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,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../qa'
4
+
5
+ # This script deletes all subgroups of a group specified by ENV['GROUP_NAME_OR_PATH']
6
+ # Required environment variables: GITLAB_QA_ACCESS_TOKEN and GITLAB_ADDRESS
7
+ # Optional environment variable: GROUP_NAME_OR_PATH (defaults to 'gitlab-qa-sandbox-group')
8
+ # Run `rake delete_subgroups`
9
+
10
+ module QA
11
+ module Tools
12
+ class DeleteSubgroups
13
+ include Support::Api
14
+
15
+ def initialize
16
+ raise ArgumentError, "Please provide GITLAB_ADDRESS" unless ENV['GITLAB_ADDRESS']
17
+ raise ArgumentError, "Please provide GITLAB_QA_ACCESS_TOKEN" unless ENV['GITLAB_QA_ACCESS_TOKEN']
18
+
19
+ @api_client = Runtime::API::Client.new(ENV['GITLAB_ADDRESS'], personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN'])
20
+ end
21
+
22
+ def run
23
+ STDOUT.puts 'Running...'
24
+
25
+ # Fetch group's id
26
+ group_id = fetch_group_id
27
+
28
+ sub_groups_head_response = head Runtime::API::Request.new(@api_client, "/groups/#{group_id}/subgroups", per_page: "100").url
29
+ total_sub_group_pages = sub_groups_head_response.headers[:x_total_pages]
30
+
31
+ sub_group_ids = fetch_subgroup_ids(group_id, total_sub_group_pages)
32
+ STDOUT.puts "Number of Sub Groups not already marked for deletion: #{sub_group_ids.length}"
33
+
34
+ delete_subgroups(sub_group_ids) unless sub_group_ids.empty?
35
+ STDOUT.puts "\nDone"
36
+ end
37
+
38
+ private
39
+
40
+ def delete_subgroups(sub_group_ids)
41
+ STDOUT.puts "Deleting #{sub_group_ids.length} subgroups..."
42
+ sub_group_ids.each do |subgroup_id|
43
+ delete_response = delete Runtime::API::Request.new(@api_client, "/groups/#{subgroup_id}").url
44
+ dot_or_f = delete_response.code == 202 ? "\e[32m.\e[0m" : "\e[31mF\e[0m"
45
+ print dot_or_f
46
+ end
47
+ end
48
+
49
+ def fetch_group_id
50
+ group_search_response = get Runtime::API::Request.new(@api_client, "/groups", search: ENV['GROUP_NAME_OR_PATH'] || 'gitlab-qa-sandbox-group').url
51
+ JSON.parse(group_search_response.body).first["id"]
52
+ end
53
+
54
+ def fetch_subgroup_ids(group_id, group_pages)
55
+ sub_groups_ids = []
56
+
57
+ group_pages.to_i.times do |page_no|
58
+ sub_groups_response = get Runtime::API::Request.new(@api_client, "/groups/#{group_id}/subgroups", page: (page_no + 1).to_s, per_page: "100").url
59
+ sub_groups_ids.concat(JSON.parse(sub_groups_response.body).reject { |subgroup| !subgroup["marked_for_deletion_on"].nil? }.map { |subgroup| subgroup["id"] })
60
+ end
61
+
62
+ sub_groups_ids.uniq
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../qa'
4
+
5
+ # This script deletes all test ssh keys (with titles including 'key for ssh tests' or 'key for audit event test') of a user specified by ENV['GITLAB_USERNAME']
6
+ # Required environment variables: GITLAB_QA_ACCESS_TOKEN, GITLAB_ADDRESS and GITLAB_USERNAME
7
+
8
+ module QA
9
+ module Tools
10
+ class DeleteTestSSHKeys
11
+ include Support::Api
12
+
13
+ def initialize
14
+ raise ArgumentError, "Please provide GITLAB_ADDRESS" unless ENV['GITLAB_ADDRESS']
15
+ raise ArgumentError, "Please provide GITLAB_QA_ACCESS_TOKEN" unless ENV['GITLAB_QA_ACCESS_TOKEN']
16
+ raise ArgumentError, "Please provide GITLAB_USERNAME" unless ENV['GITLAB_USERNAME']
17
+
18
+ @api_client = Runtime::API::Client.new(ENV['GITLAB_ADDRESS'], personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN'])
19
+ @username = ENV['GITLAB_USERNAME']
20
+ end
21
+
22
+ def run
23
+ STDOUT.puts 'Running...'
24
+
25
+ user_id = fetch_user_id
26
+ test_ssh_key_ids = fetch_test_ssh_key_ids(user_id)
27
+ STDOUT.puts "Number of test ssh keys to be deleted: #{test_ssh_key_ids.length}"
28
+
29
+ delete_ssh_keys(user_id, test_ssh_key_ids) unless test_ssh_key_ids.empty?
30
+ STDOUT.puts "\nDone"
31
+ end
32
+
33
+ private
34
+
35
+ def fetch_user_id
36
+ get_user_response = get Runtime::API::Request.new(@api_client, "/users?username=#{@username}").url
37
+ user = JSON.parse(get_user_response.body).first
38
+ raise "Unexpected user found. Expected #{@username}, found #{user['username']}" unless user['username'] == @username
39
+
40
+ user["id"]
41
+ end
42
+
43
+ def delete_ssh_keys(user_id, ssh_key_ids)
44
+ STDOUT.puts "Deleting #{ssh_key_ids.length} ssh keys..."
45
+ ssh_key_ids.each do |key_id|
46
+ delete_response = delete Runtime::API::Request.new(@api_client, "/users/#{user_id}/keys/#{key_id}").url
47
+ dot_or_f = delete_response.code == 204 ? "\e[32m.\e[0m" : "\e[31mF\e[0m"
48
+ print dot_or_f
49
+ end
50
+ end
51
+
52
+ def fetch_test_ssh_key_ids(user_id)
53
+ get_keys_response = get Runtime::API::Request.new(@api_client, "/users/#{user_id}/keys").url
54
+ JSON.parse(get_keys_response.body)
55
+ .select { |key| (key["title"].include?('key for ssh tests') || key["title"].include?('key for audit event test')) }
56
+ .map { |key| key['id'] }
57
+ .uniq
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,301 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require 'faker'
5
+ require 'yaml'
6
+ require_relative '../../qa'
7
+ # This script generates testdata for Performance Testing.
8
+ # Required environment variables: GITLAB_QA_ACCESS_TOKEN and GITLAB_ADDRESS
9
+ # This job creates a urls.txt which contains a hash of all the URLs needed for Performance Testing
10
+ # Run `rake generate_perf_testdata`
11
+
12
+ module QA
13
+ module Tools
14
+ class GeneratePerfTestdata
15
+ include Support::Api
16
+
17
+ def initialize
18
+ raise ArgumentError, "Please provide GITLAB_ADDRESS" unless ENV['GITLAB_ADDRESS']
19
+ raise ArgumentError, "Please provide GITLAB_QA_ACCESS_TOKEN" unless ENV['GITLAB_QA_ACCESS_TOKEN']
20
+
21
+ @api_client = Runtime::API::Client.new(ENV['GITLAB_ADDRESS'], personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN'])
22
+ @group_name = ENV['GROUP_NAME'] || "gitlab-qa-perf-sandbox-#{SecureRandom.hex(8)}"
23
+ @project_name = ENV['PROJECT_NAME'] || "my-test-project-#{SecureRandom.hex(8)}"
24
+ @visibility = "public"
25
+ @urls = { host: ENV['GITLAB_ADDRESS'] }
26
+ end
27
+
28
+ def all
29
+ STDOUT.puts 'Running...'
30
+ group_id = create_group
31
+ create_project(group_id)
32
+
33
+ create_many_branches
34
+ create_many_new_files
35
+ create_mr_with_many_commits
36
+ create_many_issues
37
+
38
+ methods_arr = [
39
+ method(:create_many_labels),
40
+ method(:create_many_todos),
41
+ method(:create_many_merge_requests),
42
+ method(:create_an_issue_with_many_discussions),
43
+ method(:create_an_mr_with_large_files_and_many_mr_discussions)
44
+ ]
45
+
46
+ threads_arr = []
47
+
48
+ methods_arr.each do |m|
49
+ threads_arr << Thread.new { m.call }
50
+ end
51
+
52
+ threads_arr.each(&:join)
53
+ STDOUT.puts "\nURLs: #{@urls}"
54
+ File.open("urls.yml", "w") { |file| file.puts @urls.stringify_keys.to_yaml }
55
+ STDOUT.puts "\nDone"
56
+ end
57
+
58
+ def create_group
59
+ group_search_response = create_a_group_api_req(@group_name, @visibility)
60
+ group = JSON.parse(group_search_response.body)
61
+ @urls[:group_page] = group["web_url"]
62
+ STDOUT.puts "Created a group: #{@urls[:group_page]}"
63
+ group["id"]
64
+ end
65
+
66
+ def create_project(group_id)
67
+ create_project_response = create_a_project_api_req(@project_name, group_id, @visibility)
68
+ @urls[:project_page] = JSON.parse(create_project_response.body)["web_url"]
69
+ STDOUT.puts "Created a project: #{@urls[:project_page]}"
70
+ end
71
+
72
+ def create_many_issues
73
+ 30.times do |i|
74
+ create_an_issue_api_req("#{@group_name}%2F#{@project_name}", "issue#{i}", "desc#{i}")
75
+ end
76
+ @urls[:issues_list_page] = @urls[:project_page] + "/issues"
77
+ STDOUT.puts "Created many issues: #{@urls[:issues_list_page]}"
78
+ end
79
+
80
+ def create_many_todos
81
+ 30.times do |i|
82
+ create_a_todo_api_req("#{@group_name}%2F#{@project_name}", "#{i + 1}")
83
+ end
84
+ @urls[:todos_page] = ENV['GITLAB_ADDRESS'] + "/dashboard/todos"
85
+ STDOUT.puts "Created many todos: #{@urls[:todos_page]}"
86
+ end
87
+
88
+ def create_many_labels
89
+ 30.times do |i|
90
+ create_a_label_api_req("#{@group_name}%2F#{@project_name}", "label#{i}", "#{Faker::Color.hex_color}")
91
+ end
92
+ @urls[:labels_page] = @urls[:project_page] + "/labels"
93
+ STDOUT.puts "Created many labels: #{@urls[:labels_page]}"
94
+ end
95
+
96
+ def create_many_merge_requests
97
+ 30.times do |i|
98
+ create_a_merge_request_api_req("#{@group_name}%2F#{@project_name}", "branch#{i}", "master", "MR#{i}")
99
+ end
100
+ @urls[:mr_list_page] = @urls[:project_page] + "/merge_requests"
101
+ STDOUT.puts "Created many MRs: #{@urls[:mr_list_page]}"
102
+ end
103
+
104
+ def create_many_new_files
105
+ create_a_new_file_api_req("hello.txt", "master", "#{@group_name}%2F#{@project_name}", "hello", "my new content")
106
+ 30.times do |i|
107
+ create_a_new_file_api_req("hello#{i}.txt", "master", "#{@group_name}%2F#{@project_name}", "hello", "my new content")
108
+ create_a_new_file_api_req("hello#{i}.txt", "branch#{i}", "#{@group_name}%2F#{@project_name}", "hello", "my new content")
109
+ end
110
+
111
+ @urls[:files_page] = @urls[:project_page] + "/tree/master"
112
+ STDOUT.puts "Added many new files: #{@urls[:files_page]}"
113
+ end
114
+
115
+ def create_many_branches
116
+ 30.times do |i|
117
+ create_a_branch_api_req("branch#{i}", "#{@group_name}%2F#{@project_name}")
118
+ end
119
+ @urls[:branches_page] = @urls[:project_page] + "/-/branches"
120
+ STDOUT.puts "Created many branches: #{@urls[:branches_page]}"
121
+ end
122
+
123
+ def create_an_issue_with_many_discussions
124
+ issue_id = 1
125
+ 500.times do
126
+ create_a_discussion_on_issue_api_req("#{@group_name}%2F#{@project_name}", issue_id, "Let us discuss")
127
+ end
128
+
129
+ labels_list = (0..15).map { |i| "label#{i}" }.join(',')
130
+ # Add description and labels
131
+ update_an_issue_api_req("#{@group_name}%2F#{@project_name}", issue_id, "#{Faker::Lorem.sentences(500).join(" ")}", labels_list)
132
+ @urls[:large_issue] = @urls[:project_page] + "/issues/#{issue_id}"
133
+ STDOUT.puts "Created an issue with many discussions: #{@urls[:large_issue]}"
134
+ end
135
+
136
+ def create_an_mr_with_large_files_and_many_mr_discussions
137
+ content_arr = []
138
+ 16.times do |i|
139
+ faker_line_arr = Faker::Lorem.sentences(1500)
140
+ content = faker_line_arr.join("\n\r")
141
+ create_a_new_file_api_req("hello#{i + 100}.txt", "master", "#{@group_name}%2F#{@project_name}", "Add hello#{i + 100}.txt", content)
142
+ content_arr[i] = faker_line_arr
143
+ end
144
+
145
+ create_a_branch_api_req("performance", "#{@group_name}%2F#{@project_name}")
146
+
147
+ 16.times do |i|
148
+ missed_line_array = content_arr[i].each_slice(2).map(&:first)
149
+ content = missed_line_array.join("\n\rIm new!:D \n\r ")
150
+
151
+ update_file_api_req("hello#{i + 100}.txt", "performance", "#{@group_name}%2F#{@project_name}", "Update hello#{i + 100}.txt", content)
152
+ end
153
+
154
+ create_mr_response = create_a_merge_request_api_req("#{@group_name}%2F#{@project_name}", "performance", "master", "Large_MR")
155
+
156
+ iid = JSON.parse(create_mr_response.body)["iid"]
157
+ diff_refs = JSON.parse(create_mr_response.body)["diff_refs"]
158
+
159
+ # Add discussions to diff tab and resolve a few!
160
+ should_resolve = false
161
+ 16.times do |i|
162
+ 1.upto(9) do |j|
163
+ create_diff_note(iid, i, j, diff_refs["head_sha"], diff_refs["start_sha"], diff_refs["base_sha"], "new_line")
164
+ create_diff_note_response = create_diff_note(iid, i, j, diff_refs["head_sha"], diff_refs["start_sha"], diff_refs["base_sha"], "old_line")
165
+
166
+ if should_resolve
167
+ discussion_id = JSON.parse(create_diff_note_response.body)["id"]
168
+
169
+ update_a_discussion_on_issue_api_req("#{@group_name}%2F#{@project_name}", iid, discussion_id, "true")
170
+ end
171
+
172
+ should_resolve ^= true
173
+ end
174
+ end
175
+
176
+ # Add discussions to main tab
177
+ 100.times do
178
+ create_a_discussion_on_mr_api_req("#{@group_name}%2F#{@project_name}", iid, "Let us discuss")
179
+ end
180
+ @urls[:large_mr] = JSON.parse(create_mr_response.body)["web_url"]
181
+ STDOUT.puts "Created an MR with many discussions and many very large Files: #{@urls[:large_mr]}"
182
+ end
183
+
184
+ def create_diff_note(iid, file_count, line_count, head_sha, start_sha, base_sha, line_type)
185
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/merge_requests/#{iid}/discussions").url,
186
+ "" "body=\"Let us discuss\"&
187
+ position[position_type]=text&
188
+ position[new_path]=hello#{file_count}.txt&
189
+ position[old_path]=hello#{file_count}.txt&
190
+ position[#{line_type}]=#{line_count * 100}&
191
+ position[head_sha]=#{head_sha}&
192
+ position[start_sha]=#{start_sha}&
193
+ position[base_sha]=#{base_sha}" ""
194
+ end
195
+
196
+ def create_mr_with_many_commits
197
+ project_path = "#{@group_name}%2F#{@project_name}"
198
+ branch_name = "branch_with_many_commits-#{SecureRandom.hex(8)}"
199
+ file_name = "file_for_many_commits.txt"
200
+
201
+ create_a_branch_api_req(branch_name, project_path)
202
+ create_a_new_file_api_req(file_name, branch_name, project_path, "Initial commit for new file", "Initial file content")
203
+ create_mr_response = create_a_merge_request_api_req(project_path, branch_name, "master", "MR with many commits-#{SecureRandom.hex(8)}")
204
+ @urls[:mr_with_many_commits] = JSON.parse(create_mr_response.body)["web_url"]
205
+ 100.times do |i|
206
+ update_file_api_req(file_name, branch_name, project_path, Faker::Lorem.sentences(5).join(" "), Faker::Lorem.sentences(500).join("\n"))
207
+ end
208
+ STDOUT.puts "Using branch: #{branch_name}, created an MR with many commits: #{@urls[:mr_with_many_commits]}"
209
+ end
210
+
211
+ private
212
+
213
+ # API Requests
214
+
215
+ def create_a_discussion_on_issue_api_req(project_path_or_id, issue_id, body)
216
+ call_api(expected_response_code: 201) do
217
+ post Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/issues/#{issue_id}/discussions").url, "body=\"#{body}\""
218
+ end
219
+ end
220
+
221
+ def update_a_discussion_on_issue_api_req(project_path_or_id, mr_iid, discussion_id, resolved_status)
222
+ call_api(expected_response_code: 200) do
223
+ put Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/merge_requests/#{mr_iid}/discussions/#{discussion_id}").url, "resolved=#{resolved_status}"
224
+ end
225
+ end
226
+
227
+ def create_a_discussion_on_mr_api_req(project_path_or_id, mr_iid, body)
228
+ call_api(expected_response_code: 201) do
229
+ post Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/merge_requests/#{mr_iid}/discussions").url, "body=\"#{body}\""
230
+ end
231
+ end
232
+
233
+ def create_a_label_api_req(project_path_or_id, name, color)
234
+ call_api(expected_response_code: 201) do
235
+ post Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/labels").url, "name=#{name}&color=#{color}"
236
+ end
237
+ end
238
+
239
+ def create_a_todo_api_req(project_path_or_id, issue_id)
240
+ call_api(expected_response_code: 201) do
241
+ post Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/issues/#{issue_id}/todo").url, nil
242
+ end
243
+ end
244
+
245
+ def create_an_issue_api_req(project_path_or_id, title, description)
246
+ call_api(expected_response_code: 201) do
247
+ post Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/issues").url, "title=#{title}&description=#{description}"
248
+ end
249
+ end
250
+
251
+ def update_an_issue_api_req(project_path_or_id, issue_id, description, labels_list)
252
+ call_api(expected_response_code: 200) do
253
+ put Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/issues/#{issue_id}").url, "description=#{description}&labels=#{labels_list}"
254
+ end
255
+ end
256
+
257
+ def create_a_project_api_req(project_name, group_id, visibility)
258
+ call_api(expected_response_code: 201) do
259
+ post Runtime::API::Request.new(@api_client, "/projects").url, "name=#{project_name}&namespace_id=#{group_id}&visibility=#{visibility}"
260
+ end
261
+ end
262
+
263
+ def create_a_group_api_req(group_name, visibility)
264
+ call_api(expected_response_code: 201) do
265
+ post Runtime::API::Request.new(@api_client, "/groups").url, "name=#{group_name}&path=#{group_name}&visibility=#{visibility}"
266
+ end
267
+ end
268
+
269
+ def create_a_branch_api_req(branch_name, project_path_or_id)
270
+ call_api(expected_response_code: 201) do
271
+ post Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/repository/branches").url, "branch=#{branch_name}&ref=master"
272
+ end
273
+ end
274
+
275
+ def create_a_new_file_api_req(file_path, branch_name, project_path_or_id, commit_message, content)
276
+ call_api(expected_response_code: 201) do
277
+ post Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/repository/files/#{file_path}").url, "branch=#{branch_name}&commit_message=\"#{commit_message}\"&content=\"#{content}\""
278
+ end
279
+ end
280
+
281
+ def create_a_merge_request_api_req(project_path_or_id, source_branch, target_branch, mr_title)
282
+ call_api(expected_response_code: 201) do
283
+ post Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/merge_requests").url, "source_branch=#{source_branch}&target_branch=#{target_branch}&title=#{mr_title}"
284
+ end
285
+ end
286
+
287
+ def update_file_api_req(file_path, branch_name, project_path_or_id, commit_message, content)
288
+ call_api(expected_response_code: 200) do
289
+ put Runtime::API::Request.new(@api_client, "/projects/#{project_path_or_id}/repository/files/#{file_path}").url, "branch=#{branch_name}&commit_message=\"#{commit_message}\"&content=\"#{content}\""
290
+ end
291
+ end
292
+
293
+ def call_api(expected_response_code: 200)
294
+ response = yield
295
+ raise "API call failed with response code: #{response.code} and body: #{response.body}" unless response.code == expected_response_code
296
+
297
+ response
298
+ end
299
+ end
300
+ end
301
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../qa'
4
+ require 'net/protocol.rb'
5
+ # This script revokes all personal access tokens with the name of 'api-test-token' on the host specified by GITLAB_ADDRESS
6
+ # Required environment variables: GITLAB_USERNAME, GITLAB_PASSWORD and GITLAB_ADDRESS
7
+ # Run `rake revoke_personal_access_tokens`
8
+
9
+ module QA
10
+ module Tools
11
+ class RevokeAllPersonalAccessTokens
12
+ def run
13
+ do_run
14
+ rescue Net::ReadTimeout
15
+ STDOUT.puts 'Net::ReadTimeout during run. Trying again'
16
+ run
17
+ end
18
+
19
+ private
20
+
21
+ def do_run
22
+ raise ArgumentError, "Please provide GITLAB_USERNAME" unless ENV['GITLAB_USERNAME']
23
+ raise ArgumentError, "Please provide GITLAB_PASSWORD" unless ENV['GITLAB_PASSWORD']
24
+ raise ArgumentError, "Please provide GITLAB_ADDRESS" unless ENV['GITLAB_ADDRESS']
25
+
26
+ STDOUT.puts 'Running...'
27
+
28
+ Runtime::Browser.visit(ENV['GITLAB_ADDRESS'], Page::Main::Login)
29
+ Page::Main::Login.perform(&:sign_in_using_credentials)
30
+ Page::Main::Menu.perform(&:click_settings_link)
31
+ Page::Profile::Menu.perform(&:click_access_tokens)
32
+
33
+ token_name = 'api-test-token'
34
+
35
+ Page::Profile::PersonalAccessTokens.perform do |tokens_page|
36
+ while tokens_page.has_token_row_for_name?(token_name)
37
+ tokens_page.revoke_first_token_with_name(token_name)
38
+ print "\e[32m.\e[0m"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end