| <!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> |