217 lines
5.8 KiB
JavaScript
217 lines
5.8 KiB
JavaScript
import MockAdapter from 'axios-mock-adapter';
|
|
import testAction from 'helpers/vuex_action_helper';
|
|
import { TEST_HOST } from 'helpers/test_constants';
|
|
import axios from '~/lib/utils/axios_utils';
|
|
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
|
|
import {
|
|
REQUEST_REPOS,
|
|
RECEIVE_REPOS_SUCCESS,
|
|
RECEIVE_REPOS_ERROR,
|
|
REQUEST_IMPORT,
|
|
RECEIVE_IMPORT_SUCCESS,
|
|
RECEIVE_IMPORT_ERROR,
|
|
RECEIVE_JOBS_SUCCESS,
|
|
} from '~/import_projects/store/mutation_types';
|
|
import {
|
|
fetchRepos,
|
|
fetchImport,
|
|
receiveJobsSuccess,
|
|
fetchJobs,
|
|
clearJobsEtagPoll,
|
|
stopJobsPolling,
|
|
} from '~/import_projects/store/actions';
|
|
import state from '~/import_projects/store/state';
|
|
|
|
describe('import_projects store actions', () => {
|
|
let localState;
|
|
const repos = [{ id: 1 }, { id: 2 }];
|
|
const importPayload = { newName: 'newName', targetNamespace: 'targetNamespace', repo: { id: 1 } };
|
|
|
|
beforeEach(() => {
|
|
localState = state();
|
|
});
|
|
|
|
describe('fetchRepos', () => {
|
|
let mock;
|
|
const payload = { imported_projects: [{}], provider_repos: [{}], namespaces: [{}] };
|
|
|
|
beforeEach(() => {
|
|
localState.reposPath = `${TEST_HOST}/endpoint.json`;
|
|
mock = new MockAdapter(axios);
|
|
});
|
|
|
|
afterEach(() => mock.restore());
|
|
|
|
it('dispatches stopJobsPolling actions and commits REQUEST_REPOS, RECEIVE_REPOS_SUCCESS mutations on a successful request', () => {
|
|
mock.onGet(`${TEST_HOST}/endpoint.json`).reply(200, payload);
|
|
|
|
return testAction(
|
|
fetchRepos,
|
|
null,
|
|
localState,
|
|
[
|
|
{ type: REQUEST_REPOS },
|
|
{
|
|
type: RECEIVE_REPOS_SUCCESS,
|
|
payload: convertObjectPropsToCamelCase(payload, { deep: true }),
|
|
},
|
|
],
|
|
[{ type: 'stopJobsPolling' }, { type: 'fetchJobs' }],
|
|
);
|
|
});
|
|
|
|
it('dispatches stopJobsPolling action and commits REQUEST_REPOS, RECEIVE_REPOS_ERROR mutations on an unsuccessful request', () => {
|
|
mock.onGet(`${TEST_HOST}/endpoint.json`).reply(500);
|
|
|
|
return testAction(
|
|
fetchRepos,
|
|
null,
|
|
localState,
|
|
[{ type: REQUEST_REPOS }, { type: RECEIVE_REPOS_ERROR }],
|
|
[{ type: 'stopJobsPolling' }],
|
|
);
|
|
});
|
|
|
|
describe('when filtered', () => {
|
|
beforeEach(() => {
|
|
localState.filter = 'filter';
|
|
});
|
|
|
|
it('fetches repos with filter applied', () => {
|
|
mock.onGet(`${TEST_HOST}/endpoint.json?filter=filter`).reply(200, payload);
|
|
|
|
return testAction(
|
|
fetchRepos,
|
|
null,
|
|
localState,
|
|
[
|
|
{ type: REQUEST_REPOS },
|
|
{
|
|
type: RECEIVE_REPOS_SUCCESS,
|
|
payload: convertObjectPropsToCamelCase(payload, { deep: true }),
|
|
},
|
|
],
|
|
[{ type: 'stopJobsPolling' }, { type: 'fetchJobs' }],
|
|
);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('fetchImport', () => {
|
|
let mock;
|
|
|
|
beforeEach(() => {
|
|
localState.importPath = `${TEST_HOST}/endpoint.json`;
|
|
mock = new MockAdapter(axios);
|
|
});
|
|
|
|
afterEach(() => mock.restore());
|
|
|
|
it('commits REQUEST_IMPORT and REQUEST_IMPORT_SUCCESS mutations on a successful request', () => {
|
|
const importedProject = { name: 'imported/project' };
|
|
const importRepoId = importPayload.repo.id;
|
|
mock.onPost(`${TEST_HOST}/endpoint.json`).reply(200, importedProject);
|
|
|
|
return testAction(
|
|
fetchImport,
|
|
importPayload,
|
|
localState,
|
|
[
|
|
{ type: REQUEST_IMPORT, payload: importRepoId },
|
|
{
|
|
type: RECEIVE_IMPORT_SUCCESS,
|
|
payload: {
|
|
importedProject: convertObjectPropsToCamelCase(importedProject, { deep: true }),
|
|
repoId: importRepoId,
|
|
},
|
|
},
|
|
],
|
|
[],
|
|
);
|
|
});
|
|
|
|
it('commits REQUEST_IMPORT and RECEIVE_IMPORT_ERROR on an unsuccessful request', () => {
|
|
mock.onPost(`${TEST_HOST}/endpoint.json`).reply(500);
|
|
|
|
return testAction(
|
|
fetchImport,
|
|
importPayload,
|
|
localState,
|
|
[
|
|
{ type: REQUEST_IMPORT, payload: importPayload.repo.id },
|
|
{ type: RECEIVE_IMPORT_ERROR, payload: importPayload.repo.id },
|
|
],
|
|
[],
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('receiveJobsSuccess', () => {
|
|
it(`commits ${RECEIVE_JOBS_SUCCESS} mutation`, () => {
|
|
return testAction(
|
|
receiveJobsSuccess,
|
|
repos,
|
|
localState,
|
|
[{ type: RECEIVE_JOBS_SUCCESS, payload: repos }],
|
|
[],
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('fetchJobs', () => {
|
|
let mock;
|
|
const updatedProjects = [{ name: 'imported/project' }, { name: 'provider/repo' }];
|
|
|
|
beforeEach(() => {
|
|
localState.jobsPath = `${TEST_HOST}/endpoint.json`;
|
|
mock = new MockAdapter(axios);
|
|
});
|
|
|
|
afterEach(() => {
|
|
stopJobsPolling();
|
|
clearJobsEtagPoll();
|
|
});
|
|
|
|
afterEach(() => mock.restore());
|
|
|
|
it('commits RECEIVE_JOBS_SUCCESS mutation on a successful request', async () => {
|
|
mock.onGet(`${TEST_HOST}/endpoint.json`).reply(200, updatedProjects);
|
|
|
|
await testAction(
|
|
fetchJobs,
|
|
null,
|
|
localState,
|
|
[
|
|
{
|
|
type: RECEIVE_JOBS_SUCCESS,
|
|
payload: convertObjectPropsToCamelCase(updatedProjects, { deep: true }),
|
|
},
|
|
],
|
|
[],
|
|
);
|
|
});
|
|
|
|
describe('when filtered', () => {
|
|
beforeEach(() => {
|
|
localState.filter = 'filter';
|
|
});
|
|
|
|
it('fetches realtime changes with filter applied', () => {
|
|
mock.onGet(`${TEST_HOST}/endpoint.json?filter=filter`).reply(200, updatedProjects);
|
|
|
|
return testAction(
|
|
fetchJobs,
|
|
null,
|
|
localState,
|
|
[
|
|
{
|
|
type: RECEIVE_JOBS_SUCCESS,
|
|
payload: convertObjectPropsToCamelCase(updatedProjects, { deep: true }),
|
|
},
|
|
],
|
|
[],
|
|
);
|
|
});
|
|
});
|
|
});
|
|
});
|