summaryrefslogtreecommitdiff
path: root/spec/frontend/cycle_analytics/store/actions_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/cycle_analytics/store/actions_spec.js')
-rw-r--r--spec/frontend/cycle_analytics/store/actions_spec.js130
1 files changed, 130 insertions, 0 deletions
diff --git a/spec/frontend/cycle_analytics/store/actions_spec.js b/spec/frontend/cycle_analytics/store/actions_spec.js
new file mode 100644
index 00000000000..630c5100754
--- /dev/null
+++ b/spec/frontend/cycle_analytics/store/actions_spec.js
@@ -0,0 +1,130 @@
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import testAction from 'helpers/vuex_action_helper';
+import * as actions from '~/cycle_analytics/store/actions';
+import httpStatusCodes from '~/lib/utils/http_status';
+import { selectedStage } from '../mock_data';
+
+const mockRequestPath = 'some/cool/path';
+const mockStartDate = 30;
+
+describe('Project Value Stream Analytics actions', () => {
+ let state;
+ let mock;
+
+ beforeEach(() => {
+ state = {};
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ state = {};
+ });
+
+ it.each`
+ action | type | payload | expectedActions
+ ${'initializeVsa'} | ${'INITIALIZE_VSA'} | ${{ requestPath: mockRequestPath }} | ${['fetchCycleAnalyticsData']}
+ ${'setDateRange'} | ${'SET_DATE_RANGE'} | ${{ startDate: 30 }} | ${[]}
+ ${'setSelectedStage'} | ${'SET_SELECTED_STAGE'} | ${{ selectedStage }} | ${[]}
+ `(
+ '$action should dispatch $expectedActions and commit $type',
+ ({ action, type, payload, expectedActions }) =>
+ testAction({
+ action: actions[action],
+ state,
+ payload,
+ expectedMutations: [
+ {
+ type,
+ payload,
+ },
+ ],
+ expectedActions: expectedActions.map((a) => ({ type: a })),
+ }),
+ );
+
+ describe('fetchCycleAnalyticsData', () => {
+ beforeEach(() => {
+ state = { requestPath: mockRequestPath };
+ mock = new MockAdapter(axios);
+ mock.onGet(mockRequestPath).reply(httpStatusCodes.OK);
+ });
+
+ it(`dispatches the 'setSelectedStage' and 'fetchStageData' actions`, () =>
+ testAction({
+ action: actions.fetchCycleAnalyticsData,
+ state,
+ payload: {},
+ expectedMutations: [
+ { type: 'REQUEST_CYCLE_ANALYTICS_DATA' },
+ { type: 'RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS' },
+ ],
+ expectedActions: [{ type: 'setSelectedStage' }, { type: 'fetchStageData' }],
+ }));
+
+ describe('with a failing request', () => {
+ beforeEach(() => {
+ state = { requestPath: mockRequestPath };
+ mock = new MockAdapter(axios);
+ mock.onGet(mockRequestPath).reply(httpStatusCodes.BAD_REQUEST);
+ });
+
+ it(`commits the 'RECEIVE_CYCLE_ANALYTICS_DATA_ERROR' mutation`, () =>
+ testAction({
+ action: actions.fetchCycleAnalyticsData,
+ state,
+ payload: {},
+ expectedMutations: [
+ { type: 'REQUEST_CYCLE_ANALYTICS_DATA' },
+ { type: 'RECEIVE_CYCLE_ANALYTICS_DATA_ERROR' },
+ ],
+ expectedActions: [],
+ }));
+ });
+ });
+
+ describe('fetchStageData', () => {
+ const mockStagePath = `${mockRequestPath}/events/${selectedStage.name}.json`;
+
+ beforeEach(() => {
+ state = {
+ requestPath: mockRequestPath,
+ startDate: mockStartDate,
+ selectedStage,
+ };
+ mock = new MockAdapter(axios);
+ mock.onGet(mockStagePath).reply(httpStatusCodes.OK);
+ });
+
+ it(`commits the 'RECEIVE_STAGE_DATA_SUCCESS' mutation`, () =>
+ testAction({
+ action: actions.fetchStageData,
+ state,
+ payload: {},
+ expectedMutations: [{ type: 'REQUEST_STAGE_DATA' }, { type: 'RECEIVE_STAGE_DATA_SUCCESS' }],
+ expectedActions: [],
+ }));
+
+ describe('with a failing request', () => {
+ beforeEach(() => {
+ state = {
+ requestPath: mockRequestPath,
+ startDate: mockStartDate,
+ selectedStage,
+ };
+ mock = new MockAdapter(axios);
+ mock.onGet(mockStagePath).reply(httpStatusCodes.BAD_REQUEST);
+ });
+
+ it(`commits the 'RECEIVE_STAGE_DATA_ERROR' mutation`, () =>
+ testAction({
+ action: actions.fetchStageData,
+ state,
+ payload: {},
+ expectedMutations: [{ type: 'REQUEST_STAGE_DATA' }, { type: 'RECEIVE_STAGE_DATA_ERROR' }],
+ expectedActions: [],
+ }));
+ });
+ });
+});