Added Wiki Scenario Automation gitlab-qa#263
This commit is contained in:
parent
3a1a5b28bf
commit
bc07b89fc2
22 changed files with 314 additions and 70 deletions
13
qa/qa.rb
13
qa/qa.rb
|
@ -46,10 +46,13 @@ module QA
|
|||
autoload :Runner, 'qa/factory/resource/runner'
|
||||
autoload :PersonalAccessToken, 'qa/factory/resource/personal_access_token'
|
||||
autoload :KubernetesCluster, 'qa/factory/resource/kubernetes_cluster'
|
||||
autoload :Wiki, 'qa/factory/resource/wiki'
|
||||
end
|
||||
|
||||
module Repository
|
||||
autoload :Push, 'qa/factory/repository/push'
|
||||
autoload :ProjectPush, 'qa/factory/repository/project_push'
|
||||
autoload :WikiPush, 'qa/factory/repository/wiki_push'
|
||||
end
|
||||
|
||||
module Settings
|
||||
|
@ -165,6 +168,16 @@ module QA
|
|||
autoload :Show, 'qa/page/project/operations/kubernetes/show'
|
||||
end
|
||||
end
|
||||
|
||||
module Wiki
|
||||
autoload :Edit, 'qa/page/project/wiki/edit'
|
||||
autoload :New, 'qa/page/project/wiki/new'
|
||||
autoload :Show, 'qa/page/project/wiki/show'
|
||||
end
|
||||
end
|
||||
|
||||
module Shared
|
||||
autoload :ClonePanel, 'qa/page/shared/clone_panel'
|
||||
end
|
||||
|
||||
module Profile
|
||||
|
|
34
qa/qa/factory/repository/project_push.rb
Normal file
34
qa/qa/factory/repository/project_push.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
module QA
|
||||
module Factory
|
||||
module Repository
|
||||
class ProjectPush < Factory::Repository::Push
|
||||
dependency Factory::Resource::Project, as: :project do |project|
|
||||
project.name = 'project-with-code'
|
||||
project.description = 'Project with repository'
|
||||
end
|
||||
|
||||
product :output do |factory|
|
||||
factory.output
|
||||
end
|
||||
|
||||
def initialize
|
||||
@file_name = 'file.txt'
|
||||
@file_content = '# This is test project'
|
||||
@commit_message = "This is a test commit"
|
||||
@branch_name = 'master'
|
||||
@new_branch = true
|
||||
end
|
||||
|
||||
def repository_uri
|
||||
@repository_uri ||= begin
|
||||
project.visit!
|
||||
Page::Project::Show.act do
|
||||
choose_repository_clone_http
|
||||
repository_location.uri
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -5,25 +5,17 @@ module QA
|
|||
module Repository
|
||||
class Push < Factory::Base
|
||||
attr_accessor :file_name, :file_content, :commit_message,
|
||||
:branch_name, :new_branch, :output
|
||||
:branch_name, :new_branch, :output, :repository_uri
|
||||
|
||||
attr_writer :remote_branch
|
||||
|
||||
dependency Factory::Resource::Project, as: :project do |project|
|
||||
project.name = 'project-with-code'
|
||||
project.description = 'Project with repository'
|
||||
end
|
||||
|
||||
product :output do |factory|
|
||||
factory.output
|
||||
end
|
||||
|
||||
def initialize
|
||||
@file_name = 'file.txt'
|
||||
@file_content = '# This is test project'
|
||||
@file_content = '# This is test file'
|
||||
@commit_message = "This is a test commit"
|
||||
@branch_name = 'master'
|
||||
@new_branch = true
|
||||
@repository_uri = ""
|
||||
end
|
||||
|
||||
def remote_branch
|
||||
|
@ -37,14 +29,8 @@ module QA
|
|||
end
|
||||
|
||||
def fabricate!
|
||||
project.visit!
|
||||
|
||||
Git::Repository.perform do |repository|
|
||||
repository.uri = Page::Project::Show.act do
|
||||
choose_repository_clone_http
|
||||
repository_location.uri
|
||||
end
|
||||
|
||||
repository.uri = repository_uri
|
||||
repository.use_default_credentials
|
||||
repository.clone
|
||||
repository.configure_identity('GitLab QA', 'root@gitlab.com')
|
||||
|
|
32
qa/qa/factory/repository/wiki_push.rb
Normal file
32
qa/qa/factory/repository/wiki_push.rb
Normal file
|
@ -0,0 +1,32 @@
|
|||
module QA
|
||||
module Factory
|
||||
module Repository
|
||||
class WikiPush < Factory::Repository::Push
|
||||
dependency Factory::Resource::Wiki, as: :wiki do |wiki|
|
||||
wiki.title = 'Home'
|
||||
wiki.content = '# My First Wiki Content'
|
||||
wiki.message = 'Update home'
|
||||
end
|
||||
|
||||
def initialize
|
||||
@file_name = 'Home.md'
|
||||
@file_content = '# Welcome to My Wiki'
|
||||
@commit_message = 'Updating Home Page'
|
||||
@branch_name = 'master'
|
||||
@new_branch = false
|
||||
end
|
||||
|
||||
def repository_uri
|
||||
@repository_uri ||= begin
|
||||
wiki.visit!
|
||||
Page::Project::Wiki::Show.act do
|
||||
go_to_clone_repository
|
||||
choose_repository_clone_http
|
||||
repository_location.uri
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -31,13 +31,13 @@ module QA
|
|||
def fabricate!
|
||||
project.visit!
|
||||
|
||||
Factory::Repository::Push.fabricate! do |resource|
|
||||
Factory::Repository::ProjectPush.fabricate! do |resource|
|
||||
resource.project = project
|
||||
resource.file_name = 'kick-off.txt'
|
||||
resource.commit_message = 'First commit'
|
||||
end
|
||||
|
||||
branch = Factory::Repository::Push.fabricate! do |resource|
|
||||
branch = Factory::Repository::ProjectPush.fabricate! do |resource|
|
||||
resource.project = project
|
||||
resource.file_name = 'README.md'
|
||||
resource.commit_message = 'Add readme'
|
||||
|
|
|
@ -21,14 +21,14 @@ module QA
|
|||
project.name = 'project-with-merge-request'
|
||||
end
|
||||
|
||||
dependency Factory::Repository::Push, as: :target do |push, factory|
|
||||
dependency Factory::Repository::ProjectPush, as: :target do |push, factory|
|
||||
factory.project.visit!
|
||||
push.project = factory.project
|
||||
push.branch_name = 'master'
|
||||
push.remote_branch = factory.target_branch
|
||||
end
|
||||
|
||||
dependency Factory::Repository::Push, as: :source do |push, factory|
|
||||
dependency Factory::Repository::ProjectPush, as: :source do |push, factory|
|
||||
push.project = factory.project
|
||||
push.branch_name = factory.target_branch
|
||||
push.remote_branch = factory.source_branch
|
||||
|
|
25
qa/qa/factory/resource/wiki.rb
Normal file
25
qa/qa/factory/resource/wiki.rb
Normal file
|
@ -0,0 +1,25 @@
|
|||
module QA
|
||||
module Factory
|
||||
module Resource
|
||||
class Wiki < Factory::Base
|
||||
attr_accessor :title, :content, :message
|
||||
|
||||
dependency Factory::Resource::Project, as: :project do |project|
|
||||
project.name = 'project-for-wikis'
|
||||
project.description = 'project for adding wikis'
|
||||
end
|
||||
|
||||
def fabricate!
|
||||
Page::Menu::Side.act { click_wiki }
|
||||
Page::Project::Wiki::New.perform do |page|
|
||||
page.go_to_create_first_page
|
||||
page.set_title(@title)
|
||||
page.set_content(@content)
|
||||
page.set_message(@message)
|
||||
page.create_new_page
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -13,6 +13,7 @@ module QA
|
|||
element :top_level_items, '.sidebar-top-level-items'
|
||||
element :operations_section, "class: 'shortcuts-operations'"
|
||||
element :activity_link, "title: 'Activity'"
|
||||
element :wiki_link_text, "Wiki"
|
||||
end
|
||||
|
||||
view 'app/assets/javascripts/fly_out_nav.js' do
|
||||
|
@ -61,6 +62,12 @@ module QA
|
|||
end
|
||||
end
|
||||
|
||||
def click_wiki
|
||||
within_sidebar do
|
||||
click_link('Wiki')
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def hover_settings
|
||||
|
|
|
@ -2,11 +2,7 @@ module QA
|
|||
module Page
|
||||
module Project
|
||||
class Show < Page::Base
|
||||
view 'app/views/shared/_clone_panel.html.haml' do
|
||||
element :clone_dropdown
|
||||
element :clone_options_dropdown, '.clone-options-dropdown'
|
||||
element :project_repository_location, 'text_field_tag :project_clone'
|
||||
end
|
||||
include Page::Shared::ClonePanel
|
||||
|
||||
view 'app/views/projects/_last_push.html.haml' do
|
||||
element :create_merge_request
|
||||
|
@ -26,21 +22,6 @@ module QA
|
|||
element :branches_dropdown
|
||||
end
|
||||
|
||||
def choose_repository_clone_http
|
||||
choose_repository_clone('HTTP', 'http')
|
||||
end
|
||||
|
||||
def choose_repository_clone_ssh
|
||||
# It's not always beginning with ssh:// so detecting with @
|
||||
# would be more reliable because ssh would always contain it.
|
||||
# We can't use .git because HTTP also contain that part.
|
||||
choose_repository_clone('SSH', '@')
|
||||
end
|
||||
|
||||
def repository_location
|
||||
Git::Location.new(find('#project_clone').value)
|
||||
end
|
||||
|
||||
def project_name
|
||||
find('.qa-project-name').text
|
||||
end
|
||||
|
@ -65,31 +46,11 @@ module QA
|
|||
click_element :create_merge_request
|
||||
end
|
||||
|
||||
def wait_for_push
|
||||
sleep 5
|
||||
refresh
|
||||
end
|
||||
|
||||
def go_to_new_issue
|
||||
click_element :new_menu_toggle
|
||||
|
||||
click_link 'New issue'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def choose_repository_clone(kind, detect_text)
|
||||
wait(reload: false) do
|
||||
click_element :clone_dropdown
|
||||
|
||||
page.within('.clone-options-dropdown') do
|
||||
click_link(kind)
|
||||
end
|
||||
|
||||
# Ensure git clone textbox was updated
|
||||
repository_location.git_uri.include?(detect_text)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
27
qa/qa/page/project/wiki/edit.rb
Normal file
27
qa/qa/page/project/wiki/edit.rb
Normal file
|
@ -0,0 +1,27 @@
|
|||
module QA
|
||||
module Page
|
||||
module Project
|
||||
module Wiki
|
||||
class Edit < Page::Base
|
||||
view 'app/views/projects/wikis/_main_links.html.haml' do
|
||||
element :new_page_link, 'New page'
|
||||
element :page_history_link, 'Page history'
|
||||
element :edit_page_link, 'Edit'
|
||||
end
|
||||
|
||||
def go_to_new_page
|
||||
click_on 'New page'
|
||||
end
|
||||
|
||||
def got_to_view_history_page
|
||||
click_on 'Page history'
|
||||
end
|
||||
|
||||
def go_to_edit_page
|
||||
click_on 'Edit'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
45
qa/qa/page/project/wiki/new.rb
Normal file
45
qa/qa/page/project/wiki/new.rb
Normal file
|
@ -0,0 +1,45 @@
|
|||
module QA
|
||||
module Page
|
||||
module Project
|
||||
module Wiki
|
||||
class New < Page::Base
|
||||
view 'app/views/projects/wikis/_form.html.haml' do
|
||||
element :wiki_title_textbox, 'text_field :title'
|
||||
element :wiki_content_textarea, "render 'projects/zen', f: f, attr: :content"
|
||||
element :wiki_message_textbox, 'text_field :message'
|
||||
element :save_changes_button, 'submit _("Save changes")'
|
||||
element :create_page_button, 'submit s_("Wiki|Create page")'
|
||||
end
|
||||
|
||||
view 'app/views/shared/empty_states/_wikis.html.haml' do
|
||||
element :create_link, 'Create your first page'
|
||||
end
|
||||
|
||||
def go_to_create_first_page
|
||||
click_link 'Create your first page'
|
||||
end
|
||||
|
||||
def set_title(title)
|
||||
fill_in 'wiki_title', with: title
|
||||
end
|
||||
|
||||
def set_content(content)
|
||||
fill_in 'wiki_content', with: content
|
||||
end
|
||||
|
||||
def set_message(message)
|
||||
fill_in 'wiki_message', with: message
|
||||
end
|
||||
|
||||
def save_changes
|
||||
click_on 'Save changes'
|
||||
end
|
||||
|
||||
def create_new_page
|
||||
click_on 'Create page'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
19
qa/qa/page/project/wiki/show.rb
Normal file
19
qa/qa/page/project/wiki/show.rb
Normal file
|
@ -0,0 +1,19 @@
|
|||
module QA
|
||||
module Page
|
||||
module Project
|
||||
module Wiki
|
||||
class Show < Page::Base
|
||||
include Page::Shared::ClonePanel
|
||||
|
||||
view 'app/views/projects/wikis/pages.html.haml' do
|
||||
element :clone_repository_link, 'Clone repository'
|
||||
end
|
||||
|
||||
def go_to_clone_repository
|
||||
click_on 'Clone repository'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
50
qa/qa/page/shared/clone_panel.rb
Normal file
50
qa/qa/page/shared/clone_panel.rb
Normal file
|
@ -0,0 +1,50 @@
|
|||
module QA
|
||||
module Page
|
||||
module Shared
|
||||
module ClonePanel
|
||||
def self.included(base)
|
||||
base.view 'app/views/shared/_clone_panel.html.haml' do
|
||||
element :clone_dropdown
|
||||
element :clone_options_dropdown, '.clone-options-dropdown'
|
||||
element :project_repository_location, 'text_field_tag :project_clone'
|
||||
end
|
||||
end
|
||||
|
||||
def choose_repository_clone_http
|
||||
choose_repository_clone('HTTP', 'http')
|
||||
end
|
||||
|
||||
def choose_repository_clone_ssh
|
||||
# It's not always beginning with ssh:// so detecting with @
|
||||
# would be more reliable because ssh would always contain it.
|
||||
# We can't use .git because HTTP also contain that part.
|
||||
choose_repository_clone('SSH', '@')
|
||||
end
|
||||
|
||||
def repository_location
|
||||
Git::Location.new(find('#project_clone').value)
|
||||
end
|
||||
|
||||
def wait_for_push
|
||||
sleep 5
|
||||
refresh
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def choose_repository_clone(kind, detect_text)
|
||||
wait(reload: false) do
|
||||
click_element :clone_dropdown
|
||||
|
||||
page.within('.clone-options-dropdown') do
|
||||
click_link(kind)
|
||||
end
|
||||
|
||||
# Ensure git clone textbox was updated
|
||||
repository_location.git_uri.include?(detect_text)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -16,7 +16,7 @@ module QA
|
|||
merge_request.title = 'Needs rebasing'
|
||||
end
|
||||
|
||||
Factory::Repository::Push.fabricate! do |push|
|
||||
Factory::Repository::ProjectPush.fabricate! do |push|
|
||||
push.project = project
|
||||
push.file_name = "other.txt"
|
||||
push.file_content = "New file added!"
|
||||
|
|
|
@ -13,7 +13,7 @@ module QA
|
|||
merge_request.title = 'Squashing commits'
|
||||
end
|
||||
|
||||
Factory::Repository::Push.fabricate! do |push|
|
||||
Factory::Repository::ProjectPush.fabricate! do |push|
|
||||
push.project = project
|
||||
push.commit_message = 'to be squashed'
|
||||
push.branch_name = merge_request.source_branch
|
||||
|
|
|
@ -4,7 +4,7 @@ module QA
|
|||
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
||||
Page::Main::Login.act { sign_in_using_credentials }
|
||||
|
||||
Factory::Repository::Push.fabricate! do |push|
|
||||
Factory::Repository::ProjectPush.fabricate! do |push|
|
||||
push.file_name = 'README.md'
|
||||
push.file_content = '# This is a test project'
|
||||
push.commit_message = 'Add README.md'
|
||||
|
|
|
@ -16,7 +16,7 @@ module QA
|
|||
end
|
||||
|
||||
# Create Auto Devops compatible repo
|
||||
Factory::Repository::Push.fabricate! do |push|
|
||||
Factory::Repository::ProjectPush.fabricate! do |push|
|
||||
push.project = project
|
||||
push.directory = Pathname
|
||||
.new(__dir__)
|
||||
|
|
|
@ -75,7 +75,7 @@ module QA
|
|||
- docker
|
||||
YAML
|
||||
|
||||
Factory::Repository::Push.fabricate! do |resource|
|
||||
Factory::Repository::ProjectPush.fabricate! do |resource|
|
||||
resource.project = @project
|
||||
resource.file_name = '.gitlab-ci.yml'
|
||||
resource.commit_message = 'Add .gitlab-ci.yml'
|
||||
|
|
|
@ -40,7 +40,7 @@ module QA
|
|||
runner.tags = %w[qa test]
|
||||
end
|
||||
|
||||
Factory::Repository::Push.fabricate! do |push|
|
||||
Factory::Repository::ProjectPush.fabricate! do |push|
|
||||
push.project = project
|
||||
push.file_name = '.gitlab-ci.yml'
|
||||
push.commit_message = 'Add .gitlab-ci.yml'
|
||||
|
|
45
qa/qa/specs/features/project/wikis_spec.rb
Normal file
45
qa/qa/specs/features/project/wikis_spec.rb
Normal file
|
@ -0,0 +1,45 @@
|
|||
module QA
|
||||
feature 'Wiki Functionality', :core do
|
||||
def login
|
||||
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
||||
Page::Main::Login.act { sign_in_using_credentials }
|
||||
end
|
||||
|
||||
def validate_content(content)
|
||||
expect(page).to have_content('Wiki was successfully updated')
|
||||
expect(page).to have_content(/#{content}/)
|
||||
end
|
||||
|
||||
before do
|
||||
login
|
||||
end
|
||||
|
||||
scenario 'User creates, edits, clones, and pushes to the wiki' do
|
||||
wiki = Factory::Resource::Wiki.fabricate! do |resource|
|
||||
resource.title = 'Home'
|
||||
resource.content = '# My First Wiki Content'
|
||||
resource.message = 'Update home'
|
||||
end
|
||||
|
||||
validate_content('My First Wiki Content')
|
||||
|
||||
Page::Project::Wiki::Edit.act { go_to_edit_page }
|
||||
Page::Project::Wiki::New.perform do |page|
|
||||
page.set_content("My Second Wiki Content")
|
||||
page.save_changes
|
||||
end
|
||||
|
||||
validate_content('My Second Wiki Content')
|
||||
|
||||
Factory::Repository::WikiPush.fabricate! do |push|
|
||||
push.wiki = wiki
|
||||
push.file_name = 'Home.md'
|
||||
push.file_content = '# My Third Wiki Content'
|
||||
push.commit_message = 'Update Home.md'
|
||||
end
|
||||
Page::Menu::Side.act { click_wiki }
|
||||
|
||||
expect(page).to have_content('My Third Wiki Content')
|
||||
end
|
||||
end
|
||||
end
|
|
@ -56,7 +56,7 @@ module QA
|
|||
end
|
||||
|
||||
def push_new_file(branch)
|
||||
Factory::Repository::Push.fabricate! do |resource|
|
||||
Factory::Repository::ProjectPush.fabricate! do |resource|
|
||||
resource.project = project
|
||||
resource.file_name = 'new_file.md'
|
||||
resource.file_content = '# This is a new file'
|
||||
|
|
|
@ -5,7 +5,7 @@ module QA
|
|||
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
||||
Page::Main::Login.act { sign_in_using_credentials }
|
||||
|
||||
Factory::Repository::Push.fabricate! do |push|
|
||||
Factory::Repository::ProjectPush.fabricate! do |push|
|
||||
push.file_name = 'README.md'
|
||||
push.file_content = '# This is a test project'
|
||||
push.commit_message = 'Add README.md'
|
||||
|
|
Loading…
Reference in a new issue