From e58491d1553f0c481eb5d4ea9df29acd94fe7147 Mon Sep 17 00:00:00 2001
From: Ian Baum <ibaum@gitlab.com>
Date: Mon, 1 Nov 2021 15:28:09 -0500
Subject: [PATCH 1/7] Match address of host when checking whether to login

* Makes sure we are on the login page of the desired host before
  deciding whether we need to re-login. Currently only checks if we're
  on the login page. For Geo specs, we need to sign into different hosts

Changelog: fixed
MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73492
EE: true
---
 qa/qa/flow/login.rb     |  7 ++-----
 qa/qa/page/base.rb      |  4 ++++
 qa/qa/page/main/menu.rb | 17 +++++++++++++----
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/qa/qa/flow/login.rb b/qa/qa/flow/login.rb
index 5f7e0227ac5c36..10468165f19058 100644
--- a/qa/qa/flow/login.rb
+++ b/qa/qa/flow/login.rb
@@ -6,7 +6,7 @@ module Login
       module_function
 
       def while_signed_in(as: nil, address: :gitlab, admin: false)
-        Page::Main::Menu.perform(&:sign_out_if_signed_in)
+        Page::Main::Menu.perform {|menu| menu.sign_out_if_signed_in(address) }
 
         sign_in(as: as, address: address, admin: admin)
 
@@ -23,10 +23,7 @@ def while_signed_in_as_admin(address: :gitlab)
       end
 
       def sign_in(as: nil, address: :gitlab, skip_page_validation: false, admin: false)
-        unless Page::Main::Login.perform(&:on_login_page?)
-          Page::Main::Menu.perform(&:sign_out) if Page::Main::Menu.perform(&:signed_in?)
-          Runtime::Browser.visit(address, Page::Main::Login)
-        end
+        Runtime::Browser.visit(address, Page::Main::Login)
 
         Page::Main::Login.perform do |login|
           if admin
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 69f58dcb8a593e..c48d278600af04 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -386,6 +386,10 @@ def wait_if_retry_later
         end
       end
 
+      def current_url
+        page.current_url
+      end
+
       def self.path
         raise NotImplementedError
       end
diff --git a/qa/qa/page/main/menu.rb b/qa/qa/page/main/menu.rb
index e3bb585955b266..2a22679306eaed 100644
--- a/qa/qa/page/main/menu.rb
+++ b/qa/qa/page/main/menu.rb
@@ -99,8 +99,17 @@ def go_to_admin_area
           end
         end
 
-        def signed_in?
-          return false if Page::Main::Login.perform(&:on_login_page?)
+        def signed_in?(address = nil)
+          current_host = URI(page.current_url).host
+
+          return false if Page::Main::Login.perform(&:on_login_page?) && current_host.eql?(address)
+
+          unless address.nil?
+            Page::Main::Login.perform do |login|
+              desired_host = URI(Runtime::Scenario.send("#{address}_address")).host
+              return false unless current_host == desired_host # rubocop:disable Cop/AvoidReturnFromBlocks
+            end
+          end
 
           has_personal_area?(wait: 0)
         end
@@ -125,8 +134,8 @@ def sign_out
           end
         end
 
-        def sign_out_if_signed_in
-          sign_out if signed_in?
+        def sign_out_if_signed_in(address = nil)
+          sign_out if signed_in?(address)
         end
 
         def click_edit_profile_link
-- 
GitLab


From 5bc0bfa56bcd1234137b9b1ef848a65cb2fdd171 Mon Sep 17 00:00:00 2001
From: Ian Baum <ibaum@gitlab.com>
Date: Mon, 20 Dec 2021 14:04:47 -0600
Subject: [PATCH 2/7] Restore sign_in flow

* Make sign_in logout again. Remove signout from while_signed_in instead
---
 qa/qa/flow/login.rb | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/qa/qa/flow/login.rb b/qa/qa/flow/login.rb
index 10468165f19058..62a807a1139d24 100644
--- a/qa/qa/flow/login.rb
+++ b/qa/qa/flow/login.rb
@@ -6,8 +6,6 @@ module Login
       module_function
 
       def while_signed_in(as: nil, address: :gitlab, admin: false)
-        Page::Main::Menu.perform {|menu| menu.sign_out_if_signed_in(address) }
-
         sign_in(as: as, address: address, admin: admin)
 
         result = yield
@@ -23,7 +21,10 @@ def while_signed_in_as_admin(address: :gitlab)
       end
 
       def sign_in(as: nil, address: :gitlab, skip_page_validation: false, admin: false)
-        Runtime::Browser.visit(address, Page::Main::Login)
+        unless Page::Main::Login.perform(&:on_login_page?)
+          Page::Main::Menu.perform(&:sign_out) if Page::Main::Menu.perform(&:signed_in?)
+          Runtime::Browser.visit(address, Page::Main::Login)
+        end
 
         Page::Main::Login.perform do |login|
           if admin
-- 
GitLab


