From ccceb26617a28ee6acda0d46a3997428c9f7e56a Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Thu, 18 Jan 2018 17:07:37 +0000 Subject: Generate ssh key on the fly for QA --- qa/Gemfile | 1 + qa/Gemfile.lock | 4 +++- qa/qa.rb | 1 + qa/qa/runtime/rsa_key.rb | 21 +++++++++++++++++++++ qa/qa/runtime/user.rb | 11 ----------- qa/qa/specs/features/project/add_deploy_key_spec.rb | 2 +- 6 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 qa/qa/runtime/rsa_key.rb diff --git a/qa/Gemfile b/qa/Gemfile index 4c866a3f893..1cc40f2d2d0 100644 --- a/qa/Gemfile +++ b/qa/Gemfile @@ -6,3 +6,4 @@ gem 'capybara-screenshot', '~> 1.0.18' gem 'rake', '~> 12.3.0' gem 'rspec', '~> 3.7' gem 'selenium-webdriver', '~> 3.8.0' +gem 'net-ssh', require: false diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock index 88d5fe834a0..7aa442b8c8e 100644 --- a/qa/Gemfile.lock +++ b/qa/Gemfile.lock @@ -24,6 +24,7 @@ GEM method_source (0.9.0) mini_mime (1.0.0) mini_portile2 (2.3.0) + net-ssh (4.1.0) nokogiri (1.8.1) mini_portile2 (~> 2.3.0) pry (0.11.3) @@ -63,10 +64,11 @@ PLATFORMS DEPENDENCIES capybara (~> 2.16.1) capybara-screenshot (~> 1.0.18) + net-ssh pry-byebug (~> 3.5.1) rake (~> 12.3.0) rspec (~> 3.7) selenium-webdriver (~> 3.8.0) BUNDLED WITH - 1.16.0 + 1.16.1 diff --git a/qa/qa.rb b/qa/qa.rb index 4803432aeee..b8821f2c164 100644 --- a/qa/qa.rb +++ b/qa/qa.rb @@ -11,6 +11,7 @@ module QA autoload :Scenario, 'qa/runtime/scenario' autoload :Browser, 'qa/runtime/browser' autoload :Env, 'qa/runtime/env' + autoload :RSAKey, 'qa/runtime/rsa_key' end ## diff --git a/qa/qa/runtime/rsa_key.rb b/qa/qa/runtime/rsa_key.rb new file mode 100644 index 00000000000..e9b6ea66dbd --- /dev/null +++ b/qa/qa/runtime/rsa_key.rb @@ -0,0 +1,21 @@ +require 'net/ssh' +require 'forwardable' + +module QA + module Runtime + class RSAKey + extend Forwardable + + def initialize(bits = 4096) + @key = OpenSSL::PKey::RSA.new(bits) + end + + attr_reader :key + def_delegators :@key, :fingerprint + + def public_key + @public_key ||= "#{key.ssh_type} #{[key.to_blob].pack('m0')}" + end + end + end +end diff --git a/qa/qa/runtime/user.rb b/qa/qa/runtime/user.rb index 2832439d9e0..60027c89ab1 100644 --- a/qa/qa/runtime/user.rb +++ b/qa/qa/runtime/user.rb @@ -10,17 +10,6 @@ module QA def password ENV['GITLAB_PASSWORD'] || '5iveL!fe' end - - def ssh_key - <<~KEY.delete("\n") - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFf6RYK3qu/RKF/3ndJmL5xgMLp3O9 - 6x8lTay+QGZ0+9FnnAXMdUqBq/ZU6d/gyMB4IaW3nHzM1w049++yAB6UPCzMB8Uo27K5 - /jyZCtj7Vm9PFNjF/8am1kp46c/SeYicQgQaSBdzIW3UDEa1Ef68qroOlvpi9PYZ/tA7 - M0YP0K5PXX+E36zaIRnJVMPT3f2k+GnrxtjafZrwFdpOP/Fol5BQLBgcsyiU+LM1SuaC - rzd8c9vyaTA1CxrkxaZh+buAi0PmdDtaDrHd42gqZkXCKavyvgM5o2CkQ5LJHCgzpXy0 - 5qNFzmThBSkb+XtoxbyagBiGbVZtSVow6Xa7qewz= dummy@gitlab.com - KEY - end end end end diff --git a/qa/qa/specs/features/project/add_deploy_key_spec.rb b/qa/qa/specs/features/project/add_deploy_key_spec.rb index 43a85213501..abff641ccce 100644 --- a/qa/qa/specs/features/project/add_deploy_key_spec.rb +++ b/qa/qa/specs/features/project/add_deploy_key_spec.rb @@ -1,7 +1,7 @@ module QA feature 'deploy keys support', :core do given(:deploy_key_title) { 'deploy key title' } - given(:deploy_key_value) { Runtime::User.ssh_key } + given(:deploy_key_value) { Runtime::RSAKey.new.public_key } scenario 'user adds a deploy key' do Runtime::Browser.visit(:gitlab, Page::Main::Login) -- cgit v1.2.1 From 4b1da8502f4625116447014b18adc7e1986e038e Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Mon, 22 Jan 2018 16:25:14 +0800 Subject: Also test if the fingerprint is correct --- .../javascripts/deploy_keys/components/key.vue | 4 ++-- qa/qa/factory/resource/deploy_key.rb | 6 ++++++ qa/qa/page/base.rb | 16 +++++++++++++++- qa/qa/page/project/settings/deploy_keys.rb | 22 ++++++++++++++++++---- .../specs/features/project/add_deploy_key_spec.rb | 4 +++- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/deploy_keys/components/key.vue b/app/assets/javascripts/deploy_keys/components/key.vue index 843564ce016..c6091efd62f 100644 --- a/app/assets/javascripts/deploy_keys/components/key.vue +++ b/app/assets/javascripts/deploy_keys/components/key.vue @@ -53,10 +53,10 @@
- + {{ deployKey.title }} -
+
{{ deployKey.fingerprint }}
diff --git a/qa/qa/factory/resource/deploy_key.rb b/qa/qa/factory/resource/deploy_key.rb index 671114d38b1..d161e57ec99 100644 --- a/qa/qa/factory/resource/deploy_key.rb +++ b/qa/qa/factory/resource/deploy_key.rb @@ -10,6 +10,12 @@ module QA end end + product :fingerprint do + Page::Project::Settings::Repository.act do + expand_deploy_keys(&:key_fingerprint) + end + end + dependency Factory::Resource::Project, as: :project do |project| project.name = 'project-to-deploy' project.description = 'project for adding deploy key test' diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb index ea4c920c82c..81ba80cdbaf 100644 --- a/qa/qa/page/base.rb +++ b/qa/qa/page/base.rb @@ -41,7 +41,21 @@ module QA end def click_element(name) - find(Page::Element.new(name).selector_css).click + find_element(name).click + end + + def find_element(name) + find(element_selector_css(name)) + end + + def within_element(name) + page.within(element_selector_css(name)) do + yield + end + end + + def element_selector_css(name) + Page::Element.new(name).selector_css end def self.path diff --git a/qa/qa/page/project/settings/deploy_keys.rb b/qa/qa/page/project/settings/deploy_keys.rb index f9e40bf4252..332e84724c7 100644 --- a/qa/qa/page/project/settings/deploy_keys.rb +++ b/qa/qa/page/project/settings/deploy_keys.rb @@ -14,8 +14,8 @@ module QA end view 'app/assets/javascripts/deploy_keys/components/key.vue' do - element :key_title, /class=".*title.*"/ - element :key_title_field, '{{ deployKey.title }}' + element :key_title, /class=".*qa-key-title.*"/ + element :key_fingerprint, /class=".*qa-key-fingerprint.*"/ end def fill_key_title(title) @@ -31,8 +31,22 @@ module QA end def key_title - page.within('.qa-project-deploy-keys') do - page.find('.title').text + within_project_deploy_keys do + find_element(:key_title).text + end + end + + def key_fingerprint + within_project_deploy_keys do + find_element(:key_fingerprint).text + end + end + + private + + def within_project_deploy_keys + within_element(:project_deploy_keys) do + yield end end end diff --git a/qa/qa/specs/features/project/add_deploy_key_spec.rb b/qa/qa/specs/features/project/add_deploy_key_spec.rb index 54852bfce4d..67d302a5593 100644 --- a/qa/qa/specs/features/project/add_deploy_key_spec.rb +++ b/qa/qa/specs/features/project/add_deploy_key_spec.rb @@ -1,7 +1,8 @@ module QA feature 'deploy keys support', :core do + given(:key) { Runtime::RSAKey.new } given(:deploy_key_title) { 'deploy key title' } - given(:deploy_key_value) { Runtime::RSAKey.new.public_key } + given(:deploy_key_value) { key.public_key } scenario 'user adds a deploy key' do Runtime::Browser.visit(:gitlab, Page::Main::Login) @@ -13,6 +14,7 @@ module QA end expect(deploy_key.title).to eq(deploy_key_title) + expect(deploy_key.fingerprint).to eq(key.fingerprint) end end end -- cgit v1.2.1 From cc02eeff6eca6ad318c5147848dcbc4ddf87680d Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Wed, 24 Jan 2018 23:21:59 +0800 Subject: Move initialize method later. --- qa/qa/runtime/rsa_key.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qa/qa/runtime/rsa_key.rb b/qa/qa/runtime/rsa_key.rb index e9b6ea66dbd..d456062bce7 100644 --- a/qa/qa/runtime/rsa_key.rb +++ b/qa/qa/runtime/rsa_key.rb @@ -6,13 +6,13 @@ module QA class RSAKey extend Forwardable + attr_reader :key + def_delegators :@key, :fingerprint + def initialize(bits = 4096) @key = OpenSSL::PKey::RSA.new(bits) end - attr_reader :key - def_delegators :@key, :fingerprint - def public_key @public_key ||= "#{key.ssh_type} #{[key.to_blob].pack('m0')}" end -- cgit v1.2.1 From a17f4c23b706004c36242d6455c64f191e5082e5 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Wed, 24 Jan 2018 23:31:44 +0800 Subject: Add an test for QA::Runtime::RSAKey --- qa/spec/runtime/rsa_key.rb | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 qa/spec/runtime/rsa_key.rb diff --git a/qa/spec/runtime/rsa_key.rb b/qa/spec/runtime/rsa_key.rb new file mode 100644 index 00000000000..ff277b9077b --- /dev/null +++ b/qa/spec/runtime/rsa_key.rb @@ -0,0 +1,9 @@ +describe QA::Runtime::RSAKey do + describe '#public_key' do + subject { described_class.new.public_key } + + it 'generates a public RSA key' do + expect(subject).to match(/\Assh\-rsa AAAA[0-9A-Za-z+\/]+={0,3}\z/) + end + end +end -- cgit v1.2.1 From 5e911c5d2c18b5f909f2072cc97bb75704496ea1 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Wed, 24 Jan 2018 23:35:17 +0800 Subject: Prefer local variables instead --- qa/qa/specs/features/project/add_deploy_key_spec.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qa/qa/specs/features/project/add_deploy_key_spec.rb b/qa/qa/specs/features/project/add_deploy_key_spec.rb index 67d302a5593..b9998dda895 100644 --- a/qa/qa/specs/features/project/add_deploy_key_spec.rb +++ b/qa/qa/specs/features/project/add_deploy_key_spec.rb @@ -1,13 +1,13 @@ module QA feature 'deploy keys support', :core do - given(:key) { Runtime::RSAKey.new } - given(:deploy_key_title) { 'deploy key title' } - given(:deploy_key_value) { key.public_key } - scenario 'user adds a deploy key' do Runtime::Browser.visit(:gitlab, Page::Main::Login) Page::Main::Login.act { sign_in_using_credentials } + key = Runtime::RSAKey.new + deploy_key_title = 'deploy key title' + deploy_key_value = key.public_key + deploy_key = Factory::Resource::DeployKey.fabricate! do |resource| resource.title = deploy_key_title resource.key = deploy_key_value -- cgit v1.2.1 From 8f6f421643c02cbc4620269f15f51942b389d9cd Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Wed, 24 Jan 2018 16:54:06 +0000 Subject: Moves status icon into a vue file and adds tests Moves merging component into a vue file, adds i18n and better test cases --- .../components/mr_widget_deployment.js | 2 +- .../components/mr_widget_status_icon.js | 36 -------------- .../components/mr_widget_status_icon.vue | 57 ++++++++++++++++++++++ .../components/states/mr_widget_archived.vue | 2 +- .../states/mr_widget_auto_merge_failed.vue | 2 +- .../components/states/mr_widget_checking.js | 2 +- .../components/states/mr_widget_closed.js | 2 +- .../components/states/mr_widget_conflicts.js | 2 +- .../components/states/mr_widget_failed_to_merge.js | 2 +- .../mr_widget_merge_when_pipeline_succeeds.js | 2 +- .../components/states/mr_widget_merged.js | 2 +- .../components/states/mr_widget_merging.js | 29 ----------- .../components/states/mr_widget_merging.vue | 35 +++++++++++++ .../components/states/mr_widget_missing_branch.js | 2 +- .../components/states/mr_widget_not_allowed.js | 2 +- .../states/mr_widget_pipeline_blocked.js | 2 +- .../components/states/mr_widget_pipeline_failed.js | 2 +- .../components/states/mr_widget_ready_to_merge.js | 2 +- .../components/states/mr_widget_rebase.vue | 2 +- .../components/states/mr_widget_sha_mismatch.js | 2 +- .../states/mr_widget_unresolved_discussions.js | 2 +- .../components/states/mr_widget_wip.js | 2 +- .../vue_merge_request_widget/dependencies.js | 2 +- .../components/mr_widget_status_icon_spec.js | 44 +++++++++++++++++ .../components/states/mr_widget_locked_spec.js | 33 ------------- .../components/states/mr_widget_merging_spec.js | 34 +++++++++++++ 26 files changed, 189 insertions(+), 117 deletions(-) delete mode 100644 app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.js create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue delete mode 100644 app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.js create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue create mode 100644 spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js delete mode 100644 spec/javascripts/vue_mr_widget/components/states/mr_widget_locked_spec.js create mode 100644 spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_deployment.js b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_deployment.js index d48f3a01420..d174a900f63 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_deployment.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_deployment.js @@ -2,7 +2,7 @@ import { getTimeago } from '~/lib/utils/datetime_utility'; import { visitUrl } from '../../lib/utils/url_utility'; import Flash from '../../flash'; import MemoryUsage from './mr_widget_memory_usage'; -import StatusIcon from './mr_widget_status_icon'; +import StatusIcon from './mr_widget_status_icon.vue'; import MRWidgetService from '../services/mr_widget_service'; export default { diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.js b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.js deleted file mode 100644 index eeb990908f6..00000000000 --- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.js +++ /dev/null @@ -1,36 +0,0 @@ -import ciIcon from '../../vue_shared/components/ci_icon.vue'; -import loadingIcon from '../../vue_shared/components/loading_icon.vue'; - -export default { - props: { - status: { type: String, required: true }, - showDisabledButton: { type: Boolean, required: false }, - }, - components: { - ciIcon, - loadingIcon, - }, - computed: { - statusObj() { - return { - group: this.status, - icon: `status_${this.status}`, - }; - }, - }, - template: ` -
-
- -
- - -
- `, -}; diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue new file mode 100644 index 00000000000..1fdc3218671 --- /dev/null +++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue @@ -0,0 +1,57 @@ + + diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_archived.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_archived.vue index afa9cc57544..cfbd44d41b2 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_archived.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_archived.vue @@ -1,5 +1,5 @@ + diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_missing_branch.js b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_missing_branch.js index 16ff1109e3f..303877d6fbf 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_missing_branch.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_missing_branch.js @@ -1,4 +1,4 @@ -import statusIcon from '../mr_widget_status_icon'; +import statusIcon from '../mr_widget_status_icon.vue'; import tooltip from '../../../vue_shared/directives/tooltip'; import mrWidgetMergeHelp from '../../components/mr_widget_merge_help'; diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_not_allowed.js b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_not_allowed.js index 00047718201..cea3d97fa88 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_not_allowed.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_not_allowed.js @@ -1,4 +1,4 @@ -import statusIcon from '../mr_widget_status_icon'; +import statusIcon from '../mr_widget_status_icon.vue'; export default { name: 'MRWidgetNotAllowed', diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_pipeline_blocked.js b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_pipeline_blocked.js index 2c84f423ee2..e66ce071ab4 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_pipeline_blocked.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_pipeline_blocked.js @@ -1,4 +1,4 @@ -import statusIcon from '../mr_widget_status_icon'; +import statusIcon from '../mr_widget_status_icon.vue'; export default { name: 'MRWidgetPipelineBlocked', diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_pipeline_failed.js b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_pipeline_failed.js index cbaa73deffa..4d9a2ca530f 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_pipeline_failed.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_pipeline_failed.js @@ -1,4 +1,4 @@ -import statusIcon from '../mr_widget_status_icon'; +import statusIcon from '../mr_widget_status_icon.vue'; export default { name: 'MRWidgetPipelineBlocked', diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_ready_to_merge.js b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_ready_to_merge.js index e51eef07093..7ba6c29006a 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_ready_to_merge.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_ready_to_merge.js @@ -3,7 +3,7 @@ import warningSvg from 'icons/_icon_status_warning.svg'; import simplePoll from '~/lib/utils/simple_poll'; import MergeRequest from '../../../merge_request'; import Flash from '../../../flash'; -import statusIcon from '../mr_widget_status_icon'; +import statusIcon from '../mr_widget_status_icon.vue'; import eventHub from '../../event_hub'; export default { diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue index 52dd0245ff0..2968af0d5cb 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue @@ -1,7 +1,7 @@