chemlab 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +3 -0
  4. data/.rspec_parallel +5 -0
  5. data/Dockerfile +68 -0
  6. data/Gemfile +23 -0
  7. data/Gemfile.lock +137 -0
  8. data/README.md +201 -0
  9. data/Rakefile +47 -0
  10. data/bin/qa +7 -0
  11. data/bin/test +3 -0
  12. data/chemlab.gemspec +43 -0
  13. data/knapsack/master_report.json +54 -0
  14. data/lib/chemlab.rb +5 -0
  15. data/lib/chemlab/version.rb +5 -0
  16. data/qa.rb +513 -0
  17. data/qa/ce/strategy.rb +21 -0
  18. data/qa/ee.rb +234 -0
  19. data/qa/ee/fixtures/gpg/admin.asc +0 -0
  20. data/qa/ee/fixtures/secure_license_files/.gitlab-ci.yml +12 -0
  21. data/qa/ee/fixtures/secure_license_files/gl-license-management-report.json +24 -0
  22. data/qa/ee/fixtures/secure_premade_reports/.gitlab-ci.yml +61 -0
  23. data/qa/ee/fixtures/secure_premade_reports/gl-container-scanning-report.json +105 -0
  24. data/qa/ee/fixtures/secure_premade_reports/gl-dast-report.json +1 -0
  25. data/qa/ee/fixtures/secure_premade_reports/gl-dependency-scanning-report.json +226 -0
  26. data/qa/ee/fixtures/secure_premade_reports/gl-license-management-report.json +42 -0
  27. data/qa/ee/fixtures/secure_premade_reports/gl-sast-report.json +152 -0
  28. data/qa/ee/fixtures/secure_premade_reports/yarn.lock +10024 -0
  29. data/qa/ee/page/admin/geo/nodes/new.rb +36 -0
  30. data/qa/ee/page/admin/geo/nodes/show.rb +23 -0
  31. data/qa/ee/page/admin/license.rb +41 -0
  32. data/qa/ee/page/admin/menu.rb +55 -0
  33. data/qa/ee/page/admin/monitoring/audit_log.rb +27 -0
  34. data/qa/ee/page/admin/overview/groups/edit.rb +27 -0
  35. data/qa/ee/page/admin/settings/component/elasticsearch.rb +38 -0
  36. data/qa/ee/page/admin/settings/component/email.rb +35 -0
  37. data/qa/ee/page/admin/settings/integration.rb +25 -0
  38. data/qa/ee/page/admin/settings/preferences.rb +25 -0
  39. data/qa/ee/page/admin/settings/templates.rb +40 -0
  40. data/qa/ee/page/component/design_management.rb +80 -0
  41. data/qa/ee/page/component/issue_board/show.rb +154 -0
  42. data/qa/ee/page/component/license_management.rb +62 -0
  43. data/qa/ee/page/component/secure_report.rb +38 -0
  44. data/qa/ee/page/component/web_ide/web_terminal_panel.rb +58 -0
  45. data/qa/ee/page/dashboard/projects.rb +54 -0
  46. data/qa/ee/page/file/show.rb +49 -0
  47. data/qa/ee/page/group/contribution_analytics.rb +29 -0
  48. data/qa/ee/page/group/epic/index.rb +46 -0
  49. data/qa/ee/page/group/epic/show.rb +74 -0
  50. data/qa/ee/page/group/issues_analytics.rb +33 -0
  51. data/qa/ee/page/group/members.rb +19 -0
  52. data/qa/ee/page/group/menu.rb +117 -0
  53. data/qa/ee/page/group/roadmap.rb +34 -0
  54. data/qa/ee/page/group/saml_sso_sign_in.rb +22 -0
  55. data/qa/ee/page/group/saml_sso_sign_up.rb +34 -0
  56. data/qa/ee/page/group/secure/show.rb +24 -0
  57. data/qa/ee/page/group/settings/general.rb +112 -0
  58. data/qa/ee/page/group/settings/ldap_sync.rb +38 -0
  59. data/qa/ee/page/group/settings/saml_sso.rb +93 -0
  60. data/qa/ee/page/insights/show.rb +51 -0
  61. data/qa/ee/page/main/banner.rb +19 -0
  62. data/qa/ee/page/merge_request/new.rb +74 -0
  63. data/qa/ee/page/merge_request/show.rb +326 -0
  64. data/qa/ee/page/profile/menu.rb +15 -0
  65. data/qa/ee/page/project/issue/index.rb +46 -0
  66. data/qa/ee/page/project/issue/show.rb +97 -0
  67. data/qa/ee/page/project/menu.rb +17 -0
  68. data/qa/ee/page/project/milestone/show.rb +41 -0
  69. data/qa/ee/page/project/new.rb +56 -0
  70. data/qa/ee/page/project/operations/kubernetes/show.rb +50 -0
  71. data/qa/ee/page/project/operations/metrics/show.rb +101 -0
  72. data/qa/ee/page/project/packages/index.rb +30 -0
  73. data/qa/ee/page/project/packages/show.rb +29 -0
  74. data/qa/ee/page/project/path_locks/index.rb +30 -0
  75. data/qa/ee/page/project/pipeline/show.rb +34 -0
  76. data/qa/ee/page/project/secure/dependency_list.rb +19 -0
  77. data/qa/ee/page/project/secure/show.rb +17 -0
  78. data/qa/ee/page/project/settings/ci_cd.rb +25 -0
  79. data/qa/ee/page/project/settings/integrations.rb +21 -0
  80. data/qa/ee/page/project/settings/license_compliance.rb +67 -0
  81. data/qa/ee/page/project/settings/merge_request.rb +27 -0
  82. data/qa/ee/page/project/settings/mirroring_repositories.rb +30 -0
  83. data/qa/ee/page/project/settings/protected_branches.rb +37 -0
  84. data/qa/ee/page/project/settings/push_rules.rb +82 -0
  85. data/qa/ee/page/project/settings/repository.rb +27 -0
  86. data/qa/ee/page/project/settings/services/jenkins.rb +56 -0
  87. data/qa/ee/page/project/show.rb +35 -0
  88. data/qa/ee/page/project/sub_menus/packages.rb +27 -0
  89. data/qa/ee/page/project/sub_menus/project.rb +21 -0
  90. data/qa/ee/page/project/sub_menus/repository.rb +29 -0
  91. data/qa/ee/page/project/sub_menus/security_compliance.rb +44 -0
  92. data/qa/ee/page/project/sub_menus/settings.rb +42 -0
  93. data/qa/ee/page/project/wiki/show.rb +31 -0
  94. data/qa/ee/resource/board/base_board.rb +26 -0
  95. data/qa/ee/resource/board/board_list/group/board_list.rb +57 -0
  96. data/qa/ee/resource/board/board_list/project/assignee_board_list.rb +23 -0
  97. data/qa/ee/resource/board/board_list/project/base_board_list.rb +50 -0
  98. data/qa/ee/resource/board/board_list/project/label_board_list.rb +28 -0
  99. data/qa/ee/resource/board/board_list/project/milestone_board_list.rb +28 -0
  100. data/qa/ee/resource/board/group_board.rb +25 -0
  101. data/qa/ee/resource/board/project_board.rb +25 -0
  102. data/qa/ee/resource/epic.rb +60 -0
  103. data/qa/ee/resource/geo/node.rb +31 -0
  104. data/qa/ee/resource/group_label.rb +50 -0
  105. data/qa/ee/resource/license.rb +21 -0
  106. data/qa/ee/resource/project_milestone.rb +20 -0
  107. data/qa/ee/resource/settings/elasticsearch.rb +60 -0
  108. data/qa/ee/runtime/env.rb +30 -0
  109. data/qa/ee/runtime/geo.rb +28 -0
  110. data/qa/ee/runtime/saml.rb +37 -0
  111. data/qa/ee/scenario/test/geo.rb +211 -0
  112. data/qa/ee/scenario/test/integration/elasticsearch.rb +15 -0
  113. data/qa/ee/scenario/test/integration/group_saml.rb +17 -0
  114. data/qa/ee/scenario/test/sanity/selectors.rb +17 -0
  115. data/qa/ee/strategy.rb +28 -0
  116. data/qa/fixtures/auto_devops_rack/Dockerfile +9 -0
  117. data/qa/fixtures/auto_devops_rack/Gemfile +3 -0
  118. data/qa/fixtures/auto_devops_rack/Gemfile.lock +15 -0
  119. data/qa/fixtures/auto_devops_rack/Rakefile +7 -0
  120. data/qa/fixtures/auto_devops_rack/config.ru +1 -0
  121. data/qa/fixtures/ldap/admin/1_add_nodes.ldif +7 -0
  122. data/qa/fixtures/ldap/admin/2_add_users.ldif +63 -0
  123. data/qa/fixtures/ldap/admin/3_add_groups.ldif +16 -0
  124. data/qa/fixtures/ldap/non_admin/1_add_nodes.ldif +7 -0
  125. data/qa/fixtures/ldap/non_admin/2_add_users.ldif +61 -0
  126. data/qa/fixtures/ldap/non_admin/3_add_groups.ldif +16 -0
  127. data/qa/fixtures/monitored_auto_devops/.gitlab-ci.yml +337 -0
  128. data/qa/flow/login.rb +39 -0
  129. data/qa/flow/project.rb +19 -0
  130. data/qa/flow/saml.rb +72 -0
  131. data/qa/flow/user.rb +26 -0
  132. data/qa/git/location.rb +34 -0
  133. data/qa/git/repository.rb +269 -0
  134. data/qa/page/admin/menu.rb +110 -0
  135. data/qa/page/admin/new_session.rb +22 -0
  136. data/qa/page/admin/overview/groups/edit.rb +23 -0
  137. data/qa/page/admin/overview/groups/index.rb +32 -0
  138. data/qa/page/admin/overview/groups/show.rb +21 -0
  139. data/qa/page/admin/overview/users/index.rb +35 -0
  140. data/qa/page/admin/overview/users/show.rb +31 -0
  141. data/qa/page/admin/settings/component/account_and_limit.rb +26 -0
  142. data/qa/page/admin/settings/component/ip_limits.rb +30 -0
  143. data/qa/page/admin/settings/component/outbound_requests.rb +33 -0
  144. data/qa/page/admin/settings/component/performance_bar.rb +27 -0
  145. data/qa/page/admin/settings/component/repository_storage.rb +26 -0
  146. data/qa/page/admin/settings/general.rb +23 -0
  147. data/qa/page/admin/settings/metrics_and_profiling.rb +23 -0
  148. data/qa/page/admin/settings/network.rb +30 -0
  149. data/qa/page/admin/settings/repository.rb +23 -0
  150. data/qa/page/alert/auto_devops_alert.rb +13 -0
  151. data/qa/page/base.rb +348 -0
  152. data/qa/page/component/breadcrumbs.rb +19 -0
  153. data/qa/page/component/ci_badge_link.rb +49 -0
  154. data/qa/page/component/clone_panel.rb +38 -0
  155. data/qa/page/component/confirm_modal.rb +25 -0
  156. data/qa/page/component/dropdown_filter.rb +16 -0
  157. data/qa/page/component/dropzone.rb +33 -0
  158. data/qa/page/component/groups_filter.rb +37 -0
  159. data/qa/page/component/issuable/common.rb +31 -0
  160. data/qa/page/component/lazy_loader.rb +15 -0
  161. data/qa/page/component/legacy_clone_panel.rb +47 -0
  162. data/qa/page/component/note.rb +84 -0
  163. data/qa/page/component/select2.rb +48 -0
  164. data/qa/page/component/users_select.rb +14 -0
  165. data/qa/page/component/web_ide/alert.rb +27 -0
  166. data/qa/page/dashboard/groups.rb +34 -0
  167. data/qa/page/dashboard/projects.rb +37 -0
  168. data/qa/page/dashboard/snippet/index.rb +21 -0
  169. data/qa/page/dashboard/snippet/new.rb +70 -0
  170. data/qa/page/dashboard/snippet/show.rb +63 -0
  171. data/qa/page/dashboard/welcome.rb +17 -0
  172. data/qa/page/element.rb +55 -0
  173. data/qa/page/file/edit.rb +13 -0
  174. data/qa/page/file/form.rb +49 -0
  175. data/qa/page/file/shared/commit_button.rb +25 -0
  176. data/qa/page/file/shared/commit_message.rb +21 -0
  177. data/qa/page/file/shared/editor.rb +33 -0
  178. data/qa/page/file/show.rb +36 -0
  179. data/qa/page/group/menu.rb +52 -0
  180. data/qa/page/group/new.rb +37 -0
  181. data/qa/page/group/settings/general.rb +115 -0
  182. data/qa/page/group/show.rb +74 -0
  183. data/qa/page/group/sub_menus/common.rb +27 -0
  184. data/qa/page/group/sub_menus/members.rb +45 -0
  185. data/qa/page/issuable/sidebar.rb +27 -0
  186. data/qa/page/label/index.rb +34 -0
  187. data/qa/page/label/new.rb +32 -0
  188. data/qa/page/layout/banner.rb +19 -0
  189. data/qa/page/layout/performance_bar.rb +41 -0
  190. data/qa/page/main/login.rb +181 -0
  191. data/qa/page/main/menu.rb +150 -0
  192. data/qa/page/main/oauth.rb +21 -0
  193. data/qa/page/main/sign_up.rb +37 -0
  194. data/qa/page/main/terms.rb +21 -0
  195. data/qa/page/mattermost/login.rb +28 -0
  196. data/qa/page/mattermost/main.rb +15 -0
  197. data/qa/page/merge_request/new.rb +68 -0
  198. data/qa/page/merge_request/show.rb +232 -0
  199. data/qa/page/profile/emails.rb +29 -0
  200. data/qa/page/profile/menu.rb +52 -0
  201. data/qa/page/profile/password.rb +23 -0
  202. data/qa/page/profile/personal_access_tokens.rb +67 -0
  203. data/qa/page/profile/ssh_keys.rb +42 -0
  204. data/qa/page/profile/two_factor_auth.rb +17 -0
  205. data/qa/page/project/activity.rb +17 -0
  206. data/qa/page/project/branches/show.rb +56 -0
  207. data/qa/page/project/commit/show.rb +32 -0
  208. data/qa/page/project/fork/new.rb +19 -0
  209. data/qa/page/project/import/github.rb +78 -0
  210. data/qa/page/project/issue/index.rb +71 -0
  211. data/qa/page/project/issue/new.rb +35 -0
  212. data/qa/page/project/issue/show.rb +168 -0
  213. data/qa/page/project/job/show.rb +53 -0
  214. data/qa/page/project/menu.rb +43 -0
  215. data/qa/page/project/milestone/index.rb +19 -0
  216. data/qa/page/project/milestone/new.rb +29 -0
  217. data/qa/page/project/new.rb +76 -0
  218. data/qa/page/project/operations/environments/index.rb +21 -0
  219. data/qa/page/project/operations/environments/show.rb +23 -0
  220. data/qa/page/project/operations/kubernetes/add.rb +21 -0
  221. data/qa/page/project/operations/kubernetes/add_existing.rb +46 -0
  222. data/qa/page/project/operations/kubernetes/index.rb +25 -0
  223. data/qa/page/project/operations/kubernetes/show.rb +81 -0
  224. data/qa/page/project/operations/metrics/show.rb +87 -0
  225. data/qa/page/project/pipeline/index.rb +43 -0
  226. data/qa/page/project/pipeline/show.rb +76 -0
  227. data/qa/page/project/settings/advanced.rb +75 -0
  228. data/qa/page/project/settings/auto_devops.rb +21 -0
  229. data/qa/page/project/settings/ci_cd.rb +39 -0
  230. data/qa/page/project/settings/ci_variables.rb +56 -0
  231. data/qa/page/project/settings/common.rb +13 -0
  232. data/qa/page/project/settings/deploy_keys.rb +69 -0
  233. data/qa/page/project/settings/deploy_tokens.rb +64 -0
  234. data/qa/page/project/settings/main.rb +60 -0
  235. data/qa/page/project/settings/members.rb +62 -0
  236. data/qa/page/project/settings/merge_request.rb +32 -0
  237. data/qa/page/project/settings/mirroring_repositories.rb +132 -0
  238. data/qa/page/project/settings/protected_branches.rb +72 -0
  239. data/qa/page/project/settings/repository.rb +55 -0
  240. data/qa/page/project/settings/runners.rb +37 -0
  241. data/qa/page/project/settings/visibility_features_permissions.rb +26 -0
  242. data/qa/page/project/show.rb +165 -0
  243. data/qa/page/project/sub_menus/ci_cd.rb +27 -0
  244. data/qa/page/project/sub_menus/common.rb +19 -0
  245. data/qa/page/project/sub_menus/issues.rb +63 -0
  246. data/qa/page/project/sub_menus/operations.rb +58 -0
  247. data/qa/page/project/sub_menus/project.rb +29 -0
  248. data/qa/page/project/sub_menus/repository.rb +48 -0
  249. data/qa/page/project/sub_menus/settings.rb +81 -0
  250. data/qa/page/project/web_ide/edit.rb +139 -0
  251. data/qa/page/project/wiki/edit.rb +21 -0
  252. data/qa/page/project/wiki/git_access.rb +13 -0
  253. data/qa/page/project/wiki/new.rb +61 -0
  254. data/qa/page/project/wiki/show.rb +31 -0
  255. data/qa/page/search/results.rb +55 -0
  256. data/qa/page/settings/common.rb +26 -0
  257. data/qa/page/sub_menus/common.rb +50 -0
  258. data/qa/page/validatable.rb +21 -0
  259. data/qa/page/validator.rb +52 -0
  260. data/qa/page/view.rb +59 -0
  261. data/qa/resource/api_fabricator.rb +137 -0
  262. data/qa/resource/base.rb +170 -0
  263. data/qa/resource/ci_variable.rb +57 -0
  264. data/qa/resource/deploy_key.rb +39 -0
  265. data/qa/resource/deploy_token.rb +48 -0
  266. data/qa/resource/events/base.rb +42 -0
  267. data/qa/resource/events/project.rb +25 -0
  268. data/qa/resource/file.rb +63 -0
  269. data/qa/resource/fork.rb +92 -0
  270. data/qa/resource/group.rb +83 -0
  271. data/qa/resource/issue.rb +61 -0
  272. data/qa/resource/kubernetes_cluster/base.rb +40 -0
  273. data/qa/resource/kubernetes_cluster/project_cluster.rb +72 -0
  274. data/qa/resource/label.rb +61 -0
  275. data/qa/resource/members.rb +36 -0
  276. data/qa/resource/merge_request.rb +105 -0
  277. data/qa/resource/merge_request_from_fork.rb +33 -0
  278. data/qa/resource/personal_access_token.rb +31 -0
  279. data/qa/resource/project.rb +179 -0
  280. data/qa/resource/project_imported_from_github.rb +31 -0
  281. data/qa/resource/project_member.rb +35 -0
  282. data/qa/resource/project_milestone.rb +34 -0
  283. data/qa/resource/protected_branch.rb +76 -0
  284. data/qa/resource/repository/commit.rb +81 -0
  285. data/qa/resource/repository/project_push.rb +44 -0
  286. data/qa/resource/repository/push.rb +113 -0
  287. data/qa/resource/repository/wiki_push.rb +38 -0
  288. data/qa/resource/runner.rb +75 -0
  289. data/qa/resource/sandbox.rb +79 -0
  290. data/qa/resource/settings/hashed_storage.rb +26 -0
  291. data/qa/resource/snippet.rb +30 -0
  292. data/qa/resource/ssh_key.rb +57 -0
  293. data/qa/resource/tag.rb +30 -0
  294. data/qa/resource/user.rb +150 -0
  295. data/qa/resource/user_gpg.rb +46 -0
  296. data/qa/resource/visibility.rb +17 -0
  297. data/qa/resource/wiki.rb +48 -0
  298. data/qa/runtime/address.rb +29 -0
  299. data/qa/runtime/api/client.rb +90 -0
  300. data/qa/runtime/api/request.rb +49 -0
  301. data/qa/runtime/application_settings.rb +46 -0
  302. data/qa/runtime/browser.rb +220 -0
  303. data/qa/runtime/env.rb +330 -0
  304. data/qa/runtime/feature.rb +87 -0
  305. data/qa/runtime/fixtures.rb +43 -0
  306. data/qa/runtime/gpg.rb +37 -0
  307. data/qa/runtime/ip_address.rb +33 -0
  308. data/qa/runtime/key/base.rb +38 -0
  309. data/qa/runtime/key/ecdsa.rb +13 -0
  310. data/qa/runtime/key/ed25519.rb +13 -0
  311. data/qa/runtime/key/rsa.rb +13 -0
  312. data/qa/runtime/logger.rb +24 -0
  313. data/qa/runtime/mail_hog.rb +15 -0
  314. data/qa/runtime/namespace.rb +27 -0
  315. data/qa/runtime/path.rb +13 -0
  316. data/qa/runtime/release.rb +40 -0
  317. data/qa/runtime/scenario.rb +38 -0
  318. data/qa/runtime/search.rb +124 -0
  319. data/qa/runtime/user.rb +57 -0
  320. data/qa/scenario/actable.rb +25 -0
  321. data/qa/scenario/bootable.rb +53 -0
  322. data/qa/scenario/shared_attributes.rb +14 -0
  323. data/qa/scenario/template.rb +64 -0
  324. data/qa/scenario/test/instance.rb +36 -0
  325. data/qa/scenario/test/instance/all.rb +18 -0
  326. data/qa/scenario/test/instance/smoke.rb +20 -0
  327. data/qa/scenario/test/integration/github.rb +20 -0
  328. data/qa/scenario/test/integration/instance_saml.rb +13 -0
  329. data/qa/scenario/test/integration/kubernetes.rb +13 -0
  330. data/qa/scenario/test/integration/ldap_no_server.rb +13 -0
  331. data/qa/scenario/test/integration/ldap_no_tls.rb +13 -0
  332. data/qa/scenario/test/integration/ldap_tls.rb +13 -0
  333. data/qa/scenario/test/integration/mattermost.rb +26 -0
  334. data/qa/scenario/test/integration/object_storage.rb +13 -0
  335. data/qa/scenario/test/integration/smtp.rb +13 -0
  336. data/qa/scenario/test/sanity/framework.rb +19 -0
  337. data/qa/scenario/test/sanity/selectors.rb +61 -0
  338. data/qa/service/cluster_provider/base.rb +41 -0
  339. data/qa/service/cluster_provider/gcloud.rb +115 -0
  340. data/qa/service/cluster_provider/k3d.rb +134 -0
  341. data/qa/service/cluster_provider/k3s.rb +94 -0
  342. data/qa/service/cluster_provider/minikube.rb +26 -0
  343. data/qa/service/docker_run/base.rb +47 -0
  344. data/qa/service/docker_run/gitlab_runner.rb +58 -0
  345. data/qa/service/docker_run/jenkins.rb +43 -0
  346. data/qa/service/docker_run/k3s.rb +46 -0
  347. data/qa/service/docker_run/ldap.rb +41 -0
  348. data/qa/service/docker_run/maven.rb +44 -0
  349. data/qa/service/docker_run/node_js.rb +38 -0
  350. data/qa/service/docker_run/saml_idp.rb +69 -0
  351. data/qa/service/kubernetes_cluster.rb +107 -0
  352. data/qa/service/omnibus.rb +23 -0
  353. data/qa/service/shellout.rb +31 -0
  354. data/qa/specs/features/api/1_manage/.gitkeep +0 -0
  355. data/qa/specs/features/api/1_manage/rate_limits_spec.rb +17 -0
  356. data/qa/specs/features/api/1_manage/users_spec.rb +35 -0
  357. data/qa/specs/features/api/2_plan/.gitkeep +0 -0
  358. data/qa/specs/features/api/2_plan/closes_issue_via_pushing_a_commit_spec.rb +48 -0
  359. data/qa/specs/features/api/3_create/repository/files_spec.rb +106 -0
  360. data/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb +74 -0
  361. data/qa/specs/features/api/4_verify/.gitkeep +0 -0
  362. data/qa/specs/features/api/5_package/.gitkeep +0 -0
  363. data/qa/specs/features/api/6_release/.gitkeep +0 -0
  364. data/qa/specs/features/api/7_configure/.gitkeep +0 -0
  365. data/qa/specs/features/browser_ui/1_manage/group/create_group_with_mattermost_team_spec.rb +20 -0
  366. data/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb +56 -0
  367. data/qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb +25 -0
  368. data/qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb +15 -0
  369. data/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb +20 -0
  370. data/qa/specs/features/browser_ui/1_manage/login/login_via_instance_wide_saml_sso_spec.rb +19 -0
  371. data/qa/specs/features/browser_ui/1_manage/login/register_spec.rb +27 -0
  372. data/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb +24 -0
  373. data/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb +23 -0
  374. data/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb +57 -0
  375. data/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb +117 -0
  376. data/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb +22 -0
  377. data/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb +46 -0
  378. data/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb +45 -0
  379. data/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb +35 -0
  380. data/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb +29 -0
  381. data/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb +40 -0
  382. data/qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb +40 -0
  383. data/qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb +36 -0
  384. data/qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb +28 -0
  385. data/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb +35 -0
  386. data/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb +64 -0
  387. data/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb +26 -0
  388. data/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb +49 -0
  389. data/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb +52 -0
  390. data/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb +35 -0
  391. data/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb +68 -0
  392. data/qa/specs/features/browser_ui/3_create/repository/add_list_delete_branches_spec.rb +88 -0
  393. data/qa/specs/features/browser_ui/3_create/repository/add_ssh_key_spec.rb +30 -0
  394. data/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb +51 -0
  395. data/qa/specs/features/browser_ui/3_create/repository/create_edit_delete_file_via_web_spec.rb +58 -0
  396. data/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb +53 -0
  397. data/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb +48 -0
  398. data/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb +74 -0
  399. data/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb +34 -0
  400. data/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb +43 -0
  401. data/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb +81 -0
  402. data/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb +44 -0
  403. data/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb +63 -0
  404. data/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb +37 -0
  405. data/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb +66 -0
  406. data/qa/specs/features/browser_ui/3_create/snippet/create_snippet_spec.rb +29 -0
  407. data/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb +69 -0
  408. data/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb +43 -0
  409. data/qa/specs/features/browser_ui/3_create/wiki/create_edit_clone_push_wiki_spec.rb +42 -0
  410. data/qa/specs/features/browser_ui/4_verify/ci_variable/add_remove_ci_variable_spec.rb +60 -0
  411. data/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb +89 -0
  412. data/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb +34 -0
  413. data/qa/specs/features/browser_ui/5_package/.gitkeep +0 -0
  414. data/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb +28 -0
  415. data/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb +102 -0
  416. data/qa/specs/features/browser_ui/6_release/deploy_token/add_deploy_token_spec.rb +22 -0
  417. data/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_dependent_relationship_spec.rb +122 -0
  418. data/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_independent_relationship_spec.rb +121 -0
  419. data/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb +147 -0
  420. data/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb +38 -0
  421. data/qa/specs/features/browser_ui/8_monitor/apm/dashboards_spec.rb +97 -0
  422. data/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb +38 -0
  423. data/qa/specs/features/ee/api/1_manage/.gitkeep +0 -0
  424. data/qa/specs/features/ee/api/2_plan/.gitkeep +0 -0
  425. data/qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb +173 -0
  426. data/qa/specs/features/ee/api/3_create/.gitkeep +0 -0
  427. data/qa/specs/features/ee/api/4_verify/.gitkeep +0 -0
  428. data/qa/specs/features/ee/api/5_package/.gitkeep +0 -0
  429. data/qa/specs/features/ee/api/6_release/.gitkeep +0 -0
  430. data/qa/specs/features/ee/api/7_configure/.gitkeep +0 -0
  431. data/qa/specs/features/ee/api/enablement/elasticsearch/advanced_global_advanced_syntax_search_spec.rb +70 -0
  432. data/qa/specs/features/ee/api/enablement/elasticsearch/elasticsearch_api_spec.rb +84 -0
  433. data/qa/specs/features/ee/api/geo/geo_nodes_spec.rb +91 -0
  434. data/qa/specs/features/ee/browser_ui/1_manage/.gitkeep +0 -0
  435. data/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb +155 -0
  436. data/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_2_spec.rb +103 -0
  437. data/qa/specs/features/ee/browser_ui/1_manage/group/group_file_template_spec.rb +141 -0
  438. data/qa/specs/features/ee/browser_ui/1_manage/group/group_ldap_sync_spec.rb +183 -0
  439. data/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_enforced_sso_spec.rb +115 -0
  440. data/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_group_managed_accounts_spec.rb +178 -0
  441. data/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_non_enforced_sso_spec.rb +87 -0
  442. data/qa/specs/features/ee/browser_ui/1_manage/group/restrict_by_ip_address_spec.rb +107 -0
  443. data/qa/specs/features/ee/browser_ui/1_manage/insights/default_insights_spec.rb +48 -0
  444. data/qa/specs/features/ee/browser_ui/1_manage/instance/instance_audit_logs_spec.rb +124 -0
  445. data/qa/specs/features/ee/browser_ui/1_manage/ldap/admin_ldap_sync_spec.rb +63 -0
  446. data/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb +127 -0
  447. data/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb +165 -0
  448. data/qa/specs/features/ee/browser_ui/2_plan/.gitkeep +0 -0
  449. data/qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb +46 -0
  450. data/qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb +28 -0
  451. data/qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb +96 -0
  452. data/qa/specs/features/ee/browser_ui/2_plan/epic/promote_issue_to_epic_spec.rb +40 -0
  453. data/qa/specs/features/ee/browser_ui/2_plan/epic/roadmap_spec.rb +31 -0
  454. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/configurable_issue_board_spec.rb +28 -0
  455. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/configure_issue_board_by_label_spec.rb +44 -0
  456. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb +31 -0
  457. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/focus_mode_spec.rb +28 -0
  458. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb +48 -0
  459. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb +103 -0
  460. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb +37 -0
  461. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb +40 -0
  462. data/qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb +35 -0
  463. data/qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb +46 -0
  464. data/qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb +45 -0
  465. data/qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb +70 -0
  466. data/qa/specs/features/ee/browser_ui/2_plan/related_issues/related_issues_spec.rb +50 -0
  467. data/qa/specs/features/ee/browser_ui/2_plan/scoped_labels/editing_scoped_labels_spec.rb +58 -0
  468. data/qa/specs/features/ee/browser_ui/3_create/.gitkeep +0 -0
  469. data/qa/specs/features/ee/browser_ui/3_create/contribution_analytics_spec.rb +53 -0
  470. data/qa/specs/features/ee/browser_ui/3_create/design_management_spec.rb +29 -0
  471. data/qa/specs/features/ee/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb +158 -0
  472. data/qa/specs/features/ee/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb +80 -0
  473. data/qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb +97 -0
  474. data/qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb +83 -0
  475. data/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb +75 -0
  476. data/qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb +161 -0
  477. data/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb +52 -0
  478. data/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb +71 -0
  479. data/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb +202 -0
  480. data/qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb +120 -0
  481. data/qa/specs/features/ee/browser_ui/3_create/web_ide/web_terminal_spec.rb +80 -0
  482. data/qa/specs/features/ee/browser_ui/4_verify/.gitkeep +0 -0
  483. data/qa/specs/features/ee/browser_ui/5_package/.gitkeep +0 -0
  484. data/qa/specs/features/ee/browser_ui/5_package/maven_repository_spec.rb +102 -0
  485. data/qa/specs/features/ee/browser_ui/5_package/npm_registry_spec.rb +75 -0
  486. data/qa/specs/features/ee/browser_ui/6_release/.gitkeep +0 -0
  487. data/qa/specs/features/ee/browser_ui/6_release/multi-project_pipelines_spec.rb +98 -0
  488. data/qa/specs/features/ee/browser_ui/6_release/pipelines_for_merged_results_and_merge_trains_spec.rb +137 -0
  489. data/qa/specs/features/ee/browser_ui/7_configure/.gitkeep +0 -0
  490. data/qa/specs/features/ee/browser_ui/8_monitor/.gitkeep +0 -0
  491. data/qa/specs/features/ee/browser_ui/8_monitor/apm/metrics_spec.rb +68 -0
  492. data/qa/specs/features/ee/browser_ui/8_monitor/health/alerting_spec.rb +106 -0
  493. data/qa/specs/features/ee/browser_ui/8_monitor/health/cluster_health_spec.rb +52 -0
  494. data/qa/specs/features/ee/browser_ui/enablement/elasticsearch/elasticsearch_reindexing_spec.rb +78 -0
  495. data/qa/specs/features/ee/browser_ui/geo/attachment_replication_spec.rb +63 -0
  496. data/qa/specs/features/ee/browser_ui/geo/database_delete_replication_spec.rb +60 -0
  497. data/qa/specs/features/ee/browser_ui/geo/http_push_spec.rb +121 -0
  498. data/qa/specs/features/ee/browser_ui/geo/http_push_to_secondary_spec.rb +174 -0
  499. data/qa/specs/features/ee/browser_ui/geo/rename_replication_spec.rb +75 -0
  500. data/qa/specs/features/ee/browser_ui/geo/ssh_push_spec.rb +151 -0
  501. data/qa/specs/features/ee/browser_ui/geo/ssh_push_to_secondary_spec.rb +189 -0
  502. data/qa/specs/features/ee/browser_ui/geo/wiki_http_push_spec.rb +68 -0
  503. data/qa/specs/features/ee/browser_ui/geo/wiki_http_push_to_secondary_spec.rb +105 -0
  504. data/qa/specs/features/ee/browser_ui/geo/wiki_ssh_push_spec.rb +93 -0
  505. data/qa/specs/features/ee/browser_ui/geo/wiki_ssh_push_to_secondary_spec.rb +110 -0
  506. data/qa/specs/features/ee/browser_ui/secure/create_merge_request_with_secure_spec.rb +79 -0
  507. data/qa/specs/features/ee/browser_ui/secure/license_compliance_spec.rb +98 -0
  508. data/qa/specs/features/ee/browser_ui/secure/merge_request_license_widget_spec.rb +134 -0
  509. data/qa/specs/features/ee/browser_ui/secure/security_reports_spec.rb +143 -0
  510. data/qa/specs/features/ee/browser_ui/secure/vulnerability_management_spec.rb +101 -0
  511. data/qa/specs/features/sanity/framework_spec.rb +21 -0
  512. data/qa/specs/helpers/quarantine.rb +84 -0
  513. data/qa/specs/loop_runner.rb +21 -0
  514. data/qa/specs/parallel_runner.rb +33 -0
  515. data/qa/specs/runner.rb +78 -0
  516. data/qa/support/api.rb +71 -0
  517. data/qa/support/dates.rb +21 -0
  518. data/qa/support/page/logging.rb +178 -0
  519. data/qa/support/repeater.rb +65 -0
  520. data/qa/support/retrier.rb +64 -0
  521. data/qa/support/wait_for_requests.rb +25 -0
  522. data/qa/support/waiter.rb +39 -0
  523. data/qa/tools/delete_subgroups.rb +66 -0
  524. data/qa/tools/delete_test_ssh_keys.rb +61 -0
  525. data/qa/tools/generate_perf_testdata.rb +301 -0
  526. data/qa/tools/revoke_all_personal_access_tokens.rb +44 -0
  527. data/qa/vendor/jenkins/page/base.rb +24 -0
  528. data/qa/vendor/jenkins/page/configure.rb +48 -0
  529. data/qa/vendor/jenkins/page/configure_job.rb +72 -0
  530. data/qa/vendor/jenkins/page/last_job_console.rb +44 -0
  531. data/qa/vendor/jenkins/page/login.rb +31 -0
  532. data/qa/vendor/jenkins/page/new_credentials.rb +50 -0
  533. data/qa/vendor/jenkins/page/new_job.rb +38 -0
  534. data/qa/vendor/saml_idp/page/base.rb +14 -0
  535. data/qa/vendor/saml_idp/page/login.rb +31 -0
  536. metadata +835 -0
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Overview
7
+ module Groups
8
+ class Edit < QA::Page::Base
9
+ view 'app/views/admin/groups/_form.html.haml' do
10
+ element :save_changes_button, required: true
11
+ end
12
+
13
+ def click_save_changes_button
14
+ click_element :save_changes_button, Groups::Show
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ QA::Page::Admin::Overview::Groups::Edit.prepend_if_ee('QA::EE::Page::Admin::Overview::Groups::Edit')
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Overview
7
+ module Groups
8
+ class Index < QA::Page::Base
9
+ view 'app/views/admin/groups/index.html.haml' do
10
+ element :group_search_field, required: true
11
+ end
12
+
13
+ view 'app/views/admin/groups/_group.html.haml' do
14
+ element :group_row_content
15
+ element :group_name_link
16
+ end
17
+
18
+ def search_group(group_name)
19
+ find_element(:group_search_field).set(group_name).send_keys(:return)
20
+ end
21
+
22
+ def click_group(group_name)
23
+ within_element(:group_row_content, text: group_name) do
24
+ click_element(:group_name_link)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Overview
7
+ module Groups
8
+ class Show < QA::Page::Base
9
+ view 'app/views/admin/groups/show.html.haml' do
10
+ element :edit_group_link, required: true
11
+ end
12
+
13
+ def click_edit_group_link
14
+ click_element :edit_group_link, Groups::Edit
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Overview
7
+ module Users
8
+ class Index < QA::Page::Base
9
+ view 'app/views/admin/users/index.html.haml' do
10
+ element :user_search_field
11
+ end
12
+
13
+ view 'app/views/admin/users/_user.html.haml' do
14
+ element :user_row_content
15
+ end
16
+
17
+ view 'app/views/admin/users/_user_detail.html.haml' do
18
+ element :username_link
19
+ end
20
+
21
+ def search_user(username)
22
+ find_element(:user_search_field).set(username).send_keys(:return)
23
+ end
24
+
25
+ def click_user(username)
26
+ within_element(:user_row_content, text: username) do
27
+ click_element(:username_link)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Overview
7
+ module Users
8
+ class Show < QA::Page::Base
9
+ view 'app/views/admin/users/_head.html.haml' do
10
+ element :impersonate_user_link
11
+ end
12
+
13
+ view 'app/views/admin/users/show.html.haml' do
14
+ element :confirm_user_button
15
+ end
16
+
17
+ def click_impersonate_user
18
+ click_element(:impersonate_user_link)
19
+ end
20
+
21
+ def confirm_user
22
+ accept_confirm do
23
+ click_element :confirm_user_button
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ module Component
8
+ class AccountAndLimit < Page::Base
9
+ view 'app/views/admin/application_settings/_account_and_limit.html.haml' do
10
+ element :receive_max_input_size_field
11
+ element :save_changes_button
12
+ end
13
+
14
+ def set_max_file_size(size)
15
+ fill_element :receive_max_input_size_field, size
16
+ end
17
+
18
+ def save_settings
19
+ click_element :save_changes_button
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ module Component
8
+ class IpLimits < Page::Base
9
+ view 'app/views/admin/application_settings/_ip_limits.html.haml' do
10
+ element :throttle_unauthenticated_checkbox
11
+ element :throttle_authenticated_api_checkbox
12
+ element :throttle_authenticated_web_checkbox
13
+ element :save_changes_button
14
+ end
15
+
16
+ def enable_throttles
17
+ check_element :throttle_unauthenticated_checkbox
18
+ check_element :throttle_authenticated_api_checkbox
19
+ check_element :throttle_authenticated_web_checkbox
20
+ end
21
+
22
+ def save_settings
23
+ click_element :save_changes_button
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ module Component
8
+ class OutboundRequests < Page::Base
9
+ view 'app/views/admin/application_settings/_outbound.html.haml' do
10
+ element :allow_requests_from_services_checkbox
11
+ element :save_changes_button
12
+ end
13
+
14
+ def allow_requests_to_local_network_from_services
15
+ check_allow_requests_to_local_network_from_services_checkbox
16
+ click_save_changes_button
17
+ end
18
+
19
+ private
20
+
21
+ def check_allow_requests_to_local_network_from_services_checkbox
22
+ check_element :allow_requests_from_services_checkbox
23
+ end
24
+
25
+ def click_save_changes_button
26
+ click_element :save_changes_button
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ module Component
8
+ class PerformanceBar < Page::Base
9
+ view 'app/views/admin/application_settings/_performance_bar.html.haml' do
10
+ element :enable_performance_bar_checkbox
11
+ element :save_changes_button
12
+ end
13
+
14
+ def enable_performance_bar
15
+ click_element :enable_performance_bar_checkbox
16
+ Capybara.current_session.driver.browser.manage.add_cookie(name: 'perf_bar_enabled', value: 'true')
17
+ end
18
+
19
+ def save_settings
20
+ click_element :save_changes_button
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ module Component
8
+ class RepositoryStorage < Page::Base
9
+ view 'app/views/admin/application_settings/_repository_storage.html.haml' do
10
+ element :hashed_storage_checkbox
11
+ element :save_changes_button
12
+ end
13
+
14
+ def enable_hashed_storage
15
+ check_element :hashed_storage_checkbox
16
+ end
17
+
18
+ def save_settings
19
+ click_element :save_changes_button
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ class General < Page::Base
8
+ include QA::Page::Settings::Common
9
+
10
+ view 'app/views/admin/application_settings/general.html.haml' do
11
+ element :account_and_limit_settings
12
+ end
13
+
14
+ def expand_account_and_limit(&block)
15
+ expand_section(:account_and_limit_settings) do
16
+ Component::AccountAndLimit.perform(&block)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ class MetricsAndProfiling < Page::Base
8
+ include QA::Page::Settings::Common
9
+
10
+ view 'app/views/admin/application_settings/metrics_and_profiling.html.haml' do
11
+ element :performance_bar_settings
12
+ end
13
+
14
+ def expand_performance_bar(&block)
15
+ expand_section(:performance_bar_settings) do
16
+ Component::PerformanceBar.perform(&block)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ class Network < Page::Base
8
+ include QA::Page::Settings::Common
9
+
10
+ view 'app/views/admin/application_settings/network.html.haml' do
11
+ element :ip_limits_section
12
+ element :outbound_requests_section
13
+ end
14
+
15
+ def expand_ip_limits(&block)
16
+ expand_section(:ip_limits_section) do
17
+ Component::IpLimits.perform(&block)
18
+ end
19
+ end
20
+
21
+ def expand_outbound_requests(&block)
22
+ expand_section(:outbound_requests_section) do
23
+ Component::OutboundRequests.perform(&block)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Admin
6
+ module Settings
7
+ class Repository < Page::Base
8
+ include QA::Page::Settings::Common
9
+
10
+ view 'app/views/admin/application_settings/repository.html.haml' do
11
+ element :repository_storage_settings
12
+ end
13
+
14
+ def expand_repository_storage(&block)
15
+ expand_section(:repository_storage_settings) do
16
+ Component::RepositoryStorage.perform(&block)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ module Page
5
+ module Alert
6
+ class AutoDevopsAlert < Page::Base
7
+ view 'app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml' do
8
+ element :auto_devops_banner
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,348 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capybara/dsl'
4
+
5
+ module QA
6
+ module Page
7
+ class Base
8
+ prepend Support::Page::Logging if Runtime::Env.debug?
9
+ include Capybara::DSL
10
+ include Scenario::Actable
11
+ include Support::WaitForRequests
12
+ extend Validatable
13
+ extend SingleForwardable
14
+
15
+ ElementNotFound = Class.new(RuntimeError)
16
+
17
+ class NoRequiredElementsError < RuntimeError
18
+ def initialize(page_class)
19
+ @page_class = page_class
20
+ super
21
+ end
22
+
23
+ def to_s
24
+ <<~MSG.strip % { page: @page_class }
25
+ %{page} has no required elements.
26
+ See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/dynamic_element_validation.html#required-elements
27
+ MSG
28
+ end
29
+ end
30
+
31
+ def_delegators :evaluator, :view, :views
32
+
33
+ def initialize
34
+ @retry_later_backoff = QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME
35
+ end
36
+
37
+ def assert_no_element(name)
38
+ assert_no_selector(element_selector_css(name))
39
+ end
40
+
41
+ def refresh
42
+ page.refresh
43
+
44
+ wait_for_requests
45
+ end
46
+
47
+ def wait_until(max_duration: 60, sleep_interval: 0.1, reload: true, raise_on_failure: true)
48
+ Support::Waiter.wait_until(max_duration: max_duration, sleep_interval: sleep_interval, raise_on_failure: raise_on_failure) do
49
+ yield || (reload && refresh && false)
50
+ end
51
+ end
52
+
53
+ def retry_until(max_attempts: 3, reload: false, sleep_interval: 0, raise_on_failure: true)
54
+ Support::Retrier.retry_until(max_attempts: max_attempts, reload_page: (reload && self), sleep_interval: sleep_interval, raise_on_failure: raise_on_failure) do
55
+ yield
56
+ end
57
+ end
58
+
59
+ def retry_on_exception(max_attempts: 3, reload: false, sleep_interval: 0.5)
60
+ Support::Retrier.retry_on_exception(max_attempts: max_attempts, reload_page: (reload && self), sleep_interval: sleep_interval) do
61
+ yield
62
+ end
63
+ end
64
+
65
+ def scroll_to(selector, text: nil)
66
+ wait_for_requests
67
+
68
+ page.execute_script <<~JS
69
+ var elements = Array.from(document.querySelectorAll('#{selector}'));
70
+ var text = '#{text}';
71
+
72
+ if (text.length > 0) {
73
+ elements.find(e => e.textContent === text).scrollIntoView();
74
+ } else {
75
+ elements[0].scrollIntoView();
76
+ }
77
+ JS
78
+
79
+ page.within(selector) { yield } if block_given?
80
+ end
81
+
82
+ # Returns true if successfully GETs the given URL
83
+ # Useful because `page.status_code` is unsupported by our driver, and
84
+ # we don't have access to the `response` to use `have_http_status`.
85
+ def asset_exists?(url)
86
+ page.execute_script <<~JS
87
+ xhr = new XMLHttpRequest();
88
+ xhr.open('GET', '#{url}', true);
89
+ xhr.send();
90
+ JS
91
+
92
+ return false unless wait_until(sleep_interval: 0.5, max_duration: 60, reload: false) do
93
+ page.evaluate_script('xhr.readyState == XMLHttpRequest.DONE')
94
+ end
95
+
96
+ page.evaluate_script('xhr.status') == 200
97
+ end
98
+
99
+ def find_element(name, **kwargs)
100
+ wait_for_requests
101
+
102
+ find(element_selector_css(name), kwargs)
103
+ end
104
+
105
+ def active_element?(name)
106
+ find_element(name, class: 'active')
107
+ end
108
+
109
+ def all_elements(name, **kwargs)
110
+ if kwargs.keys.none? { |key| [:minimum, :maximum, :count, :between].include?(key) }
111
+ raise ArgumentError, "Please use :minimum, :maximum, :count, or :between so that all is more reliable"
112
+ end
113
+
114
+ wait_for_requests
115
+
116
+ all(element_selector_css(name), **kwargs)
117
+ end
118
+
119
+ def check_element(name)
120
+ retry_until(sleep_interval: 1) do
121
+ find_element(name).set(true)
122
+
123
+ find_element(name).checked?
124
+ end
125
+ end
126
+
127
+ def uncheck_element(name)
128
+ retry_until(sleep_interval: 1) do
129
+ find_element(name).set(false)
130
+
131
+ !find_element(name).checked?
132
+ end
133
+ end
134
+
135
+ # replace with (..., page = self.class)
136
+ def click_element(name, page = nil, text: nil, wait: Capybara.default_max_wait_time)
137
+ find_element(name, text: text, wait: wait).click
138
+ page.validate_elements_present! if page
139
+ end
140
+
141
+ def fill_element(name, content)
142
+ find_element(name).set(content)
143
+ end
144
+
145
+ def select_element(name, value)
146
+ element = find_element(name)
147
+
148
+ return if element.text == value
149
+
150
+ element.select value
151
+ end
152
+
153
+ def has_active_element?(name, **kwargs)
154
+ has_element?(name, class: 'active', **kwargs)
155
+ end
156
+
157
+ def has_element?(name, **kwargs)
158
+ wait_for_requests
159
+
160
+ wait = kwargs.delete(:wait) || Capybara.default_max_wait_time
161
+ text = kwargs.delete(:text)
162
+ klass = kwargs.delete(:class)
163
+
164
+ has_css?(element_selector_css(name, kwargs), text: text, wait: wait, class: klass)
165
+ end
166
+
167
+ def has_no_element?(name, **kwargs)
168
+ wait_for_requests
169
+
170
+ wait = kwargs.delete(:wait) || Capybara.default_max_wait_time
171
+ text = kwargs.delete(:text)
172
+
173
+ has_no_css?(element_selector_css(name, kwargs), wait: wait, text: text)
174
+ end
175
+
176
+ def has_text?(text, wait: Capybara.default_max_wait_time)
177
+ wait_for_requests
178
+
179
+ page.has_text?(text, wait: wait)
180
+ end
181
+
182
+ def has_no_text?(text, wait: Capybara.default_max_wait_time)
183
+ wait_for_requests
184
+
185
+ page.has_no_text?(text, wait: wait)
186
+ end
187
+
188
+ def has_normalized_ws_text?(text, wait: Capybara.default_max_wait_time)
189
+ has_text?(text.gsub(/\s+/, " "), wait: wait)
190
+ end
191
+
192
+ def finished_loading?
193
+ wait_for_requests
194
+
195
+ # The number of selectors should be able to be reduced after
196
+ # migration to the new spinner is complete.
197
+ # https://gitlab.com/groups/gitlab-org/-/epics/956
198
+ has_no_css?('.gl-spinner, .fa-spinner, .spinner', wait: QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME)
199
+ end
200
+
201
+ def finished_loading_block?
202
+ wait_for_requests
203
+
204
+ has_no_css?('.fa-spinner.block-loading', wait: Capybara.default_max_wait_time)
205
+ end
206
+
207
+ def has_loaded_all_images?
208
+ # I don't know of a foolproof way to wait for all images to load
209
+ # This loop gives time for the img tags to be rendered and for
210
+ # images to start loading.
211
+ previous_total_images = 0
212
+ wait_until(sleep_interval: 1) do
213
+ current_total_images = all("img").size
214
+ result = previous_total_images == current_total_images
215
+ previous_total_images = current_total_images
216
+ result
217
+ end
218
+
219
+ # Retry until all images found can be fetched via HTTP, and
220
+ # check that the image has a non-zero natural width (a broken
221
+ # img tag could have a width, but wouldn't have a natural width)
222
+
223
+ # Unfortunately, this doesn't account for SVGs. They're rendered
224
+ # as HTML, so there doesn't seem to be a way to check that they
225
+ # display properly via Selenium. However, if the SVG couldn't be
226
+ # rendered (e.g., because the file doesn't exist), the whole page
227
+ # won't display properly, so we should catch that with the test
228
+ # this method is called from.
229
+
230
+ # The user's avatar is an img, which could be a gravatar image,
231
+ # so we skip that by only checking for images hosted internally
232
+ retry_until(sleep_interval: 1) do
233
+ all("img").all? do |image|
234
+ next true unless URI(image['src']).host == URI(page.current_url).host
235
+
236
+ asset_exists?(image['src']) && image['naturalWidth'].to_i > 0
237
+ end
238
+ end
239
+ end
240
+
241
+ def wait_for_animated_element(name)
242
+ # It would be ideal if we could detect when the animation is complete
243
+ # but in some cases there's nothing we can easily access via capybara
244
+ # so instead we wait for the element, and then we wait a little longer
245
+ raise ElementNotFound, %Q(Couldn't find element named "#{name}") unless has_element?(name)
246
+
247
+ sleep 1
248
+ end
249
+
250
+ def within_element(name, text: nil)
251
+ page.within(element_selector_css(name), text: text) do
252
+ yield
253
+ end
254
+ end
255
+
256
+ def within_element_by_index(name, index)
257
+ page.within all_elements(name, minimum: index + 1)[index] do
258
+ yield
259
+ end
260
+ end
261
+
262
+ def scroll_to_element(name, *args)
263
+ scroll_to(element_selector_css(name), *args)
264
+ end
265
+
266
+ def element_selector_css(name, *attributes)
267
+ return name.selector_css if name.is_a? Page::Element
268
+
269
+ Page::Element.new(name, *attributes).selector_css
270
+ end
271
+
272
+ def click_link_with_text(text)
273
+ wait_for_requests
274
+
275
+ click_link text
276
+ end
277
+
278
+ def visit_link_in_element(name)
279
+ visit find_element(name)['href']
280
+ end
281
+
282
+ def wait_if_retry_later
283
+ return if @retry_later_backoff > QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME * 5
284
+
285
+ if has_css?('body', text: 'Retry later', wait: 0)
286
+ QA::Runtime::Logger.warn("`Retry later` error occurred. Sleeping for #{@retry_later_backoff} seconds...")
287
+ sleep @retry_later_backoff
288
+ refresh
289
+ @retry_later_backoff += QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME
290
+
291
+ wait_if_retry_later
292
+ end
293
+ end
294
+
295
+ def self.path
296
+ raise NotImplementedError
297
+ end
298
+
299
+ def self.evaluator
300
+ @evaluator ||= Page::Base::DSL.new
301
+ end
302
+
303
+ def self.errors
304
+ if views.empty?
305
+ return ["Page class does not have views / elements defined!"]
306
+ end
307
+
308
+ views.flat_map(&:errors)
309
+ end
310
+
311
+ def self.elements
312
+ views.flat_map(&:elements)
313
+ end
314
+
315
+ def self.required_elements
316
+ elements.select(&:required?)
317
+ end
318
+
319
+ def send_keys_to_element(name, keys)
320
+ find_element(name).send_keys(keys)
321
+ end
322
+
323
+ def visible?
324
+ raise NoRequiredElementsError.new(self.class) if self.class.required_elements.empty?
325
+
326
+ self.class.required_elements.each do |required_element|
327
+ return false if has_no_element? required_element
328
+ end
329
+
330
+ true
331
+ end
332
+
333
+ class DSL
334
+ attr_reader :views
335
+
336
+ def initialize
337
+ @views = []
338
+ end
339
+
340
+ def view(path, &block)
341
+ Page::View.evaluate(&block).tap do |view|
342
+ @views.push(Page::View.new(path, view.elements))
343
+ end
344
+ end
345
+ end
346
+ end
347
+ end
348
+ end