Ghost/ghost/admin/tests/acceptance/members/details-test.js

298 lines
12 KiB
JavaScript

import {authenticateSession} from 'ember-simple-auth/test-support';
import {click, currentURL, find, findAll} from '@ember/test-helpers';
import {enableLabsFlag} from '../../helpers/labs-flag';
import {enableNewsletters} from '../../helpers/newsletters';
import {enableStripe} from '../../helpers/stripe';
import {expect} from 'chai';
import {setupApplicationTest} from 'ember-mocha';
import {setupMirage} from 'ember-cli-mirage/test-support';
import {visit} from '../../helpers/visit';
describe('Acceptance: Member details', function () {
let hooks = setupApplicationTest();
setupMirage(hooks);
let clock;
let tier;
beforeEach(async function () {
this.server.loadFixtures('configs');
this.server.loadFixtures('settings');
enableLabsFlag(this.server, 'membersLastSeenFilter');
enableLabsFlag(this.server, 'membersTimeFilters');
enableStripe(this.server);
enableNewsletters(this.server, true);
// add a default tier that complimentary plans can be assigned to
tier = this.server.create('tier', {
id: '6213b3f6cb39ebdb03ebd810',
name: 'Ghost Subscription',
slug: 'ghost-subscription',
created_at: '2022-02-21T16:47:02.000Z',
updated_at: '2022-03-03T15:37:02.000Z',
description: null,
monthly_price_id: '6220df272fee0571b5dd0a0a',
yearly_price_id: '6220df272fee0571b5dd0a0b',
type: 'paid',
active: true,
welcome_page_url: '/'
});
let role = this.server.create('role', {name: 'Owner'});
this.server.create('user', {roles: [role]});
return await authenticateSession();
});
afterEach(function () {
clock?.restore();
});
it('has a known base-state', async function () {
const member = this.server.create('member', {
id: 1,
subscriptions: [
this.server.create('subscription', {
id: 'sub_1KZGcmEGb07FFvyN9jwrwbKu',
customer: {
id: 'cus_LFmBWoSkB84lnr',
name: 'test',
email: 'test@ghost.org'
},
plan: {
id: 'price_1KZGc6EGb07FFvyNkK3umKiX',
nickname: 'Monthly',
amount: 500,
interval: 'month',
currency: 'USD'
},
status: 'canceled',
start_date: '2022-03-03T15:31:27.000Z',
default_payment_card_last4: '4242',
cancel_at_period_end: false,
cancellation_reason: null,
current_period_end: '2022-04-03T15:31:27.000Z',
price: {
id: 'price_1KZGc6EGb07FFvyNkK3umKiX',
price_id: '6220df272fee0571b5dd0a0a',
nickname: 'Monthly',
amount: 500,
interval: 'month',
type: 'recurring',
currency: 'USD',
tier: {
id: 'prod_LFmAAmCnnbzrvL',
name: 'Ghost Subscription',
tier_id: tier.id
}
},
offer: null
}),
this.server.create('subscription', {
id: 'sub_1KZGi6EGb07FFvyNDjZq98g8',
tier,
customer: {
id: 'cus_LFmGicpX4BkQKH',
name: '123',
email: 'test@ghost.org'
},
plan: {
id: 'price_1KZGc6EGb07FFvyNkK3umKiX',
nickname: 'Monthly',
amount: 500,
interval: 'month',
currency: 'USD'
},
status: 'active',
start_date: '2022-03-03T15:36:58.000Z',
default_payment_card_last4: '4242',
cancel_at_period_end: false,
cancellation_reason: null,
current_period_end: '2022-04-03T15:36:58.000Z',
price: {
id: 'price_1KZGc6EGb07FFvyNkK3umKiX',
price_id: '6220df272fee0571b5dd0a0a',
nickname: 'Monthly',
amount: 500,
interval: 'month',
type: 'recurring',
currency: 'USD',
tier: {
id: 'prod_LFmAAmCnnbzrvL',
name: 'Ghost Subscription',
tier_id: tier.id
}
},
offer: null
})
],
tiers: [
tier
]
});
await visit(`/members/${member.id}`);
expect(currentURL()).to.equal(`/members/${member.id}`);
expect(findAll('[data-test-subscription]').length, 'displays all member subscriptions')
.to.equal(2);
await click('[data-test-button="save"]');
expect(find('[data-test-button="save"]')).to.not.contain.text('Retry');
});
it('displays correctly one canceled subscription', async function () {
const member = this.server.create('member', {
id: 1,
subscriptions: [
this.server.create('subscription', {
id: 'sub_1KZGcmEGb07FFvyN9jwrwbKu',
tier,
customer: {
id: 'cus_LFmBWoSkB84lnr',
name: 'test',
email: 'test@ghost.org'
},
plan: {
id: 'price_1KZGc6EGb07FFvyNkK3umKiX',
nickname: 'Monthly',
amount: 500,
interval: 'month',
currency: 'USD'
},
status: 'canceled',
start_date: '2022-03-03T15:31:27.000Z',
default_payment_card_last4: '4242',
cancel_at_period_end: false,
cancellation_reason: null,
current_period_end: '2022-04-03T15:31:27.000Z',
price: {
id: 'price_1KZGc6EGb07FFvyNkK3umKiX',
price_id: '6220df272fee0571b5dd0a0a',
nickname: 'Monthly',
amount: 500,
interval: 'month',
type: 'recurring',
currency: 'USD',
tier: {
id: 'prod_LFmAAmCnnbzrvL',
name: 'Ghost Subscription',
tier_id: '6213b3f6cb39ebdb03ebd810'
}
},
offer: null
})
],
tiers: []
});
await visit(`/members/${member.id}`);
expect(currentURL()).to.equal(`/members/${member.id}`);
expect(findAll('[data-test-subscription]').length, 'displays all member subscriptions')
.to.equal(1);
});
it('can add and remove complimentary subscription', async function () {
const member = this.server.create('member', {name: 'Comp Member Test'});
await visit(`/members/${member.id}`);
expect(findAll('[data-test-button="add-complimentary"]').length, '# of add complimentary buttons')
.to.equal(1);
await click('[data-test-button="add-complimentary"]');
expect(find('[data-test-modal="member-tier"]'), 'select tier modal').to.exist;
expect(find('[data-test-text="select-tier-desc"]')).to.contain.text('Comp Member Test');
expect(find('[data-test-tier-option="6213b3f6cb39ebdb03ebd810"]')).to.have.exist;
expect(find('[data-test-tier-option="6213b3f6cb39ebdb03ebd810"]')).to.have.class('active');
await click('[data-test-button="save-comp-tier"]');
expect(findAll('[data-test-subscription]').length, '# of subscription blocks - after add comped')
.to.equal(1);
await click('[data-test-tier="6213b3f6cb39ebdb03ebd810"] [data-test-button="subscription-actions"]');
await click('[data-test-tier="6213b3f6cb39ebdb03ebd810"] [data-test-button="remove-complimentary"]');
expect(findAll('[data-test-subscription]').length, '# of subscription blocks - after remove comped')
.to.equal(0);
});
it('can add complimentary subscription when member has canceled subscriptions', async function () {
const member = this.server.create('member', {
name: 'Comped for canceled sub test',
subscriptions: [
this.server.create('subscription', {
// tier, // _Not_ included as `tier` when subscription is canceled
status: 'canceled',
price: {
id: 'price_1',
tier: {
id: 'prod_1',
tier_id: tier.id
}
}
})
]
});
await visit(`/members/${member.id}`);
expect(findAll('[data-test-button="add-complimentary"]').length, '# of add complimentary buttons')
.to.equal(1);
await click('[data-test-button="add-complimentary"]');
await click('[data-test-button="save-comp-tier"]');
expect(findAll('[data-test-subscription]').length, '# of subscription blocks - after add comped')
.to.equal(2);
expect(findAll('[data-test-button="add-complimentary"]').length, '# of add complimentary buttons - after add comped')
.to.equal(0);
});
it('handles multiple tiers', async function () {
const tier2 = this.server.create('tier', {
name: 'Second tier',
slug: 'second-tier',
created_at: '2022-02-21T16:47:02.000Z',
updated_at: '2022-03-03T15:37:02.000Z',
description: null,
monthly_price_id: '6220df272fee0571b5dd0a0a',
yearly_price_id: '6220df272fee0571b5dd0a0b',
type: 'paid',
active: true,
welcome_page_url: '/'
});
const member = this.server.create('member', {name: 'Multiple tier test'});
this.server.create('subscription', {member, tier, status: 'canceled', price: {id: '1', tier: {tier_id: tier.id}}});
this.server.create('subscription', {member, tier, status: 'canceled', price: {id: '1', tier: {tier_id: tier.id}}});
this.server.create('subscription', {member, tier: tier2, status: 'canceled', price: {id: '1', tier: {tier_id: tier2.id}}});
await visit(`/members/${member.id}`);
// all tiers and subscriptions are shown
expect(findAll('[data-test-tier]').length, '# of tier blocks').to.equal(2);
const p1 = `[data-test-tier="${tier.id}"]`;
const p2 = `[data-test-tier="${tier2.id}"]`;
expect(find(`${p1} [data-test-text="tier-name"]`)).to.contain.text('Ghost Subscription');
expect(findAll(`${p1} [data-test-subscription]`).length, '# of tier 1 subscription blocks').to.equal(2);
expect(find(`${p2} [data-test-text="tier-name"]`)).to.contain.text('Second tier');
expect(findAll(`${p2} [data-test-subscription]`).length, '# of tier 2 subscription blocks').to.equal(1);
// can add complimentary
expect(findAll('[data-test-button="add-complimentary"]').length, '# of add-complimentary buttons').to.equal(1);
await click('[data-test-button="add-complimentary"]');
await click(`[data-test-tier-option="${tier2.id}"]`);
await click('[data-test-button="save-comp-tier"]');
expect(findAll(`${p2} [data-test-subscription]`).length, '# of tier 2 subscription blocks after comp added').to.equal(2);
});
});