Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
02b976a4
Commit
02b976a4
authored
Jan 15, 2020
by
Walmyr Lima e Silva Filho
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'ml-remove-old-wait-code' into 'master'
Remove old wait method See merge request gitlab-org/gitlab!22861
parents
c14f2e39
98124bd7
Changes
57
Show whitespace changes
Inline
Side-by-side
Showing
57 changed files
with
107 additions
and
152 deletions
+107
-152
qa/qa/ee/page/admin/monitoring/audit_log.rb
qa/qa/ee/page/admin/monitoring/audit_log.rb
+1
-1
qa/qa/ee/page/component/design_management.rb
qa/qa/ee/page/component/design_management.rb
+1
-1
qa/qa/ee/page/component/issue_board/show.rb
qa/qa/ee/page/component/issue_board/show.rb
+1
-1
qa/qa/ee/page/component/web_ide/web_terminal_panel.rb
qa/qa/ee/page/component/web_ide/web_terminal_panel.rb
+2
-4
qa/qa/ee/page/dashboard/projects.rb
qa/qa/ee/page/dashboard/projects.rb
+3
-3
qa/qa/ee/page/group/epic/index.rb
qa/qa/ee/page/group/epic/index.rb
+1
-1
qa/qa/ee/page/group/issues_analytics.rb
qa/qa/ee/page/group/issues_analytics.rb
+1
-1
qa/qa/ee/page/insights/show.rb
qa/qa/ee/page/insights/show.rb
+1
-3
qa/qa/ee/page/merge_request/show.rb
qa/qa/ee/page/merge_request/show.rb
+7
-9
qa/qa/ee/page/profile/menu.rb
qa/qa/ee/page/profile/menu.rb
+1
-1
qa/qa/ee/page/project/issue/index.rb
qa/qa/ee/page/project/issue/index.rb
+1
-1
qa/qa/ee/page/project/issue/show.rb
qa/qa/ee/page/project/issue/show.rb
+1
-3
qa/qa/ee/page/project/operations/kubernetes/show.rb
qa/qa/ee/page/project/operations/kubernetes/show.rb
+1
-1
qa/qa/ee/page/project/show.rb
qa/qa/ee/page/project/show.rb
+2
-4
qa/qa/ee/page/project/wiki/show.rb
qa/qa/ee/page/project/wiki/show.rb
+1
-1
qa/qa/ee/resource/epic.rb
qa/qa/ee/resource/epic.rb
+1
-3
qa/qa/page/base.rb
qa/qa/page/base.rb
+8
-8
qa/qa/page/component/ci_badge_link.rb
qa/qa/page/component/ci_badge_link.rb
+1
-1
qa/qa/page/component/clone_panel.rb
qa/qa/page/component/clone_panel.rb
+1
-1
qa/qa/page/component/dropdown_filter.rb
qa/qa/page/component/dropdown_filter.rb
+1
-3
qa/qa/page/component/dropzone.rb
qa/qa/page/component/dropzone.rb
+1
-1
qa/qa/page/component/groups_filter.rb
qa/qa/page/component/groups_filter.rb
+1
-3
qa/qa/page/component/legacy_clone_panel.rb
qa/qa/page/component/legacy_clone_panel.rb
+1
-1
qa/qa/page/file/shared/commit_button.rb
qa/qa/page/file/shared/commit_button.rb
+1
-1
qa/qa/page/group/show.rb
qa/qa/page/group/show.rb
+1
-1
qa/qa/page/merge_request/show.rb
qa/qa/page/merge_request/show.rb
+9
-9
qa/qa/page/project/branches/show.rb
qa/qa/page/project/branches/show.rb
+1
-1
qa/qa/page/project/import/github.rb
qa/qa/page/project/import/github.rb
+2
-2
qa/qa/page/project/issue/show.rb
qa/qa/page/project/issue/show.rb
+2
-4
qa/qa/page/project/job/show.rb
qa/qa/page/project/job/show.rb
+2
-2
qa/qa/page/project/operations/environments/index.rb
qa/qa/page/project/operations/environments/index.rb
+1
-3
qa/qa/page/project/pipeline/index.rb
qa/qa/page/project/pipeline/index.rb
+1
-1
qa/qa/page/project/pipeline/show.rb
qa/qa/page/project/pipeline/show.rb
+1
-7
qa/qa/page/project/settings/ci_variables.rb
qa/qa/page/project/settings/ci_variables.rb
+1
-1
qa/qa/page/project/settings/deploy_keys.rb
qa/qa/page/project/settings/deploy_keys.rb
+1
-3
qa/qa/page/project/settings/deploy_tokens.rb
qa/qa/page/project/settings/deploy_tokens.rb
+1
-3
qa/qa/page/project/settings/mirroring_repositories.rb
qa/qa/page/project/settings/mirroring_repositories.rb
+3
-5
qa/qa/page/project/settings/protected_branches.rb
qa/qa/page/project/settings/protected_branches.rb
+1
-1
qa/qa/page/project/show.rb
qa/qa/page/project/show.rb
+3
-5
qa/qa/page/project/web_ide/edit.rb
qa/qa/page/project/web_ide/edit.rb
+3
-3
qa/qa/page/settings/common.rb
qa/qa/page/settings/common.rb
+1
-1
qa/qa/page/validatable.rb
qa/qa/page/validatable.rb
+1
-1
qa/qa/resource/base.rb
qa/qa/resource/base.rb
+3
-3
qa/qa/resource/group.rb
qa/qa/resource/group.rb
+1
-1
qa/qa/resource/protected_branch.rb
qa/qa/resource/protected_branch.rb
+0
-5
qa/qa/runtime/feature.rb
qa/qa/runtime/feature.rb
+1
-1
qa/qa/specs/features/browser_ui/2_plan/issue/close_issue_spec.rb
...pecs/features/browser_ui/2_plan/issue/close_issue_spec.rb
+1
-1
qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_sso_spec.rb
...tures/ee/browser_ui/1_manage/group/group_saml_sso_spec.rb
+2
-2
qa/qa/specs/features/ee/browser_ui/1_manage/ldap/admin_ldap_sync_spec.rb
...tures/ee/browser_ui/1_manage/ldap/admin_ldap_sync_spec.rb
+2
-2
qa/qa/specs/features/ee/browser_ui/2_plan/related_issues/related_issues_spec.rb
...e/browser_ui/2_plan/related_issues/related_issues_spec.rb
+2
-2
qa/qa/specs/features/ee/browser_ui/geo/attachment_replication_spec.rb
...features/ee/browser_ui/geo/attachment_replication_spec.rb
+1
-1
qa/qa/support/page/logging.rb
qa/qa/support/page/logging.rb
+3
-3
qa/qa/support/wait_for_requests.rb
qa/qa/support/wait_for_requests.rb
+1
-1
qa/qa/support/waiter.rb
qa/qa/support/waiter.rb
+0
-6
qa/qa/vendor/jenkins/page/new_credentials.rb
qa/qa/vendor/jenkins/page/new_credentials.rb
+1
-1
qa/spec/page/base_spec.rb
qa/spec/page/base_spec.rb
+5
-5
qa/spec/page/logging_spec.rb
qa/spec/page/logging_spec.rb
+8
-8
No files found.
qa/qa/ee/page/admin/monitoring/audit_log.rb
View file @
02b976a4
...
...
@@ -15,7 +15,7 @@ module QA
# right away so a refresh may be needed.
# https://gitlab.com/gitlab-org/gitlab/issues/119203
# TODO: https://gitlab.com/gitlab-org/gitlab/issues/195424
wait
(
reload:
true
)
do
wait
_until
(
reload:
true
)
do
has_element?
(
:admin_audit_log_row_content
,
text:
text
)
end
end
...
...
qa/qa/ee/page/component/design_management.rb
View file @
02b976a4
...
...
@@ -53,7 +53,7 @@ module QA
filename
=
::
File
.
basename
(
design_file_path
)
found
=
wait
(
reload:
false
,
interval:
1
)
do
found
=
wait
_until
(
reload:
false
,
sleep_
interval:
1
)
do
image
=
find_element
(
:design_image
)
has_element?
(
:design_file_name
,
text:
filename
)
&&
...
...
qa/qa/ee/page/component/issue_board/show.rb
View file @
02b976a4
...
...
@@ -141,7 +141,7 @@ module QA
def
wait_boards_list_finish_loading
within_element
(
:boards_list
)
do
wait
(
reload:
false
,
max:
5
,
interval:
1
)
do
wait
_until
(
reload:
false
,
max_duration:
5
,
sleep_
interval:
1
)
do
finished_loading?
&&
(
block_given?
?
yield
:
true
)
end
end
...
...
qa/qa/ee/page/component/web_ide/web_terminal_panel.rb
View file @
02b976a4
...
...
@@ -25,13 +25,11 @@ module QA
end
def
has_finished_loading?
wait
(
reload:
false
)
do
has_no_element?
:loading_container
end
has_no_element?
(
:loading_container
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
def
has_terminal_screen?
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
within_element
:terminal_screen
do
# The DOM initially just includes the :terminal_screen element
# and then the xterm package dynamically loads when the user
...
...
qa/qa/ee/page/dashboard/projects.rb
View file @
02b976a4
...
...
@@ -14,7 +14,7 @@ module QA
end
def
wait_for_project_replication
(
project_name
)
wait
(
max
:
Runtime
::
Geo
.
max_db_replication_time
)
do
wait
_until
(
max_duration
:
Runtime
::
Geo
.
max_db_replication_time
)
do
filter_by_name
(
project_name
)
within_element
(
:projects_list
)
do
...
...
@@ -30,7 +30,7 @@ module QA
def
project_created?
(
project_name
)
fill_element
(
:project_filter_form
,
project_name
)
wait
(
max
:
Runtime
::
Geo
.
max_db_replication_time
)
do
wait
_until
(
max_duration
:
Runtime
::
Geo
.
max_db_replication_time
)
do
within_element
(
:projects_list
)
do
has_text?
(
project_name
)
end
...
...
@@ -40,7 +40,7 @@ module QA
def
project_deleted?
(
project_name
)
fill_element
(
:project_filter_form
,
project_name
)
wait
(
max
:
Runtime
::
Geo
.
max_db_replication_time
)
do
wait
_until
(
max_duration
:
Runtime
::
Geo
.
max_db_replication_time
)
do
within_element
(
:projects_list
)
do
has_no_text?
(
project_name
)
end
...
...
qa/qa/ee/page/group/epic/index.rb
View file @
02b976a4
...
...
@@ -34,7 +34,7 @@ module QA
end
def
has_epic_title?
(
title
)
wait
do
wait
_until
do
has_element?
(
:epic_title_text
,
text:
title
)
end
end
...
...
qa/qa/ee/page/group/issues_analytics.rb
View file @
02b976a4
...
...
@@ -20,7 +20,7 @@ module QA
def
wait_issues_analytics_graph_finish_loading
within_element
(
:issues_analytics_wrapper
)
do
wait
(
reload:
false
,
max:
5
,
interval:
1
)
do
wait
_until
(
reload:
false
,
max_duration:
5
,
sleep_
interval:
1
)
do
finished_loading?
yield
end
...
...
qa/qa/ee/page/insights/show.rb
View file @
02b976a4
...
...
@@ -14,9 +14,7 @@ module QA
end
def
wait_for_insight_charts_to_load
wait
(
reload:
false
)
do
has_element?
(
:insights_charts
)
end
has_element?
(
:insights_charts
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
def
select_insights_dashboard
(
title
)
...
...
qa/qa/ee/page/merge_request/show.rb
View file @
02b976a4
...
...
@@ -91,9 +91,7 @@ module QA
end
def
wait_for_license_compliance_report
wait
(
reload:
false
)
do
has_no_text?
(
'Loading License Compliance report'
)
end
has_no_text?
(
'Loading License Compliance report'
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
def
approvals_required_from
...
...
@@ -192,7 +190,7 @@ module QA
click_on
name
end
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
find_element
(
:vulnerability_modal_content
)[
:class
].
include?
'show'
end
end
...
...
@@ -204,7 +202,7 @@ module QA
find_element
(
:dismiss_comment_field
).
fill_in
with:
reason
click_element
:add_and_dismiss_button
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
has_no_element?
(
:vulnerability_modal_content
)
end
end
...
...
@@ -216,7 +214,7 @@ module QA
previous_page
=
page
.
current_url
click_element
:resolve_split_button
wait
(
max
:
15
,
reload:
false
)
do
wait
_until
(
max_duration
:
15
,
reload:
false
)
do
page
.
current_url
!=
previous_page
end
end
...
...
@@ -228,13 +226,13 @@ module QA
previous_page
=
page
.
current_url
click_element
(
:create_issue_button
)
wait
(
max
:
15
,
reload:
false
)
do
wait
_until
(
max_duration
:
15
,
reload:
false
)
do
page
.
current_url
!=
previous_page
end
end
def
has_vulnerability_report?
(
timeout:
60
)
wait
(
reload:
true
,
max:
timeout
,
interval:
1
)
do
wait
_until
(
reload:
true
,
max_duration:
timeout
,
sleep_
interval:
1
)
do
finished_loading?
has_element?
(
:vulnerability_report_grouped
,
wait:
10
)
end
...
...
@@ -310,7 +308,7 @@ module QA
sleep
1
text
=
nil
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
text
=
find_element
(
:approvals_summary_content
).
text
text
=~
/Requires|approved/
end
...
...
qa/qa/ee/page/profile/menu.rb
View file @
02b976a4
...
...
@@ -6,7 +6,7 @@ module QA
module
Profile
module
Menu
def
wait_for_key_to_replicate
(
text
,
max_wait:
Runtime
::
Geo
.
max_file_replication_time
)
wait
(
max
:
max_wait
)
{
page
.
has_text?
(
text
)
}
wait
_until
(
max_duration
:
max_wait
)
{
page
.
has_text?
(
text
)
}
end
end
end
...
...
qa/qa/ee/page/project/issue/index.rb
View file @
02b976a4
...
...
@@ -45,7 +45,7 @@ module QA
end
def
wait_for_issue_replication
(
issue
)
wait
do
wait
_until
do
filter_by_title
(
issue
.
title
)
page
.
has_content?
(
issue
.
title
)
...
...
qa/qa/ee/page/project/issue/show.rb
View file @
02b976a4
...
...
@@ -68,9 +68,7 @@ module QA
end
def
wait_for_related_issues_to_load
wait
(
reload:
false
)
do
has_no_element?
(
:related_issues_loading_icon
)
end
has_no_element?
(
:related_issues_loading_icon
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
def
weight_label_value
...
...
qa/qa/ee/page/project/operations/kubernetes/show.rb
View file @
02b976a4
...
...
@@ -16,7 +16,7 @@ module QA
end
def
wait_for_cluster_health
wait
(
max:
120
,
interval:
3
,
reload:
true
)
do
wait
_until
(
max_duration:
120
,
sleep_
interval:
3
,
reload:
true
)
do
has_cluster_health_graphs?
end
end
...
...
qa/qa/ee/page/project/show.rb
View file @
02b976a4
...
...
@@ -18,13 +18,11 @@ module QA
end
def
wait_until_geo_max_replication_time
(
max_wait:
Runtime
::
Geo
.
max_file_replication_time
)
wait
(
max
:
max_wait
)
{
yield
}
wait
_until
(
max_duration
:
max_wait
)
{
yield
}
end
def
wait_for_import_success
wait
(
reload:
false
)
do
has_text?
(
'The project was successfully imported.'
)
end
has_text?
(
'The project was successfully imported.'
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
end
end
...
...
qa/qa/ee/page/project/wiki/show.rb
View file @
02b976a4
...
...
@@ -19,7 +19,7 @@ module QA
end
def
wait_until_geo_max_replication_time
(
max_wait:
Runtime
::
Geo
.
max_file_replication_time
)
wait
(
max
:
max_wait
)
{
yield
}
wait
_until
(
max_duration
:
max_wait
)
{
yield
}
end
end
end
...
...
qa/qa/ee/resource/epic.rb
View file @
02b976a4
...
...
@@ -33,9 +33,7 @@ module QA
index
.
click_new_epic
index
.
set_title
(
@title
)
index
.
create_new_epic
index
.
wait
(
interval:
1
)
do
index
.
has_text?
(
@title
)
end
index
.
has_text?
(
@title
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
end
...
...
qa/qa/page/base.rb
View file @
02b976a4
...
...
@@ -26,8 +26,8 @@ module QA
wait_for_requests
end
def
wait
(
max:
60
,
interval:
0.1
,
reload:
true
,
raise_on_failure:
false
)
Support
::
Waiter
.
wait_until
(
max_duration:
max
,
sleep_interval:
interval
,
raise_on_failure:
raise_on_failure
)
do
def
wait
_until
(
max_duration:
60
,
sleep_
interval:
0.1
,
reload:
true
,
raise_on_failure:
false
)
Support
::
Waiter
.
wait_until
(
max_duration:
max
_duration
,
sleep_interval:
sleep_
interval
,
raise_on_failure:
raise_on_failure
)
do
yield
||
(
reload
&&
refresh
&&
false
)
end
end
...
...
@@ -71,7 +71,7 @@ module QA
xhr.send();
JS
return
false
unless
wait
(
interval:
0.5
,
max
:
60
,
reload:
false
)
do
return
false
unless
wait
_until
(
sleep_interval:
0.5
,
max_duration
:
60
,
reload:
false
)
do
page
.
evaluate_script
(
'xhr.readyState == XMLHttpRequest.DONE'
)
end
...
...
@@ -115,8 +115,8 @@ module QA
end
# replace with (..., page = self.class)
def
click_element
(
name
,
page
=
nil
,
text:
nil
)
find_element
(
name
,
text:
text
).
click
def
click_element
(
name
,
page
=
nil
,
text:
nil
,
wait:
Capybara
.
default_max_wait_time
)
find_element
(
name
,
text:
text
,
wait:
wait
).
click
page
.
validate_elements_present!
if
page
end
...
...
@@ -161,10 +161,10 @@ module QA
page
.
has_text?
(
text
,
wait:
wait
)
end
def
has_no_text?
(
text
)
def
has_no_text?
(
text
,
wait:
Capybara
.
default_max_wait_time
)
wait_for_requests
page
.
has_no_text?
text
page
.
has_no_text?
(
text
,
wait:
wait
)
end
def
has_normalized_ws_text?
(
text
,
wait:
Capybara
.
default_max_wait_time
)
...
...
@@ -191,7 +191,7 @@ module QA
# This loop gives time for the img tags to be rendered and for
# images to start loading.
previous_total_images
=
0
wait
(
interval:
1
)
do
wait
_until
(
sleep_
interval:
1
)
do
current_total_images
=
all
(
"img"
).
size
result
=
previous_total_images
==
current_total_images
previous_total_images
=
current_total_images
...
...
qa/qa/page/component/ci_badge_link.rb
View file @
02b976a4
...
...
@@ -26,7 +26,7 @@ module QA
private
def
completed?
(
timeout:
60
)
wait
(
reload:
false
,
max
:
timeout
)
do
wait
_until
(
reload:
false
,
max_duration
:
timeout
)
do
COMPLETED_STATUSES
.
include?
(
status_badge
)
end
end
...
...
qa/qa/page/component/clone_panel.rb
View file @
02b976a4
...
...
@@ -24,7 +24,7 @@ module QA
private
def
repository_clone_location
(
kind
)
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
click_element
:clone_dropdown
within_element
:clone_options
do
...
...
qa/qa/page/component/dropdown_filter.rb
View file @
02b976a4
...
...
@@ -5,9 +5,7 @@ module QA
module
Component
module
DropdownFilter
def
filter_and_select
(
item
)
wait
(
reload:
false
)
do
page
.
has_css?
(
'.dropdown-input-field'
)
end
page
.
has_css?
(
'.dropdown-input-field'
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
find
(
'.dropdown-input-field'
).
set
(
item
)
click_link
item
...
...
qa/qa/page/component/dropzone.rb
View file @
02b976a4
...
...
@@ -23,7 +23,7 @@ module QA
page
.
attach_file
(
attachment
,
class:
'dz-hidden-input'
,
make_visible:
field_style
)
# Wait for link to be appended to dropzone text
page
.
wait
(
reload:
false
)
do
page
.
wait
_until
(
reload:
false
)
do
page
.
find
(
"
#{
container
}
textarea"
).
value
.
match
(
filename
)
end
end
...
...
qa/qa/page/component/groups_filter.rb
View file @
02b976a4
...
...
@@ -23,9 +23,7 @@ module QA
# Since we submitted after filtering, the presence of
# groups_list_tree_container means we have the complete filtered list
# of groups
wait
(
reload:
false
)
do
page
.
has_css?
(
element_selector_css
(
:groups_list_tree_container
))
end
has_element?
(
:groups_list_tree_container
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
# If there are no groups we'll know immediately because we filtered the list
return
false
if
page
.
has_text?
(
'No groups or projects matched your search'
,
wait:
0
)
...
...
qa/qa/page/component/legacy_clone_panel.rb
View file @
02b976a4
...
...
@@ -30,7 +30,7 @@ module QA
private
def
choose_repository_clone
(
kind
,
detect_text
)
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
click_element
:clone_dropdown
page
.
within
(
'.clone-options-dropdown'
)
do
...
...
qa/qa/page/file/shared/commit_button.rb
View file @
02b976a4
...
...
@@ -14,7 +14,7 @@ module QA
def
commit_changes
click_element
(
:commit_button
)
wait
(
reload:
false
,
max
:
60
)
do
wait
_until
(
reload:
false
,
max_duration
:
60
)
do
finished_loading?
end
end
...
...
qa/qa/page/group/show.rb
View file @
02b976a4
...
...
@@ -58,7 +58,7 @@ module QA
QA
::
Support
::
Retrier
.
retry_on_exception
(
sleep_interval:
1.0
)
do
within_element
(
:new_project_or_subgroup_dropdown
)
do
# May need to click again because it is possible to click the button quicker than the JS is bound
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
click_element
:new_project_or_subgroup_dropdown_toggle
has_element?
(
kind
)
...
...
qa/qa/page/merge_request/show.rb
View file @
02b976a4
...
...
@@ -73,7 +73,7 @@ module QA
end
def
add_comment_to_diff
(
text
)
wait
(
interval:
5
)
do
wait
_until
(
sleep_
interval:
5
)
do
has_text?
(
"No newline at end of file"
)
end
all_elements
(
:new_diff_line
,
minimum:
1
).
first
.
hover
...
...
@@ -140,12 +140,12 @@ module QA
def
mark_to_squash
# The squash checkbox is disabled on load
wait
do
wait
_until
do
has_element?
(
:squash_checkbox
)
end
# The squash checkbox is enabled via JS
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
!
find_element
(
:squash_checkbox
).
disabled?
end
...
...
@@ -164,30 +164,30 @@ module QA
def
ready_to_merge?
# The merge button is disabled on load
wait
do
wait
_until
do
has_element?
(
:merge_button
)
end
# The merge button is enabled via JS
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
!
find_element
(
:merge_button
).
disabled?
end
end
def
rebase!
# The rebase button is disabled on load
wait
do
wait
_until
do
has_element?
(
:mr_rebase_button
)
end
# The rebase button is enabled via JS
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
!
find_element
(
:mr_rebase_button
).
disabled?
end
click_element
:mr_rebase_button
success
=
wait
do
success
=
wait
_until
do
has_text?
(
'Fast-forward merge without a merge commit'
)
end
...
...
@@ -209,7 +209,7 @@ module QA
end
def
wait_for_merge_request_error_message
wait
(
max
:
30
,
reload:
false
)
do
wait
_until
(
max_duration
:
30
,
reload:
false
)
do
has_element?
(
:merge_request_error_content
)
end
end
...
...
qa/qa/page/project/branches/show.rb
View file @
02b976a4
...
...
@@ -29,7 +29,7 @@ module QA
end
def
has_no_branch?
(
branch_name
,
reload:
false
)
wait
(
reload:
reload
)
do
wait
_until
(
reload:
reload
)
do
within_element
(
:all_branches
)
do
has_no_element?
(
:branch_name
,
text:
branch_name
)
end
...
...
qa/qa/page/project/import/github.rb
View file @
02b976a4
...
...
@@ -35,7 +35,7 @@ module QA
private
def
within_repo_path
(
full_path
)
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
has_element?
(
:project_import_row
,
text:
full_path
)
end
...
...
@@ -67,7 +67,7 @@ module QA
end
def
wait_for_success
wait
(
max:
60
,
interval:
1.0
,
reload:
false
)
do
wait
_until
(
max_duration:
60
,
sleep_
interval:
1.0
,
reload:
false
)
do
page
.
has_content?
(
'Done'
,
wait:
1.0
)
end
end
...
...
qa/qa/page/project/issue/show.rb
View file @
02b976a4
...
...
@@ -89,9 +89,7 @@ module QA
end
def
has_comment?
(
comment_text
)
wait
(
reload:
false
)
do
has_element?
(
:noteable_note_item
,
text:
comment_text
)
end
has_element?
(
:noteable_note_item
,
text:
comment_text
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
def
more_assignees_link
...
...
@@ -155,7 +153,7 @@ module QA
def
wait_assignees_block_finish_loading
within_element
(
:assignee_block
)
do
wait
(
reload:
false
,
max:
10
,
interval:
1
)
do
wait
_until
(
reload:
false
,
max_duration:
10
,
sleep_
interval:
1
)
do
finished_loading_block?
yield
end
...
...
qa/qa/page/project/job/show.rb
View file @
02b976a4
...
...
@@ -24,7 +24,7 @@ module QA::Page
def
output
(
wait:
5
)
result
=
''
wait
(
reload:
false
,
max:
wait
,
interval:
1
)
do
wait
_until
(
reload:
false
,
max_duration:
wait
,
sleep_
interval:
1
)
do
result
=
find_element
(
:job_log_content
).
text
result
.
include?
(
'Job'
)
...
...
@@ -36,7 +36,7 @@ module QA::Page
private
def
loaded?
(
wait:
60
)
wait
(
reload:
true
,
max:
wait
,
interval:
1
)
do
wait
_until
(
reload:
true
,
max_duration:
wait
,
sleep_
interval:
1
)
do
has_element?
(
:job_log_content
,
wait:
1
)
end
end
...
...
qa/qa/page/project/operations/environments/index.rb
View file @
02b976a4
...
...
@@ -11,9 +11,7 @@ module QA
end
def
click_environment_link
(
environment_name
)
wait
(
reload:
false
)
do
find
(
element_selector_css
(
:environment_link
),
text:
environment_name
).
click
end
click_element
(
:environment_link
,
text:
environment_name
)
end
end
end
...
...
qa/qa/page/project/pipeline/index.rb
View file @
02b976a4
...
...
@@ -18,7 +18,7 @@ module QA::Page
end
def
wait_for_latest_pipeline_success
wait
(
reload:
false
,
max
:
300
)
do
wait
_until
(
reload:
false
,
max_duration
:
300
)
do
within_element_by_index
(
:pipeline_commit_status
,
0
)
do
has_text?
(
'passed'
)
end
...
...
qa/qa/page/project/pipeline/show.rb
View file @
02b976a4
...
...
@@ -67,13 +67,7 @@ module QA::Page
end
def
click_on_first_job
css
=
'.js-pipeline-graph-job-link'
wait
(
reload:
false
)
do
has_css?
(
css
)
end
first
(
css
).
click
first
(
'.js-pipeline-graph-job-link'
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
).
click
end
end
end
...
...
qa/qa/page/project/settings/ci_variables.rb
View file @
02b976a4
...
...
@@ -55,7 +55,7 @@ module QA
private
def
toggle_masked
(
masked_node
,
masked
)
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
masked_node
.
click
masked
?
masked_enabled?
(
masked_node
)
:
masked_disabled?
(
masked_node
)
...
...
qa/qa/page/project/settings/deploy_keys.rb
View file @
02b976a4
...
...
@@ -56,9 +56,7 @@ module QA
private
def
within_project_deploy_keys
wait
(
reload:
false
)
do
has_element?
(
:project_deploy_keys
)
end
has_element?
(
:project_deploy_keys
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
within_element
(
:project_deploy_keys
)
do
yield
...
...
qa/qa/page/project/settings/deploy_tokens.rb
View file @
02b976a4
...
...
@@ -51,9 +51,7 @@ module QA
private
def
within_new_project_deploy_token
wait
(
reload:
false
)
do
has_css?
(
element_selector_css
(
:created_deploy_token_section
))
end
has_element?
(
:created_deploy_token_section
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
within_element
(
:created_deploy_token_section
)
do
yield
...
...
qa/qa/page/project/settings/mirroring_repositories.rb
View file @
02b976a4
...
...
@@ -77,9 +77,7 @@ module QA
# The host key detection process is interrupted if we navigate away
# from the page before the fingerprint appears.
wait
(
max:
5
)
do
find_element
(
:fingerprints_list
).
has_text?
/.*/
end
find_element
(
:fingerprints_list
,
text:
/.*/
)
end
def
mirror_repository
...
...
@@ -100,7 +98,7 @@ module QA
sleep
5
refresh
wait
(
interval:
1
)
do
wait
_until
(
sleep_
interval:
1
)
do
within_element_by_index
(
:mirrored_repository_row
,
row_index
)
do
last_update
=
find_element
(
:mirror_last_update_at_cell
,
wait:
0
)
last_update
.
has_text?
(
'just now'
)
||
last_update
.
has_text?
(
'seconds'
)
...
...
@@ -117,7 +115,7 @@ module QA
private
def
find_repository_row_index
(
target_url
)
wait
(
max
:
5
,
reload:
false
)
do
wait
_until
(
max_duration
:
5
,
reload:
false
)
do
all_elements
(
:mirror_repository_url_cell
,
minimum:
1
).
index
do
|
url
|
# The url might be a sanitized url but the target_url won't be so
# we compare just the paths instead of the full url
...
...
qa/qa/page/project/settings/protected_branches.rb
View file @
02b976a4
...
...
@@ -46,7 +46,7 @@ module QA
end
def
protect_branch
click_element
:protect_button
click_element
(
:protect_button
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
private
...
...
qa/qa/page/project/show.rb
View file @
02b976a4
...
...
@@ -61,9 +61,7 @@ module QA
end
def
wait_for_viewers_to_load
wait
(
reload:
false
)
do
has_no_element?
(
:spinner
)
end
has_no_element?
(
:spinner
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
end
def
create_first_new_file!
...
...
@@ -103,7 +101,7 @@ module QA
end
def
new_merge_request
wait
(
reload:
true
)
do
wait
_until
(
reload:
true
)
do
has_css?
(
element_selector_css
(
:create_merge_request
))
end
...
...
@@ -127,7 +125,7 @@ module QA
end
def
wait_for_import
wait
(
reload:
true
)
do
wait
_until
(
reload:
true
)
do
has_css?
(
'.tree-holder'
)
end
end
...
...
qa/qa/page/project/web_ide/edit.rb
View file @
02b976a4
...
...
@@ -69,7 +69,7 @@ module QA
# Wait for the modal to fade out too
has_no_element?
(
:new_file_modal
)
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
within_element
(
:file_templates_bar
)
do
click_element
:file_template_dropdown
fill_element
:dropdown_filter_input
,
template
...
...
@@ -97,7 +97,7 @@ module QA
#
# Wait for the animation to complete before clicking :commit_button
# otherwise the click will quietly do nothing.
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
has_no_element?
(
:begin_commit_button
)
&&
has_element?
(
:commit_button
)
end
...
...
@@ -112,7 +112,7 @@ module QA
click_element
(
:commit_to_current_branch_radio
)
if
has_element?
(
:commit_to_current_branch_radio
)
click_element
(
:commit_button
)
if
has_element?
(
:commit_button
)
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
has_text?
(
'Your changes have been committed'
)
end
end
...
...
qa/qa/page/settings/common.rb
View file @
02b976a4
...
...
@@ -10,7 +10,7 @@ module QA
def
expand_section
(
element_name
)
within_element
(
element_name
)
do
# Because it is possible to click the button before the JS toggle code is bound
wait
(
reload:
false
)
do
wait
_until
(
reload:
false
)
do
click_button
'Expand'
unless
has_css?
(
'button'
,
text:
'Collapse'
,
wait:
1
)
has_content?
(
'Collapse'
)
...
...
qa/qa/page/validatable.rb
View file @
02b976a4
...
...
@@ -11,7 +11,7 @@ module QA
elements
.
each
do
|
element
|
next
unless
element
.
required?
unless
base_page
.
wait
(
reload:
false
)
{
base_page
.
has_element?
(
element
.
name
,
wait:
15
)
}
unless
base_page
.
has_element?
(
element
.
name
,
wait:
QA
::
Support
::
Repeater
::
DEFAULT_MAX_WAIT_TIME
)
raise
Validatable
::
PageValidationError
,
"
#{
element
.
name
}
did not appear on
#{
self
.
name
}
as expected"
end
end
...
...
qa/qa/resource/base.rb
View file @
02b976a4
...
...
@@ -71,7 +71,7 @@ module QA
Support
::
Retrier
.
retry_until
do
visit
(
web_url
)
wait
{
current_url
.
include?
(
URI
.
parse
(
web_url
).
path
.
split
(
'/'
).
last
||
web_url
)
}
wait
_until
{
current_url
.
include?
(
URI
.
parse
(
web_url
).
path
.
split
(
'/'
).
last
||
web_url
)
}
end
# Wait until the new page is ready for us to interact with it
...
...
@@ -82,8 +82,8 @@ module QA
attributes
.
each
(
&
method
(
:public_send
))
end
def
wait
(
max:
60
,
interval:
0.1
)
QA
::
Support
::
Waiter
.
wait
(
max:
max
,
interval:
interval
)
do
def
wait
_until
(
max_duration:
60
,
sleep_
interval:
0.1
)
QA
::
Support
::
Waiter
.
wait
_until
(
max_duration:
max_duration
,
sleep_interval:
sleep_
interval
)
do
yield
end
end
...
...
qa/qa/resource/group.rb
View file @
02b976a4
...
...
@@ -39,7 +39,7 @@ module QA
end
# Ensure that the group was actually created
group_show
.
wait
(
interval:
1
)
do
group_show
.
wait
_until
(
sleep_
interval:
1
)
do
group_show
.
has_text?
(
path
)
&&
group_show
.
has_new_project_or_subgroup_dropdown?
end
...
...
qa/qa/resource/protected_branch.rb
View file @
02b976a4
...
...
@@ -49,11 +49,6 @@ module QA
page
.
select_branch
(
branch_name
)
page
.
select_allowed_to_merge
(
allowed_to_merge
)
page
.
select_allowed_to_push
(
allowed_to_push
)
page
.
wait
(
reload:
false
)
do
!
page
.
first
(
'.btn-success'
).
disabled?
end
page
.
protect_branch
end
end
...
...
qa/qa/runtime/feature.rb
View file @
02b976a4
...
...
@@ -33,7 +33,7 @@ module QA
is_enabled
=
false
QA
::
Support
::
Waiter
.
wait
(
interval:
1
)
do
QA
::
Support
::
Waiter
.
wait
_until
(
sleep_
interval:
1
)
do
is_enabled
=
enabled?
(
key
)
end
...
...
qa/qa/specs/features/browser_ui/2_plan/issue/close_issue_spec.rb
View file @
02b976a4
...
...
@@ -27,7 +27,7 @@ module QA
issue
.
visit!
Page
::
Project
::
Issue
::
Show
.
perform
do
|
show
|
reopen_issue_button_visible
=
show
.
wait
(
reload:
true
)
do
reopen_issue_button_visible
=
show
.
wait
_until
(
reload:
true
)
do
show
.
has_element?
(
:reopen_issue_button
,
wait:
1.0
)
end
expect
(
reopen_issue_button_visible
).
to
be_truthy
...
...
qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_sso_spec.rb
View file @
02b976a4
...
...
@@ -335,7 +335,7 @@ module QA
Runtime
::
Logger
.
debug
(
%Q[Visiting IDP url at "
#{
EE
::
Runtime
::
Saml
.
idp_sso_url
}
"]
)
page
.
visit
EE
::
Runtime
::
Saml
.
idp_sso_url
Support
::
Waiter
.
wait
{
current_url
==
EE
::
Runtime
::
Saml
.
idp_sso_url
}
Support
::
Waiter
.
wait
_until
{
current_url
==
EE
::
Runtime
::
Saml
.
idp_sso_url
}
Capybara
.
current_session
.
reset!
end
...
...
@@ -344,7 +344,7 @@ module QA
Runtime
::
Logger
.
debug
(
%Q[Visiting managed_group_url at "
#{
@managed_group_url
}
"]
)
page
.
visit
@managed_group_url
Support
::
Waiter
.
wait
{
current_url
==
@managed_group_url
}
Support
::
Waiter
.
wait
_until
{
current_url
==
@managed_group_url
}
end
def
disable_enforce_sso_and_group_managed_account
...
...
qa/qa/specs/features/ee/browser_ui/1_manage/ldap/admin_ldap_sync_spec.rb
View file @
02b976a4
...
...
@@ -12,7 +12,7 @@ module QA
it
'sets and removes user\'s admin status'
do
Page
::
Main
::
Menu
.
perform
do
|
menu
|
admin_synchronised
=
menu
.
wait
(
max:
80
,
interval:
1
,
reload:
true
)
do
admin_synchronised
=
menu
.
wait
_until
(
max_duration:
80
,
sleep_
interval:
1
,
reload:
true
)
do
menu
.
has_admin_area_link?
end
...
...
@@ -26,7 +26,7 @@ module QA
login_with_ldap_admin_user
Page
::
Main
::
Menu
.
perform
do
|
menu
|
admin_removed
=
menu
.
wait
(
max:
80
,
interval:
1
,
reload:
true
)
do
admin_removed
=
menu
.
wait
_until
(
max_duration:
80
,
sleep_
interval:
1
,
reload:
true
)
do
menu
.
has_no_admin_area_link?
end
...
...
qa/qa/specs/features/ee/browser_ui/2_plan/related_issues/related_issues_spec.rb
View file @
02b976a4
...
...
@@ -36,13 +36,13 @@ module QA
show
.
relate_issue
(
issue_2
)
show
.
wait
(
reload:
false
,
max:
max_wait
,
interval:
wait_interval
)
do
show
.
wait
_until
(
reload:
false
,
max_duration:
max_wait
,
sleep_
interval:
wait_interval
)
do
expect
(
show
.
related_issuable_item
).
to
have_content
(
issue_2
.
title
)
end
show
.
click_remove_related_issue_button
show
.
wait
(
reload:
false
,
max:
max_wait
,
interval:
wait_interval
)
do
show
.
wait
_until
(
reload:
false
,
max_duration:
max_wait
,
sleep_
interval:
wait_interval
)
do
expect
(
show
).
not_to
have_content
(
issue_2
.
title
)
end
end
...
...
qa/qa/specs/features/ee/browser_ui/geo/attachment_replication_spec.rb
View file @
02b976a4
...
...
@@ -51,7 +51,7 @@ module QA
Page
::
Project
::
Issue
::
Show
.
perform
do
|
show
|
# Wait for attachment replication
found
=
show
.
wait
(
reload:
false
)
do
found
=
show
.
wait
_until
(
reload:
false
)
do
show
.
asset_exists?
(
image_url
)
end
...
...
qa/qa/support/page/logging.rb
View file @
02b976a4
...
...
@@ -16,7 +16,7 @@ module QA
super
end
def
wait
(
max:
60
,
interval:
0.1
,
reload:
true
)
def
wait
_until
(
max_duration:
60
,
sleep_
interval:
0.1
,
reload:
true
)
log
(
"next wait uses reload:
#{
reload
}
"
)
# Logging of wait start/end/duration is handled by QA::Support::Waiter
...
...
@@ -119,10 +119,10 @@ module QA
found
end
def
has_no_text?
(
text
)
def
has_no_text?
(
text
,
**
kwargs
)
found
=
super
log
(
%Q{has_no_text?('
#{
text
}
') returned
#{
found
}
}
)
log
(
%Q{has_no_text?('
#{
text
}
'
, wait:
#{
kwargs
[
:wait
]
||
Capybara
.
default_max_wait_time
}
) returned
#{
found
}
}
)
found
end
...
...
qa/qa/support/wait_for_requests.rb
View file @
02b976a4
...
...
@@ -6,7 +6,7 @@ module QA
module_function
def
wait_for_requests
Waiter
.
wait
do
Waiter
.
wait
_until
do
finished_all_ajax_requests?
&&
finished_all_axios_requests?
end
end
...
...
qa/qa/support/waiter.rb
View file @
02b976a4
...
...
@@ -7,12 +7,6 @@ module QA
module_function
def
wait
(
max:
singleton_class
::
DEFAULT_MAX_WAIT_TIME
,
interval:
0.1
)
wait_until
(
max_duration:
max
,
sleep_interval:
interval
,
raise_on_failure:
false
)
do
yield
end
end
def
wait_until
(
max_duration:
singleton_class
::
DEFAULT_MAX_WAIT_TIME
,
reload_page:
nil
,
sleep_interval:
0.1
,
raise_on_failure:
false
,
retry_on_exception:
false
)
QA
::
Runtime
::
Logger
.
debug
(
<<~
MSG
.
tr
(
"
\n
"
,
' '
)
...
...
qa/qa/vendor/jenkins/page/new_credentials.rb
View file @
02b976a4
...
...
@@ -39,7 +39,7 @@ module QA
end
def
wait_for_page_to_load
QA
::
Support
::
Waiter
.
wait
(
interval:
1.0
)
do
QA
::
Support
::
Waiter
.
wait
_until
(
sleep_
interval:
1.0
)
do
page
.
has_css?
(
'.setting-name'
,
text:
"Description"
)
end
end
...
...
qa/spec/page/base_spec.rb
View file @
02b976a4
...
...
@@ -3,7 +3,7 @@
describe
QA
::
Page
::
Base
do
describe
'page helpers'
do
it
'exposes helpful page helpers'
do
expect
(
subject
).
to
respond_to
:refresh
,
:wait
,
:scroll_to
expect
(
subject
).
to
respond_to
:refresh
,
:wait
_until
,
:scroll_to
end
end
...
...
@@ -69,11 +69,11 @@ describe QA::Page::Base do
it
'does not refresh'
do
expect
(
subject
).
not_to
receive
(
:refresh
)
subject
.
wait
(
max
:
0.01
,
raise_on_failure:
false
)
{
true
}
subject
.
wait
_until
(
max_duration
:
0.01
,
raise_on_failure:
false
)
{
true
}
end
it
'returns true'
do
expect
(
subject
.
wait
(
max
:
0.1
,
raise_on_failure:
false
)
{
true
}).
to
be_truthy
expect
(
subject
.
wait
_until
(
max_duration
:
0.1
,
raise_on_failure:
false
)
{
true
}).
to
be_truthy
end
end
...
...
@@ -81,13 +81,13 @@ describe QA::Page::Base do
it
'refreshes'
do
expect
(
subject
).
to
receive
(
:refresh
).
at_least
(
:once
)
subject
.
wait
(
max
:
0.01
,
raise_on_failure:
false
)
{
false
}
subject
.
wait
_until
(
max_duration
:
0.01
,
raise_on_failure:
false
)
{
false
}
end
it
'returns false'
do
allow
(
subject
).
to
receive
(
:refresh
)
expect
(
subject
.
wait
(
max
:
0.01
,
raise_on_failure:
false
)
{
false
}).
to
be_falsey
expect
(
subject
.
wait
_until
(
max_duration
:
0.01
,
raise_on_failure:
false
)
{
false
}).
to
be_falsey
end
end
end
...
...
qa/spec/page/logging_spec.rb
View file @
02b976a4
...
...
@@ -28,20 +28,20 @@ describe QA::Support::Page::Logging do
end
it
'logs wait'
do
expect
{
subject
.
wait
(
max
:
0
)
{}
}
expect
{
subject
.
wait
_until
(
max_duration
:
0
)
{}
}
.
to
output
(
/next wait uses reload: true/
).
to_stdout_from_any_process
expect
{
subject
.
wait
(
max
:
0
)
{}
}
expect
{
subject
.
wait
_until
(
max_duration
:
0
)
{}
}
.
to
output
(
/with wait_until/
).
to_stdout_from_any_process
expect
{
subject
.
wait
(
max
:
0
)
{}
}
expect
{
subject
.
wait
_until
(
max_duration
:
0
)
{}
}
.
to
output
(
/ended wait_until$/
).
to_stdout_from_any_process
end
it
'logs wait with reload false'
do
expect
{
subject
.
wait
(
max
:
0
,
reload:
false
)
{}
}
expect
{
subject
.
wait
_until
(
max_duration
:
0
,
reload:
false
)
{}
}
.
to
output
(
/next wait uses reload: false/
).
to_stdout_from_any_process
expect
{
subject
.
wait
(
max
:
0
,
reload:
false
)
{}
}
expect
{
subject
.
wait
_until
(
max_duration
:
0
,
reload:
false
)
{}
}
.
to
output
(
/with wait_until/
).
to_stdout_from_any_process
expect
{
subject
.
wait
(
max
:
0
,
reload:
false
)
{}
}
expect
{
subject
.
wait
_until
(
max_duration
:
0
,
reload:
false
)
{}
}
.
to
output
(
/ended wait_until$/
).
to_stdout_from_any_process
end
...
...
@@ -121,10 +121,10 @@ describe QA::Support::Page::Logging do
end
it
'logs has_no_text?'
do
allow
(
page
).
to
receive
(
:has_no_text?
).
with
(
'foo'
).
and_return
(
true
)
allow
(
page
).
to
receive
(
:has_no_text?
).
with
(
'foo'
,
any_args
).
and_return
(
true
)
expect
{
subject
.
has_no_text?
'foo'
}
.
to
output
(
/has_no_text\?\('foo'\) returned true/
).
to_stdout_from_any_process
.
to
output
(
/has_no_text\?\('foo'
, wait:
#{
QA
::
Runtime
::
Browser
::
CAPYBARA_MAX_WAIT_TIME
}
\) returned true/
).
to_stdout_from_any_process
end
it
'logs finished_loading?'
do
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment