const should = require('should');
const {Member} = require('../../../core/server/models/member');
const {MemberStripeCustomer} = require('../../../core/server/models/member-stripe-customer');
const {StripeCustomerSubscription} = require('../../../core/server/models/stripe-customer-subscription');

const testUtils = require('../../utils');

describe('StripeCustomerSubscription Model', function run() {
    before(testUtils.teardownDb);
    beforeEach(testUtils.setup('roles'));
    afterEach(testUtils.teardownDb);

    describe('customer', function () {
        it('Is correctly mapped to the stripe customer', async function () {
            const context = testUtils.context.admin;
            const member = await Member.add({
                email: 'test@test.member'
            }, context);
            await MemberStripeCustomer.add({
                member_id: member.get('id'),
                customer_id: 'fake_customer_id'
            }, context);

            await StripeCustomerSubscription.add({
                customer_id: 'fake_customer_id',
                subscription_id: 'fake_subscription_id',
                plan_id: 'fake_plan_id',
                plan_amount: 1337,
                plan_nickname: 'e-LEET',
                plan_interval: 'year',
                plan_currency: 'btc',
                status: 'active',
                start_date: new Date(),
                current_period_end: new Date(),
                cancel_at_period_end: false
            }, context);

            const subscription = await StripeCustomerSubscription.findOne({
                subscription_id: 'fake_subscription_id'
            }, Object.assign({}, context, {
                withRelated: ['customer']
            }));

            const customer = subscription.related('customer');

            should.exist(customer, 'StripeCustomerSubscription should have been fetched with customer');

            should.equal(customer.get('customer_id'), 'fake_customer_id');
        });
    });
});
