'use strict';

const assert = require('assert');

const TestServer = require('./resources/test-server.js');
const addBuilderForReport = require('./resources/common-operations.js').addBuilderForReport;
const prepareServerTest = require('./resources/common-operations.js').prepareServerTest;

describe("/admin/reprocess-report", function () {
    prepareServerTest(this);

    const simpleReport = [{
        "buildTag": "1986",
        "buildTime": "2013-02-28T10:12:03",
        "builderName": "someBuilder",
        "builderPassword": "somePassword",
        "platform": "Mountain Lion",
        "tests": {
                "test": {
                    "metrics": {"FrameRate": { "current": [[1, 2, 3], [4, 5, 6]] }}
                },
            },
        }];

    const simpleReportWithRevisions = [{
        "buildTag": "1986",
        "buildTime": "2013-02-28T10:12:03",
        "builderName": "someBuilder",
        "builderPassword": "somePassword",
        "platform": "Mountain Lion",
        "tests": {
                "test": {
                    "metrics": {"FrameRate": { "current": [[1, 2, 3], [4, 5, 6]] }}
                },
            },
        "revisions": {
                "WebKit": {
                    "timestamp": "2017-03-01T09:38:44.826833Z",
                    "revision": "213214"
                }
            }
        }];

    it("should still create new repository when repository ownerships are different", () => {
        let db = TestServer.database();
        return addBuilderForReport(simpleReportWithRevisions[0]).then(() => {
            return db.insert('repositories', {'name': 'WebKit', 'owner': 1});
        }).then(() => {
            return TestServer.remoteAPI().postJSON('/api/report/', simpleReportWithRevisions);
        }).then((response) => {
            assert.strictEqual(response['status'], 'OK');
            return db.selectRows('repositories', {'name': 'WebKit'});
        }).then((repositories) => {
            assert.strictEqual(repositories.length, 2);
            const webkitRepsitoryId = repositories[0].owner == 1 ? repositories[1].id : repositories[0].id;
            return db.selectRows('commits', {'revision': '213214', 'repository': webkitRepsitoryId});
        }).then((result) => {
            assert(result.length, 1);
        });
    });

    it("should add build", () => {
        let db = TestServer.database();
        let reportId;
        return addBuilderForReport(simpleReport[0]).then(() => {
            return TestServer.remoteAPI().postJSON('/api/report/', simpleReport);
        }).then((response) => {
            assert.strictEqual(response['status'], 'OK');
            return Promise.all([db.selectAll('builds'), db.selectAll('reports')]);
        }).then((result) => {
            const builds = result[0];
            const reports = result[1];
            assert.strictEqual(builds.length, 1);
            assert.strictEqual(builds[0]['tag'], '1986');
            assert.strictEqual(reports.length, 1);
            reportId = reports[0]['id'];
            assert.strictEqual(reports[0]['build_tag'], '1986');
            return db.query('UPDATE reports SET report_build = NULL; DELETE FROM builds');
        }).then(() => {
            return db.selectAll('builds');
        }).then((builds) => {
            assert.strictEqual(builds.length, 0);
            return TestServer.remoteAPI().getJSONWithStatus(`/admin/reprocess-report?report=${reportId}`);
        }).then(() => {
            return db.selectAll('builds');
        }).then((builds) => {
            assert.strictEqual(builds.length, 1);
            assert.strictEqual(builds[0]['tag'], '1986');
        });
    });

    it("should not duplicate the reprocessed report", () => {
        let db = TestServer.database();
        let originalReprot;
        return addBuilderForReport(simpleReport[0]).then(() => {
            return TestServer.remoteAPI().postJSON('/api/report/', simpleReport);
        }).then((response) => {
            assert.strictEqual(response['status'], 'OK');
            return db.selectAll('reports');
        }).then((reports) => {
            assert.strictEqual(reports.length, 1);
            originalReprot = reports[0];
            return db.query('UPDATE reports SET report_build = NULL; DELETE FROM builds');
        }).then(() => {
            return TestServer.remoteAPI().getJSONWithStatus(`/admin/reprocess-report?report=${originalReprot['id']}`);
        }).then(() => {
            return db.selectAll('reports');
        }).then((reports) => {
            assert.strictEqual(reports.length, 1);
            const newPort = reports[0];
            originalReprot['committed_at'] = null;
            newPort['committed_at'] = null;
            assert.notStrictEqual(originalReprot['build'], newPort['build']);
            originalReprot['build'] = null;
            newPort['build'] = null;
            assert.deepStrictEqual(originalReprot, newPort);
        });
    });
});