From 5ad0a63ccf4ffadc4ea52725b88db357cb383887 Mon Sep 17 00:00:00 2001
From: Ian Baum <ibaum@gitlab.com>
Date: Mon, 20 Dec 2021 16:39:02 -0600
Subject: [PATCH 3/7] Make on_login_page check for the host as well

---
 qa/qa/page/base.rb       | 4 ++++
 qa/qa/page/main/login.rb | 8 +++++++-
 qa/qa/page/main/menu.rb  | 5 ++---
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index c48d278600af04..671348f2dc48ca 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -390,6 +390,10 @@ def current_url
         page.current_url
       end
 
+      def current_host
+        URI(current_url).host
+      end
+
       def self.path
         raise NotImplementedError
       end
diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index 5cba9d4bce4924..a82e734966e7a7 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -45,7 +45,13 @@ def can_sign_in?
           has_element?(:sign_in_button)
         end
 
-        def on_login_page?
+        def on_login_page?(address = nil)
+          unless address.nil?
+            desired_host = URI(Runtime::Scenario.send("#{address}_address")).host
+
+            return false if current_host != desired_host
+          end
+
           has_element?(:login_page, wait: 0)
         end
 
diff --git a/qa/qa/page/main/menu.rb b/qa/qa/page/main/menu.rb
index 2a22679306eaed..8d1db6c367d5fa 100644
--- a/qa/qa/page/main/menu.rb
+++ b/qa/qa/page/main/menu.rb
@@ -100,12 +100,11 @@ def go_to_admin_area
         end
 
         def signed_in?(address = nil)
-          current_host = URI(page.current_url).host
-
-          return false if Page::Main::Login.perform(&:on_login_page?) && current_host.eql?(address)
+          return false if Page::Main::Login.perform {|p| p.on_login_page?(address) }
 
           unless address.nil?
             Page::Main::Login.perform do |login|
+              current_host = URI(page.current_url).host
               desired_host = URI(Runtime::Scenario.send("#{address}_address")).host
               return false unless current_host == desired_host # rubocop:disable Cop/AvoidReturnFromBlocks
             end
-- 
GitLab


From 8adac2b347ef88ecbebb79fd7be462a76c0d83ea Mon Sep 17 00:00:00 2001
From: Ian Baum <ibaum@gitlab.com>
Date: Wed, 22 Dec 2021 11:49:02 -0600
Subject: [PATCH 4/7] Add missing address arg for sign_in check

---
 qa/qa/flow/login.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qa/qa/flow/login.rb b/qa/qa/flow/login.rb
index 62a807a1139d24..953ef27a188b78 100644
--- a/qa/qa/flow/login.rb
+++ b/qa/qa/flow/login.rb
@@ -21,7 +21,7 @@ def while_signed_in_as_admin(address: :gitlab)
       end
 
       def sign_in(as: nil, address: :gitlab, skip_page_validation: false, admin: false)
-        unless Page::Main::Login.perform(&:on_login_page?)
+        unless Page::Main::Login.perform {|p| p.on_login_page?(address) }
           Page::Main::Menu.perform(&:sign_out) if Page::Main::Menu.perform(&:signed_in?)
           Runtime::Browser.visit(address, Page::Main::Login)
         end
-- 
GitLab


From 164dd89a6b1081ddec36a2385ed961a0edb14925 Mon Sep 17 00:00:00 2001
From: Tiffany Rea <trea@gitlab.com>
Date: Wed, 29 Dec 2021 16:27:43 +0000
Subject: [PATCH 5/7] Apply 2 suggestion(s) to 2 file(s)

---
 qa/qa/flow/login.rb     | 2 +-
 qa/qa/page/main/menu.rb | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/qa/qa/flow/login.rb b/qa/qa/flow/login.rb
index 953ef27a188b78..81ed5bd1cf1ce6 100644
--- a/qa/qa/flow/login.rb
+++ b/qa/qa/flow/login.rb
@@ -21,7 +21,7 @@ def while_signed_in_as_admin(address: :gitlab)
       end
 
       def sign_in(as: nil, address: :gitlab, skip_page_validation: false, admin: false)
-        unless Page::Main::Login.perform {|p| p.on_login_page?(address) }
+        unless Page::Main::Login.perform { |p| p.on_login_page?(address) }
           Page::Main::Menu.perform(&:sign_out) if Page::Main::Menu.perform(&:signed_in?)
           Runtime::Browser.visit(address, Page::Main::Login)
         end
diff --git a/qa/qa/page/main/menu.rb b/qa/qa/page/main/menu.rb
index 8d1db6c367d5fa..05fa123adca67e 100644
--- a/qa/qa/page/main/menu.rb
+++ b/qa/qa/page/main/menu.rb
@@ -100,7 +100,7 @@ def go_to_admin_area
         end
 
         def signed_in?(address = nil)
-          return false if Page::Main::Login.perform {|p| p.on_login_page?(address) }
+          return false if Page::Main::Login.perform { |p| p.on_login_page?(address) }
 
           unless address.nil?
             Page::Main::Login.perform do |login|
