| /** |
| * @license |
| * Copyright 2023 Google LLC |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| import '../../test/common-test-setup'; |
| import {getAppContext} from '../../services/app-context'; |
| import {ChangeModel, changeModelToken} from '../change/change-model'; |
| import {assert} from '@open-wc/testing'; |
| import {testResolver} from '../../test/common-test-setup'; |
| import {RelatedChangesModel} from './related-changes-model'; |
| import {configModelToken} from '../config/config-model'; |
| import {SinonStub} from 'sinon'; |
| import { |
| ChangeInfo, |
| RelatedChangesInfo, |
| SubmittedTogetherInfo, |
| } from '../../types/common'; |
| import {stubRestApi, waitUntilObserved} from '../../test/test-utils'; |
| import { |
| createParsedChange, |
| createRelatedChangesInfo, |
| createRelatedChangeAndCommitInfo, |
| createChange, |
| createChangeMessage, |
| } from '../../test/test-data-generators'; |
| import {ChangeStatus, ReviewInputTag, TopicName} from '../../api/rest-api'; |
| import {MessageTag} from '../../constants/constants'; |
| |
| suite('related-changes-model tests', () => { |
| let model: RelatedChangesModel; |
| let changeModel: ChangeModel; |
| |
| setup(async () => { |
| changeModel = testResolver(changeModelToken); |
| model = new RelatedChangesModel( |
| changeModel, |
| testResolver(configModelToken), |
| getAppContext().restApiService |
| ); |
| await waitUntilObserved(changeModel.change$, c => c === undefined); |
| }); |
| |
| teardown(() => { |
| model.finalize(); |
| }); |
| |
| test('register and fetch', async () => { |
| assert.equal('', ''); |
| }); |
| |
| suite('related changes and hasParent', async () => { |
| let getRelatedChangesStub: SinonStub; |
| let getRelatedChangesResponse: RelatedChangesInfo; |
| let hasParent: boolean | undefined; |
| |
| setup(() => { |
| getRelatedChangesStub = stubRestApi('getRelatedChanges').callsFake(() => |
| Promise.resolve(getRelatedChangesResponse) |
| ); |
| model.hasParent$.subscribe(x => (hasParent = x)); |
| }); |
| |
| test('relatedChanges initially undefined', async () => { |
| await waitUntilObserved( |
| model.relatedChanges$, |
| relatedChanges => relatedChanges === undefined |
| ); |
| assert.isFalse(getRelatedChangesStub.called); |
| assert.isUndefined(hasParent); |
| }); |
| |
| test('relatedChanges loading empty', async () => { |
| changeModel.updateStateChange({...createParsedChange()}); |
| |
| await waitUntilObserved( |
| model.relatedChanges$, |
| relatedChanges => relatedChanges?.length === 0 |
| ); |
| assert.isTrue(getRelatedChangesStub.calledOnce); |
| assert.isFalse(hasParent); |
| }); |
| |
| test('relatedChanges loading one change', async () => { |
| getRelatedChangesResponse = { |
| ...createRelatedChangesInfo(), |
| changes: [createRelatedChangeAndCommitInfo()], |
| }; |
| changeModel.updateStateChange({...createParsedChange()}); |
| |
| await waitUntilObserved( |
| model.relatedChanges$, |
| relatedChanges => relatedChanges?.length === 1 |
| ); |
| assert.isTrue(getRelatedChangesStub.calledOnce); |
| assert.isTrue(hasParent); |
| }); |
| }); |
| |
| suite('loadSubmittedTogether', async () => { |
| let getChangesSubmittedTogetherStub: SinonStub; |
| let getChangesSubmittedTogetherResponse: SubmittedTogetherInfo; |
| |
| setup(() => { |
| getChangesSubmittedTogetherStub = stubRestApi( |
| 'getChangesSubmittedTogether' |
| ).callsFake(() => Promise.resolve(getChangesSubmittedTogetherResponse)); |
| }); |
| |
| test('submittedTogether initially undefined', async () => { |
| await waitUntilObserved( |
| model.submittedTogether$, |
| submittedTogether => submittedTogether === undefined |
| ); |
| assert.isFalse(getChangesSubmittedTogetherStub.called); |
| }); |
| |
| test('submittedTogether emits', async () => { |
| getChangesSubmittedTogetherResponse = { |
| changes: [createChange()], |
| non_visible_changes: 0, |
| }; |
| changeModel.updateStateChange({...createParsedChange()}); |
| |
| await waitUntilObserved( |
| model.submittedTogether$, |
| submittedTogether => submittedTogether?.changes?.length === 1 |
| ); |
| assert.isTrue(getChangesSubmittedTogetherStub.calledOnce); |
| }); |
| }); |
| |
| suite('loadCherryPicks', async () => { |
| let getChangeCherryPicksStub: SinonStub; |
| let getChangeCherryPicksResponse: ChangeInfo[]; |
| |
| setup(() => { |
| getChangeCherryPicksStub = stubRestApi('getChangeCherryPicks').callsFake( |
| () => Promise.resolve(getChangeCherryPicksResponse) |
| ); |
| }); |
| |
| test('cherryPicks initially undefined', async () => { |
| await waitUntilObserved( |
| model.cherryPicks$, |
| cherryPicks => cherryPicks === undefined |
| ); |
| assert.isFalse(getChangeCherryPicksStub.called); |
| }); |
| |
| test('cherryPicks emits', async () => { |
| getChangeCherryPicksResponse = [createChange()]; |
| changeModel.updateStateChange({...createParsedChange()}); |
| |
| await waitUntilObserved( |
| model.cherryPicks$, |
| cherryPicks => cherryPicks?.length === 1 |
| ); |
| assert.isTrue(getChangeCherryPicksStub.calledOnce); |
| }); |
| }); |
| |
| suite('loadConflictingChanges', async () => { |
| let getChangeConflictsStub: SinonStub; |
| let getChangeConflictsResponse: ChangeInfo[]; |
| |
| setup(() => { |
| getChangeConflictsStub = stubRestApi('getChangeConflicts').callsFake(() => |
| Promise.resolve(getChangeConflictsResponse) |
| ); |
| }); |
| |
| test('conflictingChanges initially undefined', async () => { |
| await waitUntilObserved( |
| model.conflictingChanges$, |
| conflictingChanges => conflictingChanges === undefined |
| ); |
| assert.isFalse(getChangeConflictsStub.called); |
| }); |
| |
| test('conflictingChanges not loaded for merged changes', async () => { |
| getChangeConflictsResponse = [createChange()]; |
| changeModel.updateStateChange({ |
| ...createParsedChange(), |
| mergeable: true, |
| status: ChangeStatus.MERGED, |
| }); |
| |
| await waitUntilObserved( |
| model.conflictingChanges$, |
| conflictingChanges => conflictingChanges === undefined |
| ); |
| assert.isFalse(getChangeConflictsStub.called); |
| }); |
| |
| test('conflictingChanges emits', async () => { |
| getChangeConflictsResponse = [createChange()]; |
| changeModel.updateStateChange({...createParsedChange(), mergeable: true}); |
| |
| await waitUntilObserved( |
| model.conflictingChanges$, |
| conflictingChanges => conflictingChanges?.length === 1 |
| ); |
| assert.isTrue(getChangeConflictsStub.calledOnce); |
| }); |
| }); |
| |
| suite('loadSameTopicChanges', async () => { |
| let getChangesWithSameTopicStub: SinonStub; |
| let getChangesWithSameTopicResponse: ChangeInfo[]; |
| |
| setup(() => { |
| getChangesWithSameTopicStub = stubRestApi( |
| 'getChangesWithSameTopic' |
| ).callsFake(() => Promise.resolve(getChangesWithSameTopicResponse)); |
| }); |
| |
| test('sameTopicChanges initially undefined', async () => { |
| await waitUntilObserved( |
| model.sameTopicChanges$, |
| sameTopicChanges => sameTopicChanges === undefined |
| ); |
| assert.isFalse(getChangesWithSameTopicStub.called); |
| }); |
| |
| test('sameTopicChanges emits', async () => { |
| getChangesWithSameTopicResponse = [createChange()]; |
| changeModel.updateStateChange({ |
| ...createParsedChange(), |
| topic: 'test-topic' as TopicName, |
| }); |
| |
| await waitUntilObserved( |
| model.sameTopicChanges$, |
| sameTopicChanges => sameTopicChanges?.length === 1 |
| ); |
| assert.isTrue(getChangesWithSameTopicStub.calledOnce); |
| }); |
| }); |
| |
| suite('loadRevertingChanges', async () => { |
| let getChangeStub: SinonStub; |
| |
| setup(() => { |
| getChangeStub = stubRestApi('getChange').callsFake(() => |
| Promise.resolve(createChange()) |
| ); |
| }); |
| |
| test('revertingChanges initially empty', async () => { |
| await waitUntilObserved( |
| model.revertingChanges$, |
| revertingChanges => revertingChanges.length === 0 |
| ); |
| assert.isFalse(getChangeStub.called); |
| }); |
| |
| test('revertingChanges empty when change does not contain a revert message', async () => { |
| changeModel.updateStateChange(createParsedChange()); |
| await waitUntilObserved( |
| model.revertingChanges$, |
| revertingChanges => revertingChanges.length === 0 |
| ); |
| assert.isFalse(getChangeStub.called); |
| }); |
| |
| test('revertingChanges emits', async () => { |
| changeModel.updateStateChange({ |
| ...createParsedChange(), |
| messages: [ |
| { |
| ...createChangeMessage(), |
| message: 'Created a revert of this change as 123', |
| tag: MessageTag.TAG_REVERT as ReviewInputTag, |
| }, |
| ], |
| }); |
| |
| await waitUntilObserved( |
| model.revertingChanges$, |
| revertingChanges => revertingChanges?.length === 1 |
| ); |
| assert.isTrue(getChangeStub.calledOnce); |
| }); |
| }); |
| }); |