<!DOCTYPE html>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">

<script src="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>
<script src="../node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script>
<script src="../bower_components/web-component-tester/browser.js"></script>

<title>code owners service test</title>

<script type="module">
  import '../test/common-test-setup.js';
  import {CodeOwnerService} from './code-owners-service.js';

  suite('code owners service tests', () => {
    let sandbox;
    let codeOwnersService;
    const fakeRestApi = {
      get() {
        return Promise.resolve({});
      },
      getLoggedIn() {
        return Promise.resolve(undefined);
      },
    };
    const getApiStub = sinon.stub(fakeRestApi, 'get');
    getApiStub.returns(Promise.resolve({}));
    const fakeStatus = {
      // fake data with fake files
      patch_set_number: 1,
      file_code_owner_statuses: [
        {
          new_path_status: {
            path: 'a.js',
            status: 'INSUFFICIENT_REVIEWERS',
          },
        },
        {
          new_path_status: {
            path: 'b.js',
            status: 'INSUFFICIENT_REVIEWERS',
          },
        },
        {
          new_path_status: {
            path: 'c.ts',
            status: 'INSUFFICIENT_REVIEWERS',
          },
        },
        {
          change_type: 'RENAMED',
          old_path_status: {
            path: 'd.ts',
            status: 'INSUFFICIENT_REVIEWERS',
          },
          new_path_status: {
            path: 'd_edit.ts',
            status: 'INSUFFICIENT_REVIEWERS',
          },
        },
        {
          new_path_status: {
            path: 'e.ts',
            status: 'PENDING',
          },
        },
        {
          new_path_status: {
            path: 'f.ts',
            status: 'PENDING',
          },
        },
        {
          new_path_status: {
            path: 'g.ts',
            status: 'PENDING',
          },
        },
      ],
    };
    const fakeChange = {
      project: 'test',
      branch: 'main',
      _number: '123',
      revisions: {
        a: {
          _number: 1,
        },
      },
      current_revision: 'a',
    };

    setup(() => {
      sandbox = sinon.sandbox.create();
      getApiStub.reset();
    });

    teardown(() => { sandbox.restore(); });

    suite('basic api request tests', () => {
      setup(done => {
        getApiStub.withArgs(`/changes/${fakeChange._number}/code_owners.status`)
            .returns(Promise.resolve(fakeStatus));
        codeOwnersService = CodeOwnerService.getOwnerService(fakeRestApi,
            {...fakeChange});
        flush(done);
      });

      test('getOwnerService - same change returns the same instance', () => {
        assert.equal(
            CodeOwnerService.getOwnerService(fakeRestApi, fakeChange),
            CodeOwnerService.getOwnerService(fakeRestApi, fakeChange)
        );
      });

      test('return a new instance when change changed', () => {
        assert.notEqual(
            CodeOwnerService.getOwnerService(fakeRestApi, {...fakeChange}),
            CodeOwnerService.getOwnerService(fakeRestApi, {...fakeChange})
        );
      });

      test('should fetch status after init', () => {
        assert.isTrue(getApiStub.calledOnce);
        assert.equal(getApiStub.lastCall.args[0],
            `/changes/${fakeChange._number}/code_owners.status`);
      });

      test('getSuggestion should kickoff the fetch', done => {
        codeOwnersService.getSuggestedOwners().then(r => {
          // 6 requests for getting file owners + 1 status call
          assert.equal(getApiStub.callCount, 7);
          assert.equal(r.finished, false);
          flush(() => {
            assert.equal(getApiStub.callCount, 9);
            done();
          });
        });
      });

      test('approved status calculation', done => {
        codeOwnersService.areAllFilesApproved().then(approved => {
          assert.equal(approved, false);
          done();
        });
      });
    });

    suite('all approved case', () => {
      setup(done => {
        getApiStub.withArgs(`/changes/${fakeChange._number}/code_owners.status`)
            .returns(Promise.resolve({
              // fake data with fake files
              patch_set_number: 1,
              file_code_owner_statuses: [
                {
                  new_path_status: {
                    path: 'a.js',
                    status: 'APPROVED',
                  },
                },
                {
                  new_path_status: {
                    path: 'b.js',
                    status: 'APPROVED',
                  },
                },
                {
                  old_path_status: {
                    path: 'd.js',
                    status: 'APPROVED',
                  },
                  change_type: 'DELETED',
                },
              ],
            }));

        codeOwnersService = CodeOwnerService.getOwnerService(fakeRestApi,
            {...fakeChange});
        flush(done);
      });

      test('getSuggestion and finished in first batch', done => {
        codeOwnersService.getSuggestedOwners().then(r => {
          // 1 status call
          assert.equal(getApiStub.callCount, 1);
          // initially false as getSuggestedOwners is synchrously
          assert.equal(r.finished, false);
          codeOwnersService.getSuggestedOwners().then(nR => {
            assert.equal(nR.finished, true);
            done();
          });
        });
      });

      test('approved status calculation', done => {
        codeOwnersService.areAllFilesApproved().then(approved => {
          assert.equal(approved, true);
          done();
        });
      });
    });

    suite('abort', () => {
      setup(done => {
        getApiStub.withArgs(`/changes/${fakeChange._number}/code_owners.status`)
            .returns(Promise.resolve(fakeStatus));

        codeOwnersService = CodeOwnerService.getOwnerService(fakeRestApi,
            {...fakeChange});
        flush(done);
      });

      test('abort should abort pending requests', done => {
        codeOwnersService.getSuggestedOwners().then(r => {
          // 6 requests for getting file owners + 1 status call
          assert.equal(getApiStub.callCount, 7);
          assert.equal(r.finished, false);
          codeOwnersService.abort();
          flush(() => {
            // should still at 7 since aborted
            assert.equal(getApiStub.callCount, 7);
            done();
          });
        });
      });

      test('getSuggestedOwners should restart if aborted', done => {
        codeOwnersService.abort();
        codeOwnersService.getSuggestedOwners().then(r => {
          // 6 requests for getting file owners + 1 status call
          assert.equal(getApiStub.callCount, 7);
          assert.equal(r.finished, false);
          codeOwnersService.abort();
          flush(() => {
            codeOwnersService.getSuggestedOwners().then(r => {
              // should at 13 since restarted
              assert.equal(getApiStub.callCount, 13);
              done();
            });
          });
        });
      });
    });
  });
</script>
