Welcome to mirror list, hosted at ThFree Co, Russian Federation.

index_spec.js « gitlab_version_check « frontend « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 8a11ff48bf2c8fe40c1430fb931a6a393d4b5ef2 (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import Vue from 'vue';
import * as Sentry from '@sentry/browser';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initGitlabVersionCheck from '~/gitlab_version_check';

describe('initGitlabVersionCheck', () => {
  let originalGon;
  let mock;
  let vueApps;

  const defaultResponse = {
    code: 200,
    res: { severity: 'success' },
  };

  const dummyGon = {
    relative_url_root: '/',
  };

  const createApp = async (mockResponse, htmlClass) => {
    originalGon = window.gon;

    const response = {
      ...defaultResponse,
      ...mockResponse,
    };

    mock = new MockAdapter(axios);
    mock.onGet().replyOnce(response.code, response.res);

    setHTMLFixture(`<div class="${htmlClass}"></div>`);

    vueApps = await initGitlabVersionCheck();
  };

  afterEach(() => {
    mock.restore();
    window.gon = originalGon;
    resetHTMLFixture();
  });

  describe('with no .js-gitlab-version-check-badge elements', () => {
    beforeEach(async () => {
      await createApp();
    });

    it('does not make axios GET request', () => {
      expect(mock.history.get.length).toBe(0);
    });

    it('does not render the Version Check Badge', () => {
      expect(vueApps).toBeNull();
    });
  });

  describe('with .js-gitlab-version-check-badge element but API errors', () => {
    beforeEach(async () => {
      jest.spyOn(Sentry, 'captureException');
      await createApp({ code: 500, res: null }, 'js-gitlab-version-check-badge');
    });

    it('does make axios GET request', () => {
      expect(mock.history.get.length).toBe(1);
      expect(mock.history.get[0].url).toContain('/admin/version_check.json');
    });

    it('logs error to Sentry', () => {
      expect(Sentry.captureException).toHaveBeenCalled();
    });

    it('does not render the Version Check Badge', () => {
      expect(vueApps).toBeNull();
    });
  });

  describe('with .js-gitlab-version-check-badge element and successful API call', () => {
    beforeEach(async () => {
      await createApp({}, 'js-gitlab-version-check-badge');
    });

    it('does make axios GET request', () => {
      expect(mock.history.get.length).toBe(1);
      expect(mock.history.get[0].url).toContain('/admin/version_check.json');
    });

    it('does render the Version Check Badge', () => {
      expect(vueApps).toHaveLength(1);
      expect(vueApps[0]).toBeInstanceOf(Vue);
    });
  });

  describe.each`
    root                 | description
    ${'/'}               | ${'not used (uses its own (sub)domain)'}
    ${'/gitlab'}         | ${'custom path'}
    ${'/service/gitlab'} | ${'custom path with 2 depth'}
  `('path for version_check.json', ({ root, description }) => {
    describe(`when relative url is ${description}: ${root}`, () => {
      beforeEach(async () => {
        originalGon = window.gon;
        window.gon = { ...dummyGon };
        window.gon.relative_url_root = root;
        await createApp({}, 'js-gitlab-version-check-badge');
      });

      it('reflects the relative url setting', () => {
        expect(mock.history.get.length).toBe(1);

        const pathRegex = new RegExp(`^${root}`);
        expect(mock.history.get[0].url).toMatch(pathRegex);
      });
    });
  });
});