From 905c1110b08f93a19661cf42a276c7ea90d0a0ff Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 22 Oct 2019 11:31:16 +0000 Subject: Add latest changes from gitlab-org/gitlab@12-4-stable-ee --- .../clusters/stores/clusters_store_spec.js | 3 + .../commit_pipeline_status_component_spec.js | 179 ++++++++ .../components/cluster_form_dropdown_spec.js | 25 +- .../eks_cluster_configuration_form_spec.js | 457 +++++++++++++++++++++ .../eks_cluster/components/region_dropdown_spec.js | 55 +++ .../components/role_name_dropdown_spec.js | 43 -- .../eks_cluster/store/actions_spec.js | 60 +++ .../store/cluster_dropdown/actions_spec.js | 95 +++++ .../store/cluster_dropdown/mutations_spec.js | 36 ++ .../eks_cluster/store/mutations_spec.js | 62 +++ spec/frontend/error_tracking/utils_spec.js | 27 ++ spec/frontend/fixtures/abuse_reports.rb | 2 + spec/frontend/fixtures/admin_users.rb | 2 + spec/frontend/fixtures/application_settings.rb | 2 + spec/frontend/fixtures/autocomplete_sources.rb | 4 + spec/frontend/fixtures/blob.rb | 2 + spec/frontend/fixtures/boards.rb | 2 + spec/frontend/fixtures/branches.rb | 2 + spec/frontend/fixtures/clusters.rb | 2 + spec/frontend/fixtures/commit.rb | 2 + spec/frontend/fixtures/deploy_keys.rb | 2 + spec/frontend/fixtures/groups.rb | 2 + spec/frontend/fixtures/issues.rb | 2 + spec/frontend/fixtures/jobs.rb | 2 + spec/frontend/fixtures/labels.rb | 2 + spec/frontend/fixtures/merge_requests.rb | 2 + spec/frontend/fixtures/merge_requests_diffs.rb | 2 + spec/frontend/fixtures/pipeline_schedules.rb | 2 + spec/frontend/fixtures/pipelines.rb | 2 + spec/frontend/fixtures/projects.rb | 2 + spec/frontend/fixtures/prometheus_service.rb | 2 + spec/frontend/fixtures/raw.rb | 2 + spec/frontend/fixtures/search.rb | 2 + spec/frontend/fixtures/services.rb | 2 + spec/frontend/fixtures/sessions.rb | 2 + spec/frontend/fixtures/snippet.rb | 2 + .../fixtures/static/environments_logs.html | 109 ++++- spec/frontend/fixtures/todos.rb | 2 + spec/frontend/fixtures/u2f.rb | 2 + spec/frontend/helpers/dom_shims/README.md | 12 + .../frontend/helpers/dom_shims/get_client_rects.js | 50 +++ .../helpers/dom_shims/get_client_rects_spec.js | 71 ++++ spec/frontend/helpers/dom_shims/index.js | 1 + spec/frontend/helpers/test_constants.js | 7 +- spec/frontend/helpers/tracking_helper.js | 25 ++ spec/frontend/helpers/vue_resource_helper.js | 11 - .../ide/components/branches/search_list_spec.js | 81 ++++ spec/frontend/ide/components/error_message_spec.js | 122 ++++++ .../ide/components/file_templates/dropdown_spec.js | 175 ++++++++ spec/frontend/ide/components/jobs/list_spec.js | 115 ++++++ .../ide/components/merge_requests/list_spec.js | 214 ++++++++++ .../pipelines/__snapshots__/list_spec.js.snap | 15 + .../frontend/ide/components/pipelines/list_spec.js | 193 +++++++++ spec/frontend/ide/lib/files_spec.js | 4 +- spec/frontend/ide/mock_data.js | 228 ++++++++++ spec/frontend/ide/stores/integration_spec.js | 100 +++++ .../components/import_projects_table_spec.js | 8 +- .../frontend/import_projects/store/actions_spec.js | 64 ++- spec/frontend/issue_show/store_spec.js | 39 ++ .../issue_show/utils/update_description_spec.js | 24 ++ .../components/log/collapsible_section_spec.js | 73 ++++ spec/frontend/jobs/components/log/mock_data.js | 64 ++- spec/frontend/jobs/store/mutations_spec.js | 76 ++++ spec/frontend/jobs/store/utils_spec.js | 350 +++++++++++++++- spec/frontend/lib/utils/datetime_utility_spec.js | 29 +- spec/frontend/lib/utils/number_utility_spec.js | 13 + spec/frontend/lib/utils/set_spec.js | 19 + .../suppress_ajax_errors_during_navigation_spec.js | 37 ++ spec/frontend/lib/utils/url_utility_spec.js | 18 + .../date_time_picker_input_spec.js | 66 +++ .../date_time_picker/date_time_picker_spec.js | 157 +++++++ spec/frontend/monitoring/embed/embed_spec.js | 4 + spec/frontend/monitoring/utils_spec.js | 54 +++ .../discussion_jump_to_next_button_spec.js.snap | 1 - .../__snapshots__/delete_user_modal_spec.js.snap | 63 +++ .../user_operation_confirmation_modal_spec.js.snap | 33 ++ .../users/components/delete_user_modal_spec.js | 85 ++++ .../admin/users/components/stubs/modal_stub.js | 23 ++ .../users/components/user_modal_manager_spec.js | 148 +++++++ .../user_operation_confirmation_modal_spec.js | 47 +++ .../components/detailed_metric_spec.js | 111 +++++ .../components/performance_bar_app_spec.js | 20 + .../components/request_selector_spec.js | 64 +++ .../components/request_warning_spec.js | 33 ++ .../__snapshots__/group_empty_state_spec.js.snap | 61 +++ .../__snapshots__/project_empty_state_spec.js.snap | 186 +++++++++ spec/frontend/registry/components/app_spec.js | 160 ++++++++ .../components/collapsible_container_spec.js | 127 ++++++ .../registry/components/group_empty_state_spec.js | 23 ++ .../components/project_empty_state_spec.js | 27 ++ .../registry/components/table_registry_spec.js | 268 ++++++++++++ spec/frontend/registry/getters_spec.js | 46 --- spec/frontend/registry/mock_data.js | 134 ++++++ spec/frontend/registry/stores/actions_spec.js | 203 +++++++++ spec/frontend/registry/stores/getters_spec.js | 52 +++ spec/frontend/registry/stores/mutations_spec.js | 94 +++++ .../releases/components/milestone_list_spec.js | 56 --- .../releases/components/release_block_spec.js | 120 ------ .../releases/detail/components/app_spec.js | 70 ++++ .../frontend/releases/detail/store/actions_spec.js | 217 ++++++++++ .../releases/detail/store/mutations_spec.js | 119 ++++++ .../__snapshots__/release_block_spec.js.snap | 332 +++++++++++++++ .../releases/list/components/release_block_spec.js | 266 ++++++++++++ spec/frontend/releases/mock_data.js | 7 +- spec/frontend/reports/store/utils_spec.js | 14 +- .../__snapshots__/last_commit_spec.js.snap | 107 ++++- .../repository/components/last_commit_spec.js | 6 + .../confidential_issue_sidebar_spec.js.snap | 229 +++++++++++ .../sidebar/__snapshots__/todo_spec.js.snap | 37 ++ .../sidebar/confidential_issue_sidebar_spec.js | 167 ++++++++ spec/frontend/sidebar/todo_spec.js | 93 +++++ spec/frontend/test_setup.js | 2 + spec/frontend/tracking_spec.js | 81 ++-- .../components/artifacts_list_app_spec.js | 121 ++++++ .../components/artifacts_list_spec.js | 61 +++ .../frontend/vue_mr_widget/components/mock_data.js | 15 + .../components/mr_collapsible_extension_spec.js | 99 +++++ .../stores/artifacts_list/getters_spec.js | 32 ++ .../stores/artifacts_list/mutations_spec.js | 78 ++++ .../components/changed_file_icon_spec.js | 5 +- .../vue_shared/components/file_icon_spec.js | 2 +- .../components/modal_copy_button_spec.js | 2 +- .../components/recaptcha_eventhub_spec.js | 21 + .../vue_shared/components/recaptcha_modal_spec.js | 36 ++ .../vue_shared/directives/track_event_spec.js | 49 +++ .../vue_shared/gl_feature_flags_plugin_spec.js | 42 ++ .../mixins/gl_feature_flags_mixin_spec.js | 36 ++ .../vue_shared/plugins/global_toast_spec.js | 10 +- 128 files changed, 7856 insertions(+), 411 deletions(-) create mode 100644 spec/frontend/commit/commit_pipeline_status_component_spec.js create mode 100644 spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js create mode 100644 spec/frontend/create_cluster/eks_cluster/components/region_dropdown_spec.js delete mode 100644 spec/frontend/create_cluster/eks_cluster/components/role_name_dropdown_spec.js create mode 100644 spec/frontend/create_cluster/eks_cluster/store/actions_spec.js create mode 100644 spec/frontend/create_cluster/eks_cluster/store/cluster_dropdown/actions_spec.js create mode 100644 spec/frontend/create_cluster/eks_cluster/store/cluster_dropdown/mutations_spec.js create mode 100644 spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js create mode 100644 spec/frontend/error_tracking/utils_spec.js create mode 100644 spec/frontend/helpers/dom_shims/README.md create mode 100644 spec/frontend/helpers/dom_shims/get_client_rects.js create mode 100644 spec/frontend/helpers/dom_shims/get_client_rects_spec.js create mode 100644 spec/frontend/helpers/dom_shims/index.js create mode 100644 spec/frontend/helpers/tracking_helper.js delete mode 100644 spec/frontend/helpers/vue_resource_helper.js create mode 100644 spec/frontend/ide/components/branches/search_list_spec.js create mode 100644 spec/frontend/ide/components/error_message_spec.js create mode 100644 spec/frontend/ide/components/file_templates/dropdown_spec.js create mode 100644 spec/frontend/ide/components/jobs/list_spec.js create mode 100644 spec/frontend/ide/components/merge_requests/list_spec.js create mode 100644 spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap create mode 100644 spec/frontend/ide/components/pipelines/list_spec.js create mode 100644 spec/frontend/ide/mock_data.js create mode 100644 spec/frontend/ide/stores/integration_spec.js create mode 100644 spec/frontend/issue_show/store_spec.js create mode 100644 spec/frontend/issue_show/utils/update_description_spec.js create mode 100644 spec/frontend/jobs/components/log/collapsible_section_spec.js create mode 100644 spec/frontend/lib/utils/set_spec.js create mode 100644 spec/frontend/lib/utils/suppress_ajax_errors_during_navigation_spec.js create mode 100644 spec/frontend/monitoring/components/date_time_picker/date_time_picker_input_spec.js create mode 100644 spec/frontend/monitoring/components/date_time_picker/date_time_picker_spec.js create mode 100644 spec/frontend/monitoring/utils_spec.js create mode 100644 spec/frontend/pages/admin/users/components/__snapshots__/delete_user_modal_spec.js.snap create mode 100644 spec/frontend/pages/admin/users/components/__snapshots__/user_operation_confirmation_modal_spec.js.snap create mode 100644 spec/frontend/pages/admin/users/components/delete_user_modal_spec.js create mode 100644 spec/frontend/pages/admin/users/components/stubs/modal_stub.js create mode 100644 spec/frontend/pages/admin/users/components/user_modal_manager_spec.js create mode 100644 spec/frontend/pages/admin/users/components/user_operation_confirmation_modal_spec.js create mode 100644 spec/frontend/performance_bar/components/detailed_metric_spec.js create mode 100644 spec/frontend/performance_bar/components/performance_bar_app_spec.js create mode 100644 spec/frontend/performance_bar/components/request_selector_spec.js create mode 100644 spec/frontend/performance_bar/components/request_warning_spec.js create mode 100644 spec/frontend/registry/components/__snapshots__/group_empty_state_spec.js.snap create mode 100644 spec/frontend/registry/components/__snapshots__/project_empty_state_spec.js.snap create mode 100644 spec/frontend/registry/components/app_spec.js create mode 100644 spec/frontend/registry/components/collapsible_container_spec.js create mode 100644 spec/frontend/registry/components/group_empty_state_spec.js create mode 100644 spec/frontend/registry/components/project_empty_state_spec.js create mode 100644 spec/frontend/registry/components/table_registry_spec.js delete mode 100644 spec/frontend/registry/getters_spec.js create mode 100644 spec/frontend/registry/mock_data.js create mode 100644 spec/frontend/registry/stores/actions_spec.js create mode 100644 spec/frontend/registry/stores/getters_spec.js create mode 100644 spec/frontend/registry/stores/mutations_spec.js delete mode 100644 spec/frontend/releases/components/milestone_list_spec.js delete mode 100644 spec/frontend/releases/components/release_block_spec.js create mode 100644 spec/frontend/releases/detail/components/app_spec.js create mode 100644 spec/frontend/releases/detail/store/actions_spec.js create mode 100644 spec/frontend/releases/detail/store/mutations_spec.js create mode 100644 spec/frontend/releases/list/components/__snapshots__/release_block_spec.js.snap create mode 100644 spec/frontend/releases/list/components/release_block_spec.js create mode 100644 spec/frontend/sidebar/__snapshots__/confidential_issue_sidebar_spec.js.snap create mode 100644 spec/frontend/sidebar/__snapshots__/todo_spec.js.snap create mode 100644 spec/frontend/sidebar/confidential_issue_sidebar_spec.js create mode 100644 spec/frontend/sidebar/todo_spec.js create mode 100644 spec/frontend/vue_mr_widget/components/artifacts_list_app_spec.js create mode 100644 spec/frontend/vue_mr_widget/components/artifacts_list_spec.js create mode 100644 spec/frontend/vue_mr_widget/components/mock_data.js create mode 100644 spec/frontend/vue_mr_widget/components/mr_collapsible_extension_spec.js create mode 100644 spec/frontend/vue_mr_widget/stores/artifacts_list/getters_spec.js create mode 100644 spec/frontend/vue_mr_widget/stores/artifacts_list/mutations_spec.js create mode 100644 spec/frontend/vue_shared/components/recaptcha_eventhub_spec.js create mode 100644 spec/frontend/vue_shared/components/recaptcha_modal_spec.js create mode 100644 spec/frontend/vue_shared/directives/track_event_spec.js create mode 100644 spec/frontend/vue_shared/gl_feature_flags_plugin_spec.js create mode 100644 spec/frontend/vue_shared/mixins/gl_feature_flags_mixin_spec.js (limited to 'spec/frontend') diff --git a/spec/frontend/clusters/stores/clusters_store_spec.js b/spec/frontend/clusters/stores/clusters_store_spec.js index ee3b7d8aa90..5ee06eb44c9 100644 --- a/spec/frontend/clusters/stores/clusters_store_spec.js +++ b/spec/frontend/clusters/stores/clusters_store_spec.js @@ -54,8 +54,11 @@ describe('Clusters Store', () => { environmentsHelpPath: null, clustersHelpPath: null, deployBoardsHelpPath: null, + cloudRunHelpPath: null, status: mockResponseData.status, statusReason: mockResponseData.status_reason, + providerType: null, + preInstalledKnative: false, rbac: false, applications: { helm: { diff --git a/spec/frontend/commit/commit_pipeline_status_component_spec.js b/spec/frontend/commit/commit_pipeline_status_component_spec.js new file mode 100644 index 00000000000..1736d1d0df8 --- /dev/null +++ b/spec/frontend/commit/commit_pipeline_status_component_spec.js @@ -0,0 +1,179 @@ +import Visibility from 'visibilityjs'; +import { GlLoadingIcon } from '@gitlab/ui'; +import Poll from '~/lib/utils/poll'; +import flash from '~/flash'; +import CiIcon from '~/vue_shared/components/ci_icon.vue'; +import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue'; +import { shallowMount } from '@vue/test-utils'; +import { getJSONFixture } from '../helpers/fixtures'; + +jest.mock('~/lib/utils/poll'); +jest.mock('visibilityjs'); +jest.mock('~/flash'); + +const mockFetchData = jest.fn(); +jest.mock('~/projects/tree/services/commit_pipeline_service', () => + jest.fn().mockImplementation(() => ({ + fetchData: mockFetchData.mockReturnValue(Promise.resolve()), + })), +); + +describe('Commit pipeline status component', () => { + let wrapper; + const { pipelines } = getJSONFixture('pipelines/pipelines.json'); + const { status: mockCiStatus } = pipelines[0].details; + + const defaultProps = { + endpoint: 'endpoint', + }; + + const createComponent = (props = {}) => { + wrapper = shallowMount(CommitPipelineStatus, { + propsData: { + ...defaultProps, + ...props, + }, + sync: false, + }); + }; + + const findLoader = () => wrapper.find(GlLoadingIcon); + const findLink = () => wrapper.find('a'); + const findCiIcon = () => findLink().find(CiIcon); + + afterEach(() => { + wrapper.destroy(); + wrapper = null; + jest.clearAllMocks(); + }); + + describe('Visibility management', () => { + describe('when component is hidden', () => { + beforeEach(() => { + Visibility.hidden.mockReturnValue(true); + createComponent(); + }); + + it('does not start polling', () => { + const [pollInstance] = Poll.mock.instances; + expect(pollInstance.makeRequest).not.toHaveBeenCalled(); + }); + + it('requests pipeline data', () => { + expect(mockFetchData).toHaveBeenCalled(); + }); + }); + + describe('when component is visible', () => { + beforeEach(() => { + Visibility.hidden.mockReturnValue(false); + createComponent(); + }); + + it('starts polling', () => { + const [pollInstance] = [...Poll.mock.instances].reverse(); + expect(pollInstance.makeRequest).toHaveBeenCalled(); + }); + }); + + describe('when component changes its visibility', () => { + it.each` + visibility | action + ${false} | ${'restart'} + ${true} | ${'stop'} + `( + '$action polling when component visibility becomes $visibility', + ({ visibility, action }) => { + Visibility.hidden.mockReturnValue(!visibility); + createComponent(); + const [pollInstance] = Poll.mock.instances; + expect(pollInstance[action]).not.toHaveBeenCalled(); + Visibility.hidden.mockReturnValue(visibility); + const [visibilityHandler] = Visibility.change.mock.calls[0]; + visibilityHandler(); + expect(pollInstance[action]).toHaveBeenCalled(); + }, + ); + }); + }); + + it('stops polling when component is destroyed', () => { + createComponent(); + wrapper.destroy(); + const [pollInstance] = Poll.mock.instances; + expect(pollInstance.stop).toHaveBeenCalled(); + }); + + describe('when polling', () => { + let pollConfig; + beforeEach(() => { + Poll.mockImplementation(config => { + pollConfig = config; + return { makeRequest: jest.fn(), restart: jest.fn(), stop: jest.fn() }; + }); + createComponent(); + }); + + it('shows the loading icon at start', () => { + createComponent(); + expect(findLoader().exists()).toBe(true); + + pollConfig.successCallback({ + data: { pipelines: [] }, + }); + + return wrapper.vm.$nextTick().then(() => { + expect(findLoader().exists()).toBe(false); + }); + }); + + describe('is successful', () => { + beforeEach(() => { + pollConfig.successCallback({ + data: { pipelines: [{ details: { status: mockCiStatus } }] }, + }); + return wrapper.vm.$nextTick(); + }); + + it('does not render loader', () => { + expect(findLoader().exists()).toBe(false); + }); + + it('renders link with href', () => { + expect(findLink().attributes('href')).toEqual(mockCiStatus.details_path); + }); + + it('renders CI icon', () => { + expect(findCiIcon().attributes('data-original-title')).toEqual('Pipeline: pending'); + expect(findCiIcon().props('status')).toEqual(mockCiStatus); + }); + }); + + describe('is not successful', () => { + beforeEach(() => { + pollConfig.errorCallback(); + }); + + it('does not render loader', () => { + expect(findLoader().exists()).toBe(false); + }); + + it('renders link with href', () => { + expect(findLink().attributes('href')).toBeUndefined(); + }); + + it('renders not found CI icon', () => { + expect(findCiIcon().attributes('data-original-title')).toEqual('Pipeline: not found'); + expect(findCiIcon().props('status')).toEqual({ + text: 'not found', + icon: 'status_notfound', + group: 'notfound', + }); + }); + + it('displays flash error message', () => { + expect(flash).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js b/spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js index e873ef0b2fa..366c2fc7b26 100644 --- a/spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js +++ b/spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js @@ -7,12 +7,22 @@ import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidde describe('ClusterFormDropdown', () => { let vm; + const firstItem = { name: 'item 1', value: 1 }; + const secondItem = { name: 'item 2', value: 2 }; + const items = [firstItem, secondItem, { name: 'item 3', value: 3 }]; beforeEach(() => { vm = shallowMount(ClusterFormDropdown); }); afterEach(() => vm.destroy()); + describe('when initial value is provided', () => { + it('sets selectedItem to initial value', () => { + vm.setProps({ items, value: secondItem.value }); + expect(vm.find(DropdownButton).props('toggleText')).toEqual(secondItem.name); + }); + }); + describe('when no item is selected', () => { it('displays placeholder text', () => { const placeholder = 'placeholder'; @@ -24,18 +34,19 @@ describe('ClusterFormDropdown', () => { }); describe('when an item is selected', () => { - const selectedItem = { name: 'Name', value: 'value' }; - beforeEach(() => { - vm.setData({ selectedItem }); + vm.setProps({ items }); + vm.findAll('.js-dropdown-item') + .at(1) + .trigger('click'); }); it('displays selected item label', () => { - expect(vm.find(DropdownButton).props('toggleText')).toEqual(selectedItem.name); + expect(vm.find(DropdownButton).props('toggleText')).toEqual(secondItem.name); }); it('sets selected value to dropdown hidden input', () => { - expect(vm.find(DropdownHiddenInput).props('value')).toEqual(selectedItem.value); + expect(vm.find(DropdownHiddenInput).props('value')).toEqual(secondItem.value); }); }); @@ -124,9 +135,7 @@ describe('ClusterFormDropdown', () => { }); it('it filters results by search query', () => { - const secondItem = { name: 'second item' }; - const items = [{ name: 'first item' }, secondItem]; - const searchQuery = 'second'; + const searchQuery = secondItem.name; vm.setProps({ items }); vm.setData({ searchQuery }); diff --git a/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js b/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js new file mode 100644 index 00000000000..69290f6dfa9 --- /dev/null +++ b/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js @@ -0,0 +1,457 @@ +import { shallowMount, createLocalVue } from '@vue/test-utils'; +import Vuex from 'vuex'; +import Vue from 'vue'; +import { GlFormCheckbox } from '@gitlab/ui'; + +import EksClusterConfigurationForm from '~/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue'; +import RegionDropdown from '~/create_cluster/eks_cluster/components/region_dropdown.vue'; +import eksClusterFormState from '~/create_cluster/eks_cluster/store/state'; +import clusterDropdownStoreState from '~/create_cluster/eks_cluster/store/cluster_dropdown/state'; + +const localVue = createLocalVue(); +localVue.use(Vuex); + +describe('EksClusterConfigurationForm', () => { + let store; + let actions; + let state; + let rolesState; + let regionsState; + let vpcsState; + let subnetsState; + let keyPairsState; + let securityGroupsState; + let vpcsActions; + let rolesActions; + let regionsActions; + let subnetsActions; + let keyPairsActions; + let securityGroupsActions; + let vm; + + beforeEach(() => { + state = eksClusterFormState(); + actions = { + setClusterName: jest.fn(), + setEnvironmentScope: jest.fn(), + setKubernetesVersion: jest.fn(), + setRegion: jest.fn(), + setVpc: jest.fn(), + setSubnet: jest.fn(), + setRole: jest.fn(), + setKeyPair: jest.fn(), + setSecurityGroup: jest.fn(), + setGitlabManagedCluster: jest.fn(), + }; + regionsActions = { + fetchItems: jest.fn(), + }; + keyPairsActions = { + fetchItems: jest.fn(), + }; + vpcsActions = { + fetchItems: jest.fn(), + }; + subnetsActions = { + fetchItems: jest.fn(), + }; + rolesActions = { + fetchItems: jest.fn(), + }; + securityGroupsActions = { + fetchItems: jest.fn(), + }; + rolesState = { + ...clusterDropdownStoreState(), + }; + regionsState = { + ...clusterDropdownStoreState(), + }; + vpcsState = { + ...clusterDropdownStoreState(), + }; + subnetsState = { + ...clusterDropdownStoreState(), + }; + keyPairsState = { + ...clusterDropdownStoreState(), + }; + securityGroupsState = { + ...clusterDropdownStoreState(), + }; + store = new Vuex.Store({ + state, + actions, + modules: { + vpcs: { + namespaced: true, + state: vpcsState, + actions: vpcsActions, + }, + regions: { + namespaced: true, + state: regionsState, + actions: regionsActions, + }, + subnets: { + namespaced: true, + state: subnetsState, + actions: subnetsActions, + }, + roles: { + namespaced: true, + state: rolesState, + actions: rolesActions, + }, + keyPairs: { + namespaced: true, + state: keyPairsState, + actions: keyPairsActions, + }, + securityGroups: { + namespaced: true, + state: securityGroupsState, + actions: securityGroupsActions, + }, + }, + }); + }); + + beforeEach(() => { + vm = shallowMount(EksClusterConfigurationForm, { + localVue, + store, + propsData: { + gitlabManagedClusterHelpPath: '', + kubernetesIntegrationHelpPath: '', + }, + }); + }); + + afterEach(() => { + vm.destroy(); + }); + + const findClusterNameInput = () => vm.find('[id=eks-cluster-name]'); + const findEnvironmentScopeInput = () => vm.find('[id=eks-environment-scope]'); + const findKubernetesVersionDropdown = () => vm.find('[field-id="eks-kubernetes-version"]'); + const findRegionDropdown = () => vm.find(RegionDropdown); + const findKeyPairDropdown = () => vm.find('[field-id="eks-key-pair"]'); + const findVpcDropdown = () => vm.find('[field-id="eks-vpc"]'); + const findSubnetDropdown = () => vm.find('[field-id="eks-subnet"]'); + const findRoleDropdown = () => vm.find('[field-id="eks-role"]'); + const findSecurityGroupDropdown = () => vm.find('[field-id="eks-security-group"]'); + const findGitlabManagedClusterCheckbox = () => vm.find(GlFormCheckbox); + + describe('when mounted', () => { + it('fetches available regions', () => { + expect(regionsActions.fetchItems).toHaveBeenCalled(); + }); + + it('fetches available roles', () => { + expect(rolesActions.fetchItems).toHaveBeenCalled(); + }); + }); + + it('sets isLoadingRoles to RoleDropdown loading property', () => { + rolesState.isLoadingItems = true; + + return Vue.nextTick().then(() => { + expect(findRoleDropdown().props('loading')).toBe(rolesState.isLoadingItems); + }); + }); + + it('sets roles to RoleDropdown items property', () => { + expect(findRoleDropdown().props('items')).toBe(rolesState.items); + }); + + it('sets RoleDropdown hasErrors to true when loading roles failed', () => { + rolesState.loadingItemsError = new Error(); + + expect(findRoleDropdown().props('hasErrors')).toEqual(true); + }); + + it('sets isLoadingRegions to RegionDropdown loading property', () => { + regionsState.isLoadingItems = true; + + return Vue.nextTick().then(() => { + expect(findRegionDropdown().props('loading')).toBe(regionsState.isLoadingItems); + }); + }); + + it('sets regions to RegionDropdown regions property', () => { + expect(findRegionDropdown().props('regions')).toBe(regionsState.items); + }); + + it('sets loadingRegionsError to RegionDropdown error property', () => { + expect(findRegionDropdown().props('error')).toBe(regionsState.loadingItemsError); + }); + + it('disables KeyPairDropdown when no region is selected', () => { + expect(findKeyPairDropdown().props('disabled')).toBe(true); + }); + + it('enables KeyPairDropdown when no region is selected', () => { + state.selectedRegion = { name: 'west-1 ' }; + + return Vue.nextTick().then(() => { + expect(findKeyPairDropdown().props('disabled')).toBe(false); + }); + }); + + it('sets isLoadingKeyPairs to KeyPairDropdown loading property', () => { + keyPairsState.isLoadingItems = true; + + return Vue.nextTick().then(() => { + expect(findKeyPairDropdown().props('loading')).toBe(keyPairsState.isLoadingItems); + }); + }); + + it('sets keyPairs to KeyPairDropdown items property', () => { + expect(findKeyPairDropdown().props('items')).toBe(keyPairsState.items); + }); + + it('sets KeyPairDropdown hasErrors to true when loading key pairs fails', () => { + keyPairsState.loadingItemsError = new Error(); + + expect(findKeyPairDropdown().props('hasErrors')).toEqual(true); + }); + + it('disables VpcDropdown when no region is selected', () => { + expect(findVpcDropdown().props('disabled')).toBe(true); + }); + + it('enables VpcDropdown when no region is selected', () => { + state.selectedRegion = { name: 'west-1 ' }; + + return Vue.nextTick().then(() => { + expect(findVpcDropdown().props('disabled')).toBe(false); + }); + }); + + it('sets isLoadingVpcs to VpcDropdown loading property', () => { + vpcsState.isLoadingItems = true; + + return Vue.nextTick().then(() => { + expect(findVpcDropdown().props('loading')).toBe(vpcsState.isLoadingItems); + }); + }); + + it('sets vpcs to VpcDropdown items property', () => { + expect(findVpcDropdown().props('items')).toBe(vpcsState.items); + }); + + it('sets VpcDropdown hasErrors to true when loading vpcs fails', () => { + vpcsState.loadingItemsError = new Error(); + + expect(findVpcDropdown().props('hasErrors')).toEqual(true); + }); + + it('disables SubnetDropdown when no vpc is selected', () => { + expect(findSubnetDropdown().props('disabled')).toBe(true); + }); + + it('enables SubnetDropdown when a vpc is selected', () => { + state.selectedVpc = { name: 'vpc-1 ' }; + + return Vue.nextTick().then(() => { + expect(findSubnetDropdown().props('disabled')).toBe(false); + }); + }); + + it('sets isLoadingSubnets to SubnetDropdown loading property', () => { + subnetsState.isLoadingItems = true; + + return Vue.nextTick().then(() => { + expect(findSubnetDropdown().props('loading')).toBe(subnetsState.isLoadingItems); + }); + }); + + it('sets subnets to SubnetDropdown items property', () => { + expect(findSubnetDropdown().props('items')).toBe(subnetsState.items); + }); + + it('sets SubnetDropdown hasErrors to true when loading subnets fails', () => { + subnetsState.loadingItemsError = new Error(); + + expect(findSubnetDropdown().props('hasErrors')).toEqual(true); + }); + + it('disables SecurityGroupDropdown when no vpc is selected', () => { + expect(findSecurityGroupDropdown().props('disabled')).toBe(true); + }); + + it('enables SecurityGroupDropdown when a vpc is selected', () => { + state.selectedVpc = { name: 'vpc-1 ' }; + + return Vue.nextTick().then(() => { + expect(findSecurityGroupDropdown().props('disabled')).toBe(false); + }); + }); + + it('sets isLoadingSecurityGroups to SecurityGroupDropdown loading property', () => { + securityGroupsState.isLoadingItems = true; + + return Vue.nextTick().then(() => { + expect(findSecurityGroupDropdown().props('loading')).toBe(securityGroupsState.isLoadingItems); + }); + }); + + it('sets securityGroups to SecurityGroupDropdown items property', () => { + expect(findSecurityGroupDropdown().props('items')).toBe(securityGroupsState.items); + }); + + it('sets SecurityGroupDropdown hasErrors to true when loading security groups fails', () => { + securityGroupsState.loadingItemsError = new Error(); + + expect(findSecurityGroupDropdown().props('hasErrors')).toEqual(true); + }); + + describe('when region is selected', () => { + const region = { name: 'us-west-2' }; + + beforeEach(() => { + findRegionDropdown().vm.$emit('input', region); + }); + + it('dispatches setRegion action', () => { + expect(actions.setRegion).toHaveBeenCalledWith(expect.anything(), { region }, undefined); + }); + + it('fetches available vpcs', () => { + expect(vpcsActions.fetchItems).toHaveBeenCalledWith(expect.anything(), { region }, undefined); + }); + + it('fetches available key pairs', () => { + expect(keyPairsActions.fetchItems).toHaveBeenCalledWith( + expect.anything(), + { region }, + undefined, + ); + }); + }); + + it('dispatches setClusterName when cluster name input changes', () => { + const clusterName = 'name'; + + findClusterNameInput().vm.$emit('input', clusterName); + + expect(actions.setClusterName).toHaveBeenCalledWith( + expect.anything(), + { clusterName }, + undefined, + ); + }); + + it('dispatches setEnvironmentScope when environment scope input changes', () => { + const environmentScope = 'production'; + + findEnvironmentScopeInput().vm.$emit('input', environmentScope); + + expect(actions.setEnvironmentScope).toHaveBeenCalledWith( + expect.anything(), + { environmentScope }, + undefined, + ); + }); + + it('dispatches setKubernetesVersion when kubernetes version dropdown changes', () => { + const kubernetesVersion = { name: '1.11' }; + + findKubernetesVersionDropdown().vm.$emit('input', kubernetesVersion); + + expect(actions.setKubernetesVersion).toHaveBeenCalledWith( + expect.anything(), + { kubernetesVersion }, + undefined, + ); + }); + + it('dispatches setGitlabManagedCluster when gitlab managed cluster input changes', () => { + const gitlabManagedCluster = false; + + findGitlabManagedClusterCheckbox().vm.$emit('input', gitlabManagedCluster); + + expect(actions.setGitlabManagedCluster).toHaveBeenCalledWith( + expect.anything(), + { gitlabManagedCluster }, + undefined, + ); + }); + + describe('when vpc is selected', () => { + const vpc = { name: 'vpc-1' }; + + beforeEach(() => { + findVpcDropdown().vm.$emit('input', vpc); + }); + + it('dispatches setVpc action', () => { + expect(actions.setVpc).toHaveBeenCalledWith(expect.anything(), { vpc }, undefined); + }); + + it('dispatches fetchSubnets action', () => { + expect(subnetsActions.fetchItems).toHaveBeenCalledWith(expect.anything(), { vpc }, undefined); + }); + + it('dispatches fetchSecurityGroups action', () => { + expect(securityGroupsActions.fetchItems).toHaveBeenCalledWith( + expect.anything(), + { vpc }, + undefined, + ); + }); + }); + + describe('when a subnet is selected', () => { + const subnet = { name: 'subnet-1' }; + + beforeEach(() => { + findSubnetDropdown().vm.$emit('input', subnet); + }); + + it('dispatches setSubnet action', () => { + expect(actions.setSubnet).toHaveBeenCalledWith(expect.anything(), { subnet }, undefined); + }); + }); + + describe('when role is selected', () => { + const role = { name: 'admin' }; + + beforeEach(() => { + findRoleDropdown().vm.$emit('input', role); + }); + + it('dispatches setRole action', () => { + expect(actions.setRole).toHaveBeenCalledWith(expect.anything(), { role }, undefined); + }); + }); + + describe('when key pair is selected', () => { + const keyPair = { name: 'key pair' }; + + beforeEach(() => { + findKeyPairDropdown().vm.$emit('input', keyPair); + }); + + it('dispatches setKeyPair action', () => { + expect(actions.setKeyPair).toHaveBeenCalledWith(expect.anything(), { keyPair }, undefined); + }); + }); + + describe('when security group is selected', () => { + const securityGroup = { name: 'default group' }; + + beforeEach(() => { + findSecurityGroupDropdown().vm.$emit('input', securityGroup); + }); + + it('dispatches setSecurityGroup action', () => { + expect(actions.setSecurityGroup).toHaveBeenCalledWith( + expect.anything(), + { securityGroup }, + undefined, + ); + }); + }); +}); diff --git a/spec/frontend/create_cluster/eks_cluster/components/region_dropdown_spec.js b/spec/frontend/create_cluster/eks_cluster/components/region_dropdown_spec.js new file mode 100644 index 00000000000..0ebb5026a4b --- /dev/null +++ b/spec/frontend/create_cluster/eks_cluster/components/region_dropdown_spec.js @@ -0,0 +1,55 @@ +import { shallowMount } from '@vue/test-utils'; + +import ClusterFormDropdown from '~/create_cluster/eks_cluster/components/cluster_form_dropdown.vue'; +import RegionDropdown from '~/create_cluster/eks_cluster/components/region_dropdown.vue'; + +describe('RegionDropdown', () => { + let vm; + + const getClusterFormDropdown = () => vm.find(ClusterFormDropdown); + + beforeEach(() => { + vm = shallowMount(RegionDropdown); + }); + afterEach(() => vm.destroy()); + + it('renders a cluster-form-dropdown', () => { + expect(getClusterFormDropdown().exists()).toBe(true); + }); + + it('sets regions to cluster-form-dropdown items property', () => { + const regions = [{ name: 'basic' }]; + + vm.setProps({ regions }); + + expect(getClusterFormDropdown().props('items')).toEqual(regions); + }); + + it('sets a loading text', () => { + expect(getClusterFormDropdown().props('loadingText')).toEqual('Loading Regions'); + }); + + it('sets a placeholder', () => { + expect(getClusterFormDropdown().props('placeholder')).toEqual('Select a region'); + }); + + it('sets an empty results text', () => { + expect(getClusterFormDropdown().props('emptyText')).toEqual('No region found'); + }); + + it('sets a search field placeholder', () => { + expect(getClusterFormDropdown().props('searchFieldPlaceholder')).toEqual('Search regions'); + }); + + it('sets hasErrors property', () => { + vm.setProps({ error: {} }); + + expect(getClusterFormDropdown().props('hasErrors')).toEqual(true); + }); + + it('sets an error message', () => { + expect(getClusterFormDropdown().props('errorMessage')).toEqual( + 'Could not load regions from your AWS account', + ); + }); +}); diff --git a/spec/frontend/create_cluster/eks_cluster/components/role_name_dropdown_spec.js b/spec/frontend/create_cluster/eks_cluster/components/role_name_dropdown_spec.js deleted file mode 100644 index 657637c1b56..00000000000 --- a/spec/frontend/create_cluster/eks_cluster/components/role_name_dropdown_spec.js +++ /dev/null @@ -1,43 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; - -import ClusterFormDropdown from '~/create_cluster/eks_cluster/components/cluster_form_dropdown.vue'; -import RoleNameDropdown from '~/create_cluster/eks_cluster/components/role_name_dropdown.vue'; - -describe('RoleNameDropdown', () => { - let vm; - - beforeEach(() => { - vm = shallowMount(RoleNameDropdown); - }); - afterEach(() => vm.destroy()); - - it('renders a cluster-form-dropdown', () => { - expect(vm.find(ClusterFormDropdown).exists()).toBe(true); - }); - - it('sets roles to cluster-form-dropdown items property', () => { - const roles = [{ name: 'basic' }]; - - vm.setProps({ roles }); - - expect(vm.find(ClusterFormDropdown).props('items')).toEqual(roles); - }); - - it('sets a loading text', () => { - expect(vm.find(ClusterFormDropdown).props('loadingText')).toEqual('Loading IAM Roles'); - }); - - it('sets a placeholder', () => { - expect(vm.find(ClusterFormDropdown).props('placeholder')).toEqual('Select role name'); - }); - - it('sets an empty results text', () => { - expect(vm.find(ClusterFormDropdown).props('emptyText')).toEqual('No IAM Roles found'); - }); - - it('sets a search field placeholder', () => { - expect(vm.find(ClusterFormDropdown).props('searchFieldPlaceholder')).toEqual( - 'Search IAM Roles', - ); - }); -}); diff --git a/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js b/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js new file mode 100644 index 00000000000..1ed7f806804 --- /dev/null +++ b/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js @@ -0,0 +1,60 @@ +import testAction from 'helpers/vuex_action_helper'; + +import createState from '~/create_cluster/eks_cluster/store/state'; +import * as actions from '~/create_cluster/eks_cluster/store/actions'; +import { + SET_CLUSTER_NAME, + SET_ENVIRONMENT_SCOPE, + SET_KUBERNETES_VERSION, + SET_REGION, + SET_VPC, + SET_KEY_PAIR, + SET_SUBNET, + SET_ROLE, + SET_SECURITY_GROUP, + SET_GITLAB_MANAGED_CLUSTER, +} from '~/create_cluster/eks_cluster/store/mutation_types'; + +describe('EKS Cluster Store Actions', () => { + let clusterName; + let environmentScope; + let kubernetesVersion; + let region; + let vpc; + let subnet; + let role; + let keyPair; + let securityGroup; + let gitlabManagedCluster; + + beforeEach(() => { + clusterName = 'my cluster'; + environmentScope = 'production'; + kubernetesVersion = '11.1'; + region = { name: 'regions-1' }; + vpc = { name: 'vpc-1' }; + subnet = { name: 'subnet-1' }; + role = { name: 'role-1' }; + keyPair = { name: 'key-pair-1' }; + securityGroup = { name: 'default group' }; + gitlabManagedCluster = true; + }); + + it.each` + action | mutation | payload | payloadDescription + ${'setClusterName'} | ${SET_CLUSTER_NAME} | ${{ clusterName }} | ${'cluster name'} + ${'setEnvironmentScope'} | ${SET_ENVIRONMENT_SCOPE} | ${{ environmentScope }} | ${'environment scope'} + ${'setKubernetesVersion'} | ${SET_KUBERNETES_VERSION} | ${{ kubernetesVersion }} | ${'kubernetes version'} + ${'setRole'} | ${SET_ROLE} | ${{ role }} | ${'role'} + ${'setRegion'} | ${SET_REGION} | ${{ region }} | ${'region'} + ${'setKeyPair'} | ${SET_KEY_PAIR} | ${{ keyPair }} | ${'key pair'} + ${'setVpc'} | ${SET_VPC} | ${{ vpc }} | ${'vpc'} + ${'setSubnet'} | ${SET_SUBNET} | ${{ subnet }} | ${'subnet'} + ${'setSecurityGroup'} | ${SET_SECURITY_GROUP} | ${{ securityGroup }} | ${'securityGroup'} + ${'setGitlabManagedCluster'} | ${SET_GITLAB_MANAGED_CLUSTER} | ${gitlabManagedCluster} | ${'gitlab managed cluster'} + `(`$action commits $mutation with $payloadDescription payload`, data => { + const { action, mutation, payload } = data; + + testAction(actions[action], payload, createState(), [{ type: mutation, payload }]); + }); +}); diff --git a/spec/frontend/create_cluster/eks_cluster/store/cluster_dropdown/actions_spec.js b/spec/frontend/create_cluster/eks_cluster/store/cluster_dropdown/actions_spec.js new file mode 100644 index 00000000000..58f8855a64c --- /dev/null +++ b/spec/frontend/create_cluster/eks_cluster/store/cluster_dropdown/actions_spec.js @@ -0,0 +1,95 @@ +import testAction from 'helpers/vuex_action_helper'; + +import createState from '~/create_cluster/eks_cluster/store/cluster_dropdown/state'; +import * as types from '~/create_cluster/eks_cluster/store/cluster_dropdown/mutation_types'; +import actionsFactory from '~/create_cluster/eks_cluster/store/cluster_dropdown/actions'; + +describe('Cluster dropdown Store Actions', () => { + const items = [{ name: 'item 1' }]; + let fetchFn; + let actions; + + beforeEach(() => { + fetchFn = jest.fn(); + actions = actionsFactory(fetchFn); + }); + + describe('fetchItems', () => { + describe('on success', () => { + beforeEach(() => { + fetchFn.mockResolvedValueOnce(items); + actions = actionsFactory(fetchFn); + }); + + it('dispatches success with received items', () => + testAction( + actions.fetchItems, + null, + createState(), + [], + [ + { type: 'requestItems' }, + { + type: 'receiveItemsSuccess', + payload: { items }, + }, + ], + )); + }); + + describe('on failure', () => { + const error = new Error('Could not fetch items'); + + beforeEach(() => { + fetchFn.mockRejectedValueOnce(error); + }); + + it('dispatches success with received items', () => + testAction( + actions.fetchItems, + null, + createState(), + [], + [ + { type: 'requestItems' }, + { + type: 'receiveItemsError', + payload: { error }, + }, + ], + )); + }); + }); + + describe('requestItems', () => { + it(`commits ${types.REQUEST_ITEMS} mutation`, () => + testAction(actions.requestItems, null, createState(), [{ type: types.REQUEST_ITEMS }])); + }); + + describe('receiveItemsSuccess', () => { + it(`commits ${types.RECEIVE_ITEMS_SUCCESS} mutation`, () => + testAction(actions.receiveItemsSuccess, { items }, createState(), [ + { + type: types.RECEIVE_ITEMS_SUCCESS, + payload: { + items, + }, + }, + ])); + }); + + describe('receiveItemsError', () => { + it(`commits ${types.RECEIVE_ITEMS_ERROR} mutation`, () => { + const error = new Error('Error fetching items'); + + testAction(actions.receiveItemsError, { error }, createState(), [ + { + type: types.RECEIVE_ITEMS_ERROR, + payload: { + error, + }, + }, + ]); + }); + }); +}); diff --git a/spec/frontend/create_cluster/eks_cluster/store/cluster_dropdown/mutations_spec.js b/spec/frontend/create_cluster/eks_cluster/store/cluster_dropdown/mutations_spec.js new file mode 100644 index 00000000000..0665047edea --- /dev/null +++ b/spec/frontend/create_cluster/eks_cluster/store/cluster_dropdown/mutations_spec.js @@ -0,0 +1,36 @@ +import { + REQUEST_ITEMS, + RECEIVE_ITEMS_SUCCESS, + RECEIVE_ITEMS_ERROR, +} from '~/create_cluster/eks_cluster/store/cluster_dropdown/mutation_types'; +import createState from '~/create_cluster/eks_cluster/store/cluster_dropdown/state'; +import mutations from '~/create_cluster/eks_cluster/store/cluster_dropdown/mutations'; + +describe('Cluster dropdown store mutations', () => { + let state; + let emptyPayload; + let items; + let error; + + beforeEach(() => { + emptyPayload = {}; + items = [{ name: 'item 1' }]; + error = new Error('could not load error'); + state = createState(); + }); + + it.each` + mutation | mutatedProperty | payload | expectedValue | expectedValueDescription + ${REQUEST_ITEMS} | ${'isLoadingItems'} | ${emptyPayload} | ${true} | ${true} + ${REQUEST_ITEMS} | ${'loadingItemsError'} | ${emptyPayload} | ${null} | ${null} + ${RECEIVE_ITEMS_SUCCESS} | ${'isLoadingItems'} | ${{ items }} | ${false} | ${false} + ${RECEIVE_ITEMS_SUCCESS} | ${'items'} | ${{ items }} | ${items} | ${'items payload'} + ${RECEIVE_ITEMS_ERROR} | ${'isLoadingItems'} | ${{ error }} | ${false} | ${false} + ${RECEIVE_ITEMS_ERROR} | ${'error'} | ${{ error }} | ${error} | ${'received error object'} + `(`$mutation sets $mutatedProperty to $expectedValueDescription`, data => { + const { mutation, mutatedProperty, payload, expectedValue } = data; + + mutations[mutation](state, payload); + expect(state[mutatedProperty]).toBe(expectedValue); + }); +}); diff --git a/spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js b/spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js new file mode 100644 index 00000000000..81b65180fb5 --- /dev/null +++ b/spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js @@ -0,0 +1,62 @@ +import { + SET_CLUSTER_NAME, + SET_ENVIRONMENT_SCOPE, + SET_KUBERNETES_VERSION, + SET_REGION, + SET_VPC, + SET_KEY_PAIR, + SET_SUBNET, + SET_ROLE, + SET_SECURITY_GROUP, + SET_GITLAB_MANAGED_CLUSTER, +} from '~/create_cluster/eks_cluster/store/mutation_types'; +import createState from '~/create_cluster/eks_cluster/store/state'; +import mutations from '~/create_cluster/eks_cluster/store/mutations'; + +describe('Create EKS cluster store mutations', () => { + let clusterName; + let environmentScope; + let kubernetesVersion; + let state; + let region; + let vpc; + let subnet; + let role; + let keyPair; + let securityGroup; + let gitlabManagedCluster; + + beforeEach(() => { + clusterName = 'my cluster'; + environmentScope = 'production'; + kubernetesVersion = '11.1'; + region = { name: 'regions-1' }; + vpc = { name: 'vpc-1' }; + subnet = { name: 'subnet-1' }; + role = { name: 'role-1' }; + keyPair = { name: 'key pair' }; + securityGroup = { name: 'default group' }; + gitlabManagedCluster = false; + + state = createState(); + }); + + it.each` + mutation | mutatedProperty | payload | expectedValue | expectedValueDescription + ${SET_CLUSTER_NAME} | ${'clusterName'} | ${{ clusterName }} | ${clusterName} | ${'cluster name'} + ${SET_ENVIRONMENT_SCOPE} | ${'environmentScope'} | ${{ environmentScope }} | ${environmentScope} | ${'environment scope'} + ${SET_KUBERNETES_VERSION} | ${'kubernetesVersion'} | ${{ kubernetesVersion }} | ${kubernetesVersion} | ${'kubernetes version'} + ${SET_ROLE} | ${'selectedRole'} | ${{ role }} | ${role} | ${'selected role payload'} + ${SET_REGION} | ${'selectedRegion'} | ${{ region }} | ${region} | ${'selected region payload'} + ${SET_KEY_PAIR} | ${'selectedKeyPair'} | ${{ keyPair }} | ${keyPair} | ${'selected key pair payload'} + ${SET_VPC} | ${'selectedVpc'} | ${{ vpc }} | ${vpc} | ${'selected vpc payload'} + ${SET_SUBNET} | ${'selectedSubnet'} | ${{ subnet }} | ${subnet} | ${'selected sybnet payload'} + ${SET_SECURITY_GROUP} | ${'selectedSecurityGroup'} | ${{ securityGroup }} | ${securityGroup} | ${'selected security group payload'} + ${SET_GITLAB_MANAGED_CLUSTER} | ${'gitlabManagedCluster'} | ${{ gitlabManagedCluster }} | ${gitlabManagedCluster} | ${'gitlab managed cluster'} + `(`$mutation sets $mutatedProperty to $expectedValueDescription`, data => { + const { mutation, mutatedProperty, payload, expectedValue } = data; + + mutations[mutation](state, payload); + expect(state[mutatedProperty]).toBe(expectedValue); + }); +}); diff --git a/spec/frontend/error_tracking/utils_spec.js b/spec/frontend/error_tracking/utils_spec.js new file mode 100644 index 00000000000..0e9047cd375 --- /dev/null +++ b/spec/frontend/error_tracking/utils_spec.js @@ -0,0 +1,27 @@ +import * as errorTrackingUtils from '~/error_tracking/utils'; + +const externalUrl = 'https://sentry.io/organizations/test-sentry-nk/issues/1/?project=1'; + +describe('Error Tracking Events', () => { + describe('trackViewInSentryOptions', () => { + it('should return correct event options', () => { + expect(errorTrackingUtils.trackViewInSentryOptions(externalUrl)).toEqual({ + category: 'Error Tracking', + action: 'click_view_in_sentry', + label: 'External Url', + property: externalUrl, + }); + }); + }); + + describe('trackClickErrorLinkToSentryOptions', () => { + it('should return correct event options', () => { + expect(errorTrackingUtils.trackClickErrorLinkToSentryOptions(externalUrl)).toEqual({ + category: 'Error Tracking', + action: 'click_error_link_to_sentry', + label: 'Error Link', + property: externalUrl, + }); + }); + }); +}); diff --git a/spec/frontend/fixtures/abuse_reports.rb b/spec/frontend/fixtures/abuse_reports.rb index 21356390cae..712ed2e8d7e 100644 --- a/spec/frontend/fixtures/abuse_reports.rb +++ b/spec/frontend/fixtures/abuse_reports.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Admin::AbuseReportsController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/admin_users.rb b/spec/frontend/fixtures/admin_users.rb index 0209594dadc..b0f7d69f091 100644 --- a/spec/frontend/fixtures/admin_users.rb +++ b/spec/frontend/fixtures/admin_users.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Admin::UsersController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/application_settings.rb b/spec/frontend/fixtures/application_settings.rb index afe5949ed3b..a16888d8f03 100644 --- a/spec/frontend/fixtures/application_settings.rb +++ b/spec/frontend/fixtures/application_settings.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Admin::ApplicationSettingsController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/autocomplete_sources.rb b/spec/frontend/fixtures/autocomplete_sources.rb index 9e04328e2b9..382eff02b0f 100644 --- a/spec/frontend/fixtures/autocomplete_sources.rb +++ b/spec/frontend/fixtures/autocomplete_sources.rb @@ -24,6 +24,10 @@ describe Projects::AutocompleteSourcesController, '(JavaScript fixtures)', type: create(:label, project: project, title: 'feature') create(:label, project: project, title: 'documentation') + create(:label, project: project, title: 'P1') + create(:label, project: project, title: 'P2') + create(:label, project: project, title: 'P3') + create(:label, project: project, title: 'P4') get :labels, format: :json, diff --git a/spec/frontend/fixtures/blob.rb b/spec/frontend/fixtures/blob.rb index ce5030efbf8..28a3badaa17 100644 --- a/spec/frontend/fixtures/blob.rb +++ b/spec/frontend/fixtures/blob.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::BlobController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/boards.rb b/spec/frontend/fixtures/boards.rb index f257d80390f..b3c7865a088 100644 --- a/spec/frontend/fixtures/boards.rb +++ b/spec/frontend/fixtures/boards.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::BoardsController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/branches.rb b/spec/frontend/fixtures/branches.rb index 197fe42c52a..2dc8cde625a 100644 --- a/spec/frontend/fixtures/branches.rb +++ b/spec/frontend/fixtures/branches.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::BranchesController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/clusters.rb b/spec/frontend/fixtures/clusters.rb index f15ef010807..fd64d3c0e28 100644 --- a/spec/frontend/fixtures/clusters.rb +++ b/spec/frontend/fixtures/clusters.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::ClustersController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/commit.rb b/spec/frontend/fixtures/commit.rb index a328c455356..2c4bf6fbd3d 100644 --- a/spec/frontend/fixtures/commit.rb +++ b/spec/frontend/fixtures/commit.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::CommitController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/deploy_keys.rb b/spec/frontend/fixtures/deploy_keys.rb index fca233c6f59..f491c424bcf 100644 --- a/spec/frontend/fixtures/deploy_keys.rb +++ b/spec/frontend/fixtures/deploy_keys.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::DeployKeysController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/groups.rb b/spec/frontend/fixtures/groups.rb index c1bb2d43332..237fc711594 100644 --- a/spec/frontend/fixtures/groups.rb +++ b/spec/frontend/fixtures/groups.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe 'Groups (JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/issues.rb b/spec/frontend/fixtures/issues.rb index b5eb38e0023..7e524990863 100644 --- a/spec/frontend/fixtures/issues.rb +++ b/spec/frontend/fixtures/issues.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::IssuesController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/jobs.rb b/spec/frontend/fixtures/jobs.rb index a3a7759c85b..787ab517f75 100644 --- a/spec/frontend/fixtures/jobs.rb +++ b/spec/frontend/fixtures/jobs.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::JobsController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/labels.rb b/spec/frontend/fixtures/labels.rb index a312287970f..e4d66dbcd0a 100644 --- a/spec/frontend/fixtures/labels.rb +++ b/spec/frontend/fixtures/labels.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe 'Labels (JavaScript fixtures)' do diff --git a/spec/frontend/fixtures/merge_requests.rb b/spec/frontend/fixtures/merge_requests.rb index 88706e96676..8fbdb534b3d 100644 --- a/spec/frontend/fixtures/merge_requests.rb +++ b/spec/frontend/fixtures/merge_requests.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::MergeRequestsController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/merge_requests_diffs.rb b/spec/frontend/fixtures/merge_requests_diffs.rb index b633a0495a6..9493cba03bb 100644 --- a/spec/frontend/fixtures/merge_requests_diffs.rb +++ b/spec/frontend/fixtures/merge_requests_diffs.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::MergeRequests::DiffsController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/pipeline_schedules.rb b/spec/frontend/fixtures/pipeline_schedules.rb index a70091a3919..e00a35d5362 100644 --- a/spec/frontend/fixtures/pipeline_schedules.rb +++ b/spec/frontend/fixtures/pipeline_schedules.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::PipelineSchedulesController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/pipelines.rb b/spec/frontend/fixtures/pipelines.rb index ed57eb0aa80..83fc13af7d3 100644 --- a/spec/frontend/fixtures/pipelines.rb +++ b/spec/frontend/fixtures/pipelines.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::PipelinesController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/projects.rb b/spec/frontend/fixtures/projects.rb index 91e3b65215a..af5b70fbbeb 100644 --- a/spec/frontend/fixtures/projects.rb +++ b/spec/frontend/fixtures/projects.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe 'Projects (JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/prometheus_service.rb b/spec/frontend/fixtures/prometheus_service.rb index 93ee81120d7..c404b8260d2 100644 --- a/spec/frontend/fixtures/prometheus_service.rb +++ b/spec/frontend/fixtures/prometheus_service.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::ServicesController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/raw.rb b/spec/frontend/fixtures/raw.rb index 801c80a0112..9c9fa4ec40b 100644 --- a/spec/frontend/fixtures/raw.rb +++ b/spec/frontend/fixtures/raw.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe 'Raw files', '(JavaScript fixtures)' do diff --git a/spec/frontend/fixtures/search.rb b/spec/frontend/fixtures/search.rb index c26c6998ae9..025cc53c745 100644 --- a/spec/frontend/fixtures/search.rb +++ b/spec/frontend/fixtures/search.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe SearchController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/services.rb b/spec/frontend/fixtures/services.rb index ee1e088f158..1b81a83ca49 100644 --- a/spec/frontend/fixtures/services.rb +++ b/spec/frontend/fixtures/services.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Projects::ServicesController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/sessions.rb b/spec/frontend/fixtures/sessions.rb index 18574ea06b5..a4dc0aef79c 100644 --- a/spec/frontend/fixtures/sessions.rb +++ b/spec/frontend/fixtures/sessions.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe 'Sessions (JavaScript fixtures)' do diff --git a/spec/frontend/fixtures/snippet.rb b/spec/frontend/fixtures/snippet.rb index 23bcdb47ac6..34a6fade9c9 100644 --- a/spec/frontend/fixtures/snippet.rb +++ b/spec/frontend/fixtures/snippet.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe SnippetsController, '(JavaScript fixtures)', type: :controller do diff --git a/spec/frontend/fixtures/static/environments_logs.html b/spec/frontend/fixtures/static/environments_logs.html index 6179d3dbc23..ccf9c364154 100644 --- a/spec/frontend/fixtures/static/environments_logs.html +++ b/spec/frontend/fixtures/static/environments_logs.html @@ -1,29 +1,102 @@ -
-
+
+
-
- -