diff options
Diffstat (limited to 'spec/frontend')
3 files changed, 134 insertions, 0 deletions
diff --git a/spec/frontend/clusters/components/applications_spec.js b/spec/frontend/clusters/components/applications_spec.js index c3336edfe59..3e25c825fe8 100644 --- a/spec/frontend/clusters/components/applications_spec.js +++ b/spec/frontend/clusters/components/applications_spec.js @@ -7,6 +7,7 @@ import { APPLICATIONS_MOCK_STATE } from '../services/mock_data'; import eventHub from '~/clusters/event_hub'; import KnativeDomainEditor from '~/clusters/components/knative_domain_editor.vue'; import CrossplaneProviderStack from '~/clusters/components/crossplane_provider_stack.vue'; +import IngressModsecuritySettings from '~/clusters/components/ingress_modsecurity_settings.vue'; describe('Applications', () => { let vm; @@ -156,6 +157,30 @@ describe('Applications', () => { }); describe('Ingress application', () => { + describe('with nested component', () => { + const propsData = { + applications: { + ...APPLICATIONS_MOCK_STATE, + ingress: { + title: 'Ingress', + status: 'installed', + }, + }, + }; + + let wrapper; + beforeEach(() => { + wrapper = shallowMount(Applications, { propsData }); + }); + afterEach(() => { + wrapper.destroy(); + }); + it('renders IngressModsecuritySettings', () => { + const modsecuritySettings = wrapper.find(IngressModsecuritySettings); + expect(modsecuritySettings.exists()).toBe(true); + }); + }); + describe('when installed', () => { describe('with ip address', () => { it('renders ip address with a clipboard button', () => { diff --git a/spec/frontend/clusters/components/ingress_modsecurity_settings_spec.js b/spec/frontend/clusters/components/ingress_modsecurity_settings_spec.js new file mode 100644 index 00000000000..e7d2b7bf5c5 --- /dev/null +++ b/spec/frontend/clusters/components/ingress_modsecurity_settings_spec.js @@ -0,0 +1,107 @@ +import { shallowMount } from '@vue/test-utils'; +import IngressModsecuritySettings from '~/clusters/components/ingress_modsecurity_settings.vue'; +import LoadingButton from '~/vue_shared/components/loading_button.vue'; +import { APPLICATION_STATUS, INGRESS } from '~/clusters/constants'; +import { GlAlert } from '@gitlab/ui'; +import eventHub from '~/clusters/event_hub'; + +const { UPDATING } = APPLICATION_STATUS; + +describe('IngressModsecuritySettings', () => { + let wrapper; + + const defaultProps = { + modsecurity_enabled: false, + status: 'installable', + installed: false, + }; + + const createComponent = (props = defaultProps) => { + wrapper = shallowMount(IngressModsecuritySettings, { + propsData: { + ingress: { + ...defaultProps, + ...props, + }, + }, + }); + }; + + const findSaveButton = () => wrapper.find(LoadingButton); + const findModSecurityCheckbox = () => wrapper.find('input').element; + + describe('when ingress is installed', () => { + beforeEach(() => { + createComponent({ installed: true }); + jest.spyOn(eventHub, '$emit'); + }); + + it('renders save button', () => { + expect(findSaveButton().exists()).toBe(true); + expect(findModSecurityCheckbox().checked).toBe(false); + }); + + describe('and the save changes button is clicked', () => { + beforeEach(() => { + findSaveButton().vm.$emit('click'); + }); + + it('triggers save event and pass current modsecurity value', () => + wrapper.vm.$nextTick().then(() => { + expect(eventHub.$emit).toHaveBeenCalledWith('updateApplication', { + id: INGRESS, + params: { modsecurity_enabled: false }, + }); + })); + }); + + it('triggers set event to be propagated with the current modsecurity value', () => { + wrapper.setData({ modSecurityEnabled: true }); + return wrapper.vm.$nextTick().then(() => { + expect(eventHub.$emit).toHaveBeenCalledWith('setIngressModSecurityEnabled', { + id: INGRESS, + modSecurityEnabled: true, + }); + }); + }); + + describe(`when ingress status is ${UPDATING}`, () => { + beforeEach(() => { + createComponent({ installed: true, status: UPDATING }); + }); + + it('renders loading spinner in save button', () => { + expect(findSaveButton().props('loading')).toBe(true); + }); + + it('renders disabled save button', () => { + expect(findSaveButton().props('disabled')).toBe(true); + }); + + it('renders save button with "Saving" label', () => { + expect(findSaveButton().props('label')).toBe('Saving'); + }); + }); + + describe('when ingress fails to update', () => { + beforeEach(() => { + createComponent({ updateFailed: true }); + }); + + it('displays a error message', () => { + expect(wrapper.find(GlAlert).exists()).toBe(true); + }); + }); + }); + + describe('when ingress is not installed', () => { + beforeEach(() => { + createComponent(); + }); + + it('does not render the save button', () => { + expect(findSaveButton().exists()).toBe(false); + expect(findModSecurityCheckbox().checked).toBe(false); + }); + }); +}); diff --git a/spec/frontend/clusters/stores/clusters_store_spec.js b/spec/frontend/clusters/stores/clusters_store_spec.js index f2dbdd0638b..d3775c6cfba 100644 --- a/spec/frontend/clusters/stores/clusters_store_spec.js +++ b/spec/frontend/clusters/stores/clusters_store_spec.js @@ -81,8 +81,10 @@ describe('Clusters Store', () => { externalIp: null, externalHostname: null, installed: false, + isEditingModSecurityEnabled: false, installFailed: true, uninstallable: false, + updateFailed: false, uninstallSuccessful: false, uninstallFailed: false, validationError: null, |