"use strict";

const assert = require('assert');
require('../tools/js/v3-models.js');
const BrowserPrivilegedAPI = require('../public/v3/privileged-api.js').PrivilegedAPI;
const MockModels = require('./resources/mock-v3-models.js').MockModels;
const MockRemoteAPI = require('../unit-tests/resources/mock-remote-api.js').MockRemoteAPI;

function createPatch()
{
    return UploadedFile.ensureSingleton(453, {'createdAt': new Date('2017-05-01T19:16:53Z'), 'filename': 'patch.dat', 'extension': '.dat', 'author': 'some user',
        size: 534637, sha256: '169463c8125e07c577110fe144ecd63942eb9472d438fc0014f474245e5df8a1'});
}

function createAnotherPatch()
{
    return UploadedFile.ensureSingleton(454, {'createdAt': new Date('2017-05-01T19:16:53Z'), 'filename': 'patch.dat', 'extension': '.dat', 'author': 'some user',
        size: 534611, sha256: '169463c8125e07c577110fe144ecd63942eb9472d438fc0014f474245e5dfaaa'});
}

function createRoot(deletedAt)
{
    const data = {'createdAt': new Date('2017-05-01T21:03:27Z'), 'filename': 'root.dat', 'extension': '.dat', 'author': 'some user',
        size: 16452234, sha256: '03eed7a8494ab8794c44b7d4308e55448fc56f4d6c175809ba968f78f656d58d'};
    if (deletedAt)
        data['deletedAt'] = deletedAt;
    return UploadedFile.ensureSingleton(456, data);
}

function createAnotherRoot(deletedAt)
{
    const data = {'createdAt': new Date('2017-05-01T21:03:27Z'), 'filename': 'root.dat', 'extension': '.dat', 'author': 'some user',
        size: 16452111, sha256: '03eed7a8494ab8794c44b7d4308e55448fc56f4d6c175809ba968f78f656dbbb'};
    if (deletedAt)
        data['deletedAt'] = deletedAt;
    return UploadedFile.ensureSingleton(457, data);
}

function createSharedRoot()
{
    return UploadedFile.ensureSingleton(458, {'createdAt': new Date('2017-05-01T22:03:27Z'), 'filename': 'root.dat', 'extension': '.dat', 'author': 'some user',
        size: 16452111, sha256: '03eed7a8494ab8794c44b7d4308e55448fc56f4aac175809ba968f78f656dbbb'});
}

function customCommitSetWithoutOwnedCommit()
{
    const customCommitSet = new CustomCommitSet;
    customCommitSet.setRevisionForRepository(MockModels.osx, '10.11.4 15E65');
    customCommitSet.setRevisionForRepository(MockModels.webkit, '200805');
    return customCommitSet;
}

function customCommitSetWithOwnedCommit()
{
    const customCommitSet = new CustomCommitSet;
    customCommitSet.setRevisionForRepository(MockModels.osx, '10.11.4 15E65');
    customCommitSet.setRevisionForRepository(MockModels.ownerRepository, 'OwnerRepository-r0');
    customCommitSet.setRevisionForRepository(MockModels.ownedRepository, 'OwnedRepository-r0', null, 'OwnerRepository-r0');
    return customCommitSet;
}

function customCommitSetWithPatch()
{
    const customCommitSet = new CustomCommitSet;
    const patch = createPatch();
    customCommitSet.setRevisionForRepository(MockModels.osx, '10.11.4 15E65');
    customCommitSet.setRevisionForRepository(MockModels.webkit, '200805', patch);
    return customCommitSet;
}

function customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository()
{
    const customCommitSet = new CustomCommitSet;
    customCommitSet.setRevisionForRepository(MockModels.osx, '10.11.4 15E65');
    customCommitSet.setRevisionForRepository(MockModels.webkit, '200805');
    customCommitSet.setRevisionForRepository(MockModels.ownedWebkit, 'owned-200805', null, '10.11.4 15E65');
    return customCommitSet;
}

function ownerCommit()
{
    return CommitLog.ensureSingleton(5, {
        id: 5,
        repository: MockModels.ownerRepository,
        revision: 'owner-commit-0',
        ownsCommits: true,
        time: null,
    });
}

function partialOwnerCommit()
{
    return CommitLog.ensureSingleton(5, {
        id: 5,
        repository: MockModels.ownerRepository,
        revision: 'owner-commit-0',
        ownsCommits: null,
        time: +(new Date('2016-05-13T00:55:57.841344Z')),
    });
}

