const {models} = require('vn-loopback/server/server');
describe('Renew Token', () => {
    const startingTime = Date.now();
    let ctx = null;
    beforeAll(async() => {
        const unAuthCtx = {
            req: {
                headers: {},
                connection: {
                    remoteAddress: '127.0.0.1'
                },
                getLocale: () => 'en'
            },
            args: {}
        };
        let login = await models.VnUser.signIn(unAuthCtx, 'salesAssistant', 'nightmare');
        let accessToken = await models.AccessToken.findById(login.token);
        ctx = {req: {accessToken: accessToken}};
    });

    beforeEach(() => {
        jasmine.clock().install();
        jasmine.clock().mockDate(new Date(startingTime));
    });

    afterEach(() => {
        jasmine.clock().uninstall();
    });

    it('should renew token', async() => {
        const {courtesyTime} = await models.AccessTokenConfig.findOne({
            fields: ['courtesyTime']
        });
        const mockDate = new Date(startingTime + 26600000);
        jasmine.clock().mockDate(mockDate);
        const {id} = await models.VnUser.renewToken(ctx);

        expect(id).not.toEqual(ctx.req.accessToken.id);

        await models.VnUser.logout(ctx.req.accessToken.id);
        jasmine.clock().tick((courtesyTime + 10) * 1000);
        let tokenNotExists;
        try {
            tokenNotExists = await models.AccessToken.findById(ctx.req.accessToken.id);
        } catch (e) {
            error = e;
        }

        expect(tokenNotExists).toBeNull();
    });

    it('NOT should renew', async() => {
        let error;
        let response;
        try {
            response = await models.VnUser.renewToken(ctx);
        } catch (e) {
            error = e;
        }

        expect(error).toBeUndefined();
        expect(response.id).toEqual(ctx.req.accessToken.id);
    });

    it('throw error', async() => {
        let error;

        try {
            await models.VnUser.renewToken({req: {token: null}});
        } catch (e) {
            error = e;
        }

        expect(error).toBeDefined();

        const query = 'SELECT * FROM util.debug WHERE variable = "renewToken"';
        const debugLog = await models.Application.rawSql(query);

        expect(debugLog.length).toEqual(1);
    });
});