Merge branch 'ml-create-user-via-api-qa' into 'master'
Create users via the API See merge request gitlab-org/gitlab-ce!22779
This commit is contained in:
commit
8ceb3dc341
6 changed files with 89 additions and 42 deletions
|
@ -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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
|
|
36
qa/spec/factory/resource/user_spec.rb
Normal file
36
qa/spec/factory/resource/user_spec.rb
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# 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
|
Loading…
Reference in a new issue