tsg-ut/mnemo

View on GitHub
api/test/routes/xranking.js

Summary

Maintainability
A
2 hrs
Test Coverage
/* eslint-env node, mocha */
/* eslint no-unused-expressions: 'off' */

const chai = require('chai');
const chaiHttp = require('chai-http');
const Umzug = require('umzug');

const app = require('../../');
const sequelize = require('../../models');
const Stages = require('../../models/stage');
const Submissions = require('../../models/submission');

const umzug = new Umzug({
    storage: 'sequelize',
    storageOptions: {
        sequelize,
    },
    migrations: {
        params: [sequelize.getQueryInterface(), sequelize.constructor],
    },
});

chai.use(chaiHttp);

const {expect} = chai;

let transaction = null;

describe('/ranking', () => {
    // Execute all migrations
    before(async () => {
        await umzug.up();
    });

    beforeEach(async () => {
        transaction = await sequelize.transaction();
    });

    afterEach(async () => {
        await transaction.rollback();
    });

    describe('GET /ranking', () => {
        it('retuns JSON of the submission array', async () => {
            const stage1 = await Stages.create({
                name: 'wire01',
                migratedVersion: 1,
            }, {transaction});

            const stage2 = await Stages.create({
                name: 'calc01',
                migratedVersion: 1,
            }, {transaction});

            const submissionFactory = {
                board: JSON.stringify([]),
                blocks: 0,
                clocks: 0,
                version: 1,
            };

            await Submissions.bulkCreate([
                Object.assign({}, submissionFactory, {
                    stageId: stage1.id,
                    name: 'A',
                    score: 10000,
                }),
                Object.assign({}, submissionFactory, {
                    stageId: stage1.id,
                    name: 'B',
                    score: 10000,
                }),
                Object.assign({}, submissionFactory, {
                    stageId: stage1.id,
                    name: 'C',
                    score: 10000,
                }),
                Object.assign({}, submissionFactory, {
                    stageId: stage2.id,
                    name: 'A',
                    score: 10000,
                }),
                Object.assign({}, submissionFactory, {
                    stageId: stage2.id,
                    name: 'B',
                    score: 5000,
                }),
            ], {transaction});

            const res = await chai.request(app).get('/ranking');

            expect(res).to.have.status(200);
            expect(res).to.be.json;
            expect(res.body).to.deep.equal([{
                name: 'A',
                score: 20000,
            }, {
                name: 'B',
                score: 15000,
            }, {
                name: 'C',
                score: 10000,
            }]);
        });

        it('does not include scores from old version stage', async () => {
            const stage1 = await Stages.create({
                name: 'wire01',
                migratedVersion: 1,
            }, {transaction});

            const stage2 = await Stages.create({
                name: 'calc01',
                migratedVersion: 1,
            }, {transaction});

            const stage3 = await Stages.create({
                name: 'calc02',
                migratedVersion: 2,
            }, {transaction});

            const submissionFactory = {
                name: 'A',
                board: JSON.stringify([]),
                blocks: 0,
                clocks: 0,
                score: 10000,
                version: 1,
            };

            await Submissions.bulkCreate([
                Object.assign({}, submissionFactory, {
                    stageId: stage1.id,
                }),
                Object.assign({}, submissionFactory, {
                    stageId: stage2.id,
                }),
                Object.assign({}, submissionFactory, {
                    stageId: stage3.id,
                }),
            ], {transaction});

            const res = await chai.request(app).get('/ranking');

            expect(res).to.have.status(200);
            expect(res).to.be.json;
            expect(res.body).to.deep.equal([{
                name: 'A',
                score: 20000,
            }]);
        });

        describe('since parameter', () => {
            it('reports error when invalid date is supplied', async () => {
                const res = await chai.request(app).get('/ranking').query({since: 'hogehoge'});
                expect(res).to.have.status(400);
            });

            it('filters submissions only from specified time', async () => {
                const stage1 = await Stages.create({
                    name: 'wire01',
                    migratedVersion: 1,
                }, {transaction});

                const stage2 = await Stages.create({
                    name: 'calc01',
                    migratedVersion: 1,
                }, {transaction});

                const stage3 = await Stages.create({
                    name: 'calc02',
                    migratedVersion: 1,
                }, {transaction});

                const submissionFactory = {
                    name: 'A',
                    board: JSON.stringify([]),
                    blocks: 0,
                    clocks: 0,
                    score: 10000,
                    version: 1,
                };

                await Submissions.bulkCreate([
                    Object.assign({}, submissionFactory, {
                        updatedAt: new Date('2017-04-01'),
                        stageId: stage1.id,
                    }),
                    Object.assign({}, submissionFactory, {
                        updatedAt: new Date('2017-05-01'),
                        stageId: stage2.id,
                    }),
                    Object.assign({}, submissionFactory, {
                        updatedAt: new Date('2017-06-01'),
                        stageId: stage3.id,
                    }),
                ], {transaction});

                const res = await chai.request(app).get('/ranking').query({since: '2017-05-01'});

                expect(res).to.have.status(200);
                expect(res).to.be.json;
                expect(res.body).to.deep.equal([{
                    name: 'A',
                    score: 20000,
                }]);
            });
        });

        describe('limit parameter', () => {
            it('restricts size of returned array', async () => {
                const stage = await Stages.create({
                    name: 'wire01',
                    migratedVersion: 1,
                }, {transaction});

                const submissionFactory = {
                    board: JSON.stringify([]),
                    blocks: 0,
                    clocks: 0,
                    version: 1,
                    stageId: stage.id,
                    score: 10000,
                };

                await Submissions.bulkCreate([
                    Object.assign({}, submissionFactory, {
                        name: 'A',
                    }),
                    Object.assign({}, submissionFactory, {
                        name: 'B',
                    }),
                    Object.assign({}, submissionFactory, {
                        name: 'C',
                    }),
                ], {transaction});

                const res = await chai.request(app).get('/ranking').query({limit: 2});

                expect(res).to.have.status(200);
                expect(res).to.be.json;
                expect(res.body).to.have.length(2);
            });
        });
    });
});