-- 
GitLab


From ce74baf43adafd624922bf48b84a31ef6b181ca4 Mon Sep 17 00:00:00 2001
From: Ian Baum <ibaum@gitlab.com>
Date: Thu, 30 Dec 2021 13:58:31 -0600
Subject: [PATCH 6/7] Clean up redirect behavior

* Add a method to redirect to the login page if necessary
---
 qa/qa/flow/login.rb      |  5 +++--
 qa/qa/page/base.rb       |  6 +-----
 qa/qa/page/main/login.rb | 13 ++++++-------
 qa/qa/page/main/menu.rb  | 16 ++++------------
 4 files changed, 14 insertions(+), 26 deletions(-)

diff --git a/qa/qa/flow/login.rb b/qa/qa/flow/login.rb
index 81ed5bd1cf1ce6..b60f74fe9bff1d 100644
--- a/qa/qa/flow/login.rb
+++ b/qa/qa/flow/login.rb
@@ -21,9 +21,10 @@ def while_signed_in_as_admin(address: :gitlab)
       end
 
       def sign_in(as: nil, address: :gitlab, skip_page_validation: false, admin: false)
-        unless Page::Main::Login.perform { |p| p.on_login_page?(address) }
+        Page::Main::Login.perform { |p| p.redirect_to_login_page(address) }
+
+        unless Page::Main::Login.perform(&:on_login_page?)
           Page::Main::Menu.perform(&:sign_out) if Page::Main::Menu.perform(&:signed_in?)
-          Runtime::Browser.visit(address, Page::Main::Login)
         end
 
         Page::Main::Login.perform do |login|
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 671348f2dc48ca..526dd25ccc9283 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -386,12 +386,8 @@ def wait_if_retry_later
         end
       end
 
-      def current_url
-        page.current_url
-      end
-
       def current_host
-        URI(current_url).host
+        URI(page.current_url).host
       end
 
       def self.path
diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index a82e734966e7a7..1555f3e024169c 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -45,13 +45,7 @@ def can_sign_in?
           has_element?(:sign_in_button)
         end
 
-        def on_login_page?(address = nil)
-          unless address.nil?
-            desired_host = URI(Runtime::Scenario.send("#{address}_address")).host
-
-            return false if current_host != desired_host
-          end
-
+        def on_login_page?
           has_element?(:login_page, wait: 0)
         end
 
@@ -162,6 +156,11 @@ def sign_out_and_sign_in_as(user:)
           sign_in_using_credentials(user: user)
         end
 
+        def redirect_to_login_page(address)
+          desired_host = URI(Runtime::Scenario.send("#{address}_Address")).host
+          Runtime::Browser.visit(address, Page::Main::Login) if desired_host != current_host
+        end
+
         private
 
         def sign_in_using_gitlab_credentials(user:, skip_page_validation: false)
diff --git a/qa/qa/page/main/menu.rb b/qa/qa/page/main/menu.rb
index 05fa123adca67e..e3bb585955b266 100644
--- a/qa/qa/page/main/menu.rb
+++ b/qa/qa/page/main/menu.rb
@@ -99,16 +99,8 @@ def go_to_admin_area
           end
         end
 
-        def signed_in?(address = nil)
-          return false if Page::Main::Login.perform { |p| p.on_login_page?(address) }
-
-          unless address.nil?
-            Page::Main::Login.perform do |login|
-              current_host = URI(page.current_url).host
-              desired_host = URI(Runtime::Scenario.send("#{address}_address")).host
-              return false unless current_host == desired_host # rubocop:disable Cop/AvoidReturnFromBlocks
-            end
-          end
+        def signed_in?
+          return false if Page::Main::Login.perform(&:on_login_page?)
 
           has_personal_area?(wait: 0)
         end
@@ -133,8 +125,8 @@ def sign_out
           end
         end
 
-        def sign_out_if_signed_in(address = nil)
-          sign_out if signed_in?(address)
+        def sign_out_if_signed_in
+          sign_out if signed_in?
         end
 
         def click_edit_profile_link
-- 
GitLab


From 6f07681c99251068b354c9a8801c0a45ed7e875d Mon Sep 17 00:00:00 2001
From: Ian Baum <ibaum@gitlab.com>
Date: Thu, 30 Dec 2021 15:16:31 -0600
Subject: [PATCH 7/7] Fix typo

---
 qa/qa/page/main/login.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index 1555f3e024169c..f004107d7bd01b 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -157,7 +157,7 @@ def sign_out_and_sign_in_as(user:)
         end
 
         def redirect_to_login_page(address)
-          desired_host = URI(Runtime::Scenario.send("#{address}_Address")).host
+          desired_host = URI(Runtime::Scenario.send("#{address}_address")).host
           Runtime::Browser.visit(address, Page::Main::Login) if desired_host != current_host
         end
 
-- 
GitLab