From cbc3d1f9115d58ee590d84dac52f4b1ddd9dd7a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9my=20Coutable?= <remy@rymai.me>
Date: Mon, 21 Jan 2019 17:24:56 +0100
Subject: [PATCH] [QA] Use public_email instead of email since it's available
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Rémy Coutable <remy@rymai.me>
---
 qa/qa/resource/user.rb                        |  14 ++-
 qa/qa/runtime/user.rb                         |   4 +
 ...user_views_raw_diff_patch_requests_spec.rb |   2 +-
 qa/spec/resource/user_spec.rb                 | 118 ++++++++++++++++++
 4 files changed, 134 insertions(+), 4 deletions(-)
 create mode 100644 qa/spec/resource/user_spec.rb

diff --git a/qa/qa/resource/user.rb b/qa/qa/resource/user.rb
index b9580d81171c..6c5e91b6488c 100644
--- a/qa/qa/resource/user.rb
+++ b/qa/qa/resource/user.rb
@@ -17,11 +17,11 @@ def initialize
       end
 
       def username
-        @username ||= "qa-user-#{unique_id}"
+        @username || "qa-user-#{unique_id}"
       end
 
       def password
-        @password ||= 'password'
+        @password || 'password'
       end
 
       def name
@@ -29,7 +29,15 @@ def name
       end
 
       def email
-        @email ||= api_resource&.dig(:email) || "#{username}@example.com"
+        @email ||= "#{username}@example.com"
+      end
+
+      def public_email
+        @public_email ||= begin
+          api_public_email = api_resource&.dig(:public_email)
+
+          api_public_email && api_public_email != '' ? api_public_email : Runtime::User.default_email
+        end
       end
 
       def credentials_given?
diff --git a/qa/qa/runtime/user.rb b/qa/qa/runtime/user.rb
index 5eb7a210fce4..e8bcb8a9f504 100644
--- a/qa/qa/runtime/user.rb
+++ b/qa/qa/runtime/user.rb
@@ -7,6 +7,10 @@ def default_username
         'root'
       end
 
+      def default_email
+        'admin@example.com'
+      end
+
       def default_password
         '5iveL!fe'
       end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/user_views_raw_diff_patch_requests_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/user_views_raw_diff_patch_requests_spec.rb
index 3a5d89e6b837..621cca0f9a53 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/user_views_raw_diff_patch_requests_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/user_views_raw_diff_patch_requests_spec.rb
@@ -47,7 +47,7 @@ def raw_content
 
         Page::Project::Commit::Show.perform(&:select_email_patches)
 
-        expect(page).to have_content("From: #{user.name} <#{user.email}>")
+        expect(page).to have_content("From: #{user.name} <#{user.public_email}>")
         expect(page).to have_content('Subject: [PATCH] Add second file')
         expect(page).to have_content('diff --git a/second b/second')
       end
diff --git a/qa/spec/resource/user_spec.rb b/qa/spec/resource/user_spec.rb
new file mode 100644
index 000000000000..d612dfc530e6
--- /dev/null
+++ b/qa/spec/resource/user_spec.rb
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+describe QA::Resource::User do
+  let(:api_resource) do
+    {
+      name: "GitLab QA",
+      username: "gitlab-qa",
+      web_url: "https://staging.gitlab.com/gitlab-qa",
+      public_email: "1614863-gitlab-qa@users.noreply.staging.gitlab.com"
+    }
+  end
+
+  describe '#username' do
+    it 'generates a default username' do
+      expect(subject.username).to match(/qa-user-\w+/)
+    end
+
+    it 'is possible to set the username' do
+      subject.username = 'johndoe'
+
+      expect(subject.username).to eq('johndoe')
+    end
+  end
+
+  describe '#password' do
+    it 'generates a default password' do
+      expect(subject.password).to eq('password')
+    end
+
+    it 'is possible to set the password' do
+      subject.password = 'secret'
+
+      expect(subject.password).to eq('secret')
+    end
+  end
+
+  describe '#name' do
+    it 'defaults to the username' do
+      expect(subject.name).to eq(subject.username)
+    end
+
+    it 'retrieves the name from the api_resource if present' do
+      subject.__send__(:api_resource=, api_resource)
+
+      expect(subject.name).to eq(api_resource[:name])
+    end
+
+    it 'is possible to set the name' do
+      subject.name = 'John Doe'
+
+      expect(subject.name).to eq('John Doe')
+    end
+  end
+
+  describe '#email' do
+    it 'defaults to the <username>@example.com' do
+      expect(subject.email).to eq("#{subject.username}@example.com")
+    end
+
+    it 'is possible to set the email' do
+      subject.email = 'johndoe@example.org'
+
+      expect(subject.email).to eq('johndoe@example.org')
+    end
+  end
+
+  describe '#public_email' do
+    it 'defaults to QA::Runtime::User.default_email' do
+      expect(subject.public_email).to eq(QA::Runtime::User.default_email)
+    end
+
+    it 'retrieves the public_email from the api_resource if present' do
+      subject.__send__(:api_resource=, api_resource)
+
+      expect(subject.public_email).to eq(api_resource[:public_email])
+    end
+
+    it 'defaults to QA::Runtime::User.default_email if the public_email from the api_resource is blank' do
+      subject.__send__(:api_resource=, api_resource.merge(public_email: ''))
+
+      expect(subject.public_email).to eq(QA::Runtime::User.default_email)
+    end
+  end
+
+  describe '#credentials_given?' do
+    it 'returns false when username and email have not been overridden' do
+      expect(subject).not_to be_credentials_given
+    end
+
+    it 'returns false even after username and email have been called' do
+      # Call #username and #password to ensure this doesn't set their respective
+      # instance variable.
+      subject.username
+      subject.password
+
+      expect(subject).not_to be_credentials_given
+    end
+
+    it 'returns false if only the username has been overridden' do
+      subject.username = 'johndoe'
+
+      expect(subject).not_to be_credentials_given
+    end
+
+    it 'returns false if only the password has been overridden' do
+      subject.password = 'secret'
+
+      expect(subject).not_to be_credentials_given
+    end
+
+    it 'returns true if both the username and password have been overridden' do
+      subject.username = 'johndoe'
+      subject.password = 'secret'
+
+      expect(subject).to be_credentials_given
+    end
+  end
+end
-- 
GitLab