function ownedCommit()
{
    return new CommitLog(6, {
        id: 6,
        repository: MockModels.ownedRepository,
        revision: 'owned-commit-0',
        ownsCommits: null,
        time: 1456932774000
    });
}

function webkitCommit()
{
    return CommitLog.ensureSingleton(2017, {
        id: 2017,
        repository: MockModels.webkit,
        revision: 'webkit-commit-0',
        ownsCommits: false,
        time: 1456932773000
    });
}

function anotherWebKitCommit()
{
    return CommitLog.ensureSingleton(2018, {
        id: 2018,
        repository: MockModels.webkit,
        revision: 'webkit-commit-1',
        ownsCommits: false,
        time: 1456932773000
    });
}

function commitWithSVNRevision()
{
    return CommitLog.ensureSingleton(2019, {
        id: 2019,
        repository: MockModels.webkit,
        revision: '12345',
        ownsCommits: false,
        time: 1456932773000
    });
}

function anotherCommitWithSVNRevision()
{
    return CommitLog.ensureSingleton(2020, {
        id: 2020,
        repository: MockModels.webkit,
        revision: '45678',
        ownsCommits: false,
        time: 1456932773000
    });
}

function commitWithGitRevision()
{
    return CommitLog.ensureSingleton(2021, {
        id: 2021,
        repository: MockModels.webkitGit,
        revision: '13a0590d34f26fda3953c42ff833132a1a6f6f5a',
        ownsCommits: false,
        time: 1456932773000
    });
}

function anotherCommitWithGitRevision()
{
    return CommitLog.ensureSingleton(2022, {
        id: 2022,
        repository: MockModels.webkitGit,
        revision: '2f8dd3321d4f51c04f4e2019428ce9ffe97f1ef1',
        ownsCommits: false,
        time: 1456932773000
    });
}

function commitWithTestability()
{
    return CommitLog.ensureSingleton(2023, {
        id: 2023,
        repository: MockModels.webkitGit,
        revision: 'f24fc67873a0068fd5a3a9adac595f0036c21315',
        ownsCommits: false,
        time: 1456932773000,
        testability: 'Failed compilation'
    });
}

