diff options
Diffstat (limited to 'spec/frontend/group_settings/components/shared_runners_form_spec.js')
-rw-r--r-- | spec/frontend/group_settings/components/shared_runners_form_spec.js | 167 |
1 files changed, 93 insertions, 74 deletions
diff --git a/spec/frontend/group_settings/components/shared_runners_form_spec.js b/spec/frontend/group_settings/components/shared_runners_form_spec.js index 26e9cd39cfd..70a22c86e62 100644 --- a/spec/frontend/group_settings/components/shared_runners_form_spec.js +++ b/spec/frontend/group_settings/components/shared_runners_form_spec.js @@ -1,47 +1,46 @@ -import { GlLoadingIcon, GlAlert } from '@gitlab/ui'; -import { shallowMount } from '@vue/test-utils'; +import { GlAlert } from '@gitlab/ui'; import MockAxiosAdapter from 'axios-mock-adapter'; import { nextTick } from 'vue'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import waitForPromises from 'helpers/wait_for_promises'; import SharedRunnersForm from '~/group_settings/components/shared_runners_form.vue'; import axios from '~/lib/utils/axios_utils'; -const provide = { - updatePath: '/test/update', - sharedRunnersAvailability: 'enabled', - parentSharedRunnersAvailability: null, - runnerDisabled: 'disabled', - runnerEnabled: 'enabled', - runnerAllowOverride: 'allow_override', -}; - -jest.mock('~/flash'); +const UPDATE_PATH = '/test/update'; +const RUNNER_ENABLED_VALUE = 'enabled'; +const RUNNER_DISABLED_VALUE = 'disabled_and_unoverridable'; +const RUNNER_ALLOW_OVERRIDE_VALUE = 'disabled_with_override'; describe('group_settings/components/shared_runners_form', () => { let wrapper; let mock; - const createComponent = (provides = {}) => { - wrapper = shallowMount(SharedRunnersForm, { + const createComponent = (provide = {}) => { + wrapper = shallowMountExtended(SharedRunnersForm, { provide: { + updatePath: UPDATE_PATH, + sharedRunnersSetting: RUNNER_ENABLED_VALUE, + parentSharedRunnersSetting: null, + runnerEnabledValue: RUNNER_ENABLED_VALUE, + runnerDisabledValue: RUNNER_DISABLED_VALUE, + runnerAllowOverrideValue: RUNNER_ALLOW_OVERRIDE_VALUE, ...provide, - ...provides, }, }); }; - const findLoadingIcon = () => wrapper.find(GlLoadingIcon); - const findErrorAlert = () => wrapper.find(GlAlert); - const findEnabledToggle = () => wrapper.find('[data-testid="enable-runners-toggle"]'); - const findOverrideToggle = () => wrapper.find('[data-testid="override-runners-toggle"]'); - const changeToggle = (toggle) => toggle.vm.$emit('change', !toggle.props('value')); + const findAlert = (variant) => + wrapper + .findAllComponents(GlAlert) + .filter((w) => w.props('variant') === variant) + .at(0); + const findSharedRunnersToggle = () => wrapper.findByTestId('shared-runners-toggle'); + const findOverrideToggle = () => wrapper.findByTestId('override-runners-toggle'); const getSharedRunnersSetting = () => JSON.parse(mock.history.put[0].data).shared_runners_setting; - const isLoadingIconVisible = () => findLoadingIcon().exists(); beforeEach(() => { mock = new MockAxiosAdapter(axios); - - mock.onPut(provide.updatePath).reply(200); + mock.onPut(UPDATE_PATH).reply(200); }); afterEach(() => { @@ -51,102 +50,122 @@ describe('group_settings/components/shared_runners_form', () => { mock.restore(); }); - describe('with default', () => { + describe('default state', () => { beforeEach(() => { createComponent(); }); - it('loading icon does not exist', () => { - expect(isLoadingIconVisible()).toBe(false); + it('"Enable shared runners" toggle is enabled', () => { + expect(findSharedRunnersToggle().props()).toMatchObject({ + isLoading: false, + disabled: false, + }); }); - it('enabled toggle exists', () => { - expect(findEnabledToggle().exists()).toBe(true); + it('"Override the group setting" is disabled', () => { + expect(findOverrideToggle().props()).toMatchObject({ + isLoading: false, + disabled: true, + }); }); + }); - it('override toggle does not exist', () => { - expect(findOverrideToggle().exists()).toBe(false); + describe('When group disabled shared runners', () => { + it(`toggles are not disabled with setting ${RUNNER_DISABLED_VALUE}`, () => { + createComponent({ sharedRunnersSetting: RUNNER_DISABLED_VALUE }); + + expect(findSharedRunnersToggle().props('disabled')).toBe(false); + expect(findOverrideToggle().props('disabled')).toBe(false); }); }); - describe('loading icon', () => { - it('shows and hides the loading icon on request', async () => { - createComponent(); + describe('When parent group disabled shared runners', () => { + it('toggles are disabled', () => { + createComponent({ + sharedRunnersSetting: RUNNER_DISABLED_VALUE, + parentSharedRunnersSetting: RUNNER_DISABLED_VALUE, + }); + + expect(findSharedRunnersToggle().props('disabled')).toBe(true); + expect(findOverrideToggle().props('disabled')).toBe(true); + expect(findAlert('warning').exists()).toBe(true); + }); + }); - expect(isLoadingIconVisible()).toBe(false); + describe('loading state', () => { + beforeEach(() => { + createComponent(); + }); - findEnabledToggle().vm.$emit('change', true); + it('is not loading by default', () => { + expect(findSharedRunnersToggle().props('isLoading')).toBe(false); + expect(findOverrideToggle().props('isLoading')).toBe(false); + }); + it('is loading immediately after request', async () => { + findSharedRunnersToggle().vm.$emit('change', true); await nextTick(); - expect(isLoadingIconVisible()).toBe(true); + expect(findSharedRunnersToggle().props('isLoading')).toBe(true); + expect(findOverrideToggle().props('isLoading')).toBe(true); + }); + + it('does not update settings while loading', async () => { + findSharedRunnersToggle().vm.$emit('change', true); + findSharedRunnersToggle().vm.$emit('change', false); + await waitForPromises(); + expect(mock.history.put.length).toBe(1); + }); + + it('is not loading state after completed request', async () => { + findSharedRunnersToggle().vm.$emit('change', true); await waitForPromises(); - expect(isLoadingIconVisible()).toBe(false); + expect(findSharedRunnersToggle().props('isLoading')).toBe(false); + expect(findOverrideToggle().props('isLoading')).toBe(false); }); }); - describe('enable toggle', () => { + describe('"Enable shared runners" toggle', () => { beforeEach(() => { createComponent(); }); - it('enabling the toggle sends correct payload', async () => { - findEnabledToggle().vm.$emit('change', true); - + it('sends correct payload when turned on', async () => { + findSharedRunnersToggle().vm.$emit('change', true); await waitForPromises(); - expect(getSharedRunnersSetting()).toEqual(provide.runnerEnabled); - expect(findOverrideToggle().exists()).toBe(false); + expect(getSharedRunnersSetting()).toEqual(RUNNER_ENABLED_VALUE); + expect(findOverrideToggle().props('disabled')).toBe(true); }); - it('disabling the toggle sends correct payload', async () => { - findEnabledToggle().vm.$emit('change', false); - + it('sends correct payload when turned off', async () => { + findSharedRunnersToggle().vm.$emit('change', false); await waitForPromises(); - expect(getSharedRunnersSetting()).toEqual(provide.runnerDisabled); - expect(findOverrideToggle().exists()).toBe(true); + expect(getSharedRunnersSetting()).toEqual(RUNNER_DISABLED_VALUE); + expect(findOverrideToggle().props('disabled')).toBe(false); }); }); - describe('override toggle', () => { + describe('"Override the group setting" toggle', () => { beforeEach(() => { - createComponent({ sharedRunnersAvailability: provide.runnerAllowOverride }); + createComponent({ sharedRunnersSetting: RUNNER_ALLOW_OVERRIDE_VALUE }); }); it('enabling the override toggle sends correct payload', async () => { findOverrideToggle().vm.$emit('change', true); - await waitForPromises(); - expect(getSharedRunnersSetting()).toEqual(provide.runnerAllowOverride); + expect(getSharedRunnersSetting()).toEqual(RUNNER_ALLOW_OVERRIDE_VALUE); }); it('disabling the override toggle sends correct payload', async () => { findOverrideToggle().vm.$emit('change', false); - await waitForPromises(); - expect(getSharedRunnersSetting()).toEqual(provide.runnerDisabled); - }); - }); - - describe('toggle disabled state', () => { - it(`toggles are not disabled with setting ${provide.runnerDisabled}`, () => { - createComponent({ sharedRunnersAvailability: provide.runnerDisabled }); - expect(findEnabledToggle().props('disabled')).toBe(false); - expect(findOverrideToggle().props('disabled')).toBe(false); - }); - - it('toggles are disabled', () => { - createComponent({ - sharedRunnersAvailability: provide.runnerDisabled, - parentSharedRunnersAvailability: provide.runnerDisabled, - }); - expect(findEnabledToggle().props('disabled')).toBe(true); - expect(findOverrideToggle().props('disabled')).toBe(true); + expect(getSharedRunnersSetting()).toEqual(RUNNER_DISABLED_VALUE); }); }); @@ -156,16 +175,16 @@ describe('group_settings/components/shared_runners_form', () => { ${{ error: 'Undefined error' }} | ${'Undefined error Refresh the page and try again.'} `(`with error $errorObj`, ({ errorObj, message }) => { beforeEach(async () => { - mock.onPut(provide.updatePath).reply(500, errorObj); + mock.onPut(UPDATE_PATH).reply(500, errorObj); createComponent(); - changeToggle(findEnabledToggle()); + findSharedRunnersToggle().vm.$emit('change', false); await waitForPromises(); }); it('error should be shown', () => { - expect(findErrorAlert().text()).toBe(message); + expect(findAlert('danger').text()).toBe(message); }); }); }); |