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,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Create' do
5
+ describe 'Codeowners' do
6
+ # Create one user to be the assigned approver and another user who will not be an approver
7
+ let(:approver) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
8
+ let(:non_approver) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) }
9
+
10
+ let(:project) do
11
+ Resource::Project.fabricate_via_api! do |project|
12
+ project.name = "assign-approvers"
13
+ project.initialize_with_readme = true
14
+ end
15
+ end
16
+ let(:branch_name) { 'protected-branch' }
17
+
18
+ before do
19
+ project.add_member(approver, Resource::Members::AccessLevel::DEVELOPER)
20
+ project.add_member(non_approver, Resource::Members::AccessLevel::DEVELOPER)
21
+
22
+ Flow::Login.sign_in
23
+
24
+ project.visit!
25
+ end
26
+
27
+ it 'merge request assigns code owners as approvers' do
28
+ # Commit CODEOWNERS to master
29
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
30
+ commit.project = project
31
+ commit.commit_message = 'Add CODEOWNERS and test files'
32
+ commit.add_files(
33
+ [
34
+ {
35
+ file_path: 'CODEOWNERS',
36
+ content: <<~CONTENT
37
+ CODEOWNERS @#{approver.username}
38
+ CONTENT
39
+ }
40
+ ]
41
+ )
42
+ end
43
+
44
+ # Create a projected branch that requires approval from code owners
45
+ Resource::ProtectedBranch.fabricate! do |protected_branch|
46
+ protected_branch.branch_name = branch_name
47
+ protected_branch.project = project
48
+ end
49
+
50
+ # Push a new CODEOWNERS file
51
+ Resource::Repository::Push.fabricate! do |push|
52
+ push.repository_http_uri = project.repository_http_location.uri
53
+ push.branch_name = branch_name + '-patch'
54
+ push.file_name = 'CODEOWNERS'
55
+ push.file_content = <<~CONTENT
56
+ CODEOWNERS @#{non_approver.username}
57
+ CONTENT
58
+ end
59
+
60
+ # Create a merge request
61
+ Resource::MergeRequest.fabricate! do |merge_request|
62
+ merge_request.project = project
63
+ merge_request.target_new_branch = false
64
+ merge_request.source_branch = branch_name + '-patch'
65
+ merge_request.target_branch = branch_name
66
+ merge_request.no_preparation = true
67
+ end.visit!
68
+
69
+ # Check that the merge request assigns the original code owner as an
70
+ # approver (because the current CODEOWNERS file in the master branch
71
+ # doesn't have the new owner yet)
72
+ Page::MergeRequest::Show.perform do |show|
73
+ show.edit!
74
+ approvers = show.approvers
75
+
76
+ expect(approvers.size).to eq(1)
77
+ expect(approvers).to include(approver.name)
78
+ expect(approvers).not_to include(non_approver.name)
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Create' do
5
+ describe 'Codeowners' do
6
+ let(:files) do
7
+ [
8
+ {
9
+ name: 'file.txt',
10
+ content: 'foo'
11
+ },
12
+ {
13
+ name: 'README.md',
14
+ content: 'bar'
15
+ }
16
+ ]
17
+ end
18
+
19
+ before do
20
+ # Add two new users to a project as members
21
+ Flow::Login.sign_in
22
+
23
+ @user = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
24
+ @user2 = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2)
25
+
26
+ @project = Resource::Project.fabricate_via_api! do |project|
27
+ project.name = "codeowners"
28
+ end
29
+ @project.visit!
30
+
31
+ Page::Project::Menu.perform(&:go_to_members_settings)
32
+ Page::Project::Settings::Members.perform do |members_page|
33
+ members_page.add_member(@user.username)
34
+ members_page.add_member(@user2.username)
35
+ end
36
+ end
37
+
38
+ it 'displays owners specified in CODEOWNERS file' do
39
+ codeowners_file_content =
40
+ <<-CONTENT
41
+ * @#{@user2.username}
42
+ *.txt @#{@user.username}
43
+ CONTENT
44
+ files << {
45
+ name: 'CODEOWNERS',
46
+ content: codeowners_file_content
47
+ }
48
+
49
+ # Push CODEOWNERS and test files to the project
50
+ Resource::Repository::ProjectPush.fabricate! do |push|
51
+ push.project = @project
52
+ push.files = files
53
+ push.commit_message = 'Add CODEOWNERS and test files'
54
+ end
55
+ @project.visit!
56
+
57
+ # Check the files and code owners
58
+ Page::Project::Show.perform do |project_page|
59
+ project_page.click_file 'file.txt'
60
+ end
61
+
62
+ expect(page).to have_content(@user.name)
63
+ expect(page).not_to have_content(@user2.name)
64
+
65
+ @project.visit!
66
+ Page::Project::Show.perform do |project_page|
67
+ project_page.click_file 'README.md'
68
+ end
69
+
70
+ expect(page).to have_content(@user2.name)
71
+ expect(page).not_to have_content(@user.name)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Create' do
5
+ describe 'File Locking' do
6
+ before do
7
+ Flow::Login.sign_in
8
+
9
+ @user_one = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
10
+ @user_two = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2)
11
+
12
+ @project = Resource::Project.fabricate_via_api! do |project|
13
+ project.name = 'file_locking'
14
+ end
15
+
16
+ Resource::Repository::ProjectPush.fabricate! do |push|
17
+ push.project = @project
18
+ push.file_name = 'file'
19
+ push.file_content = SecureRandom.hex(100000)
20
+ end
21
+
22
+ add_to_project user: @user_one
23
+ add_to_project user: @user_two
24
+
25
+ Resource::ProtectedBranch.unprotect_via_api! do |branch|
26
+ branch.project = @project
27
+ branch.branch_name = 'master'
28
+ end
29
+ end
30
+
31
+ it 'locks a directory and tries to push as a second user' do
32
+ push branch: 'master', file: 'directory/file', as_user: @user_one
33
+
34
+ sign_out_and_sign_in_as user: @user_one
35
+ go_to_directory
36
+ click_lock
37
+
38
+ expect_error_on_push for_file: 'directory/file', as_user: @user_two
39
+ expect_no_error_on_push for_file: 'directory/file', as_user: @user_one
40
+ end
41
+
42
+ it 'locks a file and tries to push as a second user' do
43
+ sign_out_and_sign_in_as user: @user_one
44
+ go_to_file
45
+ click_lock
46
+
47
+ expect_error_on_push as_user: @user_two
48
+ expect_no_error_on_push as_user: @user_one
49
+ end
50
+
51
+ it 'checks file locked by other user to be disabled' do
52
+ go_to_file
53
+ click_lock
54
+ sign_out_and_sign_in_as user: @user_one
55
+ go_to_file
56
+
57
+ Page::File::Show.perform do |show|
58
+ expect(show).to have_lock_button_disabled
59
+ end
60
+ end
61
+
62
+ it 'creates a merge request and fails to merge', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/issues/40125', type: :bug } do
63
+ push branch: 'test', as_user: @user_one
64
+
65
+ merge_request = Resource::MergeRequest.fabricate_via_api! do |merge_request|
66
+ merge_request.project = @project
67
+ merge_request.source_branch = 'test'
68
+ merge_request.target_branch = 'master'
69
+ merge_request.no_preparation = true
70
+ end
71
+
72
+ go_to_file
73
+ click_lock
74
+ sign_out_and_sign_in_as user: @user_one
75
+ try_to_merge merge_request: merge_request
76
+ Page::MergeRequest::Show.perform(&:wait_for_merge_request_error_message)
77
+ expect(page).to have_text("locked by #{admin_username}")
78
+ end
79
+
80
+ it 'locks a file and unlocks in list' do
81
+ sign_out_and_sign_in_as user: @user_one
82
+ go_to_file
83
+ click_lock
84
+ @project.visit!
85
+
86
+ Page::Project::Menu.perform(&:go_to_repository_locked_files)
87
+ EE::Page::Project::PathLocks::Index.perform do |list|
88
+ expect(list).to have_file_with_title 'file'
89
+ list.unlock_file 'file'
90
+ end
91
+
92
+ expect_no_error_on_push as_user: @user_two
93
+ end
94
+
95
+ def try_to_merge(merge_request:)
96
+ merge_request.visit!
97
+ Page::MergeRequest::Show.perform do |show|
98
+ show.try_to_merge!
99
+ end
100
+ end
101
+
102
+ def sign_out_and_sign_in_as(user:)
103
+ Page::Main::Login.perform do |login|
104
+ login.sign_out_and_sign_in_as user: user
105
+ end
106
+ end
107
+
108
+ def go_to_file
109
+ @project.visit!
110
+ Page::Project::Show.perform do |project_page|
111
+ project_page.click_file 'file'
112
+ end
113
+ end
114
+
115
+ def go_to_directory
116
+ @project.visit!
117
+ Page::Project::Show.perform do |project_page|
118
+ project_page.click_file 'directory'
119
+ end
120
+ end
121
+
122
+ def click_lock
123
+ Page::File::Show.perform(&:lock)
124
+ end
125
+
126
+ def add_to_project(user:)
127
+ Resource::ProjectMember.fabricate_via_api! do |member|
128
+ member.user = user
129
+ member.project = @project
130
+ member.access_level = member.level[:developer]
131
+ end
132
+ end
133
+
134
+ def push(branch: 'master', file: 'file', as_user:)
135
+ Resource::Repository::ProjectPush.fabricate! do |push|
136
+ push.project = @project
137
+ push.new_branch = false unless branch != 'master'
138
+ push.file_name = file
139
+ push.file_content = SecureRandom.hex(100000)
140
+ push.user = as_user
141
+ push.branch_name = branch
142
+ end
143
+ end
144
+
145
+ def expect_error_on_push(for_file: 'file', as_user:)
146
+ expect { push branch: 'master', file: for_file, as_user: as_user }.to raise_error(
147
+ QA::Git::Repository::RepositoryCommandError)
148
+ end
149
+
150
+ def expect_no_error_on_push(for_file: 'file', as_user:)
151
+ expect { push branch: 'master', file: for_file, as_user: as_user }.not_to raise_error
152
+ end
153
+
154
+ def admin_username
155
+ Resource::User.fabricate_via_api! do |user|
156
+ user.username = Runtime::User.username
157
+ end.name
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Create' do
5
+ # Use Admin credentials as a workaround for a permissions bug
6
+ # See https://gitlab.com/gitlab-org/gitlab/issues/13769
7
+ describe 'Pull mirror a repository over HTTP', :requires_admin do
8
+ it 'configures and syncs a (pull) mirrored repository with password auth' do
9
+ Flow::Login.sign_in_as_admin
10
+
11
+ source = Resource::Repository::ProjectPush.fabricate! do |project_push|
12
+ project_push.project_name = 'pull-mirror-source-project'
13
+ project_push.file_name = 'README.md'
14
+ project_push.file_content = '# This is a pull mirroring test project'
15
+ project_push.commit_message = 'Add README.md'
16
+ end
17
+ source_project_uri = source.project.repository_http_location.uri
18
+ source_project_uri.user = CGI.escape(Runtime::User.admin_username)
19
+
20
+ target_project = Resource::Project.fabricate_via_api! do |project|
21
+ project.name = 'pull-mirror-target-project'
22
+ end
23
+ target_project.visit!
24
+
25
+ Page::Project::Menu.perform(&:go_to_repository_settings)
26
+ Page::Project::Settings::Repository.perform do |settings|
27
+ settings.expand_mirroring_repositories do |mirror_settings|
28
+ # Configure the target project to pull from the source project
29
+ mirror_settings.repository_url = source_project_uri
30
+ mirror_settings.mirror_direction = 'Pull'
31
+ mirror_settings.authentication_method = 'Password'
32
+ mirror_settings.password = Runtime::User.admin_password
33
+ mirror_settings.mirror_repository
34
+ mirror_settings.update source_project_uri
35
+ end
36
+ end
37
+
38
+ # Check that the target project has the commit from the source
39
+ target_project.visit!
40
+ expect(page).to have_content("README.md")
41
+ expect(page).to have_content("This is a pull mirroring test project")
42
+ expect(page).to have_content("Mirrored from #{masked_url(source_project_uri)}")
43
+ end
44
+
45
+ def masked_url(url)
46
+ url.password = '*****'
47
+ url.user = '*****'
48
+ url
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Create' do
5
+ describe 'Pull mirror a repository over SSH with a private key', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/216297', type: :investigating } do
6
+ let(:source) do
7
+ Resource::Repository::ProjectPush.fabricate! do |project_push|
8
+ project_push.project_name = 'pull-mirror-source-project'
9
+ project_push.file_name = 'README.md'
10
+ project_push.file_content = '# This is a pull mirroring test project'
11
+ project_push.commit_message = 'Add README.md'
12
+ end
13
+ end
14
+ let(:source_project_uri) { source.project.repository_ssh_location.uri }
15
+ let(:target_project) do
16
+ Resource::Project.fabricate_via_api! do |project|
17
+ project.name = 'pull-mirror-target-project'
18
+ end
19
+ end
20
+
21
+ before do
22
+ Flow::Login.sign_in
23
+
24
+ target_project.visit!
25
+ end
26
+
27
+ it 'configures and syncs a (pull) mirrored repository' do
28
+ # Configure the target project to pull from the source project
29
+ # And get the public key to be used as a deploy key
30
+ Page::Project::Menu.perform(&:go_to_repository_settings)
31
+ public_key = Page::Project::Settings::Repository.perform do |settings|
32
+ settings.expand_mirroring_repositories do |mirror_settings|
33
+ mirror_settings.repository_url = source_project_uri
34
+ mirror_settings.mirror_direction = 'Pull'
35
+ mirror_settings.authentication_method = 'SSH public key'
36
+ mirror_settings.detect_host_keys
37
+ mirror_settings.mirror_repository
38
+ mirror_settings.public_key source_project_uri
39
+ end
40
+ end
41
+
42
+ # Add the public key to the source project as a deploy key
43
+ Resource::DeployKey.fabricate! do |deploy_key|
44
+ deploy_key.project = source.project
45
+ deploy_key.title = "pull mirror key #{Time.now.to_f}"
46
+ deploy_key.key = public_key
47
+ end
48
+
49
+ # Sync the repositories
50
+ target_project.visit!
51
+ Page::Project::Menu.perform(&:go_to_repository_settings)
52
+ Page::Project::Settings::Repository.perform do |settings|
53
+ settings.expand_mirroring_repositories do |mirror_settings|
54
+ mirror_settings.update source_project_uri
55
+ end
56
+ end
57
+
58
+ # Check that the target project has the commit from the source
59
+ target_project.visit!
60
+ expect(page).to have_content('README.md')
61
+ expect(page).to have_content('This is a pull mirroring test project')
62
+ expect(page).to have_content("Mirrored from #{masked_url(source_project_uri)}")
63
+ end
64
+
65
+ def masked_url(url)
66
+ url.user = '*****'
67
+ url
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,202 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Create' do
5
+ context 'Push Rules' do
6
+ describe 'using non signed commits' do
7
+ before(:context) do
8
+ prepare
9
+
10
+ @file_name_limitation = 'denied_file'
11
+ @file_size_limitation = 1
12
+ @authors_email_limitation = %{(#{Regexp.escape(@creator.email)}|#{@root.email})}
13
+ @branch_name_limitation = 'master'
14
+ @needed_phrase_limitation = 'allowed commit'
15
+ @deny_message_phrase_limitation = 'denied commit'
16
+
17
+ Page::Project::Settings::Repository.perform do |repository|
18
+ repository.expand_push_rules do |push_rules|
19
+ push_rules.fill_file_name(@file_name_limitation)
20
+ push_rules.fill_file_size(@file_size_limitation)
21
+ push_rules.fill_author_email(@authors_email_limitation)
22
+ push_rules.fill_branch_name(@branch_name_limitation)
23
+ push_rules.fill_commit_message_rule(@needed_phrase_limitation)
24
+ push_rules.fill_deny_commit_message_rule(@deny_message_phrase_limitation)
25
+ push_rules.check_prevent_secrets
26
+ push_rules.check_restrict_author
27
+ push_rules.check_deny_delete_tag
28
+ push_rules.click_submit
29
+ end
30
+ end
31
+ end
32
+
33
+ it 'allows an unrestricted push' do
34
+ expect_no_error_on_push(file: standard_file)
35
+ end
36
+
37
+ it 'restricts files by name and size' do
38
+ large_file = [{
39
+ name: 'file',
40
+ content: SecureRandom.hex(1000000)
41
+ }]
42
+ wrongly_named_file = [{
43
+ name: @file_name_limitation,
44
+ content: SecureRandom.hex(100)
45
+ }]
46
+
47
+ expect_error_on_push(file: large_file,
48
+ error: 'File "file" is larger than the allowed size of 1 MB')
49
+ expect_error_on_push(file: wrongly_named_file,
50
+ error: Regexp.escape("File name #{@file_name_limitation} was blacklisted by the pattern #{@file_name_limitation}"))
51
+ end
52
+
53
+ it 'restricts users by email format' do
54
+ gitlab_user = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2)
55
+ @project.add_member(gitlab_user, Resource::Members::AccessLevel::MAINTAINER)
56
+
57
+ expect_error_on_push(file: standard_file, user: gitlab_user,
58
+ error: Regexp.escape("Committer's email '#{gitlab_user.email}' does not follow the pattern '#{@authors_email_limitation}'"))
59
+ end
60
+
61
+ it 'restricts branches by branch name' do
62
+ expect_error_on_push(file: standard_file, branch: 'forbidden_branch',
63
+ error: Regexp.escape("Branch name does not follow the pattern '#{@branch_name_limitation}'"))
64
+ end
65
+
66
+ it 'restricts commit by message format' do
67
+ expect_no_error_on_push(file: standard_file, commit_message: @needed_phrase_limitation)
68
+ expect_error_on_push(file: standard_file, commit_message: 'forbidden message',
69
+ error: Regexp.escape("Commit message does not follow the pattern '#{@needed_phrase_limitation}'"))
70
+ expect_error_on_push(file: standard_file, commit_message: "#{@needed_phrase_limitation} - #{@deny_message_phrase_limitation}",
71
+ error: Regexp.escape("Commit message contains the forbidden pattern '#{@deny_message_phrase_limitation}'"))
72
+ end
73
+
74
+ it 'restricts committing files with secrets' do
75
+ secret_file = [{
76
+ name: 'id_rsa',
77
+ content: SecureRandom.hex(100)
78
+ }]
79
+
80
+ expect_error_on_push(file: secret_file,
81
+ error: Regexp.escape('File name id_rsa was blacklisted by the pattern id_rsa$'))
82
+ end
83
+
84
+ it 'restricts commits by user' do
85
+ expect_error_on_push(file: standard_file, user: @root,
86
+ error: Regexp.escape("Author '#{@root.email}' is not a member of team"))
87
+ end
88
+
89
+ it 'restricts removal of tag' do
90
+ tag = Resource::Tag.fabricate_via_api! do |tag|
91
+ tag.project = @project
92
+ tag.ref = 'master'
93
+ tag.name = 'test_tag'
94
+ end
95
+
96
+ expect_error_on_push(file: standard_file, tag: tag.name,
97
+ error: 'You cannot delete a tag')
98
+ end
99
+ end
100
+
101
+ describe 'with commits restricted to verified emails' do
102
+ before do
103
+ prepare
104
+
105
+ Page::Project::Settings::Repository.perform do |repository|
106
+ repository.expand_push_rules do |push_rules|
107
+ push_rules.check_committer_restriction
108
+ push_rules.click_submit
109
+ end
110
+ end
111
+ end
112
+
113
+ it 'rejects unverified emails' do
114
+ expect_no_error_on_push(file: standard_file)
115
+ expect_error_on_push(file: standard_file, user: @root,
116
+ error: 'You can only push commits that were committed with one of your own verified emails')
117
+ end
118
+ end
119
+
120
+ describe 'using signed commits' do
121
+ before do
122
+ prepare
123
+
124
+ Page::Project::Settings::Repository.perform do |repository|
125
+ repository.expand_push_rules do |push_rules|
126
+ push_rules.check_reject_unsigned_commits
127
+ push_rules.click_submit
128
+ end
129
+ end
130
+
131
+ @gpg = Resource::UserGPG.fabricate_via_api!
132
+ end
133
+
134
+ it 'restricts to signed commits' do
135
+ expect_no_error_on_push(file: standard_file, gpg: @gpg)
136
+ expect_error_on_push(file: standard_file, error: 'Commit must be signed with a GPG key')
137
+ end
138
+ end
139
+
140
+ def standard_file
141
+ [{
142
+ name: 'file',
143
+ content: SecureRandom.hex(100)
144
+ }]
145
+ end
146
+
147
+ def push(commit_message:, branch:, file:, user:, tag:, gpg:)
148
+ Resource::Repository::ProjectPush.fabricate! do |push|
149
+ push.project = @project
150
+ push.commit_message = commit_message
151
+ push.new_branch = branch != 'master'
152
+ push.branch_name = branch
153
+ push.user = user if user != @root
154
+ push.files = file if tag.nil?
155
+ push.tag_name = tag unless tag.nil?
156
+ push.gpg_key_id = gpg.key_id unless gpg.nil?
157
+ end
158
+ end
159
+
160
+ def expect_no_error_on_push(commit_message: 'allowed commit', branch: 'master', file:, user: @creator, tag: nil, gpg: nil)
161
+ expect do
162
+ push commit_message: commit_message, branch: branch, file: file, user: user, tag: tag, gpg: gpg
163
+ end.not_to raise_error
164
+ end
165
+
166
+ def expect_error_on_push(commit_message: 'allowed commit', branch: 'master', file:, user: @creator, tag: nil, gpg: nil, error: nil)
167
+ expect do
168
+ push commit_message: commit_message, branch: branch, file: file, user: user, tag: tag, gpg: gpg
169
+ end.to raise_error(QA::Git::Repository::RepositoryCommandError, /#{error}/)
170
+ end
171
+
172
+ def prepare
173
+ Flow::Login.sign_in
174
+
175
+ @creator = Resource::User.fabricate_via_api! do |user|
176
+ user.username = Runtime::User.username
177
+ user.password = Runtime::User.password
178
+ end
179
+
180
+ @root = Resource::User.new.tap do |user|
181
+ user.username = 'root'
182
+ user.name = 'GitLab QA'
183
+ user.email = 'root@gitlab.com'
184
+ user.password = nil
185
+ end
186
+
187
+ @project = Resource::Project.fabricate_via_api! do |project|
188
+ project.name = 'push_rules'
189
+ end
190
+
191
+ Resource::Repository::ProjectPush.fabricate! do |push|
192
+ push.project = @project
193
+ push.files = standard_file
194
+ end
195
+
196
+ @project.visit!
197
+
198
+ Page::Project::Menu.perform(&:go_to_repository_settings)
199
+ end
200
+ end
201
+ end
202
+ end