debian-mirror-gitlab/spec/frontend/runner/components/runner_list_spec.js

162 lines
4.8 KiB
JavaScript
Raw Normal View History

2021-11-18 22:05:49 +05:30
import { GlTable, GlSkeletonLoader } from '@gitlab/ui';
2022-04-04 11:22:00 +05:30
import {
extendedWrapper,
shallowMountExtended,
mountExtended,
} from 'helpers/vue_test_utils_helper';
2021-09-04 01:27:46 +05:30
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerList from '~/runner/components/runner_list.vue';
2022-04-04 11:22:00 +05:30
import RunnerEditButton from '~/runner/components/runner_edit_button.vue';
import RunnerPauseButton from '~/runner/components/runner_pause_button.vue';
2021-09-04 01:27:46 +05:30
import { runnersData } from '../mock_data';
const mockRunners = runnersData.data.runners.nodes;
const mockActiveRunnersCount = mockRunners.length;
describe('RunnerList', () => {
let wrapper;
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findTable = () => wrapper.findComponent(GlTable);
const findHeaders = () => wrapper.findAll('th');
const findRows = () => wrapper.findAll('[data-testid^="runner-row-"]');
const findCell = ({ row = 0, fieldKey }) =>
extendedWrapper(findRows().at(row).find(`[data-testid="td-${fieldKey}"]`));
2022-04-04 11:22:00 +05:30
const createComponent = ({ props = {} } = {}, mountFn = shallowMountExtended) => {
wrapper = mountFn(RunnerList, {
propsData: {
runners: mockRunners,
activeRunnersCount: mockActiveRunnersCount,
...props,
},
});
2021-09-04 01:27:46 +05:30
};
beforeEach(() => {
2022-04-04 11:22:00 +05:30
createComponent({}, mountExtended);
2021-09-04 01:27:46 +05:30
});
afterEach(() => {
wrapper.destroy();
});
it('Displays headers', () => {
const headerLabels = findHeaders().wrappers.map((w) => w.text());
expect(headerLabels).toEqual([
2021-12-11 22:18:48 +05:30
'Status',
2022-04-04 11:22:00 +05:30
'Runner',
2021-09-04 01:27:46 +05:30
'Version',
2022-04-04 11:22:00 +05:30
'IP',
2022-01-26 12:08:38 +05:30
'Jobs',
2021-09-04 01:27:46 +05:30
'Tags',
'Last contact',
'', // actions has no label
]);
});
2022-01-26 12:08:38 +05:30
it('Sets runner id as a row key', () => {
2022-04-04 11:22:00 +05:30
createComponent({});
2022-01-26 12:08:38 +05:30
expect(findTable().attributes('primary-key')).toBe('id');
});
2021-09-04 01:27:46 +05:30
it('Displays a list of runners', () => {
2021-11-11 11:23:49 +05:30
expect(findRows()).toHaveLength(4);
2021-09-04 01:27:46 +05:30
expect(findSkeletonLoader().exists()).toBe(false);
});
it('Displays details of a runner', () => {
const { id, description, version, ipAddress, shortSha } = mockRunners[0];
// Badges
2022-03-02 08:16:31 +05:30
expect(findCell({ fieldKey: 'status' }).text()).toMatchInterpolatedText(
'never contacted paused',
);
2021-09-04 01:27:46 +05:30
2021-11-18 22:05:49 +05:30
// Runner summary
expect(findCell({ fieldKey: 'summary' }).text()).toContain(
2021-09-04 01:27:46 +05:30
`#${getIdFromGraphQLId(id)} (${shortSha})`,
);
2021-11-18 22:05:49 +05:30
expect(findCell({ fieldKey: 'summary' }).text()).toContain(description);
2021-09-04 01:27:46 +05:30
2021-09-30 23:02:18 +05:30
// Other fields
2021-09-04 01:27:46 +05:30
expect(findCell({ fieldKey: 'version' }).text()).toBe(version);
expect(findCell({ fieldKey: 'ipAddress' }).text()).toBe(ipAddress);
2022-01-26 12:08:38 +05:30
expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('0');
2021-09-04 01:27:46 +05:30
expect(findCell({ fieldKey: 'tagList' }).text()).toBe('');
expect(findCell({ fieldKey: 'contactedAt' }).text()).toEqual(expect.any(String));
// Actions
const actions = findCell({ fieldKey: 'actions' });
2022-04-04 11:22:00 +05:30
expect(actions.findComponent(RunnerEditButton).exists()).toBe(true);
expect(actions.findComponent(RunnerPauseButton).exists()).toBe(true);
expect(actions.findByTestId('delete-runner').exists()).toBe(true);
2021-09-04 01:27:46 +05:30
});
2022-01-26 12:08:38 +05:30
describe('Table data formatting', () => {
let mockRunnersCopy;
beforeEach(() => {
mockRunnersCopy = [
{
...mockRunners[0],
},
];
});
it('Formats job counts', () => {
mockRunnersCopy[0].jobCount = 1;
2022-04-04 11:22:00 +05:30
createComponent({ props: { runners: mockRunnersCopy } }, mountExtended);
2022-01-26 12:08:38 +05:30
expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('1');
});
it('Formats large job counts', () => {
mockRunnersCopy[0].jobCount = 1000;
2022-04-04 11:22:00 +05:30
createComponent({ props: { runners: mockRunnersCopy } }, mountExtended);
2022-01-26 12:08:38 +05:30
expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('1,000');
});
it('Formats large job counts with a plus symbol', () => {
mockRunnersCopy[0].jobCount = 1001;
2022-04-04 11:22:00 +05:30
createComponent({ props: { runners: mockRunnersCopy } }, mountExtended);
2022-01-26 12:08:38 +05:30
expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('1,000+');
});
});
2021-11-18 22:05:49 +05:30
it('Shows runner identifier', () => {
const { id, shortSha } = mockRunners[0];
const numericId = getIdFromGraphQLId(id);
2021-09-04 01:27:46 +05:30
2021-11-18 22:05:49 +05:30
expect(findCell({ fieldKey: 'summary' }).text()).toContain(`#${numericId} (${shortSha})`);
2021-09-04 01:27:46 +05:30
});
describe('When data is loading', () => {
it('shows a busy state', () => {
createComponent({ props: { runners: [], loading: true } });
expect(findTable().attributes('busy')).toBeTruthy();
});
it('when there are no runners, shows an skeleton loader', () => {
2022-04-04 11:22:00 +05:30
createComponent({ props: { runners: [], loading: true } }, mountExtended);
2021-09-04 01:27:46 +05:30
expect(findSkeletonLoader().exists()).toBe(true);
});
it('when there are runners, shows a busy indicator skeleton loader', () => {
2022-04-04 11:22:00 +05:30
createComponent({ props: { loading: true } }, mountExtended);
2021-09-04 01:27:46 +05:30
expect(findSkeletonLoader().exists()).toBe(false);
});
});
});