summaryrefslogtreecommitdiff
path: root/spec/frontend/runner/utils_spec.js
blob: 1db9815dfd87a9c7a2650bf20d5a614f196bd1aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { formatJobCount, tableField, getPaginationVariables } from '~/runner/utils';

describe('~/runner/utils', () => {
  describe('formatJobCount', () => {
    it('formats a number', () => {
      expect(formatJobCount(1)).toBe('1');
      expect(formatJobCount(99)).toBe('99');
    });

    it('formats a large count', () => {
      expect(formatJobCount(1000)).toBe('1,000');
      expect(formatJobCount(1001)).toBe('1,000+');
    });

    it('returns an empty string for non-numeric values', () => {
      expect(formatJobCount(undefined)).toBe('');
      expect(formatJobCount(null)).toBe('');
      expect(formatJobCount('number')).toBe('');
    });
  });

  describe('tableField', () => {
    it('a field with options', () => {
      expect(tableField({ key: 'name' })).toEqual({
        key: 'name',
        label: '',
        tdAttr: { 'data-testid': 'td-name' },
        thClass: expect.any(Array),
      });
    });

    it('a field with a label', () => {
      const label = 'A field name';

      expect(tableField({ key: 'name', label })).toMatchObject({
        label,
      });
    });

    it('a field with custom classes', () => {
      const mockClasses = ['foo', 'bar'];

      expect(tableField({ thClasses: mockClasses })).toMatchObject({
        thClass: expect.arrayContaining(mockClasses),
      });
    });

    it('a field with custom options', () => {
      expect(tableField({ foo: 'bar' })).toMatchObject({ foo: 'bar' });
    });
  });

  describe('getPaginationVariables', () => {
    const after = 'AFTER_CURSOR';
    const before = 'BEFORE_CURSOR';

    it.each`
      case                         | pagination    | pageSize     | variables
      ${'next page'}               | ${{ after }}  | ${undefined} | ${{ after, first: 10 }}
      ${'prev page'}               | ${{ before }} | ${undefined} | ${{ before, last: 10 }}
      ${'first page'}              | ${{}}         | ${undefined} | ${{ first: 10 }}
      ${'next page with N items'}  | ${{ after }}  | ${20}        | ${{ after, first: 20 }}
      ${'prev page with N items'}  | ${{ before }} | ${20}        | ${{ before, last: 20 }}
      ${'first page with N items'} | ${{}}         | ${20}        | ${{ first: 20 }}
    `('navigates to $case', ({ pagination, pageSize, variables }) => {
      expect(getPaginationVariables(pagination, pageSize)).toEqual(variables);
    });
  });
});