describe('CommitSet', () => {
    MockRemoteAPI.inject(null, BrowserPrivilegedAPI);
    MockModels.inject();

    function oneCommitSet()
    {
        return CommitSet.ensureSingleton(1, {
            revisionItems: [{ commit: webkitCommit(), requiresBuild: false }],
            customRoots: []
        });
    }

    function anotherCommitSet()
    {
        return CommitSet.ensureSingleton(2, {
            revisionItems: [{ commit: webkitCommit(), requiresBuild: false }],
            customRoots: []
        });
    }

    function commitSetWithPatch()
    {
        return CommitSet.ensureSingleton(3, {
            revisionItems: [{ commit: webkitCommit(), requiresBuild: false, patch: createPatch() }],
            customRoots: []
        });
    }

    function commitSetWithAnotherPatch()
    {
        return CommitSet.ensureSingleton(4, {
            revisionItems: [{ commit: webkitCommit(), requiresBuild: false, patch: createAnotherPatch() }],
            customRoots: []
        });
    }

    function commitSetWithRoots(builtRoot, customRoot) {
        const revisionItems = builtRoot ? [{commit: webkitCommit(), requiredBuild: true, rootFile: builtRoot}] : [{commit: webkitCommit(), requiredBuild: false}];
        const customRoots = customRoot ? [customRoot] : [];
        return CommitSet.ensureSingleton(5, {revisionItems, customRoots});
    }

    function commitSetWithRoot()
    {
        return CommitSet.ensureSingleton(5, {
            revisionItems: [{ commit: webkitCommit(), requiresBuild: false }],
            customRoots: [createRoot()]
        });
    }

    function anotherCommitSetWithRoot()
    {
        return CommitSet.ensureSingleton(6, {
            revisionItems: [{ commit: webkitCommit(), requiresBuild: false }],
            customRoots: [createAnotherRoot()]
        });
    }

    function commitSetWithTwoRoots()
    {
        return CommitSet.ensureSingleton(7, {
            revisionItems: [{ commit: webkitCommit(), requiresBuild: false }],
            customRoots: [createRoot(), createSharedRoot()]
        });
    }

    function commitSetWithAnotherWebKitCommit()
    {
        return CommitSet.ensureSingleton(8, {
            revisionItems: [{ commit: anotherWebKitCommit(), requiresBuild: false }],
            customRoots: []
        });
    }

    function commitSetWithAnotherCommitPatchAndRoot()
    {
        return CommitSet.ensureSingleton(9, {
            revisionItems: [{ commit: anotherWebKitCommit(), requiresBuild: true, patch: createPatch()}],
            customRoots: [createRoot(), createSharedRoot()]
        });
    }

    function commitSetWithSVNCommit()
    {
        return CommitSet.ensureSingleton(10, {
            revisionItems: [{ commit: commitWithSVNRevision(), requiresBuild: false }],
            customRoots: []
        });
    }

    function anotherCommitSetWithSVNCommit()
    {
        return CommitSet.ensureSingleton(11, {
            revisionItems: [{ commit: anotherCommitWithSVNRevision(), requiresBuild: false }],
            customRoots: []
        });
    }

    function commitSetWithGitCommit()
    {
        return CommitSet.ensureSingleton(12, {
            revisionItems: [{ commit: commitWithGitRevision(), requiresBuild: false }],
            customRoots: []
        });
    }

    function anotherCommitSetWithGitCommit()
    {
        return CommitSet.ensureSingleton(13, {
            revisionItems: [{ commit: anotherCommitWithGitRevision(), requiresBuild: false }],
            customRoots: []
        });
    }

    function commitSetWithTwoCommits()
    {
        return CommitSet.ensureSingleton(14, {
            revisionItems: [{ commit: commitWithGitRevision(), requiresBuild: false }, { commit: commitWithSVNRevision(), requiresBuild: false }],
            customRoots: []
        });
    }

    function anotherCommitSetWithTwoCommits()
    {
        return CommitSet.ensureSingleton(15, {
            revisionItems: [{ commit: anotherCommitWithGitRevision(), requiresBuild: false }, { commit: anotherCommitWithSVNRevision(), requiresBuild: false }],
            customRoots: []
        });
    }

    function commitSetWithTestability()
    {
        return CommitSet.ensureSingleton(16, {
            revisionItems: [{ commit: commitWithTestability(), requiresBuild: false },
                { commit: webkitCommit(), requiresBuild: false }],
            customRoots: []
        });
    }

    function oneMeasurementCommitSet()
    {
        return MeasurementCommitSet.ensureSingleton(1, [
            [2017, 11, 'webkit-commit-0', null, null, 1456932773000]
        ]);
    }

    describe('equals', () => {
        it('should return false if patches for same repository are different', () => {
            assert(!commitSetWithPatch().equals(commitSetWithAnotherPatch()));
            assert(!commitSetWithAnotherPatch().equals(commitSetWithPatch()));
        });

        it('should return false if patch is only specified in one commit set', () => {
            assert(!oneCommitSet().equals(commitSetWithPatch()));
            assert(!commitSetWithPatch().equals(oneCommitSet()));
        });

        it('should return false if roots for same repository are different', () => {
            assert(!commitSetWithRoot().equals(anotherCommitSetWithRoot()));
            assert(!anotherCommitSetWithRoot().equals(commitSetWithRoot()));
        });

        it('should return false if root is only specified in one commit set', () => {
            assert(!commitSetWithRoot().equals(oneCommitSet()));
            assert(!oneCommitSet().equals(commitSetWithRoot()));
        });

        it('should return true when comparing two identical commit set', () => {
            assert(oneCommitSet().equals(oneCommitSet()));
            assert(anotherCommitSet().equals(anotherCommitSet()));
            assert(commitSetWithPatch().equals(commitSetWithPatch()));
            assert(commitSetWithAnotherPatch().equals(commitSetWithAnotherPatch()));
            assert(oneMeasurementCommitSet().equals(oneMeasurementCommitSet()));
            assert(commitSetWithRoot().equals(commitSetWithRoot()));
            assert(anotherCommitSetWithRoot().equals(anotherCommitSetWithRoot()));
        });

        it('should be able to compare between CommitSet and MeasurementCommitSet', () => {
            assert(oneCommitSet().equals(oneMeasurementCommitSet()));
            assert(oneMeasurementCommitSet().equals(oneCommitSet()));
        });
    });

    describe('containsRootOrPatchOrOwnedCommit', () => {
        it('should return false if commit does not contain root, patch or owned commit', () => {
            assert.ok(!oneCommitSet().containsRootOrPatchOrOwnedCommit());
            assert.ok(!anotherCommitSet().containsRootOrPatchOrOwnedCommit());
            assert.ok(!commitSetWithAnotherWebKitCommit().containsRootOrPatchOrOwnedCommit());
            assert.ok(!commitSetWithSVNCommit().containsRootOrPatchOrOwnedCommit());
            assert.ok(!anotherCommitSetWithSVNCommit().containsRootOrPatchOrOwnedCommit());
            assert.ok(!commitSetWithGitCommit().containsRootOrPatchOrOwnedCommit());
            assert.ok(!anotherCommitSetWithGitCommit().containsRootOrPatchOrOwnedCommit());
            assert.ok(!commitSetWithTwoCommits().containsRootOrPatchOrOwnedCommit());
            assert.ok(!anotherCommitSetWithTwoCommits().containsRootOrPatchOrOwnedCommit());
            assert.ok(!oneMeasurementCommitSet().containsRootOrPatchOrOwnedCommit());
        });

        it('should return true if commit contains root, patch or owned commit', () => {
            assert.ok(commitSetWithPatch().containsRootOrPatchOrOwnedCommit());
            assert.ok(commitSetWithAnotherPatch().containsRootOrPatchOrOwnedCommit());
            assert.ok(commitSetWithRoot().containsRootOrPatchOrOwnedCommit());
            assert.ok(anotherCommitSetWithRoot().containsRootOrPatchOrOwnedCommit());
            assert.ok(commitSetWithTwoRoots().containsRootOrPatchOrOwnedCommit());
            assert.ok(commitSetWithAnotherCommitPatchAndRoot().containsRootOrPatchOrOwnedCommit());
        });
    });

    describe('hasSameRepositories', () => {
        it('should return true if two commit sets have same repositories', () => {
            assert.ok(oneCommitSet().hasSameRepositories(anotherCommitSet()));
            assert.ok(commitSetWithGitCommit().hasSameRepositories(anotherCommitSetWithGitCommit()));
            assert.ok(oneCommitSet().hasSameRepositories(oneCommitSet()));
        });

        it('should return false if two commit sets have differen repositories', () => {
            assert.ok(!commitSetWithGitCommit().hasSameRepositories(commitSetWithSVNCommit()));
            assert.ok(!commitSetWithTwoCommits().hasSameRepositories(commitSetWithGitCommit()));
        });
    });

    describe('diff',  () => {
        it('should describe patch difference', () => {
            assert.equal(CommitSet.diff(commitSetWithPatch(), commitSetWithAnotherPatch()), 'WebKit: patch.dat - patch.dat (2)');
        });

        it('should describe root difference', () => {
            assert.equal(CommitSet.diff(commitSetWithRoot(), anotherCommitSetWithRoot()), 'Roots: root.dat - root.dat (2)');
            assert.equal(CommitSet.diff(commitSetWithRoot(), commitSetWithTwoRoots()), 'Roots: none - root.dat');
            assert.equal(CommitSet.diff(commitSetWithTwoRoots(), oneCommitSet()), 'Roots: root.dat, root.dat (2) - none');
        });

        it('should describe commit difference', () => {
            assert.equal(CommitSet.diff(oneCommitSet(), commitSetWithAnotherWebKitCommit()), 'WebKit: webkit-commit-0 - webkit-commit-1');
            assert.equal(CommitSet.diff(commitSetWithSVNCommit(), anotherCommitSetWithSVNCommit()), 'WebKit: r12345-r45678');
            assert.equal(CommitSet.diff(commitSetWithGitCommit(), anotherCommitSetWithGitCommit()), 'WebKit-Git: 13a0590d34f2..2f8dd3321d4f');
            assert.equal(CommitSet.diff(commitSetWithTwoCommits(), anotherCommitSetWithTwoCommits()), 'WebKit: r12345-r45678 WebKit-Git: 13a0590d34f2..2f8dd3321d4f');
        });

        it('should describe commit root and patch difference', () => {
            assert.equal(CommitSet.diff(oneCommitSet(), commitSetWithAnotherCommitPatchAndRoot()), 'WebKit: webkit-commit-0 with none - webkit-commit-1 with patch.dat Roots: none - root.dat, root.dat (2)');
        });
    });

    describe('revisionSetsFromCommitSets', () => {
        it('should create revision sets from commit sets', () => {
            assert.deepEqual(CommitSet.revisionSetsFromCommitSets([oneCommitSet(), commitSetWithRoot(), commitSetWithTwoRoots()]),
                [{'11': { revision: 'webkit-commit-0', ownerRevision: null, patch: null}},
                    {'11': { revision: 'webkit-commit-0', ownerRevision: null, patch: null}, customRoots: [456]},
                    {'11': { revision: 'webkit-commit-0', ownerRevision: null, patch: null}, customRoots: [456, 458]}]);
        });
    });

    describe('commitsWithTestability', () => {
        it('should return commits with testability', () => {
            const commits = commitSetWithTestability().commitsWithTestability();
            assert.equal(commits.length, 1);
            assert.equal(commits[0], commitWithTestability());
        });

        it('should return empty list if no commit in commit set contains testability', () => {
            const commits = commitSetWithTwoCommits().commitsWithTestability();
            assert.equal(commits.length, 0);
        });
    });

    describe('commits', () => {
        it('should return all commits in commit set', () => {
            assert.equal(commitSetWithTwoCommits().commits().length, 2);
        });
    });

    describe('areAllRootsAvailable', () => {
        it('should return false if any non-custom root is deleted', () => {
            const deletedBuiltRoot = createRoot(new Date());
            const commitSet = commitSetWithRoots(deletedBuiltRoot);
            assert.ok(!commitSet.areAllRootsAvailable(0))
        });

        it('should return true if a custom root is deleted', () => {
            const buildRoot = createRoot();
            const deletedRoot = createAnotherRoot(new Date());
            const commitSet = commitSetWithRoots(buildRoot, deletedRoot);
            assert.ok(commitSet.areAllRootsAvailable(0))
        });

        it('should return false if root is created before the earliest creation time', () => {
            const buildRoot = createRoot();
            const commitSet = commitSetWithRoots(buildRoot);
            assert.ok(!commitSet.areAllRootsAvailable(Date.now()))
        });
    });
});

