0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-06 22:40:14 -05:00

Added e2e test for comping Members (#14094)

no-issue
refs https://github.com/TryGhost/Members/commit/6860e3c1
refs https://github.com/TryGhost/Members/commit/03a6d694

This adds an e2e tests for the regression we had with comping members.

The stripe service imports the members service, which will instantiate
members-ssr once it is loaded, which will use the uninstantiated
settings cache resulting in errors due to a missing theme_session_secret.

For this reason we require the stripe service inside of the test function,
rather than at the top level of the file
This commit is contained in:
Fabien 'egg' O'Carroll 2022-02-01 18:57:27 +02:00 committed by GitHub
parent fd69899b9f
commit 805c9f22f5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 101 additions and 7 deletions

View file

@ -80,7 +80,7 @@
"@tryghost/limit-service": "1.0.9",
"@tryghost/logging": "2.0.2",
"@tryghost/magic-link": "1.0.17",
"@tryghost/members-api": "4.8.9",
"@tryghost/members-api": "4.8.10",
"@tryghost/members-importer": "0.5.0",
"@tryghost/members-offers": "0.10.6",
"@tryghost/members-ssr": "1.0.19",

View file

@ -11,6 +11,10 @@ const Papa = require('papaparse');
describe('Members API', function () {
let request;
beforeEach(function () {
sinon.stub(labs, 'isSet').withArgs('multipleProducts').returns(false);
});
afterEach(function () {
sinon.restore();
});
@ -19,7 +23,6 @@ describe('Members API', function () {
await localUtils.startGhost();
request = supertest.agent(config.get('url'));
await localUtils.doAuth(request, 'members', 'members:emails');
sinon.stub(labs, 'isSet').withArgs('members').returns(true);
});
it('Can browse', async function () {
@ -184,6 +187,96 @@ describe('Members API', function () {
.expect(422);
});
it('Can add complimentary subscription', async function () {
const stripeService = require('../../../core/server/services/stripe');
stripeService.api._configured = true;
const fakePrice = {
id: 'price_1',
product: '',
active: true,
nickname: 'Complimentary',
unit_amount: 0,
currency: 'USD',
type: 'recurring',
recurring: {
interval: 'year'
}
};
const fakeSubscription = {
id: 'sub_1',
customer: 'cus_1',
status: 'active',
cancel_at_period_end: false,
metadata: {},
current_period_end: Date.now() / 1000,
start_date: Date.now() / 1000,
plan: fakePrice,
items: {
data: [{
price: fakePrice
}]
}
};
sinon.stub(stripeService.api, 'createCustomer').callsFake(async function (data) {
return {
id: 'cus_1',
email: data.email
};
});
sinon.stub(stripeService.api, 'createPrice').resolves(fakePrice);
sinon.stub(stripeService.api, 'createSubscription').resolves(fakeSubscription);
sinon.stub(stripeService.api, 'getSubscription').resolves(fakeSubscription);
const initialMember = {
name: 'Name',
email: 'compedtest@test.com',
subscribed: true
};
const compedPayload = {
comped: true
};
const res = await request
.post(localUtils.API.getApiQuery(`members/`))
.send({members: [initialMember]})
.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.exist(jsonResponse);
should.exist(jsonResponse.members);
jsonResponse.members.should.have.length(1);
should.exist(res.headers.location);
res.headers.location.should.equal(`http://127.0.0.1:2369${localUtils.API.getApiQuery('members/')}${res.body.members[0].id}/`);
const newMember = jsonResponse.members[0];
const res2 = await request
.put(localUtils.API.getApiQuery(`members/${newMember.id}/`))
.send({members: [compedPayload]})
.set('Origin', config.get('url'))
.expect(200);
should.not.exist(res2.headers['x-cache-invalidate']);
const jsonResponse2 = res2.body;
should.exist(jsonResponse2);
should.exist(jsonResponse2.members);
jsonResponse2.members.should.have.length(1);
localUtils.API.checkResponse(jsonResponse2.members[0], 'member', ['subscriptions', 'products']);
const member = jsonResponse2.members[0];
should.equal(member.status, 'comped');
should.equal(member.subscriptions.length, 1);
stripeService.api._configured = false;
});
it('Can edit by id', async function () {
const memberToChange = {
name: 'change me',
@ -392,7 +485,8 @@ describe('Members API', function () {
// 2 from above posts, 2 from above import
data[data.length - 1].free.should.equal(4);
data[data.length - 1].paid.should.equal(0);
data[data.length - 1].comped.should.equal(0);
// 1 from the comped test
data[data.length - 1].comped.should.equal(1);
});
it('Can import CSV and bulk destroy via auto-added label', function () {

View file

@ -1551,10 +1551,10 @@
"@tryghost/domain-events" "^0.1.6"
"@tryghost/member-events" "^0.3.4"
"@tryghost/members-api@4.8.9":
version "4.8.9"
resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-4.8.9.tgz#f7a44e937501ee909c09d7ee5ddd2e55501f5f98"
integrity sha512-OtIRTEAGAbu6luzA1J5ugXAFQDoZ78jIm0IHjPSPFXt10SqihkmFY2vXc3+bofSBl7O/XXD6dqxz1ZG+GWwdAQ==
"@tryghost/members-api@4.8.10":
version "4.8.10"
resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-4.8.10.tgz#ad1c6a0b09936879b0d9ccfba46e4f275bb573c1"
integrity sha512-3KgasTzWVYHCnZbMHFQxAbBquREq1nMq73v9fpD0vLKnjoumQlNMA0hf44pjqsF+lucUA8RkBR2miULKUkPhWA==
dependencies:
"@nexes/nql" "^0.6.0"
"@tryghost/debug" "^0.1.2"