'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.equal(response['status'], 'OK');
            return db.selectRows('repositories', {'name': 'WebKit'});
        }).then((repositories) => {
            assert.equal(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.equal(response['status'], 'OK');
            return Promise.all([db.selectAll('builds'), db.selectAll('reports')]);
        }).then((result) => {
            const builds = result[0];
            const reports = result[1];
            assert.equal(builds.length, 1);
            assert.equal(builds[0]['tag'], 1986);
            assert.equal(reports.length, 1);
            reportId = reports[0]['id'];
            assert.equal(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.equal(builds.length, 0);
            return TestServer.remoteAPI().getJSONWithStatus(`/admin/reprocess-report?report=${reportId}`);
        }).then(() => {
            return db.selectAll('builds');
        }).then((builds) => {
            assert.equal(builds.length, 1);
            assert.equal(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.equal(response['status'], 'OK');
            return db.selectAll('reports');
        }).then((reports) => {
            assert.equal(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.equal(reports.length, 1);
            const newPort = reports[0];
            originalReprot['committed_at'] = null;
            newPort['committed_at'] = null;
            assert.notEqual(originalReprot['build'], newPort['build']);
            originalReprot['build'] = null;
            newPort['build'] = null;
            assert.deepEqual(originalReprot, newPort);
        });
    });
});
