summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/features/projects/clusters/gcp_spec.rb14
-rw-r--r--spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js53
-rw-r--r--spec/javascripts/create_cluster/gke_cluster/stores/getters_spec.js52
-rw-r--r--spec/migrations/20200123155929_remove_invalid_jira_data_spec.rb70
-rw-r--r--spec/services/groups/import_export/export_service_spec.rb16
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)