986296cac9
fixes https://github.com/TryGhost/Product/issues/4118 The newsletter uuids were not passed when fetching all the members current newsletters. Therefore, Portals logic broke to remove all newsletters that matched the uuid that was passed to the unsubscribe link. No newsletters were removed, still the notification toast said that the member was unsubscribed from the newsletter.
228 lines
8.1 KiB
JavaScript
228 lines
8.1 KiB
JavaScript
const {agentProvider, mockManager, fixtureManager, matchers} = require('../../utils/e2e-framework');
|
|
const {anyEtag, anyObjectId, anyUuid, anyISODateTime} = matchers;
|
|
const models = require('../../../core/server/models');
|
|
const should = require('should');
|
|
|
|
let membersAgent;
|
|
|
|
const memberMatcher = (newslettersCount) => {
|
|
return {
|
|
uuid: anyUuid,
|
|
// @NOTE: check if this field is even needed? it differs to the output in the other matcher
|
|
created_at: anyISODateTime,
|
|
newsletters: new Array(newslettersCount).fill(
|
|
{
|
|
id: anyObjectId,
|
|
uuid: anyUuid
|
|
}
|
|
)
|
|
};
|
|
};
|
|
|
|
const buildMemberMatcher = (newslettersCount) => {
|
|
return {
|
|
uuid: anyUuid,
|
|
newsletters: new Array(newslettersCount).fill(
|
|
{
|
|
id: anyObjectId,
|
|
uuid: anyUuid
|
|
}
|
|
)
|
|
};
|
|
};
|
|
|
|
describe('Comments API', function () {
|
|
before(async function () {
|
|
membersAgent = await agentProvider.getMembersAPIAgent();
|
|
|
|
await fixtureManager.init('newsletters', 'members:newsletters');
|
|
});
|
|
|
|
beforeEach(function () {
|
|
mockManager.mockMail();
|
|
});
|
|
|
|
afterEach(function () {
|
|
mockManager.restore();
|
|
});
|
|
|
|
describe('when not authenticated but enabled', function () {
|
|
it('can not get member data', async function () {
|
|
await membersAgent
|
|
.get(`/api/member/`)
|
|
.expectStatus(204)
|
|
.expectEmptyBody();
|
|
});
|
|
|
|
it('can update comment notifications', async function () {
|
|
// Only via updateMemberNewsletters
|
|
let member = await models.Member.findOne({id: fixtureManager.get('members', 0).id}, {require: true});
|
|
member.get('enable_comment_notifications').should.eql(true, 'This test requires the initial value to be true');
|
|
|
|
await membersAgent
|
|
.put(`/api/member/newsletters/?uuid=${member.get('uuid')}`)
|
|
.body({
|
|
enable_comment_notifications: false
|
|
})
|
|
.expectStatus(200)
|
|
.matchHeaderSnapshot({
|
|
etag: anyEtag
|
|
})
|
|
.matchBodySnapshot(buildMemberMatcher(1))
|
|
.expect(({body}) => {
|
|
body.email.should.eql(member.get('email'));
|
|
body.enable_comment_notifications.should.eql(false);
|
|
});
|
|
member = await models.Member.findOne({id: member.id}, {require: true});
|
|
member.get('enable_comment_notifications').should.eql(false);
|
|
});
|
|
});
|
|
|
|
describe('when authenticated', function () {
|
|
let member;
|
|
|
|
before(async function () {
|
|
await membersAgent.loginAs('member@example.com');
|
|
member = await models.Member.findOne({email: 'member@example.com'}, {require: true});
|
|
});
|
|
|
|
it('can get member data', async function () {
|
|
await membersAgent
|
|
.get(`/api/member/`)
|
|
.expectStatus(200)
|
|
.matchHeaderSnapshot({
|
|
etag: anyEtag
|
|
})
|
|
.matchBodySnapshot(memberMatcher(2))
|
|
.expect(({body}) => {
|
|
body.email.should.eql(member.get('email'));
|
|
});
|
|
});
|
|
|
|
it('can update member expertise', async function () {
|
|
await membersAgent
|
|
.put(`/api/member/`)
|
|
.body({
|
|
expertise: 'Head of Testing'
|
|
})
|
|
.expectStatus(200)
|
|
.matchHeaderSnapshot({
|
|
etag: anyEtag
|
|
})
|
|
.matchBodySnapshot(memberMatcher(2))
|
|
.expect(({body}) => {
|
|
body.email.should.eql(member.get('email'));
|
|
body.expertise.should.eql('Head of Testing');
|
|
});
|
|
member = await models.Member.findOne({id: member.id}, {require: true});
|
|
member.get('expertise').should.eql('Head of Testing');
|
|
});
|
|
|
|
it('trims whitespace from expertise', async function () {
|
|
await membersAgent
|
|
.put(`/api/member/`)
|
|
.body({
|
|
expertise: ' test '
|
|
})
|
|
.expectStatus(200)
|
|
.matchHeaderSnapshot({
|
|
etag: anyEtag
|
|
})
|
|
.matchBodySnapshot(memberMatcher(2))
|
|
.expect(({body}) => {
|
|
body.email.should.eql(member.get('email'));
|
|
body.expertise.should.eql('test');
|
|
});
|
|
member = await models.Member.findOne({id: member.id}, {require: true});
|
|
member.get('expertise').should.eql('test');
|
|
});
|
|
|
|
it('can update name', async function () {
|
|
await membersAgent
|
|
.put(`/api/member/`)
|
|
.body({
|
|
name: 'Test User'
|
|
})
|
|
.expectStatus(200)
|
|
.matchHeaderSnapshot({
|
|
etag: anyEtag
|
|
})
|
|
.matchBodySnapshot(memberMatcher(2))
|
|
.expect(({body}) => {
|
|
body.email.should.eql(member.get('email'));
|
|
body.name.should.eql('Test User');
|
|
body.firstname.should.eql('Test');
|
|
});
|
|
member = await models.Member.findOne({id: member.id}, {require: true});
|
|
member.get('name').should.eql('Test User');
|
|
});
|
|
|
|
it('can update comment notifications', async function () {
|
|
member.get('enable_comment_notifications').should.eql(true, 'This test requires the initial value to be true');
|
|
|
|
// Via general way
|
|
await membersAgent
|
|
.put(`/api/member/`)
|
|
.body({
|
|
enable_comment_notifications: false
|
|
})
|
|
.expectStatus(200)
|
|
.matchHeaderSnapshot({
|
|
etag: anyEtag
|
|
})
|
|
.matchBodySnapshot(memberMatcher(2))
|
|
.expect(({body}) => {
|
|
body.email.should.eql(member.get('email'));
|
|
body.enable_comment_notifications.should.eql(false);
|
|
});
|
|
member = await models.Member.findOne({id: member.id}, {require: true});
|
|
member.get('enable_comment_notifications').should.eql(false);
|
|
|
|
// Via updateMemberNewsletters
|
|
await membersAgent
|
|
.put(`/api/member/newsletters/?uuid=${member.get('uuid')}`)
|
|
.body({
|
|
enable_comment_notifications: true
|
|
})
|
|
.expectStatus(200)
|
|
.matchHeaderSnapshot({
|
|
etag: anyEtag
|
|
})
|
|
.matchBodySnapshot(buildMemberMatcher(2))
|
|
.expect(({body}) => {
|
|
body.email.should.eql(member.get('email'));
|
|
body.enable_comment_notifications.should.eql(true);
|
|
});
|
|
member = await models.Member.findOne({id: member.id}, {require: true});
|
|
member.get('enable_comment_notifications').should.eql(true);
|
|
});
|
|
|
|
it('can remove a member\'s email from the suppression list', async function () {
|
|
// add member's email to the suppression list
|
|
await models.Suppression.add({
|
|
email: member.get('email'),
|
|
reason: 'bounce'
|
|
});
|
|
|
|
// disable member's email
|
|
await member.save({email_disabled: true});
|
|
|
|
// remove suppression
|
|
await membersAgent
|
|
.delete(`/api/member/suppression`)
|
|
.expectStatus(204)
|
|
.expectEmptyBody();
|
|
|
|
// check that member is removed from suppression list
|
|
const suppression = await models.Suppression.findOne({email: member.get('email')});
|
|
|
|
should(suppression).be.null();
|
|
|
|
// check that member's email is enabled
|
|
await member.refresh();
|
|
|
|
should(member.get('email_disabled')).be.false();
|
|
});
|
|
});
|
|
});
|