diff options
Diffstat (limited to 'spec')
5 files changed, 193 insertions, 12 deletions
diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb index 4bc0aef0cd4..09cd1c6a765 100644 --- a/spec/features/projects/clusters/gcp_spec.rb +++ b/spec/features/projects/clusters/gcp_spec.rb @@ -14,6 +14,11 @@ describe 'Gcp Cluster', :js, :do_not_mock_admin_mode do allow(Projects::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 } end + def submit_form + execute_script('document.querySelector(".js-gke-cluster-creation-submit").removeAttribute("disabled")') + execute_script('document.querySelector(".js-gke-cluster-creation-submit").click()') + end + context 'when user has signed with Google' do let(:project_id) { 'test-project-1234' } @@ -34,7 +39,7 @@ describe 'Gcp Cluster', :js, :do_not_mock_admin_mode do end context 'when user filled form with valid parameters' do - subject { click_button 'Create Kubernetes cluster' } + subject { submit_form } before do allow_any_instance_of(GoogleApi::CloudPlatform::Client) @@ -47,8 +52,8 @@ describe 'Gcp Cluster', :js, :do_not_mock_admin_mode do allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil) - execute_script('document.querySelector(".js-gke-cluster-creation-submit").removeAttribute("disabled")') - sleep 2 # wait for ajax + expect(page).to have_css('.js-gcp-project-id-dropdown') + execute_script('document.querySelector(".js-gcp-project-id-dropdown input").setAttribute("type", "text")') execute_script('document.querySelector(".js-gcp-zone-dropdown input").setAttribute("type", "text")') execute_script('document.querySelector(".js-gcp-machine-type-dropdown input").setAttribute("type", "text")') @@ -86,8 +91,7 @@ describe 'Gcp Cluster', :js, :do_not_mock_admin_mode do context 'when user filled form with invalid parameters' do before do - execute_script('document.querySelector(".js-gke-cluster-creation-submit").removeAttribute("disabled")') - click_button 'Create Kubernetes cluster' + submit_form end it 'user sees a validation error' do 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 new file mode 100644 index 00000000000..9401ba83ef4 --- /dev/null +++ b/spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js @@ -0,0 +1,53 @@ +import Vuex from 'vuex'; +import { shallowMount, createLocalVue } from '@vue/test-utils'; +import GkeSubmitButton from '~/create_cluster/gke_cluster/components/gke_submit_button.vue'; + +const localVue = createLocalVue(); + +localVue.use(Vuex); + +describe('GkeSubmitButton', () => { + let wrapper; + let store; + let hasValidData; + + const buildStore = () => + new Vuex.Store({ + getters: { + hasValidData, + }, + }); + + const buildWrapper = () => + shallowMount(GkeSubmitButton, { + store, + localVue, + }); + + 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/javascripts/create_cluster/gke_cluster/stores/getters_spec.js b/spec/javascripts/create_cluster/gke_cluster/stores/getters_spec.js index ac92716b0ab..39106c3f6ca 100644 --- a/spec/javascripts/create_cluster/gke_cluster/stores/getters_spec.js +++ b/spec/javascripts/create_cluster/gke_cluster/stores/getters_spec.js @@ -1,4 +1,9 @@ -import * as getters from '~/create_cluster/gke_cluster/store/getters'; +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', () => { @@ -7,6 +12,7 @@ describe('GCP Cluster Dropdown Store Getters', () => { describe('valid states', () => { beforeEach(() => { state = { + projectHasBillingEnabled: true, selectedProject: selectedProjectMock, selectedZone: selectedZoneMock, selectedMachineType: selectedMachineTypeMock, @@ -15,19 +21,25 @@ describe('GCP Cluster Dropdown Store Getters', () => { describe('hasProject', () => { it('should return true when project is selected', () => { - expect(getters.hasProject(state)).toEqual(true); + expect(hasProject(state)).toEqual(true); }); }); describe('hasZone', () => { it('should return true when zone is selected', () => { - expect(getters.hasZone(state)).toEqual(true); + expect(hasZone(state)).toEqual(true); }); }); describe('hasMachineType', () => { it('should return true when machine type is selected', () => { - expect(getters.hasMachineType(state)).toEqual(true); + 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); }); }); }); @@ -46,19 +58,45 @@ describe('GCP Cluster Dropdown Store Getters', () => { describe('hasProject', () => { it('should return false when project is not selected', () => { - expect(getters.hasProject(state)).toEqual(false); + expect(hasProject(state)).toEqual(false); }); }); describe('hasZone', () => { it('should return false when zone is not selected', () => { - expect(getters.hasZone(state)).toEqual(false); + expect(hasZone(state)).toEqual(false); }); }); describe('hasMachineType', () => { it('should return false when machine type is not selected', () => { - expect(getters.hasMachineType(state)).toEqual(false); + 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/migrations/20200123155929_remove_invalid_jira_data_spec.rb b/spec/migrations/20200123155929_remove_invalid_jira_data_spec.rb new file mode 100644 index 00000000000..0e640623ea9 --- /dev/null +++ b/spec/migrations/20200123155929_remove_invalid_jira_data_spec.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require 'spec_helper' +require Rails.root.join('db', 'post_migrate', '20200123155929_remove_invalid_jira_data.rb') + +describe RemoveInvalidJiraData, :migration do + let(:jira_tracker_data) { table(:jira_tracker_data) } + let(:services) { table(:services) } + + let(:service) { services.create(id: 1) } + let(:data) do + { + service_id: service.id, + encrypted_api_url: 'http:url.com', + encrypted_api_url_iv: 'somevalue', + encrypted_url: 'http:url.com', + encrypted_url_iv: 'somevalue', + encrypted_username: 'username', + encrypted_username_iv: 'somevalue', + encrypted_password: 'username', + encrypted_password_iv: 'somevalue' + } + end + + let!(:valid_data) { jira_tracker_data.create(data) } + let!(:empty_data) { jira_tracker_data.create(service_id: service.id) } + let!(:invalid_api_url) do + data[:encrypted_api_url_iv] = nil + jira_tracker_data.create(data) + end + let!(:missing_api_url) do + data[:encrypted_api_url] = '' + data[:encrypted_api_url_iv] = nil + jira_tracker_data.create(data) + end + let!(:invalid_url) do + data[:encrypted_url_iv] = nil + jira_tracker_data.create(data) + end + let!(:missing_url) do + data[:encrypted_url] = '' + jira_tracker_data.create(data) + end + let!(:invalid_username) do + data[:encrypted_username_iv] = nil + jira_tracker_data.create(data) + end + let!(:missing_username) do + data[:encrypted_username] = nil + data[:encrypted_username_iv] = nil + jira_tracker_data.create(data) + end + let!(:invalid_password) do + data[:encrypted_password_iv] = nil + jira_tracker_data.create(data) + end + let!(:missing_password) do + data[:encrypted_password] = nil + data[:encrypted_username_iv] = nil + jira_tracker_data.create(data) + end + + it 'removes the invalid data' do + valid_data_records = [valid_data, empty_data, missing_api_url, missing_url, missing_username, missing_password] + + expect { migrate! }.to change { jira_tracker_data.count }.from(10).to(6) + + expect(jira_tracker_data.all).to match_array(valid_data_records) + end +end diff --git a/spec/services/groups/import_export/export_service_spec.rb b/spec/services/groups/import_export/export_service_spec.rb index 2024e1ed457..b1f76964722 100644 --- a/spec/services/groups/import_export/export_service_spec.rb +++ b/spec/services/groups/import_export/export_service_spec.rb @@ -10,6 +10,10 @@ describe Groups::ImportExport::ExportService do let(:export_path) { shared.export_path } let(:service) { described_class.new(group: group, user: user, params: { shared: shared }) } + before do + group.add_owner(user) + end + after do FileUtils.rm_rf(export_path) end @@ -30,6 +34,18 @@ describe Groups::ImportExport::ExportService do end end + context 'when user does not have admin_group permission' do + let!(:another_user) { create(:user) } + let(:service) { described_class.new(group: group, user: another_user, params: { shared: shared }) } + + it 'fails' do + expected_message = + "User with ID: %s does not have permission to Group %s with ID: %s." % + [another_user.id, group.name, group.id] + expect { service.execute }.to raise_error(Gitlab::ImportExport::Error).with_message(expected_message) + end + end + context 'when saving services fail' do before do allow(service).to receive_message_chain(:tree_exporter, :save).and_return(false) |