298 lines
12 KiB
JavaScript
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);
|
|
});
|
|
});
|