diff options
Diffstat (limited to 'spec/frontend/create_cluster/gke_cluster')
12 files changed, 0 insertions, 1130 deletions
diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_machine_type_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_machine_type_dropdown_spec.js deleted file mode 100644 index f46b84da939..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/components/gke_machine_type_dropdown_spec.js +++ /dev/null @@ -1,129 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import Vue, { nextTick } from 'vue'; -import Vuex from 'vuex'; -import GkeMachineTypeDropdown from '~/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue'; -import createState from '~/create_cluster/gke_cluster/store/state'; -import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue'; -import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue'; -import { selectedMachineTypeMock, gapiMachineTypesResponseMock } from '../mock_data'; - -const componentConfig = { - fieldId: 'cluster_provider_gcp_attributes_gcp_machine_type', - fieldName: 'cluster[provider_gcp_attributes][gcp_machine_type]', -}; -const setMachineType = jest.fn(); - -const LABELS = { - LOADING: 'Fetching machine types', - DISABLED_NO_PROJECT: 'Select project and zone to choose machine type', - DISABLED_NO_ZONE: 'Select zone to choose machine type', - DEFAULT: 'Select machine type', -}; - -Vue.use(Vuex); - -const createComponent = (store, propsData = componentConfig) => - shallowMount(GkeMachineTypeDropdown, { - propsData, - store, - }); - -const createStore = (initialState = {}, getters = {}) => - new Vuex.Store({ - state: { - ...createState(), - ...initialState, - }, - getters: { - hasZone: () => false, - ...getters, - }, - actions: { - setMachineType, - }, - }); - -describe('GkeMachineTypeDropdown', () => { - let wrapper; - let store; - - afterEach(() => { - wrapper.destroy(); - }); - - const dropdownButtonLabel = () => wrapper.find(DropdownButton).props('toggleText'); - const dropdownHiddenInputValue = () => wrapper.find(DropdownHiddenInput).props('value'); - - describe('shows various toggle text depending on state', () => { - it('returns disabled state toggle text when no project and zone are selected', () => { - store = createStore({ - projectHasBillingEnabled: false, - }); - wrapper = createComponent(store); - - expect(dropdownButtonLabel()).toBe(LABELS.DISABLED_NO_PROJECT); - }); - - it('returns disabled state toggle text when no zone is selected', () => { - store = createStore({ - projectHasBillingEnabled: true, - }); - wrapper = createComponent(store); - - expect(dropdownButtonLabel()).toBe(LABELS.DISABLED_NO_ZONE); - }); - - it('returns loading toggle text', async () => { - store = createStore(); - wrapper = createComponent(store); - - // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details - // eslint-disable-next-line no-restricted-syntax - wrapper.setData({ isLoading: true }); - - await nextTick(); - expect(dropdownButtonLabel()).toBe(LABELS.LOADING); - }); - - it('returns default toggle text', () => { - store = createStore( - { - projectHasBillingEnabled: true, - }, - { hasZone: () => true }, - ); - wrapper = createComponent(store); - - expect(dropdownButtonLabel()).toBe(LABELS.DEFAULT); - }); - - it('returns machine type name if machine type selected', () => { - store = createStore( - { - projectHasBillingEnabled: true, - selectedMachineType: selectedMachineTypeMock, - }, - { hasZone: () => true }, - ); - wrapper = createComponent(store); - - expect(dropdownButtonLabel()).toBe(selectedMachineTypeMock); - }); - }); - - describe('form input', () => { - it('reflects new value when dropdown item is clicked', async () => { - store = createStore({ - machineTypes: gapiMachineTypesResponseMock.items, - }); - wrapper = createComponent(store); - - expect(dropdownHiddenInputValue()).toBe(''); - - wrapper.find('.dropdown-content button').trigger('click'); - - await nextTick(); - expect(setMachineType).toHaveBeenCalledWith(expect.anything(), selectedMachineTypeMock); - }); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_network_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_network_dropdown_spec.js deleted file mode 100644 index addb0ef72a0..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/components/gke_network_dropdown_spec.js +++ /dev/null @@ -1,137 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import Vue from 'vue'; -import Vuex from 'vuex'; -import ClusterFormDropdown from '~/create_cluster/components/cluster_form_dropdown.vue'; -import GkeNetworkDropdown from '~/create_cluster/gke_cluster/components/gke_network_dropdown.vue'; -import createClusterDropdownState from '~/create_cluster/store/cluster_dropdown/state'; - -Vue.use(Vuex); - -describe('GkeNetworkDropdown', () => { - let wrapper; - let store; - const defaultProps = { fieldName: 'field-name' }; - const selectedNetwork = { selfLink: '123456' }; - const projectId = '6789'; - const region = 'east-1'; - const setNetwork = jest.fn(); - const setSubnetwork = jest.fn(); - const fetchSubnetworks = jest.fn(); - - const buildStore = ({ clusterDropdownState } = {}) => - new Vuex.Store({ - state: { - selectedNetwork, - }, - actions: { - setNetwork, - setSubnetwork, - }, - getters: { - hasZone: () => false, - region: () => region, - projectId: () => projectId, - }, - modules: { - networks: { - namespaced: true, - state: { - ...createClusterDropdownState(), - ...(clusterDropdownState || {}), - }, - }, - subnetworks: { - namespaced: true, - actions: { - fetchItems: fetchSubnetworks, - }, - }, - }, - }); - - const buildWrapper = (propsData = defaultProps) => - shallowMount(GkeNetworkDropdown, { - propsData, - store, - }); - - afterEach(() => { - wrapper.destroy(); - }); - - it('sets correct field-name', () => { - const fieldName = 'field-name'; - - store = buildStore(); - wrapper = buildWrapper({ fieldName }); - - expect(wrapper.find(ClusterFormDropdown).props('fieldName')).toBe(fieldName); - }); - - it('sets selected network as the dropdown value', () => { - store = buildStore(); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('value')).toBe(selectedNetwork); - }); - - it('maps networks store items to the dropdown items property', () => { - const items = [{ name: 'network' }]; - - store = buildStore({ clusterDropdownState: { items } }); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('items')).toBe(items); - }); - - describe('when network dropdown store is loading items', () => { - it('sets network dropdown as loading', () => { - store = buildStore({ clusterDropdownState: { isLoadingItems: true } }); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('loading')).toBe(true); - }); - }); - - describe('when there is no selected zone', () => { - it('disables the network dropdown', () => { - store = buildStore(); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('disabled')).toBe(true); - }); - }); - - describe('when an error occurs while loading networks', () => { - it('sets the network dropdown as having errors', () => { - store = buildStore({ clusterDropdownState: { loadingItemsError: new Error() } }); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('hasErrors')).toBe(true); - }); - }); - - describe('when dropdown emits input event', () => { - beforeEach(() => { - store = buildStore(); - wrapper = buildWrapper(); - wrapper.find(ClusterFormDropdown).vm.$emit('input', selectedNetwork); - }); - - it('cleans selected subnetwork', () => { - expect(setSubnetwork).toHaveBeenCalledWith(expect.anything(), ''); - }); - - it('dispatches the setNetwork action', () => { - expect(setNetwork).toHaveBeenCalledWith(expect.anything(), selectedNetwork); - }); - - it('fetches subnetworks for the selected project, region, and network', () => { - expect(fetchSubnetworks).toHaveBeenCalledWith(expect.anything(), { - project: projectId, - region, - network: selectedNetwork.selfLink, - }); - }); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_project_id_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_project_id_dropdown_spec.js deleted file mode 100644 index 36f8d4bd1e8..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/components/gke_project_id_dropdown_spec.js +++ /dev/null @@ -1,137 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import Vue, { nextTick } from 'vue'; -import Vuex from 'vuex'; -import GkeProjectIdDropdown from '~/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue'; -import createState from '~/create_cluster/gke_cluster/store/state'; -import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue'; -import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue'; -import { selectedProjectMock, gapiProjectsResponseMock } from '../mock_data'; - -const componentConfig = { - docsUrl: 'https://console.cloud.google.com/home/dashboard', - fieldId: 'cluster_provider_gcp_attributes_gcp_project_id', - fieldName: 'cluster[provider_gcp_attributes][gcp_project_id]', -}; - -const LABELS = { - LOADING: 'Fetching projects', - VALIDATING_PROJECT_BILLING: 'Validating project billing status', - DEFAULT: 'Select project', - EMPTY: 'No projects found', -}; - -Vue.use(Vuex); - -describe('GkeProjectIdDropdown', () => { - let wrapper; - let vuexStore; - let setProject; - - beforeEach(() => { - setProject = jest.fn(); - }); - - const createStore = (initialState = {}, getters = {}) => - new Vuex.Store({ - state: { - ...createState(), - ...initialState, - }, - actions: { - fetchProjects: jest.fn().mockResolvedValueOnce([]), - setProject, - }, - getters: { - hasProject: () => false, - ...getters, - }, - }); - - const createComponent = (store, propsData = componentConfig) => - shallowMount(GkeProjectIdDropdown, { - propsData, - store, - }); - - const bootstrap = (initialState, getters) => { - vuexStore = createStore(initialState, getters); - wrapper = createComponent(vuexStore); - }; - - const dropdownButtonLabel = () => wrapper.find(DropdownButton).props('toggleText'); - const dropdownHiddenInputValue = () => wrapper.find(DropdownHiddenInput).props('value'); - - afterEach(() => { - wrapper.destroy(); - }); - - describe('toggleText', () => { - it('returns loading toggle text', () => { - bootstrap(); - - expect(dropdownButtonLabel()).toBe(LABELS.LOADING); - }); - - it('returns project billing validation text', () => { - bootstrap({ isValidatingProjectBilling: true }); - - expect(dropdownButtonLabel()).toBe(LABELS.VALIDATING_PROJECT_BILLING); - }); - - it('returns default toggle text', async () => { - bootstrap(); - - // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details - // eslint-disable-next-line no-restricted-syntax - wrapper.setData({ isLoading: false }); - - await nextTick(); - expect(dropdownButtonLabel()).toBe(LABELS.DEFAULT); - }); - - it('returns project name if project selected', async () => { - bootstrap( - { - selectedProject: selectedProjectMock, - }, - { - hasProject: () => true, - }, - ); - // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details - // eslint-disable-next-line no-restricted-syntax - wrapper.setData({ isLoading: false }); - - await nextTick(); - expect(dropdownButtonLabel()).toBe(selectedProjectMock.name); - }); - - it('returns empty toggle text', async () => { - bootstrap({ - projects: null, - }); - // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details - // eslint-disable-next-line no-restricted-syntax - wrapper.setData({ isLoading: false }); - - await nextTick(); - expect(dropdownButtonLabel()).toBe(LABELS.EMPTY); - }); - }); - - describe('selectItem', () => { - it('reflects new value when dropdown item is clicked', async () => { - bootstrap({ projects: gapiProjectsResponseMock.projects }); - - expect(dropdownHiddenInputValue()).toBe(''); - - wrapper.find('.dropdown-content button').trigger('click'); - - await nextTick(); - expect(setProject).toHaveBeenCalledWith( - expect.anything(), - gapiProjectsResponseMock.projects[0], - ); - }); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js deleted file mode 100644 index 2bf9158628c..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js +++ /dev/null @@ -1,51 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import Vue from 'vue'; -import Vuex from 'vuex'; -import GkeSubmitButton from '~/create_cluster/gke_cluster/components/gke_submit_button.vue'; - -Vue.use(Vuex); - -describe('GkeSubmitButton', () => { - let wrapper; - let store; - let hasValidData; - - const buildStore = () => - new Vuex.Store({ - getters: { - hasValidData, - }, - }); - - const buildWrapper = () => - shallowMount(GkeSubmitButton, { - store, - }); - - const bootstrap = () => { - store = buildStore(); - wrapper = buildWrapper(); - }; - - beforeEach(() => { - hasValidData = jest.fn(); - }); - - afterEach(() => { - wrapper.destroy(); - }); - - it('is disabled when hasValidData is false', () => { - hasValidData.mockReturnValueOnce(false); - bootstrap(); - - expect(wrapper.attributes('disabled')).toBe('disabled'); - }); - - it('is not disabled when hasValidData is true', () => { - hasValidData.mockReturnValueOnce(true); - bootstrap(); - - expect(wrapper.attributes('disabled')).toBeFalsy(); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_subnetwork_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_subnetwork_dropdown_spec.js deleted file mode 100644 index 9df680d94b5..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/components/gke_subnetwork_dropdown_spec.js +++ /dev/null @@ -1,111 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import Vue from 'vue'; -import Vuex from 'vuex'; -import ClusterFormDropdown from '~/create_cluster/components/cluster_form_dropdown.vue'; -import GkeSubnetworkDropdown from '~/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue'; -import createClusterDropdownState from '~/create_cluster/store/cluster_dropdown/state'; - -Vue.use(Vuex); - -describe('GkeSubnetworkDropdown', () => { - let wrapper; - let store; - const defaultProps = { fieldName: 'field-name' }; - const selectedSubnetwork = '123456'; - const setSubnetwork = jest.fn(); - - const buildStore = ({ clusterDropdownState } = {}) => - new Vuex.Store({ - state: { - selectedSubnetwork, - }, - actions: { - setSubnetwork, - }, - getters: { - hasNetwork: () => false, - }, - modules: { - subnetworks: { - namespaced: true, - state: { - ...createClusterDropdownState(), - ...(clusterDropdownState || {}), - }, - }, - }, - }); - - const buildWrapper = (propsData = defaultProps) => - shallowMount(GkeSubnetworkDropdown, { - propsData, - store, - }); - - afterEach(() => { - wrapper.destroy(); - }); - - it('sets correct field-name', () => { - const fieldName = 'field-name'; - - store = buildStore(); - wrapper = buildWrapper({ fieldName }); - - expect(wrapper.find(ClusterFormDropdown).props('fieldName')).toBe(fieldName); - }); - - it('sets selected subnetwork as the dropdown value', () => { - store = buildStore(); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('value')).toBe(selectedSubnetwork); - }); - - it('maps subnetworks store items to the dropdown items property', () => { - const items = [{ name: 'subnetwork' }]; - - store = buildStore({ clusterDropdownState: { items } }); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('items')).toBe(items); - }); - - describe('when subnetwork dropdown store is loading items', () => { - it('sets subnetwork dropdown as loading', () => { - store = buildStore({ clusterDropdownState: { isLoadingItems: true } }); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('loading')).toBe(true); - }); - }); - - describe('when there is no selected network', () => { - it('disables the subnetwork dropdown', () => { - store = buildStore(); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('disabled')).toBe(true); - }); - }); - - describe('when an error occurs while loading subnetworks', () => { - it('sets the subnetwork dropdown as having errors', () => { - store = buildStore({ clusterDropdownState: { loadingItemsError: new Error() } }); - wrapper = buildWrapper(); - - expect(wrapper.find(ClusterFormDropdown).props('hasErrors')).toBe(true); - }); - }); - - describe('when dropdown emits input event', () => { - it('dispatches the setSubnetwork action', () => { - store = buildStore(); - wrapper = buildWrapper(); - - wrapper.find(ClusterFormDropdown).vm.$emit('input', selectedSubnetwork); - - expect(setSubnetwork).toHaveBeenCalledWith(expect.anything(), selectedSubnetwork); - }); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_zone_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_zone_dropdown_spec.js deleted file mode 100644 index 7b4c228b879..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/components/gke_zone_dropdown_spec.js +++ /dev/null @@ -1,103 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import { nextTick } from 'vue'; -import GkeZoneDropdown from '~/create_cluster/gke_cluster/components/gke_zone_dropdown.vue'; -import { createStore } from '~/create_cluster/gke_cluster/store'; -import { - SET_PROJECT, - SET_ZONES, - SET_PROJECT_BILLING_STATUS, -} from '~/create_cluster/gke_cluster/store/mutation_types'; -import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue'; -import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue'; -import { selectedZoneMock, selectedProjectMock, gapiZonesResponseMock } from '../mock_data'; - -const propsData = { - fieldId: 'cluster_provider_gcp_attributes_gcp_zone', - fieldName: 'cluster[provider_gcp_attributes][gcp_zone]', -}; - -const LABELS = { - LOADING: 'Fetching zones', - DISABLED: 'Select project to choose zone', - DEFAULT: 'Select zone', -}; - -describe('GkeZoneDropdown', () => { - let store; - let wrapper; - - beforeEach(() => { - store = createStore(); - wrapper = shallowMount(GkeZoneDropdown, { propsData, store }); - }); - - afterEach(() => { - wrapper.destroy(); - }); - - describe('toggleText', () => { - let dropdownButton; - - beforeEach(() => { - dropdownButton = wrapper.find(DropdownButton); - }); - - it('returns disabled state toggle text', () => { - expect(dropdownButton.props('toggleText')).toBe(LABELS.DISABLED); - }); - - describe('isLoading', () => { - beforeEach(async () => { - // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details - // eslint-disable-next-line no-restricted-syntax - wrapper.setData({ isLoading: true }); - await nextTick(); - }); - - it('returns loading toggle text', () => { - expect(dropdownButton.props('toggleText')).toBe(LABELS.LOADING); - }); - }); - - describe('project is set', () => { - beforeEach(async () => { - wrapper.vm.$store.commit(SET_PROJECT, selectedProjectMock); - wrapper.vm.$store.commit(SET_PROJECT_BILLING_STATUS, true); - await nextTick(); - }); - - it('returns default toggle text', () => { - expect(dropdownButton.props('toggleText')).toBe(LABELS.DEFAULT); - }); - }); - - describe('project is selected', () => { - beforeEach(async () => { - wrapper.vm.setItem(selectedZoneMock); - await nextTick(); - }); - - it('returns project name if project selected', () => { - expect(dropdownButton.props('toggleText')).toBe(selectedZoneMock); - }); - }); - }); - - describe('selectItem', () => { - beforeEach(async () => { - wrapper.vm.$store.commit(SET_ZONES, gapiZonesResponseMock.items); - await nextTick(); - }); - - it('reflects new value when dropdown item is clicked', async () => { - const dropdown = wrapper.find(DropdownHiddenInput); - - expect(dropdown.attributes('value')).toBe(''); - - wrapper.find('.dropdown-content button').trigger('click'); - - await nextTick(); - expect(dropdown.attributes('value')).toBe(selectedZoneMock); - }); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/gapi_loader_spec.js b/spec/frontend/create_cluster/gke_cluster/gapi_loader_spec.js deleted file mode 100644 index 9e4d6996340..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/gapi_loader_spec.js +++ /dev/null @@ -1,47 +0,0 @@ -import gapiLoader from '~/create_cluster/gke_cluster/gapi_loader'; - -describe('gapiLoader', () => { - // A mock for document.head.appendChild to intercept the script tag injection. - let mockDOMHeadAppendChild; - - beforeEach(() => { - mockDOMHeadAppendChild = jest.spyOn(document.head, 'appendChild'); - }); - - afterEach(() => { - mockDOMHeadAppendChild.mockRestore(); - delete window.gapi; - delete window.gapiPromise; - delete window.onGapiLoad; - }); - - it('returns a promise', () => { - expect(gapiLoader()).toBeInstanceOf(Promise); - }); - - it('returns the same promise when already loading', () => { - const first = gapiLoader(); - const second = gapiLoader(); - expect(first).toBe(second); - }); - - it('resolves the promise when the script loads correctly', async () => { - mockDOMHeadAppendChild.mockImplementationOnce((script) => { - script.removeAttribute('src'); - script.appendChild( - document.createTextNode(`window.gapi = 'hello gapi'; window.onGapiLoad()`), - ); - document.head.appendChild(script); - }); - await expect(gapiLoader()).resolves.toBe('hello gapi'); - expect(mockDOMHeadAppendChild).toHaveBeenCalled(); - }); - - it('rejects the promise when the script fails loading', async () => { - mockDOMHeadAppendChild.mockImplementationOnce((script) => { - script.onerror(new Error('hello error')); - }); - await expect(gapiLoader()).rejects.toThrow('hello error'); - expect(mockDOMHeadAppendChild).toHaveBeenCalled(); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/helpers.js b/spec/frontend/create_cluster/gke_cluster/helpers.js deleted file mode 100644 index 026e99fa8f4..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/helpers.js +++ /dev/null @@ -1,64 +0,0 @@ -import { - gapiProjectsResponseMock, - gapiZonesResponseMock, - gapiMachineTypesResponseMock, -} from './mock_data'; - -const cloudbilling = { - projects: { - getBillingInfo: jest.fn( - () => - new Promise((resolve) => { - resolve({ - result: { billingEnabled: true }, - }); - }), - ), - }, -}; - -const cloudresourcemanager = { - projects: { - list: jest.fn( - () => - new Promise((resolve) => { - resolve({ - result: { ...gapiProjectsResponseMock }, - }); - }), - ), - }, -}; - -const compute = { - zones: { - list: jest.fn( - () => - new Promise((resolve) => { - resolve({ - result: { ...gapiZonesResponseMock }, - }); - }), - ), - }, - machineTypes: { - list: jest.fn( - () => - new Promise((resolve) => { - resolve({ - result: { ...gapiMachineTypesResponseMock }, - }); - }), - ), - }, -}; - -const gapi = { - client: { - cloudbilling, - cloudresourcemanager, - compute, - }, -}; - -export { gapi as default }; diff --git a/spec/frontend/create_cluster/gke_cluster/mock_data.js b/spec/frontend/create_cluster/gke_cluster/mock_data.js deleted file mode 100644 index d9f5dbc636f..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/mock_data.js +++ /dev/null @@ -1,75 +0,0 @@ -export const emptyProjectMock = { - projectId: '', - name: '', -}; - -export const selectedProjectMock = { - projectId: 'gcp-project-123', - name: 'gcp-project', -}; - -export const selectedZoneMock = 'us-central1-a'; - -export const selectedMachineTypeMock = 'n1-standard-2'; - -export const gapiProjectsResponseMock = { - projects: [ - { - projectNumber: '1234', - projectId: 'gcp-project-123', - lifecycleState: 'ACTIVE', - name: 'gcp-project', - createTime: '2017-12-16T01:48:29.129Z', - parent: { - type: 'organization', - id: '12345', - }, - }, - ], -}; - -export const gapiZonesResponseMock = { - kind: 'compute#zoneList', - id: 'projects/gitlab-internal-153318/zones', - items: [ - { - kind: 'compute#zone', - id: '2000', - creationTimestamp: '1969-12-31T16:00:00.000-08:00', - name: 'us-central1-a', - description: 'us-central1-a', - status: 'UP', - region: - 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/regions/us-central1', - selfLink: - 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/zones/us-central1-a', - availableCpuPlatforms: ['Intel Skylake', 'Intel Broadwell', 'Intel Sandy Bridge'], - }, - ], - selfLink: 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/zones', -}; - -export const gapiMachineTypesResponseMock = { - kind: 'compute#machineTypeList', - id: 'projects/gitlab-internal-153318/zones/us-central1-a/machineTypes', - items: [ - { - kind: 'compute#machineType', - id: '3002', - creationTimestamp: '1969-12-31T16:00:00.000-08:00', - name: 'n1-standard-2', - description: '2 vCPUs, 7.5 GB RAM', - guestCpus: 2, - memoryMb: 7680, - imageSpaceGb: 10, - maximumPersistentDisks: 64, - maximumPersistentDisksSizeGb: '65536', - zone: 'us-central1-a', - selfLink: - 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/zones/us-central1-a/machineTypes/n1-standard-2', - isSharedCpu: false, - }, - ], - selfLink: - 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/zones/us-central1-a/machineTypes', -}; diff --git a/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js b/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js deleted file mode 100644 index c365cb6a9f4..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js +++ /dev/null @@ -1,141 +0,0 @@ -import testAction from 'helpers/vuex_action_helper'; -import * as actions from '~/create_cluster/gke_cluster/store/actions'; -import * as types from '~/create_cluster/gke_cluster/store/mutation_types'; -import createState from '~/create_cluster/gke_cluster/store/state'; -import gapi from '../helpers'; -import { - selectedProjectMock, - selectedZoneMock, - selectedMachineTypeMock, - gapiProjectsResponseMock, - gapiZonesResponseMock, - gapiMachineTypesResponseMock, -} from '../mock_data'; - -describe('GCP Cluster Dropdown Store Actions', () => { - describe('setProject', () => { - it('should set project', () => { - return testAction( - actions.setProject, - selectedProjectMock, - { selectedProject: {} }, - [{ type: 'SET_PROJECT', payload: selectedProjectMock }], - [], - ); - }); - }); - - describe('setZone', () => { - it('should set zone', () => { - return testAction( - actions.setZone, - selectedZoneMock, - { selectedZone: '' }, - [{ type: 'SET_ZONE', payload: selectedZoneMock }], - [], - ); - }); - }); - - describe('setMachineType', () => { - it('should set machine type', () => { - return testAction( - actions.setMachineType, - selectedMachineTypeMock, - { selectedMachineType: '' }, - [{ type: 'SET_MACHINE_TYPE', payload: selectedMachineTypeMock }], - [], - ); - }); - }); - - describe('setIsValidatingProjectBilling', () => { - it('should set machine type', () => { - return testAction( - actions.setIsValidatingProjectBilling, - true, - { isValidatingProjectBilling: null }, - [{ type: 'SET_IS_VALIDATING_PROJECT_BILLING', payload: true }], - [], - ); - }); - }); - - describe('async fetch methods', () => { - let originalGapi; - - beforeAll(() => { - originalGapi = window.gapi; - window.gapi = gapi; - window.gapiPromise = Promise.resolve(gapi); - }); - - afterAll(() => { - window.gapi = originalGapi; - delete window.gapiPromise; - }); - - describe('fetchProjects', () => { - it('fetches projects from Google API', () => { - const state = createState(); - - return testAction( - actions.fetchProjects, - null, - state, - [{ type: types.SET_PROJECTS, payload: gapiProjectsResponseMock.projects }], - [], - ); - }); - }); - - describe('validateProjectBilling', () => { - it('checks project billing status from Google API', () => { - return testAction( - actions.validateProjectBilling, - true, - { - selectedProject: selectedProjectMock, - selectedZone: '', - selectedMachineType: '', - projectHasBillingEnabled: null, - }, - [ - { type: 'SET_ZONE', payload: '' }, - { type: 'SET_MACHINE_TYPE', payload: '' }, - { type: 'SET_PROJECT_BILLING_STATUS', payload: true }, - ], - [{ type: 'setIsValidatingProjectBilling', payload: false }], - ); - }); - }); - - describe('fetchZones', () => { - it('fetches zones from Google API', () => { - const state = createState(); - - return testAction( - actions.fetchZones, - null, - state, - [{ type: types.SET_ZONES, payload: gapiZonesResponseMock.items }], - [], - ); - }); - }); - - describe('fetchMachineTypes', () => { - it('fetches machine types from Google API', () => { - const state = createState(); - - return testAction( - actions.fetchMachineTypes, - null, - state, - [{ type: types.SET_MACHINE_TYPES, payload: gapiMachineTypesResponseMock.items }], - [], - ); - }); - }); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/stores/getters_spec.js b/spec/frontend/create_cluster/gke_cluster/stores/getters_spec.js deleted file mode 100644 index 39106c3f6ca..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/stores/getters_spec.js +++ /dev/null @@ -1,103 +0,0 @@ -import { - hasProject, - hasZone, - hasMachineType, - hasValidData, -} from '~/create_cluster/gke_cluster/store/getters'; -import { selectedProjectMock, selectedZoneMock, selectedMachineTypeMock } from '../mock_data'; - -describe('GCP Cluster Dropdown Store Getters', () => { - let state; - - describe('valid states', () => { - beforeEach(() => { - state = { - projectHasBillingEnabled: true, - selectedProject: selectedProjectMock, - selectedZone: selectedZoneMock, - selectedMachineType: selectedMachineTypeMock, - }; - }); - - describe('hasProject', () => { - it('should return true when project is selected', () => { - expect(hasProject(state)).toEqual(true); - }); - }); - - describe('hasZone', () => { - it('should return true when zone is selected', () => { - expect(hasZone(state)).toEqual(true); - }); - }); - - describe('hasMachineType', () => { - it('should return true when machine type is selected', () => { - expect(hasMachineType(state)).toEqual(true); - }); - }); - - describe('hasValidData', () => { - it('should return true when a project, zone and machine type are selected', () => { - expect(hasValidData(state, { hasZone: true, hasMachineType: true })).toEqual(true); - }); - }); - }); - - describe('invalid states', () => { - beforeEach(() => { - state = { - selectedProject: { - projectId: '', - name: '', - }, - selectedZone: '', - selectedMachineType: '', - }; - }); - - describe('hasProject', () => { - it('should return false when project is not selected', () => { - expect(hasProject(state)).toEqual(false); - }); - }); - - describe('hasZone', () => { - it('should return false when zone is not selected', () => { - expect(hasZone(state)).toEqual(false); - }); - }); - - describe('hasMachineType', () => { - it('should return false when machine type is not selected', () => { - expect(hasMachineType(state)).toEqual(false); - }); - }); - - describe('hasValidData', () => { - let getters; - - beforeEach(() => { - getters = { hasZone: true, hasMachineType: true }; - }); - - it('should return false when project is not billable', () => { - state.projectHasBillingEnabled = false; - - expect(hasValidData(state, getters)).toEqual(false); - }); - - it('should return false when zone is not selected', () => { - getters.hasZone = false; - - expect(hasValidData(state, getters)).toEqual(false); - }); - - it('should return false when machine type is not selected', () => { - getters.hasMachineType = false; - - expect(hasValidData(state, getters)).toEqual(false); - }); - }); - }); -}); diff --git a/spec/frontend/create_cluster/gke_cluster/stores/mutations_spec.js b/spec/frontend/create_cluster/gke_cluster/stores/mutations_spec.js deleted file mode 100644 index 4493d49af43..00000000000 --- a/spec/frontend/create_cluster/gke_cluster/stores/mutations_spec.js +++ /dev/null @@ -1,32 +0,0 @@ -import * as types from '~/create_cluster/gke_cluster/store/mutation_types'; -import mutations from '~/create_cluster/gke_cluster/store/mutations'; -import createState from '~/create_cluster/gke_cluster/store/state'; -import { - gapiProjectsResponseMock, - gapiZonesResponseMock, - gapiMachineTypesResponseMock, -} from '../mock_data'; - -describe('GCP Cluster Dropdown Store Mutations', () => { - describe.each` - mutation | stateProperty | mockData - ${types.SET_PROJECTS} | ${'projects'} | ${gapiProjectsResponseMock.projects} - ${types.SET_ZONES} | ${'zones'} | ${gapiZonesResponseMock.items} - ${types.SET_MACHINE_TYPES} | ${'machineTypes'} | ${gapiMachineTypesResponseMock.items} - ${types.SET_MACHINE_TYPE} | ${'selectedMachineType'} | ${gapiMachineTypesResponseMock.items[0].name} - ${types.SET_ZONE} | ${'selectedZone'} | ${gapiZonesResponseMock.items[0].name} - ${types.SET_PROJECT} | ${'selectedProject'} | ${gapiProjectsResponseMock.projects[0]} - ${types.SET_PROJECT_BILLING_STATUS} | ${'projectHasBillingEnabled'} | ${true} - ${types.SET_IS_VALIDATING_PROJECT_BILLING} | ${'isValidatingProjectBilling'} | ${true} - `('$mutation', ({ mutation, stateProperty, mockData }) => { - it(`should set the mutation payload to the ${stateProperty} state property`, () => { - const state = createState(); - - expect(state[stateProperty]).not.toBe(mockData); - - mutations[mutation](state, mockData); - - expect(state[stateProperty]).toBe(mockData); - }); - }); -}); |