Commit 948df41e authored by Anastasia McDonald's avatar Anastasia McDonald Committed by Ramya Authappan

E2E - Version control for project snippets

Clone, push, pull a project snippet over HTTP and SSH
Create, edit and delete a project snippet via UI
See https://gitlab.com/gitlab-org/gitlab/-/issues/207110
parent c507de52
...@@ -319,7 +319,7 @@ ...@@ -319,7 +319,7 @@
- if project_nav_tab? :snippets - if project_nav_tab? :snippets
= nav_link(controller: :snippets) do = nav_link(controller: :snippets) do
= link_to project_snippets_path(@project), class: 'shortcuts-snippets' do = link_to project_snippets_path(@project), class: 'shortcuts-snippets', data: { qa_selector: 'snippets_link' } do
.nav-icon-container .nav-icon-container
= sprite_icon('snippet') = sprite_icon('snippet')
%span.nav-item-name %span.nav-item-name
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
.row.empty-state.mt-0 .row.empty-state.mt-0
.col-12 .col-12
.svg-content .svg-content
= image_tag 'illustrations/snippets_empty.svg' = image_tag 'illustrations/snippets_empty.svg', data: { qa_selector: 'svg_content' }
.text-content.text-center.pt-0 .text-content.text-center.pt-0
- if current_user - if current_user
%h4 %h4
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
= s_('SnippetsEmptyState|Store, share, and embed small pieces of code and text.') = s_('SnippetsEmptyState|Store, share, and embed small pieces of code and text.')
.mt-2< .mt-2<
- if button_path - if button_path
= link_to s_('SnippetsEmptyState|New snippet'), button_path, class: 'btn btn-success', title: s_('SnippetsEmptyState|New snippet'), id: 'new_snippet_link' = link_to s_('SnippetsEmptyState|New snippet'), button_path, class: 'btn btn-success', title: s_('SnippetsEmptyState|New snippet'), id: 'new_snippet_link', data: { qa_selector: 'create_first_snippet_link' }
= link_to s_('SnippetsEmptyState|Documentation'), help_page_path('user/snippets.md'), class: 'btn btn-default', title: s_('SnippetsEmptyState|Documentation') = link_to s_('SnippetsEmptyState|Documentation'), help_page_path('user/snippets.md'), class: 'btn btn-default', title: s_('SnippetsEmptyState|Documentation')
- else - else
%h4.text-center= s_('SnippetsEmptyState|There are no snippets to show.') %h4.text-center= s_('SnippetsEmptyState|There are no snippets to show.')
......
...@@ -86,6 +86,7 @@ module QA ...@@ -86,6 +86,7 @@ module QA
autoload :Snippet, 'qa/resource/snippet' autoload :Snippet, 'qa/resource/snippet'
autoload :Tag, 'qa/resource/tag' autoload :Tag, 'qa/resource/tag'
autoload :ProjectMember, 'qa/resource/project_member' autoload :ProjectMember, 'qa/resource/project_member'
autoload :ProjectSnippet, 'qa/resource/project_snippet'
autoload :UserGPG, 'qa/resource/user_gpg' autoload :UserGPG, 'qa/resource/user_gpg'
autoload :Visibility, 'qa/resource/visibility' autoload :Visibility, 'qa/resource/visibility'
...@@ -327,6 +328,10 @@ module QA ...@@ -327,6 +328,10 @@ module QA
module WebIDE module WebIDE
autoload :Edit, 'qa/page/project/web_ide/edit' autoload :Edit, 'qa/page/project/web_ide/edit'
end end
module Snippet
autoload :New, 'qa/page/project/snippet/new'
end
end end
module Profile module Profile
......
...@@ -16,6 +16,7 @@ module QA ...@@ -16,6 +16,7 @@ module QA
element :activity_link element :activity_link
element :merge_requests_link element :merge_requests_link
element :wiki_link element :wiki_link
element :snippets_link
end end
def click_merge_requests def click_merge_requests
...@@ -35,6 +36,12 @@ module QA ...@@ -35,6 +36,12 @@ module QA
click_element(:activity_link) click_element(:activity_link)
end end
end end
def click_snippets
within_sidebar do
click_element(:snippets_link)
end
end
end end
end end
end end
......
# frozen_string_literal: true
module QA
module Page
module Project
module Snippet
class New < Page::Dashboard::Snippet::New
include Component::LazyLoader
view 'app/views/shared/empty_states/_snippets.html.haml' do
element :create_first_snippet_link
element :svg_content
end
def click_create_first_snippet
finished_loading?
# The svg takes a fraction of a second to load after which the
# "New snippet" button shifts up a bit. This can cause
# webdriver to miss the hit so we wait for the svg to load before
# clicking the button.
within_element(:svg_content) do
has_element?(:js_lazy_loaded)
end
click_element(:create_first_snippet_link)
end
end
end
end
end
end
# frozen_string_literal: true
module QA
module Resource
class ProjectSnippet < Snippet
attribute :project do
Project.fabricate_via_api! do |resource|
resource.name = 'project-with-snippets'
end
end
def fabricate!
project.visit!
Page::Project::Menu.perform { |sidebar| sidebar.click_snippets }
Page::Project::Snippet::New.perform do |new_snippet|
new_snippet.click_create_first_snippet
new_snippet.fill_title(@title)
new_snippet.fill_description(@description)
new_snippet.set_visibility(@visibility)
new_snippet.fill_file_name(@file_name)
new_snippet.fill_file_content(@file_content)
new_snippet.click_create_snippet_button
end
end
end
end
end
# frozen_string_literal: true
module QA
context 'Create' do
describe 'Version control for project snippets' do
let(:new_file) { 'new_snippet_file' }
let(:changed_content) { 'changes' }
let(:commit_message) { 'Changes to snippets' }
let(:added_content) { 'updated ' }
let(:branch_name) { 'master' }
let(:snippet) do
Resource::ProjectSnippet.fabricate! do |snippet|
snippet.file_name = new_file
end
end
let(:ssh_key) do
Resource::SSHKey.fabricate_via_api! do |resource|
resource.title = "my key title #{Time.now.to_f}"
end
end
let(:repository_uri_http) do
snippet
Page::Dashboard::Snippet::Show.perform(&:get_repository_uri_http)
end
let(:repository_uri_ssh) do
ssh_key
snippet
Page::Dashboard::Snippet::Show.perform(&:get_repository_uri_ssh)
end
before do
Flow::Login.sign_in
end
it 'clones, pushes, and pulls a project snippet over HTTP, edits via UI' do
Resource::Repository::Push.fabricate! do |push|
push.repository_http_uri = repository_uri_http
push.file_name = new_file
push.file_content = changed_content
push.commit_message = commit_message
push.new_branch = false
end
page.refresh
verify_changes_in_ui
Page::Dashboard::Snippet::Show.perform(&:click_edit_button)
Page::Dashboard::Snippet::Edit.perform do |snippet|
snippet.add_to_file_content(added_content)
snippet.save_changes
end
Git::Repository.perform do |repository|
repository.init_repository
repository.pull(repository_uri_http, branch_name)
expect(repository.commits.size).to eq 3
expect(repository.commits.first).to include 'Update snippet'
expect(repository.file_content(new_file)).to include "#{added_content}#{changed_content}"
end
end
it 'clones, pushes, and pulls a project snippet over SSH, deletes via UI' do
Resource::Repository::Push.fabricate! do |push|
push.repository_ssh_uri = repository_uri_ssh
push.ssh_key = ssh_key
push.file_name = new_file
push.file_content = changed_content
push.commit_message = commit_message
push.new_branch = false
end
page.refresh
verify_changes_in_ui
Page::Dashboard::Snippet::Show.perform(&:click_delete_button)
# attempt to pull a deleted snippet, get a missing repository error
Git::Repository.perform do |repository|
repository.uri = repository_uri_ssh
repository.use_ssh_key(ssh_key)
repository.init_repository
expect { repository.pull(repository_uri_ssh, branch_name) }
.to raise_error(QA::Git::Repository::RepositoryCommandError, /[fatal: Could not read from remote repository.]+/)
end
end
def verify_changes_in_ui
Page::Dashboard::Snippet::Show.perform do |snippet|
expect(snippet).to have_file_name(new_file)
expect(snippet).to have_file_content(changed_content)
end
end
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