From afb35e247139c24382a0bb3da893ce156e183be2 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 20 Sep 2021 06:09:32 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- qa/Gemfile | 4 +- qa/Gemfile.lock | 10 +-- qa/chemlab-library-gitlab.gemspec | 4 +- qa/lib/gitlab.rb | 4 ++ qa/qa/page/component/web_ide/web_terminal_panel.rb | 63 ++++++++++++++++ qa/qa/page/project/web_ide/edit.rb | 3 +- .../3_create/web_ide/web_terminal_spec.rb | 84 ++++++++++++++++++++++ 7 files changed, 161 insertions(+), 11 deletions(-) create mode 100644 qa/qa/page/component/web_ide/web_terminal_panel.rb create mode 100644 qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb (limited to 'qa') diff --git a/qa/Gemfile b/qa/Gemfile index cc2355cdfa3..9b1735fe646 100644 --- a/qa/Gemfile +++ b/qa/Gemfile @@ -9,7 +9,7 @@ gem 'capybara', '~> 3.35.0' gem 'capybara-screenshot', '~> 1.0.23' gem 'rake', '~> 12.3.3' gem 'rspec', '~> 3.10' -gem 'selenium-webdriver', '~> 4.0.0.beta4' +gem 'selenium-webdriver', '~> 4.0.0.rc1' gem 'airborne', '~> 0.3.4', require: false # airborne is messing with rspec sandboxed mode so not requiring by default gem 'rest-client', '~> 2.1.0' gem 'rspec-retry', '~> 0.6.1', require: 'rspec/retry' @@ -26,7 +26,7 @@ gem 'webdrivers', '~> 4.6' gem 'zeitwerk', '~> 2.4' gem 'influxdb-client', '~> 1.17' -gem 'chemlab', '~> 0.7' +gem 'chemlab', '~> 0.8' gem 'chemlab-library-www-gitlab-com', '~> 0.1' gem 'deprecation_toolkit', '~> 1.5.1', require: false diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock index 5f33afaa77b..2f9f14e1ac7 100644 --- a/qa/Gemfile.lock +++ b/qa/Gemfile.lock @@ -41,7 +41,7 @@ GEM capybara-screenshot (1.0.23) capybara (>= 1.0, < 4) launchy - chemlab (0.7.2) + chemlab (0.8.0) colorize (~> 0.8) i18n (~> 1.8) rake (>= 12, < 14) @@ -135,7 +135,7 @@ GEM rack-test (1.1.0) rack (>= 1.0, < 3) rake (12.3.3) - regexp_parser (1.8.2) + regexp_parser (2.1.1) require_all (3.0.0) rest-client (2.1.0) http-accept (>= 1.7.0, < 2.0) @@ -174,7 +174,7 @@ GEM sawyer (0.8.2) addressable (>= 2.3.5) faraday (> 0.8, < 2.0) - selenium-webdriver (4.0.0.beta4) + selenium-webdriver (4.0.0.rc1) childprocess (>= 0.5, < 5.0) rexml (~> 3.2) rubyzip (>= 1.2.2) @@ -216,7 +216,7 @@ DEPENDENCIES allure-rspec (~> 2.14.5) capybara (~> 3.35.0) capybara-screenshot (~> 1.0.23) - chemlab (~> 0.7) + chemlab (~> 0.8) chemlab-library-www-gitlab-com (~> 0.1) deprecation_toolkit (~> 1.5.1) faker (~> 2.19, >= 2.19.0) @@ -235,7 +235,7 @@ DEPENDENCIES rspec-retry (~> 0.6.1) rspec_junit_formatter (~> 0.4.1) ruby-debug-ide (~> 0.7.0) - selenium-webdriver (~> 4.0.0.beta4) + selenium-webdriver (~> 4.0.0.rc1) timecop (~> 0.9.1) webdrivers (~> 4.6) zeitwerk (~> 2.4) diff --git a/qa/chemlab-library-gitlab.gemspec b/qa/chemlab-library-gitlab.gemspec index 908aad01850..d42d0e5e926 100644 --- a/qa/chemlab-library-gitlab.gemspec +++ b/qa/chemlab-library-gitlab.gemspec @@ -4,7 +4,7 @@ $:.unshift(File.expand_path('lib', __dir__)) Gem::Specification.new do |spec| spec.name = 'chemlab-library-gitlab' - spec.version = '0.1.1' + spec.version = '0.2.0' spec.authors = ['GitLab Quality'] spec.email = ['quality@gitlab.com'] @@ -18,5 +18,5 @@ Gem::Specification.new do |spec| spec.require_paths = ['lib'] - spec.add_runtime_dependency 'chemlab', '~> 0.7' + spec.add_runtime_dependency 'chemlab', '~> 0.8' end diff --git a/qa/lib/gitlab.rb b/qa/lib/gitlab.rb index d0d1d535114..5b5c8805868 100644 --- a/qa/lib/gitlab.rb +++ b/qa/lib/gitlab.rb @@ -1,7 +1,11 @@ # frozen_string_literal: true +require 'chemlab/library' + # Chemlab Page Libraries for GitLab module Gitlab + include Chemlab::Library + module Page module Main autoload :Login, 'gitlab/page/main/login' diff --git a/qa/qa/page/component/web_ide/web_terminal_panel.rb b/qa/qa/page/component/web_ide/web_terminal_panel.rb new file mode 100644 index 00000000000..80f83bcff7c --- /dev/null +++ b/qa/qa/page/component/web_ide/web_terminal_panel.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +module QA + module Page + module Component + module WebIDE + module WebTerminalPanel + extend QA::Page::PageConcern + + def self.prepended(base) + super + + base.class_eval do + view 'app/assets/javascripts/ide/components/panes/collapsible_sidebar.vue' do + element :ide_right_sidebar, %q(:data-qa-selector="`ide_${side}_sidebar`") # rubocop:disable QA/ElementWithPattern + end + + view 'app/assets/javascripts/ide/components/ide_sidebar_nav.vue' do + element :terminal_tab_button, %q(:data-qa-selector="`${tab.title.toLowerCase()}_tab_button`") # rubocop:disable QA/ElementWithPattern + end + + view 'app/assets/javascripts/ide/components/terminal/empty_state.vue' do + element :start_web_terminal_button + end + + view 'app/assets/javascripts/ide/components/terminal/terminal.vue' do + element :loading_container + element :terminal_screen + end + end + end + + def has_finished_loading? + has_no_element?(:loading_container, wait: QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME) + end + + def has_terminal_screen? + wait_until(reload: false) do + within_element :terminal_screen do + # The DOM initially just includes the :terminal_screen element + # and then the xterm package dynamically loads when the user + # clicks the Start Web Terminal button. If it loads succesfully + # an element with the class `xterm` is added to the DOM. + # The xterm is a third-party library, so we can't add a selector + find(".xterm") + end + end + end + + def start_web_terminal + within_element :ide_right_sidebar do + click_element :terminal_tab_button + end + + click_element :start_web_terminal_button + + has_element? :loading_container, text: "Starting" + end + end + end + end + end +end diff --git a/qa/qa/page/project/web_ide/edit.rb b/qa/qa/page/project/web_ide/edit.rb index 78b2db7d723..9c0a3ab691c 100644 --- a/qa/qa/page/project/web_ide/edit.rb +++ b/qa/qa/page/project/web_ide/edit.rb @@ -6,6 +6,7 @@ module QA module WebIDE class Edit < Page::Base prepend Page::Component::WebIDE::Alert + prepend Page::Component::WebIDE::WebTerminalPanel include Page::Component::DropdownFilter view 'app/assets/javascripts/ide/components/activity_bar.vue' do @@ -330,5 +331,3 @@ module QA end end end - -QA::Page::Project::WebIDE::Edit.prepend_mod_with('Page::Component::WebIDE::WebTerminalPanel', namespace: QA) diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb new file mode 100644 index 00000000000..51791c01048 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +module QA + RSpec.describe( + 'Create', + :runner, + quarantine: { + issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338179', + type: :bug + } + ) do + describe 'Web IDE web terminal' do + before do + project = Resource::Project.fabricate_via_api! do |project| + project.name = 'web-terminal-project' + end + + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add .gitlab/.gitlab-webide.yml' + commit.add_files( + [ + { + file_path: '.gitlab/.gitlab-webide.yml', + content: <<~YAML + terminal: + tags: ["web-ide"] + script: sleep 60 + YAML + } + ] + ) + end + + @runner = Resource::Runner.fabricate_via_api! do |runner| + runner.project = project + runner.name = "qa-runner-#{Time.now.to_i}" + runner.tags = %w[web-ide] + runner.image = 'gitlab/gitlab-runner:latest' + runner.config = <<~END + concurrent = 1 + + [session_server] + listen_address = "0.0.0.0:8093" + advertise_address = "localhost:8093" + session_timeout = 120 + END + end + + Flow::Login.sign_in + + project.visit! + end + + after do + @runner.remove_via_api! if @runner + end + + it 'user starts the web terminal', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1593' do + Page::Project::Show.perform(&:open_web_ide!) + + # Start the web terminal and check that there were no errors + # The terminal screen is a canvas element, so we can't read its content, + # so we infer that it's working if: + # a) The terminal JS package has loaded, and + # b) It's not stuck in a "Loading/Starting" state, and + # c) There's no alert stating there was a problem + # + # The terminal itself is a third-party package so we assume it is + # adequately tested elsewhere. + # + # There are also FE specs + # * spec/frontend/ide/components/terminal/terminal_controls_spec.js + Page::Project::WebIDE::Edit.perform do |edit| + edit.start_web_terminal + + expect(edit).to have_no_alert + expect(edit).to have_finished_loading + expect(edit).to have_terminal_screen + end + end + end + end +end -- cgit v1.2.3