Commit 0f30541f authored by Emily Ring's avatar Emily Ring

Updated tests for components/clusters.vue

Refactored api data for javascripts/clusters_list/
Updated clusters_list jest tests to match new logic
parent 302d52ae
...@@ -15,13 +15,16 @@ export default { ...@@ -15,13 +15,16 @@ export default {
directives: { directives: {
tooltip, tooltip,
}, },
fields: [ computed: {
...mapState(['clusters', 'loading']),
fields() {
return [
{ {
key: 'name', key: 'name',
label: __('Kubernetes cluster'), label: __('Kubernetes cluster'),
}, },
{ {
key: 'environmentScope', key: 'environment_scope',
label: __('Environment scope'), label: __('Environment scope'),
}, },
// Wait for backend to send these fields // Wait for backend to send these fields
...@@ -38,13 +41,12 @@ export default { ...@@ -38,13 +41,12 @@ export default {
// label: __('Total memory (GB)'), // label: __('Total memory (GB)'),
// }, // },
{ {
key: 'clusterType', key: 'cluster_type',
label: __('Cluster level'), label: __('Cluster level'),
formatter: value => CLUSTER_TYPES[value], formatter: value => CLUSTER_TYPES[value],
}, },
], ];
computed: { },
...mapState(['clusters', 'loading']),
}, },
mounted() { mounted() {
this.fetchClusters(); this.fetchClusters();
...@@ -65,14 +67,7 @@ export default { ...@@ -65,14 +67,7 @@ export default {
<template> <template>
<gl-loading-icon v-if="loading" size="md" class="mt-3" /> <gl-loading-icon v-if="loading" size="md" class="mt-3" />
<gl-table <gl-table v-else :items="clusters" :fields="fields" stacked="md" class="qa-clusters-table">
v-else
:items="clusters"
:fields="$options.fields"
stacked="md"
variant="light"
class="qa-clusters-table"
>
<template #cell(name)="{ item }"> <template #cell(name)="{ item }">
<div class="d-flex flex-row-reverse flex-md-row js-status"> <div class="d-flex flex-row-reverse flex-md-row js-status">
<gl-link data-qa-selector="cluster" :data-qa-cluster-name="item.name" :href="item.path"> <gl-link data-qa-selector="cluster" :data-qa-cluster-name="item.name" :href="item.path">
...@@ -95,7 +90,7 @@ export default { ...@@ -95,7 +90,7 @@ export default {
></div> ></div>
</div> </div>
</template> </template>
<template #cell(clusterType)="{value}"> <template #cell(cluster_type)="{value}">
<gl-badge variant="light"> <gl-badge variant="light">
{{ value }} {{ value }}
</gl-badge> </gl-badge>
......
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import Poll from '~/lib/utils/poll'; import Poll from '~/lib/utils/poll';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import flash from '~/flash'; import flash from '~/flash';
...@@ -14,7 +13,7 @@ export const fetchClusters = ({ state, commit }) => { ...@@ -14,7 +13,7 @@ export const fetchClusters = ({ state, commit }) => {
method: 'fetchClusters', method: 'fetchClusters',
successCallback: ({ data }) => { successCallback: ({ data }) => {
if (data.clusters) { if (data.clusters) {
commit(types.SET_CLUSTERS_DATA, convertObjectPropsToCamelCase(data, { deep: true })); commit(types.SET_CLUSTERS_DATA, data);
commit(types.SET_LOADING_STATE, false); commit(types.SET_LOADING_STATE, false);
poll.stop(); poll.stop();
} }
......
...@@ -7,7 +7,7 @@ export default { ...@@ -7,7 +7,7 @@ export default {
[types.SET_CLUSTERS_DATA](state, data) { [types.SET_CLUSTERS_DATA](state, data) {
Object.assign(state, { Object.assign(state, {
clusters: data.clusters, clusters: data.clusters,
hasAncestorClusters: data.hasAncestorClusters, hasAncestorClusters: data.has_ancestor_clusters,
}); });
}, },
}; };
import Vuex from 'vuex'; import axios from '~/lib/utils/axios_utils';
import { createLocalVue, mount } from '@vue/test-utils';
import { GlTable, GlLoadingIcon } from '@gitlab/ui';
import Clusters from '~/clusters_list/components/clusters.vue'; import Clusters from '~/clusters_list/components/clusters.vue';
import mockData from '../mock_data'; import ClusterStore from '~/clusters_list/store';
import MockAdapter from 'axios-mock-adapter';
const localVue = createLocalVue(); import { apiData } from '../mock_data';
localVue.use(Vuex); import { mount } from '@vue/test-utils';
import { GlTable, GlLoadingIcon } from '@gitlab/ui';
describe('Clusters', () => { describe('Clusters', () => {
let mock;
let store;
let wrapper; let wrapper;
const findTable = () => wrapper.find(GlTable); const endpoint = 'some/endpoint';
const findLoader = () => wrapper.find(GlLoadingIcon); const findLoader = () => wrapper.find(GlLoadingIcon);
const findTable = () => wrapper.find(GlTable);
const findStatuses = () => findTable().findAll('.js-status'); const findStatuses = () => findTable().findAll('.js-status');
const mountComponent = _state => { const mockPollingApi = (response, body, header) => {
const state = { clusters: mockData, endpoint: 'some/endpoint', ..._state }; mock.onGet(endpoint).reply(response, body, header);
const store = new Vuex.Store({ };
state,
});
wrapper = mount(Clusters, { localVue, store }); const mountWrapper = () => {
store = ClusterStore({ endpoint });
wrapper = mount(Clusters, { store });
return axios.waitForAll();
}; };
beforeEach(() => { beforeEach(() => {
mountComponent({ loading: false }); mock = new MockAdapter(axios);
mockPollingApi(200, apiData, {});
return mountWrapper();
});
afterEach(() => {
wrapper.destroy();
mock.restore();
}); });
describe('clusters table', () => { describe('clusters table', () => {
describe('when data is loading', () => {
beforeEach(() => {
wrapper.vm.$store.state.loading = true;
return wrapper.vm.$nextTick();
});
it('displays a loader instead of the table while loading', () => { it('displays a loader instead of the table while loading', () => {
mountComponent({ loading: true });
expect(findLoader().exists()).toBe(true); expect(findLoader().exists()).toBe(true);
expect(findTable().exists()).toBe(false); expect(findTable().exists()).toBe(false);
}); });
});
it('displays a table component', () => { it('displays a table component', () => {
expect(findTable().exists()).toBe(true); expect(findTable().exists()).toBe(true);
expect(findTable().exists()).toBe(true);
}); });
it('renders the correct table headers', () => { it('renders the correct table headers', () => {
const tableHeaders = wrapper.vm.$options.fields; const tableHeaders = wrapper.vm.fields;
const headers = findTable().findAll('th'); const headers = findTable().findAll('th');
expect(headers.length).toBe(tableHeaders.length); expect(headers.length).toBe(tableHeaders.length);
...@@ -62,7 +79,7 @@ describe('Clusters', () => { ...@@ -62,7 +79,7 @@ describe('Clusters', () => {
${'unreachable'} | ${'bg-danger'} | ${1} ${'unreachable'} | ${'bg-danger'} | ${1}
${'authentication_failure'} | ${'bg-warning'} | ${2} ${'authentication_failure'} | ${'bg-warning'} | ${2}
${'deleting'} | ${null} | ${3} ${'deleting'} | ${null} | ${3}
${'connected'} | ${'bg-success'} | ${4} ${'created'} | ${'bg-success'} | ${4}
`('renders a status for each cluster', ({ statusName, className, lineNumber }) => { `('renders a status for each cluster', ({ statusName, className, lineNumber }) => {
const statuses = findStatuses(); const statuses = findStatuses();
const status = statuses.at(lineNumber); const status = statuses.at(lineNumber);
......
export default [ export const clusterList = [
{ {
name: 'My Cluster 1', name: 'My Cluster 1',
environmentScope: '*', environmentScope: '*',
...@@ -40,8 +40,13 @@ export default [ ...@@ -40,8 +40,13 @@ export default [
environmentScope: 'development', environmentScope: 'development',
size: '12', size: '12',
clusterType: 'project_type', clusterType: 'project_type',
status: 'connected', status: 'created',
cpu: '6 (100% free)', cpu: '6 (100% free)',
memory: '20.12 (35% free)', memory: '20.12 (35% free)',
}, },
]; ];
export const apiData = {
clusters: clusterList,
has_ancestor_clusters: false,
};
...@@ -2,6 +2,7 @@ import MockAdapter from 'axios-mock-adapter'; ...@@ -2,6 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
import flashError from '~/flash'; import flashError from '~/flash';
import testAction from 'helpers/vuex_action_helper'; import testAction from 'helpers/vuex_action_helper';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import { apiData } from '../mock_data';
import * as types from '~/clusters_list/store/mutation_types'; import * as types from '~/clusters_list/store/mutation_types';
import * as actions from '~/clusters_list/store/actions'; import * as actions from '~/clusters_list/store/actions';
...@@ -10,8 +11,6 @@ jest.mock('~/flash.js'); ...@@ -10,8 +11,6 @@ jest.mock('~/flash.js');
describe('Clusters store actions', () => { describe('Clusters store actions', () => {
describe('fetchClusters', () => { describe('fetchClusters', () => {
let mock; let mock;
const endpoint = '/clusters';
const clusters = [{ name: 'test' }];
beforeEach(() => { beforeEach(() => {
mock = new MockAdapter(axios); mock = new MockAdapter(axios);
...@@ -20,14 +19,14 @@ describe('Clusters store actions', () => { ...@@ -20,14 +19,14 @@ describe('Clusters store actions', () => {
afterEach(() => mock.restore()); afterEach(() => mock.restore());
it('should commit SET_CLUSTERS_DATA with received response', done => { it('should commit SET_CLUSTERS_DATA with received response', done => {
mock.onGet().reply(200, clusters); mock.onGet().reply(200, apiData);
testAction( testAction(
actions.fetchClusters, actions.fetchClusters,
{ endpoint }, { endpoint: apiData.endpoint },
{}, {},
[ [
{ type: types.SET_CLUSTERS_DATA, payload: clusters }, { type: types.SET_CLUSTERS_DATA, payload: apiData },
{ type: types.SET_LOADING_STATE, payload: false }, { type: types.SET_LOADING_STATE, payload: false },
], ],
[], [],
...@@ -38,7 +37,7 @@ describe('Clusters store actions', () => { ...@@ -38,7 +37,7 @@ describe('Clusters store actions', () => {
it('should show flash on API error', done => { it('should show flash on API error', done => {
mock.onGet().reply(400, 'Not Found'); mock.onGet().reply(400, 'Not Found');
testAction(actions.fetchClusters, { endpoint }, {}, [], [], () => { testAction(actions.fetchClusters, { endpoint: apiData.endpoint }, {}, [], [], () => {
expect(flashError).toHaveBeenCalledWith(expect.stringMatching('error')); expect(flashError).toHaveBeenCalledWith(expect.stringMatching('error'));
done(); done();
}); });
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment