Commit e7300f92 authored by Sanad Liaquat's avatar Sanad Liaquat

Add e2e tests for project audit logs

Also add qa selectors and refactor existing menu page objects to
conform with CE code
parent 4a57c020
...@@ -215,6 +215,7 @@ export default { ...@@ -215,6 +215,7 @@ export default {
:disabled="!canChangeVisibilityLevel" :disabled="!canChangeVisibilityLevel"
name="project[visibility_level]" name="project[visibility_level]"
class="form-control select-control" class="form-control select-control"
data-qa-selector="project_visibility_dropdown"
> >
<option <option
:value="visibilityOptions.PRIVATE" :value="visibilityOptions.PRIVATE"
......
...@@ -26,9 +26,9 @@ ...@@ -26,9 +26,9 @@
%p= _('Once the exported file is ready, you will receive a notification email with a download link, or you can download it from this page.') %p= _('Once the exported file is ready, you will receive a notification email with a download link, or you can download it from this page.')
- if project.export_status == :finished - if project.export_status == :finished
= link_to _('Download export'), download_export_project_path(project), = link_to _('Download export'), download_export_project_path(project),
rel: 'nofollow', download: '', method: :get, class: "btn btn-default" rel: 'nofollow', download: '', method: :get, class: "btn btn-default", data: { qa_selector: 'download_export_link' }
= link_to _('Generate new export'), generate_new_export_project_path(project), = link_to _('Generate new export'), generate_new_export_project_path(project),
method: :post, class: "btn btn-default" method: :post, class: "btn btn-default"
- else - else
= link_to _('Export project'), export_project_path(project), = link_to _('Export project'), export_project_path(project),
method: :post, class: "btn btn-default" method: :post, class: "btn btn-default", data: { qa_selector: 'export_project_link' }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
- if !project.empty_repo? && can?(current_user, :download_code, project) - if !project.empty_repo? && can?(current_user, :download_code, project)
- archive_prefix = "#{project.path}-#{ref.tr('/', '-')}" - archive_prefix = "#{project.path}-#{ref.tr('/', '-')}"
.project-action-button.dropdown.inline> .project-action-button.dropdown.inline>
%button.btn.has-tooltip{ title: s_('DownloadSource|Download'), 'data-toggle' => 'dropdown', 'aria-label' => s_('DownloadSource|Download'), 'data-display' => 'static' } %button.btn.has-tooltip{ title: s_('DownloadSource|Download'), 'data-toggle' => 'dropdown', 'aria-label' => s_('DownloadSource|Download'), 'data-display' => 'static', data: { qa_selector: 'download_source_code_button' } }
= sprite_icon('download') = sprite_icon('download')
%span.sr-only= _('Select Archive Format') %span.sr-only= _('Select Archive Format')
= sprite_icon("arrow-down") = sprite_icon("arrow-down")
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
%p= _('Update your project name, topics, description and avatar.') %p= _('Update your project name, topics, description and avatar.')
.settings-content= render 'projects/settings/general' .settings-content= render 'projects/settings/general'
%section.settings.sharing-permissions.no-animate#js-shared-permissions{ class: ('expanded' if expanded) } %section.settings.sharing-permissions.no-animate#js-shared-permissions{ class: ('expanded' if expanded), data: { qa_selector: 'visibility_features_permissions_content' } }
.settings-header .settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Visibility, project features, permissions') %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Visibility, project features, permissions')
%button.btn.btn-default.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand') %button.btn.btn-default.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
%input{ name: 'update_section', type: 'hidden', value: 'js-shared-permissions' } %input{ name: 'update_section', type: 'hidden', value: 'js-shared-permissions' }
%template.js-project-permissions-form-data{ type: "application/json" }= project_permissions_panel_data_json(@project) %template.js-project-permissions-form-data{ type: "application/json" }= project_permissions_panel_data_json(@project)
.js-project-permissions-form .js-project-permissions-form
= f.submit _('Save changes'), class: "btn btn-success" = f.submit _('Save changes'), class: "btn btn-success", data: { qa_selector: 'visibility_features_permissions_save_button' }
%section.qa-merge-request-settings.rspec-merge-request-settings.settings.merge-requests-feature.no-animate#js-merge-request-settings{ class: [('expanded' if expanded), ('hidden' if @project.project_feature.send(:merge_requests_access_level) == 0)] } %section.qa-merge-request-settings.rspec-merge-request-settings.settings.merge-requests-feature.no-animate#js-merge-request-settings{ class: [('expanded' if expanded), ('hidden' if @project.project_feature.send(:merge_requests_access_level) == 0)] }
.settings-header .settings-header
...@@ -81,12 +81,12 @@ ...@@ -81,12 +81,12 @@
- if @project.archived? - if @project.archived?
%p= _("Unarchiving the project will restore people's ability to make changes to it. The repository can be committed to, and issues, comments and other entities can be created. <strong>Once active this project shows up in the search and on the dashboard.</strong>").html_safe %p= _("Unarchiving the project will restore people's ability to make changes to it. The repository can be committed to, and issues, comments and other entities can be created. <strong>Once active this project shows up in the search and on the dashboard.</strong>").html_safe
= link_to _('Unarchive project'), unarchive_project_path(@project), = link_to _('Unarchive project'), unarchive_project_path(@project),
data: { confirm: _("Are you sure that you want to unarchive this project?") }, data: { confirm: _("Are you sure that you want to unarchive this project?"), qa_selector: 'unarchive_project_link' },
method: :post, class: "btn btn-success" method: :post, class: "btn btn-success"
- else - else
%p= _("Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. <strong>The repository cannot be committed to, and no issues, comments or other entities can be created.</strong>").html_safe %p= _("Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. <strong>The repository cannot be committed to, and no issues, comments or other entities can be created.</strong>").html_safe
= link_to _('Archive project'), archive_project_path(@project), = link_to _('Archive project'), archive_project_path(@project),
data: { confirm: _("Are you sure that you want to archive this project?") }, data: { confirm: _("Are you sure that you want to archive this project?"), qa_selector: 'archive_project_link' },
method: :post, class: "btn btn-warning" method: :post, class: "btn btn-warning"
.sub-section.rename-repository .sub-section.rename-repository
%h4.warning-title= _('Change path') %h4.warning-title= _('Change path')
......
- return unless @project.feature_available?(:audit_events) || show_promotions? - return unless @project.feature_available?(:audit_events) || show_promotions?
= nav_link(controller: :audit_events) do = nav_link(controller: :audit_events) do
= link_to project_audit_events_path(@project), title: "Audit Events" do = link_to project_audit_events_path(@project), title: "Audit Events", data: { qa_selector: 'audit_events_settings_link' } do
= _('Audit Events') = _('Audit Events')
...@@ -222,6 +222,7 @@ module QA ...@@ -222,6 +222,7 @@ module QA
autoload :MergeRequest, 'qa/page/project/settings/merge_request' autoload :MergeRequest, 'qa/page/project/settings/merge_request'
autoload :Members, 'qa/page/project/settings/members' autoload :Members, 'qa/page/project/settings/members'
autoload :MirroringRepositories, 'qa/page/project/settings/mirroring_repositories' autoload :MirroringRepositories, 'qa/page/project/settings/mirroring_repositories'
autoload :VisibilityFeaturesPermissions, 'qa/page/project/settings/visibility_features_permissions'
end end
module SubMenus module SubMenus
......
...@@ -83,6 +83,8 @@ module QA ...@@ -83,6 +83,8 @@ module QA
module SubMenus module SubMenus
autoload :SecurityCompliance, 'qa/ee/page/project/sub_menus/security_compliance' autoload :SecurityCompliance, 'qa/ee/page/project/sub_menus/security_compliance'
autoload :Repository, 'qa/ee/page/project/sub_menus/repository' autoload :Repository, 'qa/ee/page/project/sub_menus/repository'
autoload :Settings, 'qa/ee/page/project/sub_menus/settings'
autoload :Project, 'qa/ee/page/project/sub_menus/project'
end end
module Issue module Issue
......
...@@ -4,17 +4,11 @@ module QA ...@@ -4,17 +4,11 @@ module QA
module EE module EE
module Page module Page
module Project module Project
class Menu < ::QA::Page::Base module Menu
include QA::Page::Project::SubMenus::Common prepend QA::Page::Project::SubMenus::Common
view 'ee/app/views/layouts/nav/_project_insights_link.html.haml' do prepend SubMenus::SecurityCompliance
element :project_insights_link prepend SubMenus::Project
end prepend SubMenus::Settings
def click_project_insights_link
within_sidebar do
click_element(:project_insights_link)
end
end
end end
end end
end end
......
# frozen_string_literal: true
module QA
module EE
module Page
module Project
module SubMenus
module Project
def self.included(base)
base.class_eval do
view 'ee/app/views/layouts/nav/_project_insights_link.html.haml' do
element :project_insights_link
end
end
end
def click_project_insights_link
within_sidebar do
click_element(:project_insights_link)
end
end
end
end
end
end
end
end
...@@ -6,8 +6,6 @@ module QA ...@@ -6,8 +6,6 @@ module QA
module Project module Project
module SubMenus module SubMenus
module SecurityCompliance module SecurityCompliance
include QA::Page::Project::SubMenus::Common
def self.included(page) def self.included(page)
page.class_eval do page.class_eval do
view 'ee/app/views/layouts/nav/sidebar/_project_security_link.html.haml' do view 'ee/app/views/layouts/nav/sidebar/_project_security_link.html.haml' do
......
# frozen_string_literal: true
module QA
module EE
module Page
module Project
module SubMenus
module Settings
include QA::Page::Project::SubMenus::Common
def self.included(base)
base.class_eval do
view 'ee/app/views/projects/sidebar/_settings_audit_events.html.haml' do
element :audit_events_settings_link
end
end
end
def go_to_audit_events_settings
hover_settings do
within_submenu do
click_element :audit_events_settings_link
end
end
end
private
def hover_settings
within_sidebar do
scroll_to_element(:settings_item)
find_element(:settings_item).hover
yield
end
end
end
end
end
end
end
end
...@@ -40,4 +40,4 @@ module QA ...@@ -40,4 +40,4 @@ module QA
end end
end end
QA::Page::Project::Menu.prepend_if_ee('QA::EE::Page::Project::SubMenus::SecurityCompliance') QA::Page::Project::Menu.prepend_if_ee('QA::EE::Page::Project::Menu')
...@@ -12,6 +12,13 @@ module QA ...@@ -12,6 +12,13 @@ module QA
element :project_path_field element :project_path_field
element :change_path_button element :change_path_button
element :transfer_button element :transfer_button
element :archive_project_link
element :unarchive_project_link
end
view 'app/views/projects/_export.html.haml' do
element :export_project_link
element :download_export_link
end end
def update_project_path_to(path) def update_project_path_to(path)
...@@ -38,6 +45,26 @@ module QA ...@@ -38,6 +45,26 @@ module QA
fill_confirmation_text(project_name) fill_confirmation_text(project_name)
click_confirm_button click_confirm_button
end end
def click_export_project_link
click_element :export_project_link
end
def click_download_export_link
click_element :download_export_link
end
def archive_project
page.accept_alert("Are you sure that you want to archive this project?") do
click_element :archive_project_link
end
end
def unarchive_project
page.accept_alert("Are you sure that you want to unarchive this project?") do
click_element :unarchive_project_link
end
end
end end
end end
end end
......
...@@ -18,6 +18,10 @@ module QA ...@@ -18,6 +18,10 @@ module QA
element :save_naming_topics_avatar_button element :save_naming_topics_avatar_button
end end
view 'app/views/projects/edit.html.haml' do
element :visibility_features_permissions_content
end
def rename_project_to(name) def rename_project_to(name)
fill_project_name(name) fill_project_name(name)
click_save_changes click_save_changes
...@@ -36,6 +40,12 @@ module QA ...@@ -36,6 +40,12 @@ module QA
Advanced.perform(&block) Advanced.perform(&block)
end end
end end
def expand_visibility_project_features_permissions(&block)
expand_section(:visibility_features_permissions_content) do
VisibilityFeaturesPermissions.perform(&block)
end
end
end end
end end
end end
......
# frozen_string_literal: true
module QA
module Page
module Project
module Settings
class VisibilityFeaturesPermissions < Page::Base
include QA::Page::Component::Select2
view 'app/views/projects/edit.html.haml' do
element :visibility_features_permissions_save_button
end
view 'app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue' do
element :project_visibility_dropdown
end
def set_project_visibility(visibility)
select_element(:project_visibility_dropdown, visibility)
click_element :visibility_features_permissions_save_button
end
end
end
end
end
end
...@@ -56,6 +56,10 @@ module QA ...@@ -56,6 +56,10 @@ module QA
element :spinner element :spinner
end end
view 'app/views/projects/buttons/_download.html.haml' do
element :download_source_code_button
end
def wait_for_viewers_to_load def wait_for_viewers_to_load
wait(reload: false) do wait(reload: false) do
has_no_element?(:spinner) has_no_element?(:spinner)
......
...@@ -41,7 +41,7 @@ module QA ...@@ -41,7 +41,7 @@ module QA
project.visit! project.visit!
EE::Page::Project::Menu.perform(&:click_project_insights_link) Page::Project::Menu.perform(&:click_project_insights_link)
end end
it_behaves_like 'default insights page' it_behaves_like 'default insights page'
......
# frozen_string_literal: true
module QA
context 'Manage' do
shared_examples 'project audit event logs' do |expected_events|
it 'logs audit events for UI operations' do
Page::Project::Menu.perform(&:go_to_audit_events_settings)
expected_events.each do |expected_event|
expect(page).to have_text(expected_event)
end
end
end
describe 'Project audit logs' do
before(:all) do
sign_in
@project = Resource::Project.fabricate_via_browser_ui! do |project|
project.name = 'awesome-project'
project.initialize_with_readme = true
end
end
before do
sign_in
end
let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
context "Add project" do
before do
@project.visit!
end
it_behaves_like 'project audit event logs', ["Add project"]
end
context "Add user access as guest" do
before do
@project.visit!
Page::Project::Menu.perform(&:go_to_members_settings)
Page::Project::Settings::Members.perform do |page|
page.add_member(user.username)
end
end
it_behaves_like 'project audit event logs', ["Add user access as guest"]
end
context "Add deploy key" do
before do
key = Runtime::Key::RSA.new
deploy_key_title = 'deploy key title'
deploy_key_value = key.public_key
Resource::DeployKey.fabricate_via_browser_ui! do |resource|
resource.project = @project
resource.title = deploy_key_title
resource.key = deploy_key_value
end
end
it_behaves_like 'project audit event logs', ["Add deploy key"]
end
context "Change visibility" do
before do
@project.visit!
Page::Project::Menu.perform(&:go_to_general_settings)
Page::Project::Settings::Main.perform do |settings|
# Change visibility from public to internal
settings.expand_visibility_project_features_permissions do |page|
page.set_project_visibility "internal"
end
end
end
it_behaves_like 'project audit event logs', ["Change visibility from public to internal"]
end
context "Export file download" do
before do
@project.visit!
Page::Project::Menu.perform(&:go_to_general_settings)
Page::Project::Settings::Main.perform do |settings|
settings.expand_advanced_settings(&:click_export_project_link)
expect(page).to have_text("Project export started")
Page::Project::Menu.perform(&:go_to_general_settings)
settings.expand_advanced_settings(&:click_download_export_link)
end
end
it_behaves_like 'project audit event logs', ["Export file download started"]
end
context "Project archive and unarchive" do
before do
@project.visit!
# Project archive
Page::Project::Menu.perform(&:go_to_general_settings)
Page::Project::Settings::Main.perform do |settings|
settings.expand_advanced_settings(&:archive_project)
end
# Project unarchived
Page::Project::Menu.perform(&:go_to_general_settings)
Page::Project::Settings::Main.perform do |settings|
settings.expand_advanced_settings(&:unarchive_project)
end
end
it_behaves_like 'project audit event logs', ["Project archived", "Project unarchived"]
end
def sign_in
unless Page::Main::Menu.perform { |p| p.has_personal_area?(wait: 0) }
Runtime::Browser.visit(:gitlab, Page::Main::Login)
Page::Main::Login.perform(&:sign_in_using_credentials)
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