spec/frontend/default/components/versions_spec.js (104 lines of code) (raw):
/**
* @jest-environment jsdom
*/
import { shallowMount } from '@vue/test-utils';
import flushPromises from 'flush-promises';
import VersionsMenu from '../../../../content/frontend/default/components/versions_menu.vue';
import * as fetchVersions from '../../../../content/frontend/services/fetch_versions';
import * as environment from '../../../../content/frontend/default/environment';
import { mockVersions, mockArchiveVersions } from '../../__mocks__/versions_mock';
import { setWindowPath, setVersionMetatag } from './helpers/versions_helper';
describe('component: Versions menu', () => {
const archivesUrl = 'https://archives.docs.gitlab.com';
beforeEach(() => {
jest.clearAllMocks();
jest.spyOn(fetchVersions, 'getVersions').mockReturnValue(mockVersions);
jest.spyOn(fetchVersions, 'getArchivesVersions').mockReturnValue(mockArchiveVersions);
jest.spyOn(environment, 'isProduction').mockReturnValue(true);
});
afterEach(() => {
document.querySelector('meta[name="gitlab-docs-version"]').remove();
});
it('Fetches versions.json and displays current version', async () => {
const wrapper = shallowMount(VersionsMenu);
setVersionMetatag(mockVersions.next);
await flushPromises();
expect(fetchVersions.getVersions).toHaveBeenCalledTimes(1);
expect(fetchVersions.getArchivesVersions).toHaveBeenCalledTimes(1);
const nextVersion = wrapper.find('[data-testid="next-version"]').text();
expect(nextVersion).toEqual(mockVersions.next);
});
it('Generates correct menu links from the homepage', async () => {
setWindowPath('/');
setVersionMetatag(mockVersions.next);
const wrapper = shallowMount(VersionsMenu);
await wrapper.setData({ activeVersion: mockVersions.next, versions: mockVersions });
expect(wrapper.vm.getVersionPath('')).toBe('/');
expect(wrapper.vm.getVersionPath(mockVersions.current)).toBe(`/${mockVersions.current}/`);
mockVersions.last_minor.forEach((v) => {
expect(wrapper.vm.getVersionPath(v)).toBe(`/${v}/`);
});
mockVersions.last_major.forEach((v) => {
expect(wrapper.vm.getVersionPath(v)).toBe(`${archivesUrl}/${v}/`);
});
});
it('Generates correct menu links from an interior page', async () => {
setWindowPath('/ee/user/project/issue_board.html');
setVersionMetatag(mockVersions.next);
const wrapper = shallowMount(VersionsMenu);
await wrapper.setData({ activeVersion: mockVersions.next, versions: mockVersions });
expect(wrapper.vm.getVersionPath('')).toBe('/ee/user/project/issue_board.html');
expect(wrapper.vm.getVersionPath(mockVersions.current)).toBe(
`/${mockVersions.current}/ee/user/project/issue_board.html`,
);
mockVersions.last_minor.forEach((v) => {
expect(wrapper.vm.getVersionPath(v)).toBe(`/${v}/ee/user/project/issue_board.html`);
});
mockVersions.last_major.forEach((v) => {
expect(wrapper.vm.getVersionPath(v)).toBe(
`${archivesUrl}/${v}/ee/user/project/issue_board.html`,
);
});
});
it('Generates correct menu links from an older version on docs.gitlab.com', async () => {
setWindowPath('/15.2/runner');
setVersionMetatag('15.2');
const wrapper = shallowMount(VersionsMenu);
await wrapper.setData({ versions: mockVersions, archiveVersions: mockArchiveVersions });
expect(wrapper.vm.getVersionPath('')).toBe('/runner');
expect(wrapper.vm.getVersionPath(mockVersions.current)).toBe(`/${mockVersions.current}/runner`);
mockVersions.last_minor.forEach((v) => {
expect(wrapper.vm.getVersionPath(v)).toBe(`/${v}/runner`);
});
mockVersions.last_major.forEach((v) => {
expect(wrapper.vm.getVersionPath(v)).toBe(`${archivesUrl}/${v}/runner`);
});
});
it('Shows simplified menu on non-production sites', async () => {
jest.spyOn(environment, 'isProduction').mockReturnValue(false);
setVersionMetatag('14.10');
const wrapper = shallowMount(VersionsMenu);
expect(wrapper.find('[data-testid="versions-menu"] a:nth-child(2)').exists()).toBe(false);
});
});
describe('isOnlineArchivedVersion', () => {
beforeEach(() => {
global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve([mockVersions]),
}),
);
});
it('Returns the correct value for the pre-release version', async () => {
const result = await fetchVersions.isOnlineArchivedVersion('15.3');
expect(result).toBe(false);
});
it('Returns the correct value for the current stable version', async () => {
const result = await fetchVersions.isOnlineArchivedVersion('15.2');
expect(result).toBe(false);
});
it('Returns the correct values for previous minor and major releases', async () => {
const olderVersions = [...mockVersions.last_minor, mockVersions.last_minor];
olderVersions.forEach(async (v) => {
const result = await fetchVersions.isOnlineArchivedVersion(v);
expect(result).toBe(true);
});
});
});