127 lines
4.2 KiB
JavaScript
127 lines
4.2 KiB
JavaScript
|
const EmailSegmenter = require('../lib/email-segmenter');
|
||
|
const sinon = require('sinon');
|
||
|
|
||
|
describe('Email segmenter', function () {
|
||
|
describe('getMemberCount', function () {
|
||
|
let membersRepository;
|
||
|
let listStub;
|
||
|
|
||
|
beforeEach(function () {
|
||
|
listStub = sinon.stub().resolves({
|
||
|
meta: {
|
||
|
pagination: {total: 12}
|
||
|
}
|
||
|
});
|
||
|
membersRepository = {
|
||
|
list: listStub
|
||
|
};
|
||
|
});
|
||
|
|
||
|
afterEach(function () {
|
||
|
sinon.restore();
|
||
|
});
|
||
|
|
||
|
it('creates correct filter and count for members visibility with null segment', async function () {
|
||
|
const emailSegmenter = new EmailSegmenter({
|
||
|
membersRepository
|
||
|
});
|
||
|
|
||
|
const response = await emailSegmenter.getMembersCount({
|
||
|
id: 'newsletter-123',
|
||
|
get: (key) => {
|
||
|
if (key === 'visibility') {
|
||
|
return 'members';
|
||
|
}
|
||
|
}
|
||
|
}, 'all', null
|
||
|
);
|
||
|
listStub.calledOnce.should.be.true();
|
||
|
listStub.calledWith({
|
||
|
filter: 'newsletters.id:newsletter-123'
|
||
|
}).should.be.true();
|
||
|
response.should.eql(12);
|
||
|
});
|
||
|
|
||
|
it('throws errors for incorrect recipient filter or visibility', async function () {
|
||
|
const emailSegmenter = new EmailSegmenter({
|
||
|
membersRepository
|
||
|
});
|
||
|
try {
|
||
|
await emailSegmenter.getMembersCount({
|
||
|
id: 'newsletter-123',
|
||
|
get: (key) => {
|
||
|
if (key === 'visibility') {
|
||
|
return 'members';
|
||
|
}
|
||
|
}
|
||
|
}, 'none', null
|
||
|
);
|
||
|
} catch (e) {
|
||
|
e.message.should.eql('Cannot send email to "none" recipient filter');
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
await emailSegmenter.getMembersCount({
|
||
|
id: 'newsletter-123',
|
||
|
get: (key) => {
|
||
|
if (key === 'visibility') {
|
||
|
return '';
|
||
|
}
|
||
|
}
|
||
|
}, 'members', null
|
||
|
);
|
||
|
} catch (e) {
|
||
|
e.message.should.eql('Unexpected visibility value "". Use one of the valid: "members", "paid".');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it('creates correct filter and count for paid visibility and custom recipient filter', async function () {
|
||
|
const emailSegmenter = new EmailSegmenter({
|
||
|
membersRepository
|
||
|
});
|
||
|
let response = await emailSegmenter.getMembersCount(
|
||
|
{
|
||
|
id: 'newsletter-123',
|
||
|
get: (key) => {
|
||
|
if (key === 'visibility') {
|
||
|
return 'paid';
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
'labels:test',
|
||
|
null
|
||
|
);
|
||
|
|
||
|
listStub.calledOnce.should.be.true();
|
||
|
listStub.calledWith({
|
||
|
filter: 'newsletters.id:newsletter-123+(labels:test)+status:-free'
|
||
|
}).should.be.true();
|
||
|
response.should.eql(12);
|
||
|
});
|
||
|
|
||
|
it('creates correct filter and count for paid visibility and custom segment', async function () {
|
||
|
const emailSegmenter = new EmailSegmenter({
|
||
|
membersRepository
|
||
|
});
|
||
|
let response = await emailSegmenter.getMembersCount(
|
||
|
{
|
||
|
id: 'newsletter-123',
|
||
|
get: (key) => {
|
||
|
if (key === 'visibility') {
|
||
|
return 'members';
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
'labels:test',
|
||
|
'status:free'
|
||
|
);
|
||
|
|
||
|
listStub.calledOnce.should.be.true();
|
||
|
listStub.calledWith({
|
||
|
filter: 'newsletters.id:newsletter-123+(labels:test)+(status:free)'
|
||
|
}).should.be.true();
|
||
|
response.should.eql(12);
|
||
|
});
|
||
|
});
|
||
|
});
|