Commit 0430524b authored by Grzegorz Bizon's avatar Grzegorz Bizon

WIP Handle domain sessions better in QA test scenario

[ci skip]
parent 9799d363
...@@ -9,6 +9,7 @@ module QA ...@@ -9,6 +9,7 @@ module QA
autoload :User, 'qa/runtime/user' autoload :User, 'qa/runtime/user'
autoload :Namespace, 'qa/runtime/namespace' autoload :Namespace, 'qa/runtime/namespace'
autoload :Scenario, 'qa/runtime/scenario' autoload :Scenario, 'qa/runtime/scenario'
autoload :Browser, 'qa/runtime/browser'
end end
## ##
......
...@@ -7,6 +7,20 @@ module QA ...@@ -7,6 +7,20 @@ module QA
def refresh def refresh
visit current_url visit current_url
end end
def wait(css = '.application', time: 60)
# This resolves cold boot / background tasks problems
#
Time.now.tap do |start|
while Time.now - start < time
break if page.has_css?(css, wait: 5)
puts "Waiting for `#{css} on `#{current_url}`"
refresh
end
end
yield if block_given?
end
end end
end end
end end
...@@ -3,20 +3,8 @@ module QA ...@@ -3,20 +3,8 @@ module QA
module Main module Main
class Entry < Page::Base class Entry < Page::Base
def visit_login_page def visit_login_page
wait(time: 500) do
visit("#{Runtime::Scenario.gitlab_address}/users/sign_in") visit("#{Runtime::Scenario.gitlab_address}/users/sign_in")
wait_for_instance_to_be_ready
end
private
def wait_for_instance_to_be_ready
# This resolves cold boot / background tasks problems
#
start = Time.now
while Time.now - start < 240
break if page.has_css?('.application', wait: 10)
refresh
end end
end end
end end
......
...@@ -3,37 +3,45 @@ require 'capybara/rspec' ...@@ -3,37 +3,45 @@ require 'capybara/rspec'
require 'capybara-screenshot/rspec' require 'capybara-screenshot/rspec'
require 'selenium-webdriver' require 'selenium-webdriver'
# rubocop:disable Metrics/MethodLength
# rubocop:disable Metrics/LineLength
module QA module QA
module Specs module Runtime
class Config < Scenario::Template module Browser
include Scenario::Actable extend self
def perform def session(address, &block)
configure_rspec! configure!
configure_capybara! page.visit(address)
end
block.call(page)
def configure_rspec! page.visit(address)
RSpec.configure do |config| reset_domain_session!
config.expect_with :rspec do |expectations| rescue
expectations.include_chain_clauses_in_custom_matcher_descriptions = true # RSpec examples will take care of screenshots on their own
#
unless block.binding.receiver.class < RSpec::Core::ExampleGroup
Capybara::Screenshot.screenshot_and_save_page
end end
config.mock_with :rspec do |mocks| raise
mocks.verify_partial_doubles = true
end end
config.order = :random def page
Kernel.srand config.seed Capybara.current_session
config.formatter = :documentation
config.color = true
end end
def reset_domain_session(address)
##
# Selenium allows to reset session cookies for current domain only.
#
# See gitlab-org/gitlab-qa#102
#
Capybar.reset_session!
end end
def configure_capybara! def configure!
return if Capybara.drivers.include?(:chrome)
Capybara.register_driver :chrome do |app| Capybara.register_driver :chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome( capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
'chromeOptions' => { 'chromeOptions' => {
...@@ -52,8 +60,7 @@ module QA ...@@ -52,8 +60,7 @@ module QA
Capybara.configure do |config| Capybara.configure do |config|
config.default_driver = :chrome config.default_driver = :chrome
config.javascript_driver = :chrome config.javascript_driver = :chrome
config.default_max_wait_time = 10 config.default_max_wait_time = 4
# https://github.com/mattheworiordan/capybara-screenshot/issues/164 # https://github.com/mattheworiordan/capybara-screenshot/issues/164
config.save_path = 'tmp' config.save_path = 'tmp'
end end
......
...@@ -8,7 +8,6 @@ module QA ...@@ -8,7 +8,6 @@ module QA
include Bootable include Bootable
def perform(address, *files) def perform(address, *files)
Specs::Config.act { configure_capybara! }
Runtime::Scenario.define(:gitlab_address, address) Runtime::Scenario.define(:gitlab_address, address)
## ##
......
module QA module QA
feature 'standard root login', :core do feature 'standard user login', :core do
scenario 'user logs in using credentials' do scenario 'user logs in using credentials' do
Page::Main::Entry.act { visit_login_page } Page::Main::Entry.act { visit_login_page }
Page::Main::Login.act { sign_in_using_credentials } Page::Main::Login.act { sign_in_using_credentials }
......
module QA module QA
feature 'logging in to Mattermost', :mattermost do feature 'logging in to Mattermost', :mattermost do
scenario 'can use gitlab oauth' do scenario 'can use gitlab oauth' do
Page::Main::Entry.act { visit_login_page } Runtime::Browser.session(Page::Gitlab::Login) do
Page::Main::Login.act { sign_in_using_credentials } Page::Main::Login.act { sign_in_using_credentials }
Runtime::Browser.session(Page::Mattermost::Login) do
Page::Mattermost::Login.act { sign_in_using_oauth } Page::Mattermost::Login.act { sign_in_using_oauth }
Page::Mattermost::Main.perform do |page| Page::Mattermost::Main.perform do |page|
...@@ -10,4 +12,6 @@ module QA ...@@ -10,4 +12,6 @@ module QA
end end
end end
end end
end
end
end end
...@@ -17,7 +17,7 @@ module QA ...@@ -17,7 +17,7 @@ module QA
tags.to_a.each { |tag| args.push(['-t', tag.to_s]) } tags.to_a.each { |tag| args.push(['-t', tag.to_s]) }
args.push(files) args.push(files)
Specs::Config.perform Runtime::Browser.configure!
RSpec::Core::Runner.run(args.flatten, $stderr, $stdout).tap do |status| RSpec::Core::Runner.run(args.flatten, $stderr, $stdout).tap do |status|
abort if status.nonzero? abort if status.nonzero?
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment