import MockAdapter from 'axios-mock-adapter'; import axios from '~/lib/utils/axios_utils'; import store from '~/ide/stores'; import actions, { getMergeRequestData, getMergeRequestChanges, getMergeRequestVersions, openMergeRequest, } from '~/ide/stores/actions/merge_request'; import service from '~/ide/services'; import { activityBarViews } from '~/ide/constants'; import { resetStore } from '../../helpers'; describe('IDE store merge request actions', () => { let mock; beforeEach(() => { mock = new MockAdapter(axios); store.state.projects.abcproject = { mergeRequests: {}, }; }); afterEach(() => { mock.restore(); resetStore(store); }); describe('getMergeRequestData', () => { describe('success', () => { beforeEach(() => { spyOn(service, 'getProjectMergeRequestData').and.callThrough(); mock .onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1/) .reply(200, { title: 'mergerequest' }); }); it('calls getProjectMergeRequestData service method', done => { store .dispatch('getMergeRequestData', { projectId: 'abcproject', mergeRequestId: 1 }) .then(() => { expect(service.getProjectMergeRequestData).toHaveBeenCalledWith('abcproject', 1, { render_html: true, }); done(); }) .catch(done.fail); }); it('sets the Merge Request Object', done => { store .dispatch('getMergeRequestData', { projectId: 'abcproject', mergeRequestId: 1 }) .then(() => { expect(store.state.projects.abcproject.mergeRequests['1'].title).toBe('mergerequest'); expect(store.state.currentMergeRequestId).toBe(1); done(); }) .catch(done.fail); }); }); describe('error', () => { beforeEach(() => { mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1/).networkError(); }); it('dispatches error action', done => { const dispatch = jasmine.createSpy('dispatch'); getMergeRequestData( { commit() {}, dispatch, state: store.state, }, { projectId: 'abcproject', mergeRequestId: 1 }, ) .then(done.fail) .catch(() => { expect(dispatch).toHaveBeenCalledWith('setErrorMessage', { text: 'An error occured whilst loading the merge request.', action: jasmine.any(Function), actionText: 'Please try again', actionPayload: { projectId: 'abcproject', mergeRequestId: 1, force: false, }, }); done(); }); }); }); }); describe('getMergeRequestChanges', () => { beforeEach(() => { store.state.projects.abcproject.mergeRequests['1'] = { changes: [] }; }); describe('success', () => { beforeEach(() => { spyOn(service, 'getProjectMergeRequestChanges').and.callThrough(); mock .onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1\/changes/) .reply(200, { title: 'mergerequest' }); }); it('calls getProjectMergeRequestChanges service method', done => { store .dispatch('getMergeRequestChanges', { projectId: 'abcproject', mergeRequestId: 1 }) .then(() => { expect(service.getProjectMergeRequestChanges).toHaveBeenCalledWith('abcproject', 1); done(); }) .catch(done.fail); }); it('sets the Merge Request Changes Object', done => { store .dispatch('getMergeRequestChanges', { projectId: 'abcproject', mergeRequestId: 1 }) .then(() => { expect(store.state.projects.abcproject.mergeRequests['1'].changes.title).toBe( 'mergerequest', ); done(); }) .catch(done.fail); }); }); describe('error', () => { beforeEach(() => { mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1\/changes/).networkError(); }); it('dispatches error action', done => { const dispatch = jasmine.createSpy('dispatch'); getMergeRequestChanges( { commit() {}, dispatch, state: store.state, }, { projectId: 'abcproject', mergeRequestId: 1 }, ) .then(done.fail) .catch(() => { expect(dispatch).toHaveBeenCalledWith('setErrorMessage', { text: 'An error occured whilst loading the merge request changes.', action: jasmine.any(Function), actionText: 'Please try again', actionPayload: { projectId: 'abcproject', mergeRequestId: 1, force: false, }, }); done(); }); }); }); }); describe('getMergeRequestVersions', () => { beforeEach(() => { store.state.projects.abcproject.mergeRequests['1'] = { versions: [] }; }); describe('success', () => { beforeEach(() => { mock .onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1\/versions/) .reply(200, [{ id: 789 }]); spyOn(service, 'getProjectMergeRequestVersions').and.callThrough(); }); it('calls getProjectMergeRequestVersions service method', done => { store .dispatch('getMergeRequestVersions', { projectId: 'abcproject', mergeRequestId: 1 }) .then(() => { expect(service.getProjectMergeRequestVersions).toHaveBeenCalledWith('abcproject', 1); done(); }) .catch(done.fail); }); it('sets the Merge Request Versions Object', done => { store .dispatch('getMergeRequestVersions', { projectId: 'abcproject', mergeRequestId: 1 }) .then(() => { expect(store.state.projects.abcproject.mergeRequests['1'].versions.length).toBe(1); done(); }) .catch(done.fail); }); }); describe('error', () => { beforeEach(() => { mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1\/versions/).networkError(); }); it('dispatches error action', done => { const dispatch = jasmine.createSpy('dispatch'); getMergeRequestVersions( { commit() {}, dispatch, state: store.state, }, { projectId: 'abcproject', mergeRequestId: 1 }, ) .then(done.fail) .catch(() => { expect(dispatch).toHaveBeenCalledWith('setErrorMessage', { text: 'An error occured whilst loading the merge request version data.', action: jasmine.any(Function), actionText: 'Please try again', actionPayload: { projectId: 'abcproject', mergeRequestId: 1, force: false, }, }); done(); }); }); }); }); describe('openMergeRequest', () => { const mr = { projectId: 'abcproject', targetProjectId: 'defproject', mergeRequestId: 2, }; let testMergeRequest; let testMergeRequestChanges; beforeEach(() => { testMergeRequest = { source_branch: 'abcbranch', }; testMergeRequestChanges = { changes: [], }; store.state.entries = { foo: {}, bar: {}, }; spyOn(store, 'dispatch').and.callFake(type => { switch (type) { case 'getMergeRequestData': return Promise.resolve(testMergeRequest); case 'getMergeRequestChanges': return Promise.resolve(testMergeRequestChanges); default: return Promise.resolve(); } }); }); it('dispatch actions for merge request data', done => { openMergeRequest(store, mr) .then(() => { expect(store.dispatch.calls.allArgs()).toEqual([ ['getMergeRequestData', mr], ['setCurrentBranchId', testMergeRequest.source_branch], [ 'getBranchData', { projectId: mr.projectId, branchId: testMergeRequest.source_branch, }, ], [ 'getFiles', { projectId: mr.projectId, branchId: testMergeRequest.source_branch, }, ], ['getMergeRequestVersions', mr], ['getMergeRequestChanges', mr], ]); }) .then(done) .catch(done.fail); }); it('updates activity bar view and gets file data, if changes are found', done => { testMergeRequestChanges.changes = [{ new_path: 'foo' }, { new_path: 'bar' }]; openMergeRequest(store, mr) .then(() => { expect(store.dispatch).toHaveBeenCalledWith( 'updateActivityBarView', activityBarViews.review, ); testMergeRequestChanges.changes.forEach((change, i) => { expect(store.dispatch).toHaveBeenCalledWith('setFileMrChange', { file: store.state.entries[change.new_path], mrChange: change, }); expect(store.dispatch).toHaveBeenCalledWith('getFileData', { path: change.new_path, makeFileActive: i === 0, }); }); }) .then(done) .catch(done.fail); }); it('flashes message, if error', done => { const flashSpy = spyOnDependency(actions, 'flash'); store.dispatch.and.returnValue(Promise.reject()); openMergeRequest(store, mr) .then(() => { fail('Expected openMergeRequest to throw an error'); }) .catch(() => { expect(flashSpy).toHaveBeenCalledWith(jasmine.any(String)); }) .then(done) .catch(done.fail); }); }); });