Commit 190afc62 authored by Mark Lapierre's avatar Mark Lapierre

Create users via the API

Allows users to be fetched/created via the API.
parent 74b5dce4
...@@ -52,14 +52,18 @@ module QA ...@@ -52,14 +52,18 @@ module QA
end end
def api_get def api_get
url = Runtime::API::Request.new(api_client, api_get_path).url process_api_response(parse_body(api_get_from(api_get_path)))
end
def api_get_from(get_path)
url = Runtime::API::Request.new(api_client, get_path).url
response = get(url) response = get(url)
unless response.code == HTTP_STATUS_OK unless response.code == HTTP_STATUS_OK
raise ResourceNotFoundError, "Resource at #{url} could not be found (#{response.code}): `#{response}`." raise ResourceNotFoundError, "Resource at #{url} could not be found (#{response.code}): `#{response}`."
end end
process_api_response(parse_body(response)) response
end end
def api_post def api_post
......
...@@ -15,44 +15,17 @@ module QA ...@@ -15,44 +15,17 @@ module QA
end end
end end
def visit_project_with_retry
# The user intermittently fails to stay signed in after visiting the
# project page. The new user is registered and then signs in and a
# screenshot shows that signing in was successful. Then the project
# page is visited but a screenshot shows the user is no longer signed
# in. It's difficult to reproduce locally but GDK logs don't seem to
# show anything unexpected. This method attempts to work around the
# problem and capture data to help troubleshoot.
Capybara::Screenshot.screenshot_and_save_page
start = Time.now
while Time.now - start < 20
push.project.visit!
puts "Visited project page"
Capybara::Screenshot.screenshot_and_save_page
return if Page::Main::Menu.act { has_personal_area?(wait: 0) }
puts "Not signed in. Attempting to sign in again."
Capybara::Screenshot.screenshot_and_save_page
Runtime::Browser.visit(:gitlab, Page::Main::Login)
Page::Main::Login.perform do |login|
login.sign_in_using_credentials(user)
end
end
raise "Failed to load project page and stay logged in"
end
def fabricate! def fabricate!
populate(:push, :user) populate(:push, :user)
visit_project_with_retry # Sign out as admin and sign is as the fork user
Page::Main::Menu.perform(&:sign_out)
Runtime::Browser.visit(:gitlab, Page::Main::Login)
Page::Main::Login.perform do |login|
login.sign_in_using_credentials(user)
end
push.project.visit!
Page::Project::Show.perform(&:fork_project) Page::Project::Show.perform(&:fork_project)
......
...@@ -50,6 +50,42 @@ module QA ...@@ -50,6 +50,42 @@ module QA
end end
end end
end end
def fabricate_via_api!
resource_web_url(api_get)
rescue ResourceNotFoundError
super
end
def api_get_path
"/users/#{fetch_id(username)}"
end
def api_post_path
'/users'
end
def api_post_body
{
email: email,
password: password,
username: username,
name: name,
skip_confirmation: true
}
end
private
def fetch_id(username)
users = parse_body(api_get_from("/users?username=#{username}"))
unless users.size == 1 && users.first[:username] == username
raise ResourceNotFoundError, "Expected one user with username #{username} but found: `#{users}`."
end
users.first[:id]
end
end end
end end
end end
......
...@@ -5,7 +5,7 @@ module QA ...@@ -5,7 +5,7 @@ module QA
it 'user registers and logs in' do it 'user registers and logs in' do
Runtime::Browser.visit(:gitlab, Page::Main::Login) Runtime::Browser.visit(:gitlab, Page::Main::Login)
Factory::Resource::User.fabricate! Factory::Resource::User.fabricate_via_browser_ui!
# TODO, since `Signed in successfully` message was removed # TODO, since `Signed in successfully` message was removed
# this is the only way to tell if user is signed in correctly. # this is the only way to tell if user is signed in correctly.
......
...@@ -5,18 +5,16 @@ module QA ...@@ -5,18 +5,16 @@ module QA
describe 'Add project member' do describe 'Add project member' do
it 'user adds project member' do it 'user adds project member' do
Runtime::Browser.visit(:gitlab, Page::Main::Login) Runtime::Browser.visit(:gitlab, Page::Main::Login)
Page::Main::Login.perform(&:sign_in_using_credentials)
user = Factory::Resource::User.fabricate! user = Factory::Resource::User.fabricate!
Page::Main::Menu.perform { |main| main.sign_out }
Page::Main::Login.act { sign_in_using_credentials }
project = Factory::Resource::Project.fabricate! do |resource| project = Factory::Resource::Project.fabricate! do |resource|
resource.name = 'add-member-project' resource.name = 'add-member-project'
end end
project.visit! project.visit!
Page::Project::Menu.act { click_members_settings } Page::Project::Menu.perform(&:click_members_settings)
Page::Project::Settings::Members.perform do |page| Page::Project::Settings::Members.perform do |page|
page.add_member(user.username) page.add_member(user.username)
end end
......
# frozen_string_literal: true
describe QA::Factory::Resource::User do
describe "#fabricate_via_api!" do
Response = Struct.new(:code, :body)
it 'fetches an existing user' do
existing_users = [
{
id: '0',
name: 'name',
username: 'name',
web_url: ''
}
]
users_response = Response.new('200', JSON.dump(existing_users))
single_user_response = Response.new('200', JSON.dump(existing_users.first))
expect(subject).to receive(:api_get_from).with("/users?username=name").and_return(users_response)
expect(subject).to receive(:api_get_from).with("/users/0").and_return(single_user_response)
subject.username = 'name'
subject.fabricate_via_api!
expect(subject.api_response).to eq(existing_users.first)
end
it 'tries to create a user if it does not exist' do
expect(subject).to receive(:api_get_from).with("/users?username=foo").and_return(Response.new('200', '[]'))
expect(subject).to receive(:api_post).and_return({ web_url: '' })
subject.username = 'foo'
subject.fabricate_via_api!
end
end
end
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