describe('IntermediateCommitSet', () => {
    MockRemoteAPI.inject(null, BrowserPrivilegedAPI);
    MockModels.inject();

    describe('setCommitForRepository', () => {
        it('should allow set commit for owner repository', () => {
            const commitSet = new IntermediateCommitSet(new CommitSet);
            const commit = ownerCommit();
            commitSet.setCommitForRepository(MockModels.ownerRepository, commit);
            assert.equal(commit, commitSet.commitForRepository(MockModels.ownerRepository));
        });

        it('should allow set commit for owned repository', () => {
            const commitSet = new IntermediateCommitSet(new CommitSet);
            const commit = ownerCommit();

            const fetchingPromise = commit.fetchOwnedCommits();
            const requests = MockRemoteAPI.requests;
            assert.equal(requests.length, 1);
            assert.equal(requests[0].url, '../api/commits/111/owned-commits?owner-revision=owner-commit-0');
            assert.equal(requests[0].method, 'GET');

            requests[0].resolve({commits: [{
                id: 233,
                repository: MockModels.ownedRepository.id(),
                revision: '6f8b0dbbda95a440503b88db1dd03dad3a7b07fb',
                time: +(new Date('2016-05-13T00:55:57.841344Z')),
            }]});

            return fetchingPromise.then(() => {
                const ownedCommit = commit.ownedCommits()[0];
                commitSet.setCommitForRepository(MockModels.ownerRepository, commit);
                commitSet.setCommitForRepository(MockModels.ownedRepository, ownedCommit);
                assert.equal(commit, commitSet.commitForRepository(MockModels.ownerRepository));
                assert.equal(ownedCommit, commitSet.commitForRepository(MockModels.ownedRepository));
                assert.deepEqual(commitSet.repositories(), [MockModels.ownerRepository, MockModels.ownedRepository]);
            });
        });
    });

    describe('fetchCommitLogs', () => {

        it('should fetch CommitLog object with owned commits information',  () => {
            const commit = partialOwnerCommit();
            assert.equal(commit.ownsCommits(), null);
            const owned = ownedCommit();

            const commitSet = CommitSet.ensureSingleton('53246456', {revisionItems: [{commit}, {commit: owned, ownerCommit: commit}]});
            const intermediateCommitSet = new IntermediateCommitSet(commitSet);
            const fetchingPromise = intermediateCommitSet.fetchCommitLogs();

            const requests = MockRemoteAPI.requests;
            assert.equal(requests.length, 2);
            assert.equal(requests[0].url, '/api/commits/111/owner-commit-0?prefix-match=true');
            assert.equal(requests[0].method, 'GET');
            assert.equal(requests[1].url, '/api/commits/112/owned-commit-0?prefix-match=true');
            assert.equal(requests[1].method, 'GET');

            requests[0].resolve({commits: [{
                id: 5,
                repository: MockModels.ownerRepository.id(),
                revision: 'owner-commit-0',
                ownsCommits: true,
                time: +(new Date('2016-05-13T00:55:57.841344Z')),
            }]});
            requests[1].resolve({commits: [{
                id: 6,
                repository: MockModels.ownedRepository.id(),
                revision: 'owned-commit-0',
                ownsCommits: false,
                time: 1456932774000,
            }]});

            return MockRemoteAPI.waitForRequest().then(() => {
                assert.equal(requests.length, 3);
                assert.equal(requests[2].url, '../api/commits/111/owned-commits?owner-revision=owner-commit-0');
                assert.equal(requests[2].method, 'GET');

                requests[2].resolve({commits: [{
                    id: 6,
                    repository: MockModels.ownedRepository.id(),
                    revision: 'owned-commit-0',
                    ownsCommits: false,
                    time: 1456932774000,
                }]});
                return fetchingPromise;
            }).then(() => {
                assert(commit.ownsCommits());
                assert.equal(commit.ownedCommits().length, 1);
                assert.equal(commit.ownedCommits()[0], owned);
                assert.equal(owned.ownerCommit(), commit);
                assert.equal(owned.repository(), MockModels.ownedRepository);
                assert.equal(intermediateCommitSet.commitForRepository(MockModels.ownedRepository), owned);
                assert.equal(intermediateCommitSet.ownerCommitForRepository(MockModels.ownedRepository), commit);
                assert.deepEqual(intermediateCommitSet.repositories(), [MockModels.ownerRepository, MockModels.ownedRepository]);
            });
        });
    });

    describe('updateRevisionForOwnerRepository', () => {

        it('should update CommitSet based on the latest invocation', () => {
            const commitSet = new IntermediateCommitSet(new CommitSet);
            const firstUpdatePromise = commitSet.updateRevisionForOwnerRepository(MockModels.webkit, 'webkit-commit-0');
            const secondUpdatePromise = commitSet.updateRevisionForOwnerRepository(MockModels.webkit, 'webkit-commit-1');
            const requests = MockRemoteAPI.requests;

            assert(requests.length, 2);
            assert.equal(requests[0].url, '/api/commits/11/webkit-commit-0?prefix-match=true');
            assert.equal(requests[0].method, 'GET');
            assert.equal(requests[1].url, '/api/commits/11/webkit-commit-1?prefix-match=true');
            assert.equal(requests[1].method, 'GET');

            requests[1].resolve({commits: [{
                id: 2018,
                repository: MockModels.webkit.id(),
                revision: 'webkit-commit-1',
                ownsCommits: false,
                time: 1456932774000,
            }]});

            let commit = null;
            return secondUpdatePromise.then(() => {
                commit = commitSet.commitForRepository(MockModels.webkit);

                requests[0].resolve({commits: [{
                    id: 2017,
                    repository: MockModels.webkit.id(),
                    revision: 'webkit-commit-0',
                    ownsCommits: false,
                    time: 1456932773000,
                }]});

                assert.equal(commit.revision(), 'webkit-commit-1');
                assert.equal(commit.id(), 2018);

                return firstUpdatePromise;
            }).then(() => {
                const currentCommit = commitSet.commitForRepository(MockModels.webkit);
                assert.equal(commit, currentCommit);
            });
        });

    });

    describe('removeCommitForRepository', () => {
        it('should remove owned commits when owner commit is removed', () => {
            const commitSet = new IntermediateCommitSet(new CommitSet);
            const commit = ownerCommit();

            const fetchingPromise = commit.fetchOwnedCommits();
            const requests = MockRemoteAPI.requests;
            assert.equal(requests.length, 1);
            assert.equal(requests[0].url, '../api/commits/111/owned-commits?owner-revision=owner-commit-0');
            assert.equal(requests[0].method, 'GET');

            requests[0].resolve({commits: [{
                id: 233,
                repository: MockModels.ownedRepository.id(),
                revision: '6f8b0dbbda95a440503b88db1dd03dad3a7b07fb',
                ownsCommits: true
            }]});

            return fetchingPromise.then(() => {
                commitSet.setCommitForRepository(MockModels.ownerRepository, commit);
                commitSet.setCommitForRepository(MockModels.ownedRepository, commit.ownedCommits()[0]);
                commitSet.removeCommitForRepository(MockModels.ownerRepository);
                assert.deepEqual(commitSet.repositories(), []);
            });
        });

        it('should not remove owner commits when owned commit is removed', () => {
            const commitSet = new IntermediateCommitSet(new CommitSet);
            const commit = ownerCommit();

            const fetchingPromise = commit.fetchOwnedCommits();
            const requests = MockRemoteAPI.requests;
            assert.equal(requests.length, 1);
            assert.equal(requests[0].url, '../api/commits/111/owned-commits?owner-revision=owner-commit-0');
            assert.equal(requests[0].method, 'GET');

            requests[0].resolve({commits: [{
                id: 233,
                repository: MockModels.ownedRepository.id(),
                revision: '6f8b0dbbda95a440503b88db1dd03dad3a7b07fb',
                time: +(new Date('2016-05-13T00:55:57.841344Z')),
            }]});

            return fetchingPromise.then(() => {
                commitSet.setCommitForRepository(MockModels.ownerRepository, commit);
                commitSet.setCommitForRepository(MockModels.ownedRepository, commit.ownedCommits()[0]);
                commitSet.removeCommitForRepository(MockModels.ownedRepository);
                assert.deepEqual(commitSet.repositories(), [MockModels.ownerRepository]);
            });
        });

        it('should not update commit set for repository if removeCommitForRepository called before updateRevisionForOwnerRepository finishes', () => {
            const commitSet = new IntermediateCommitSet(new CommitSet);
            const commit = webkitCommit();
            commitSet.setCommitForRepository(MockModels.webkit, commit);
            const updatePromise = commitSet.updateRevisionForOwnerRepository(MockModels.webkit, 'webkit-commit-1');

            commitSet.removeCommitForRepository(MockModels.webkit);

            const requests = MockRemoteAPI.requests;
            assert.equal(requests[0].url, '/api/commits/11/webkit-commit-1?prefix-match=true');
            assert.equal(requests[0].method, 'GET');

            requests[0].resolve({commits: [{
                id: 2018,
                repository: MockModels.webkit.id(),
                revision: 'webkit-commit-1',
                ownsCommits: false,
                time: 1456932774000,
            }]});

            return updatePromise.then(() => {
                assert.deepEqual(commitSet.repositories(), []);
                assert(!commitSet.commitForRepository(MockModels.webkit));
            });
        });
    });
});

