diff --git a/test/e2e-api/admin/members.test.js b/test/e2e-api/admin/members.test.js index a396b0caa7..61d7a98dc7 100644 --- a/test/e2e-api/admin/members.test.js +++ b/test/e2e-api/admin/members.test.js @@ -419,294 +419,294 @@ describe('Members API', function () { }); //TODO: migrate once we have a way to attach files in the new e2e testing framework -// describe('Members API', function () { -// let request; -// before(async function () { -// await localUtils.startGhost(); -// request = supertest.agent(config.get('url')); -// await localUtils.doAuth(request, 'members', 'members:emails'); -// }); +describe('Members API', function () { + let request; + before(async function () { + await localUtils.startGhost(); + request = supertest.agent(config.get('url')); + await localUtils.doAuth(request, 'members', 'members:emails'); + }); -// beforeEach(function () { -// mockManager.mockLabsEnabled('multipleProducts'); -// }); + beforeEach(function () { + mockManager.mockLabsEnabled('multipleProducts'); + }); -// afterEach(function () { -// mockManager.restore(); -// }); + afterEach(function () { + mockManager.restore(); + }); -// it('Can import CSV', async function () { -// const res = await request -// .post(localUtils.API.getApiQuery(`members/upload/`)) -// .attach('membersfile', path.join(__dirname, '/../../utils/fixtures/csv/valid-members-import.csv')) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(201); + it('Can import CSV', async function () { + const res = await request + .post(localUtils.API.getApiQuery(`members/upload/`)) + .attach('membersfile', path.join(__dirname, '/../../utils/fixtures/csv/valid-members-import.csv')) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(201); -// should.not.exist(res.headers['x-cache-invalidate']); -// const jsonResponse = res.body; + should.not.exist(res.headers['x-cache-invalidate']); + const jsonResponse = res.body; -// should.exist(jsonResponse); -// should.exist(jsonResponse.meta); -// should.exist(jsonResponse.meta.stats); + should.exist(jsonResponse); + should.exist(jsonResponse.meta); + should.exist(jsonResponse.meta.stats); -// jsonResponse.meta.stats.imported.should.equal(2); -// jsonResponse.meta.stats.invalid.length.should.equal(0); -// jsonResponse.meta.import_label.name.should.match(/^Import \d{4}-\d{2}-\d{2} \d{2}:\d{2}$/); + jsonResponse.meta.stats.imported.should.equal(2); + jsonResponse.meta.stats.invalid.length.should.equal(0); + jsonResponse.meta.import_label.name.should.match(/^Import \d{4}-\d{2}-\d{2} \d{2}:\d{2}$/); -// const importLabel = jsonResponse.meta.import_label; + const importLabel = jsonResponse.meta.import_label; -// // check that members had the auto-generated label attached -// const res2 = await request.get(localUtils.API.getApiQuery(`members/?filter=label:${importLabel.slug}`)) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200); + // check that members had the auto-generated label attached + const res2 = await request.get(localUtils.API.getApiQuery(`members/?filter=label:${importLabel.slug}`)) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); -// const jsonResponse2 = res2.body; -// should.exist(jsonResponse2); -// should.exist(jsonResponse2.members); -// jsonResponse2.members.should.have.length(2); + const jsonResponse2 = res2.body; + should.exist(jsonResponse2); + should.exist(jsonResponse2.members); + jsonResponse2.members.should.have.length(2); -// const importedMember1 = jsonResponse2.members.find(m => m.email === 'jbloggs@example.com'); -// should.exist(importedMember1); -// importedMember1.name.should.equal('joe'); -// should(importedMember1.note).equal(null); -// importedMember1.subscribed.should.equal(true); -// importedMember1.labels.length.should.equal(1); -// testUtils.API.isISO8601(importedMember1.created_at).should.be.true(); -// importedMember1.comped.should.equal(false); -// importedMember1.subscriptions.should.not.be.undefined(); -// importedMember1.subscriptions.length.should.equal(0); + const importedMember1 = jsonResponse2.members.find(m => m.email === 'jbloggs@example.com'); + should.exist(importedMember1); + importedMember1.name.should.equal('joe'); + should(importedMember1.note).equal(null); + importedMember1.subscribed.should.equal(true); + importedMember1.labels.length.should.equal(1); + testUtils.API.isISO8601(importedMember1.created_at).should.be.true(); + importedMember1.comped.should.equal(false); + importedMember1.subscriptions.should.not.be.undefined(); + importedMember1.subscriptions.length.should.equal(0); -// const importedMember2 = jsonResponse2.members.find(m => m.email === 'test@example.com'); -// should.exist(importedMember2); -// importedMember2.name.should.equal('test'); -// should(importedMember2.note).equal('test note'); -// importedMember2.subscribed.should.equal(false); -// importedMember2.labels.length.should.equal(2); -// testUtils.API.isISO8601(importedMember2.created_at).should.be.true(); -// importedMember2.created_at.should.equal('1991-10-02T20:30:31.000Z'); -// importedMember2.comped.should.equal(false); -// importedMember2.subscriptions.should.not.be.undefined(); -// importedMember2.subscriptions.length.should.equal(0); -// }); + const importedMember2 = jsonResponse2.members.find(m => m.email === 'test@example.com'); + should.exist(importedMember2); + importedMember2.name.should.equal('test'); + should(importedMember2.note).equal('test note'); + importedMember2.subscribed.should.equal(false); + importedMember2.labels.length.should.equal(2); + testUtils.API.isISO8601(importedMember2.created_at).should.be.true(); + importedMember2.created_at.should.equal('1991-10-02T20:30:31.000Z'); + importedMember2.comped.should.equal(false); + importedMember2.subscriptions.should.not.be.undefined(); + importedMember2.subscriptions.length.should.equal(0); + }); -// it('Can import CSV and bulk destroy via auto-added label', function () { -// // HACK: mock dates otherwise we'll often get unexpected members appearing -// // from previous tests with the same import label due to auto-generated -// // import labels only including minutes -// sinon.stub(Date, 'now').returns(new Date('2021-03-30T17:21:00.000Z')); + it('Can import CSV and bulk destroy via auto-added label', function () { + // HACK: mock dates otherwise we'll often get unexpected members appearing + // from previous tests with the same import label due to auto-generated + // import labels only including minutes + sinon.stub(Date, 'now').returns(new Date('2021-03-30T17:21:00.000Z')); -// // import our dummy data for deletion -// return request -// .post(localUtils.API.getApiQuery(`members/upload/`)) -// .attach('membersfile', path.join(__dirname, '/../../utils/fixtures/csv/valid-members-for-bulk-delete.csv')) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .then((res) => { -// should.not.exist(res.headers['x-cache-invalidate']); + // import our dummy data for deletion + return request + .post(localUtils.API.getApiQuery(`members/upload/`)) + .attach('membersfile', path.join(__dirname, '/../../utils/fixtures/csv/valid-members-for-bulk-delete.csv')) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .then((res) => { + should.not.exist(res.headers['x-cache-invalidate']); -// const jsonResponse = res.body; + const jsonResponse = res.body; -// should.exist(jsonResponse); -// should.exist(jsonResponse.meta); -// should.exist(jsonResponse.meta.stats); -// should.exist(jsonResponse.meta.import_label); + should.exist(jsonResponse); + should.exist(jsonResponse.meta); + should.exist(jsonResponse.meta.stats); + should.exist(jsonResponse.meta.import_label); -// jsonResponse.meta.stats.imported.should.equal(8); + jsonResponse.meta.stats.imported.should.equal(8); -// return jsonResponse.meta.import_label; -// }) -// .then((importLabel) => { -// // check that the import worked by checking browse response with filter -// return request.get(localUtils.API.getApiQuery(`members/?filter=label:${importLabel.slug}`)) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200) -// .then((res) => { -// should.not.exist(res.headers['x-cache-invalidate']); -// const jsonResponse = res.body; -// should.exist(jsonResponse); -// should.exist(jsonResponse.members); -// jsonResponse.members.should.have.length(8); -// }) -// .then(() => importLabel); -// }) -// .then((importLabel) => { -// // perform the bulk delete -// return request -// .del(localUtils.API.getApiQuery(`members/?filter=label:'${importLabel.slug}'`)) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200) -// .then((res) => { -// should.not.exist(res.headers['x-cache-invalidate']); -// const jsonResponse = res.body; -// should.exist(jsonResponse); -// should.exist(jsonResponse.meta); -// should.exist(jsonResponse.meta.stats); -// should.exist(jsonResponse.meta.stats.successful); -// should.equal(jsonResponse.meta.stats.successful, 8); -// }) -// .then(() => importLabel); -// }) -// .then((importLabel) => { -// // check that the bulk delete worked by checking browse response with filter -// return request.get(localUtils.API.getApiQuery(`members/?filter=label:${importLabel.slug}`)) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200) -// .then((res) => { -// const jsonResponse = res.body; -// should.exist(jsonResponse); -// should.exist(jsonResponse.members); -// jsonResponse.members.should.have.length(0); -// }); -// }); -// }); + return jsonResponse.meta.import_label; + }) + .then((importLabel) => { + // check that the import worked by checking browse response with filter + return request.get(localUtils.API.getApiQuery(`members/?filter=label:${importLabel.slug}`)) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200) + .then((res) => { + should.not.exist(res.headers['x-cache-invalidate']); + const jsonResponse = res.body; + should.exist(jsonResponse); + should.exist(jsonResponse.members); + jsonResponse.members.should.have.length(8); + }) + .then(() => importLabel); + }) + .then((importLabel) => { + // perform the bulk delete + return request + .del(localUtils.API.getApiQuery(`members/?filter=label:'${importLabel.slug}'`)) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200) + .then((res) => { + should.not.exist(res.headers['x-cache-invalidate']); + const jsonResponse = res.body; + should.exist(jsonResponse); + should.exist(jsonResponse.meta); + should.exist(jsonResponse.meta.stats); + should.exist(jsonResponse.meta.stats.successful); + should.equal(jsonResponse.meta.stats.successful, 8); + }) + .then(() => importLabel); + }) + .then((importLabel) => { + // check that the bulk delete worked by checking browse response with filter + return request.get(localUtils.API.getApiQuery(`members/?filter=label:${importLabel.slug}`)) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200) + .then((res) => { + const jsonResponse = res.body; + should.exist(jsonResponse); + should.exist(jsonResponse.members); + jsonResponse.members.should.have.length(0); + }); + }); + }); -// it('Can bulk unsubscribe members with filter', async function () { -// // import our dummy data for deletion -// await request -// .post(localUtils.API.getApiQuery(`members/upload/`)) -// .attach('membersfile', path.join(__dirname, '/../../utils/fixtures/csv/members-for-bulk-unsubscribe.csv')) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private); + it('Can bulk unsubscribe members with filter', async function () { + // import our dummy data for deletion + await request + .post(localUtils.API.getApiQuery(`members/upload/`)) + .attach('membersfile', path.join(__dirname, '/../../utils/fixtures/csv/members-for-bulk-unsubscribe.csv')) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private); -// const browseResponse = await request -// .get(localUtils.API.getApiQuery('members/?filter=label:bulk-unsubscribe-test')) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200); + const browseResponse = await request + .get(localUtils.API.getApiQuery('members/?filter=label:bulk-unsubscribe-test')) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); -// browseResponse.body.members.should.have.length(8); -// const allMembersSubscribed = browseResponse.body.members.every((member) => { -// return member.subscribed; -// }); + browseResponse.body.members.should.have.length(8); + const allMembersSubscribed = browseResponse.body.members.every((member) => { + return member.subscribed; + }); -// should.ok(allMembersSubscribed); + should.ok(allMembersSubscribed); -// const bulkUnsubscribeResponse = await request -// .put(localUtils.API.getApiQuery('members/bulk/?filter=label:bulk-unsubscribe-test')) -// .set('Origin', config.get('url')) -// .send({ -// bulk: { -// action: 'unsubscribe' -// } -// }) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200); + const bulkUnsubscribeResponse = await request + .put(localUtils.API.getApiQuery('members/bulk/?filter=label:bulk-unsubscribe-test')) + .set('Origin', config.get('url')) + .send({ + bulk: { + action: 'unsubscribe' + } + }) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); -// should.exist(bulkUnsubscribeResponse.body.bulk); -// should.exist(bulkUnsubscribeResponse.body.bulk.meta); -// should.exist(bulkUnsubscribeResponse.body.bulk.meta.stats); -// should.exist(bulkUnsubscribeResponse.body.bulk.meta.stats.successful); -// should.equal(bulkUnsubscribeResponse.body.bulk.meta.stats.successful, 8); + should.exist(bulkUnsubscribeResponse.body.bulk); + should.exist(bulkUnsubscribeResponse.body.bulk.meta); + should.exist(bulkUnsubscribeResponse.body.bulk.meta.stats); + should.exist(bulkUnsubscribeResponse.body.bulk.meta.stats.successful); + should.equal(bulkUnsubscribeResponse.body.bulk.meta.stats.successful, 8); -// const postUnsubscribeBrowseResponse = await request -// .get(localUtils.API.getApiQuery('members/?filter=label:bulk-unsubscribe-test')) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200); + const postUnsubscribeBrowseResponse = await request + .get(localUtils.API.getApiQuery('members/?filter=label:bulk-unsubscribe-test')) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); -// postUnsubscribeBrowseResponse.body.members.should.have.length(8); -// const allMembersUnsubscribed = postUnsubscribeBrowseResponse.body.members.every((member) => { -// return !member.subscribed; -// }); + postUnsubscribeBrowseResponse.body.members.should.have.length(8); + const allMembersUnsubscribed = postUnsubscribeBrowseResponse.body.members.every((member) => { + return !member.subscribed; + }); -// should.ok(allMembersUnsubscribed); -// }); + should.ok(allMembersUnsubscribed); + }); -// it('Can bulk add and remove labels to members with filter', async function () { -// // import our dummy data for deletion -// await request -// .post(localUtils.API.getApiQuery('members/upload/')) -// .attach('membersfile', path.join(__dirname, '/../../utils/fixtures/csv/members-for-bulk-add-labels.csv')) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private); + it('Can bulk add and remove labels to members with filter', async function () { + // import our dummy data for deletion + await request + .post(localUtils.API.getApiQuery('members/upload/')) + .attach('membersfile', path.join(__dirname, '/../../utils/fixtures/csv/members-for-bulk-add-labels.csv')) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private); -// const newLabelResponse = await request -// .post(localUtils.API.getApiQuery('labels')) -// .set('Origin', config.get('url')) -// .send({ -// labels: [{ -// name: 'Awesome Label For Testing Bulk Add' -// }] -// }); + const newLabelResponse = await request + .post(localUtils.API.getApiQuery('labels')) + .set('Origin', config.get('url')) + .send({ + labels: [{ + name: 'Awesome Label For Testing Bulk Add' + }] + }); -// const labelToAdd = newLabelResponse.body.labels[0]; + const labelToAdd = newLabelResponse.body.labels[0]; -// const bulkAddLabelResponse = await request -// .put(localUtils.API.getApiQuery('members/bulk/?filter=label:bulk-add-labels-test')) -// .set('Origin', config.get('url')) -// .send({ -// bulk: { -// action: 'addLabel', -// meta: { -// label: labelToAdd -// } -// } -// }) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200); + const bulkAddLabelResponse = await request + .put(localUtils.API.getApiQuery('members/bulk/?filter=label:bulk-add-labels-test')) + .set('Origin', config.get('url')) + .send({ + bulk: { + action: 'addLabel', + meta: { + label: labelToAdd + } + } + }) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); -// should.exist(bulkAddLabelResponse.body.bulk); -// should.exist(bulkAddLabelResponse.body.bulk.meta); -// should.exist(bulkAddLabelResponse.body.bulk.meta.stats); -// should.exist(bulkAddLabelResponse.body.bulk.meta.stats.successful); -// should.equal(bulkAddLabelResponse.body.bulk.meta.stats.successful, 8); + should.exist(bulkAddLabelResponse.body.bulk); + should.exist(bulkAddLabelResponse.body.bulk.meta); + should.exist(bulkAddLabelResponse.body.bulk.meta.stats); + should.exist(bulkAddLabelResponse.body.bulk.meta.stats.successful); + should.equal(bulkAddLabelResponse.body.bulk.meta.stats.successful, 8); -// const postLabelAddBrowseResponse = await request -// .get(localUtils.API.getApiQuery(`members/?filter=label:${labelToAdd.slug}`)) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200); + const postLabelAddBrowseResponse = await request + .get(localUtils.API.getApiQuery(`members/?filter=label:${labelToAdd.slug}`)) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); -// postLabelAddBrowseResponse.body.members.should.have.length(8); + postLabelAddBrowseResponse.body.members.should.have.length(8); -// const labelToRemove = newLabelResponse.body.labels[0]; + const labelToRemove = newLabelResponse.body.labels[0]; -// const bulkRemoveLabelResponse = await request -// .put(localUtils.API.getApiQuery('members/bulk/?filter=label:bulk-add-labels-test')) -// .set('Origin', config.get('url')) -// .send({ -// bulk: { -// action: 'removeLabel', -// meta: { -// label: labelToRemove -// } -// } -// }) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200); + const bulkRemoveLabelResponse = await request + .put(localUtils.API.getApiQuery('members/bulk/?filter=label:bulk-add-labels-test')) + .set('Origin', config.get('url')) + .send({ + bulk: { + action: 'removeLabel', + meta: { + label: labelToRemove + } + } + }) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); -// should.exist(bulkRemoveLabelResponse.body.bulk); -// should.exist(bulkRemoveLabelResponse.body.bulk.meta); -// should.exist(bulkRemoveLabelResponse.body.bulk.meta.stats); -// should.exist(bulkRemoveLabelResponse.body.bulk.meta.stats.successful); -// should.equal(bulkRemoveLabelResponse.body.bulk.meta.stats.successful, 8); + should.exist(bulkRemoveLabelResponse.body.bulk); + should.exist(bulkRemoveLabelResponse.body.bulk.meta); + should.exist(bulkRemoveLabelResponse.body.bulk.meta.stats); + should.exist(bulkRemoveLabelResponse.body.bulk.meta.stats.successful); + should.equal(bulkRemoveLabelResponse.body.bulk.meta.stats.successful, 8); -// const postLabelRemoveBrowseResponse = await request -// .get(localUtils.API.getApiQuery(`members/?filter=label:${labelToRemove.slug}`)) -// .set('Origin', config.get('url')) -// .expect('Content-Type', /json/) -// .expect('Cache-Control', testUtils.cacheRules.private) -// .expect(200); + const postLabelRemoveBrowseResponse = await request + .get(localUtils.API.getApiQuery(`members/?filter=label:${labelToRemove.slug}`)) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); -// postLabelRemoveBrowseResponse.body.members.should.have.length(0); -// }); -// }); + postLabelRemoveBrowseResponse.body.members.should.have.length(0); + }); +});