describe('CustomCommitSet', () => {
    MockModels.inject();

    describe('Test custom commit set without owned commit', () => {
        it('should have right revision for a given repository', () => {
            const commitSet = customCommitSetWithoutOwnedCommit();
            assert.equal(commitSet.revisionForRepository(MockModels.osx), '10.11.4 15E65');
            assert.equal(commitSet.revisionForRepository(MockModels.webkit), '200805');
        });

        it('should have no patch for any repository', () => {
            const commitSet = customCommitSetWithoutOwnedCommit();
            assert.equal(commitSet.patchForRepository(MockModels.osx), null);
            assert.equal(commitSet.patchForRepository(MockModels.webkit), null);
        });

        it('should have no owner revision for a given repository', () => {
            const commitSet = customCommitSetWithoutOwnedCommit();
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.osx), null);
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.webkit), null);
        });

        it('should return all repositories in it', () => {
            const commitSet = customCommitSetWithoutOwnedCommit();
            assert.deepEqual(commitSet.repositories(), [MockModels.osx, MockModels.webkit]);
        });

        it('should return only top level repositories', () => {
            const commitSet = customCommitSetWithoutOwnedCommit();
            assert.deepEqual(commitSet.topLevelRepositories(), [MockModels.osx, MockModels.webkit]);
        });
    });

    describe('Test custom commit set with owned commit', () => {
        it('should have right revision for a given repository', () => {
            const commitSet = customCommitSetWithOwnedCommit();
            assert.equal(commitSet.revisionForRepository(MockModels.osx), '10.11.4 15E65');
            assert.equal(commitSet.revisionForRepository(MockModels.ownerRepository), 'OwnerRepository-r0');
            assert.equal(commitSet.revisionForRepository(MockModels.ownedRepository), 'OwnedRepository-r0');
        });

        it('should have no patch for any repository', () => {
            const commitSet = customCommitSetWithOwnedCommit();
            assert.equal(commitSet.patchForRepository(MockModels.osx), null);
            assert.equal(commitSet.patchForRepository(MockModels.ownerRepository), null);
            assert.equal(commitSet.patchForRepository(MockModels.ownedRepository), null);
        });

        it('should have right owner revision for an owned repository', () => {
            const commitSet = customCommitSetWithOwnedCommit();
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.osx), null);
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.ownerRepository), null);
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.ownedRepository), 'OwnerRepository-r0');
        });

        it('should return all repositories in it', () => {
            const commitSet = customCommitSetWithOwnedCommit();
            assert.deepEqual(commitSet.repositories(), [MockModels.osx, MockModels.ownerRepository, MockModels.ownedRepository]);
        });

        it('should return only top level repositories', () => {
            const commitSet = customCommitSetWithOwnedCommit();
            assert.deepEqual(commitSet.topLevelRepositories(), [MockModels.osx, MockModels.ownerRepository]);
        });
    });

    describe('Test custom commit set with patch', () => {
        it('should have right revision for a given repository', () => {
            const commitSet = customCommitSetWithPatch();
            assert.equal(commitSet.revisionForRepository(MockModels.osx), '10.11.4 15E65');
            assert.equal(commitSet.revisionForRepository(MockModels.webkit), '200805');
        });

        it('should have a patch for a repository with patch specified', () => {
            const commitSet = customCommitSetWithPatch();
            assert.equal(commitSet.patchForRepository(MockModels.osx), null);
            assert.deepEqual(commitSet.patchForRepository(MockModels.webkit), createPatch());
        });

        it('should have no owner revision for a given repository', () => {
            const commitSet = customCommitSetWithPatch();
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.osx), null);
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.webkit), null);
        });

        it('should return all repositories in it', () => {
            const commitSet = customCommitSetWithPatch();
            assert.deepEqual(commitSet.repositories(), [MockModels.osx, MockModels.webkit]);
        });

        it('should return only top level repositories', () => {
            const commitSet = customCommitSetWithPatch();
            assert.deepEqual(commitSet.topLevelRepositories(), [MockModels.osx, MockModels.webkit]);
        });
    });

    describe('Test custom commit set with owned repository has same name as non-owned repository',  () => {
        it('should have right revision for a given repository', () => {
            const commitSet = customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository();
            assert.equal(commitSet.revisionForRepository(MockModels.osx), '10.11.4 15E65');
            assert.equal(commitSet.revisionForRepository(MockModels.webkit), '200805');
            assert.equal(commitSet.revisionForRepository(MockModels.ownedWebkit), 'owned-200805');
        });

        it('should have no patch for any repository', () => {
            const commitSet = customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository();
            assert.equal(commitSet.patchForRepository(MockModels.osx), null);
            assert.equal(commitSet.patchForRepository(MockModels.webkit), null);
            assert.equal(commitSet.patchForRepository(MockModels.ownedWebkit), null);
        });

        it('should have right owner revision for an owned repository', () => {
            const commitSet = customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository();
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.osx), null);
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.webkit), null);
            assert.equal(commitSet.ownerRevisionForRepository(MockModels.ownedWebkit), '10.11.4 15E65');
        });

        it('should return all repositories in it', () => {
            const commitSet = customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository();
            assert.deepEqual(commitSet.repositories(), [MockModels.osx, MockModels.webkit, MockModels.ownedWebkit]);
        });

        it('should return only top level repositories', () => {
            const commitSet = customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository();
            assert.deepEqual(commitSet.topLevelRepositories(), [MockModels.osx, MockModels.webkit]);
        });
    });

    describe('Test custom commit set equality function', () => {
        it('should be equal to same custom commit set', () => {
            assert.deepEqual(customCommitSetWithoutOwnedCommit(), customCommitSetWithoutOwnedCommit());
            assert.deepEqual(customCommitSetWithOwnedCommit(), customCommitSetWithOwnedCommit());
            assert.deepEqual(customCommitSetWithPatch(), customCommitSetWithPatch());
            assert.deepEqual(customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository(),
                customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository());
        });

        it('should not be equal even if non-owned revisions are the same', () => {
            const commitSet0 = customCommitSetWithoutOwnedCommit();
            const commitSet1 = customCommitSetWithOwnedRepositoryHasSameNameAsNotOwnedRepository();
            assert.equal(commitSet0.equals(commitSet1), false);
        });
    });

    describe('Test custom commit set custom root operations', () => {
        it('should return empty custom roots if no custom root specified', () => {
            assert.deepEqual(customCommitSetWithoutOwnedCommit().customRoots(), []);
        });

        it('should return root if root is added into commit set', () => {
            const commitSet = customCommitSetWithoutOwnedCommit();
            commitSet.addCustomRoot(createRoot());
            assert.deepEqual(commitSet.customRoots(), [createRoot()]);
        });
    });
});
