Running with gitlab-runner 14.4.0-rc1 (bc99a056)
  on docker-auto-scale-com d5ae8d25
  feature flags: FF_USE_FASTZIP:true
section_start:1634149107:resolve_secrets
Resolving secrets
section_end:1634149107:resolve_secrets
section_start:1634149107:prepare_executor
Preparing the "docker+machine" executor
Using Docker executor with image registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-12-graphicsmagick-1.3.36 ...
Starting service postgres:12 ...
Pulling docker image postgres:12 ...
Using docker image sha256:fd694ed1533c17b41ce216f564c485b00c54a22d4381ffffb0a8e0c1b63f1747 for postgres:12 with digest postgres@sha256:5dee94aed72d1549f945e63195ebe720a1472df170f8d2a8807ea02c8ecf6aa2 ...
Starting service redis:5.0-alpine ...
Pulling docker image redis:5.0-alpine ...
Using docker image sha256:a7a6051077c6c9cfc9ad478778271b49900cb5c4667e64a4128306d8f41a5396 for redis:5.0-alpine with digest redis@sha256:cb5840073dc475b45bf856eb666f5e4d19e3b1ae882e0f3a1396d399cfa23702 ...
Starting service elasticsearch:7.11.1 ...
Pulling docker image elasticsearch:7.11.1 ...
Using docker image sha256:bc3d45eba361de2bde57b25ada32b4de5dd5f5cb12cd3bd049212e90bdfd62a9 for elasticsearch:7.11.1 with digest elasticsearch@sha256:3a219f148b596e25c1b16bda46e1ca07db46826c0e1cde003c2d2f93f33d18e4 ...
Waiting for services to be up and running...
Authenticating with credentials from job payload (GitLab Registry)
Pulling docker image registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-12-graphicsmagick-1.3.36 ...
Using docker image sha256:3a2e6a9cad65fa0415ab85039d82beb91c1c065f731261c1b2b150f34d219920 for registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-12-graphicsmagick-1.3.36 with digest registry.gitlab.com/gitlab-org/gitlab-build-images@sha256:37c1a65d34690f6db5d9a6308136b2ef8361634b2bc1bed4057561128323c6e3 ...
section_end:1634149135:prepare_executor
section_start:1634149135:prepare_script
Preparing environment
Running on runner-d5ae8d25-project-278964-concurrent-0 via runner-d5ae8d25-gsrm-1634141510-d07530f6...
section_end:1634149137:prepare_script
section_start:1634149137:get_sources
Getting source from Git repository
$ eval "$CI_PRE_CLONE_SCRIPT"
Downloading archived master...
Connecting to storage.googleapis.com (172.217.193.128:443)
saving to '/tmp/gitlab.tar.gz'
gitlab.tar.gz         49% |***************                 |  171M  0:00:01 ETA
gitlab.tar.gz        100% |********************************|  346M  0:00:00 ETA
'/tmp/gitlab.tar.gz' saved
Extracting tarball into /builds/gitlab-org/gitlab...
Fetching changes with git depth set to 20...
Initialized empty Git repository in /builds/gitlab-org/gitlab/.git/
Created fresh repository.
remote: Enumerating objects: 110247, done.        
remote: Counting objects:   0% (1/110247)        
remote: Counting objects:   1% (1103/110247)        
remote: Counting objects:   2% (2205/110247)        
remote: Counting objects:   3% (3308/110247)        
remote: Counting objects:   4% (4410/110247)        
remote: Counting objects:   5% (5513/110247)        
remote: Counting objects:   6% (6615/110247)        
remote: Counting objects:   7% (7718/110247)        
remote: Counting objects:   8% (8820/110247)        
remote: Counting objects:   9% (9923/110247)        
remote: Counting objects:  10% (11025/110247)        
remote: Counting objects:  11% (12128/110247)        
remote: Counting objects:  12% (13230/110247)        
remote: Counting objects:  13% (14333/110247)        
remote: Counting objects:  14% (15435/110247)        
remote: Counting objects:  15% (16538/110247)        
remote: Counting objects:  16% (17640/110247)        
remote: Counting objects:  17% (18742/110247)        
remote: Counting objects:  18% (19845/110247)        
remote: Counting objects:  19% (20947/110247)        
remote: Counting objects:  20% (22050/110247)        
remote: Counting objects:  21% (23152/110247)        
remote: Counting objects:  22% (24255/110247)        
remote: Counting objects:  23% (25357/110247)        
remote: Counting objects:  24% (26460/110247)        
remote: Counting objects:  25% (27562/110247)        
remote: Counting objects:  26% (28665/110247)        
remote: Counting objects:  27% (29767/110247)        
remote: Counting objects:  28% (30870/110247)        
remote: Counting objects:  29% (31972/110247)        
remote: Counting objects:  30% (33075/110247)        
remote: Counting objects:  31% (34177/110247)        
remote: Counting objects:  32% (35280/110247)        
remote: Counting objects:  33% (36382/110247)        
remote: Counting objects:  34% (37484/110247)        
remote: Counting objects:  35% (38587/110247)        
remote: Counting objects:  36% (39689/110247)        
remote: Counting objects:  37% (40792/110247)        
remote: Counting objects:  38% (41894/110247)        
remote: Counting objects:  39% (42997/110247)        
remote: Counting objects:  40% (44099/110247)        
remote: Counting objects:  41% (45202/110247)        
remote: Counting objects:  42% (46304/110247)        
remote: Counting objects:  43% (47407/110247)        
remote: Counting objects:  44% (48509/110247)        
remote: Counting objects:  45% (49612/110247)        
remote: Counting objects:  46% (50714/110247)        
remote: Counting objects:  47% (51817/110247)        
remote: Counting objects:  48% (52919/110247)        
remote: Counting objects:  49% (54022/110247)        
remote: Counting objects:  50% (55124/110247)        
remote: Counting objects:  51% (56226/110247)        
remote: Counting objects:  52% (57329/110247)        
remote: Counting objects:  53% (58431/110247)        
remote: Counting objects:  54% (59534/110247)        
remote: Counting objects:  55% (60636/110247)        
remote: Counting objects:  56% (61739/110247)        
remote: Counting objects:  57% (62841/110247)        
remote: Counting objects:  58% (63944/110247)        
remote: Counting objects:  59% (65046/110247)        
remote: Counting objects:  60% (66149/110247)        
remote: Counting objects:  61% (67251/110247)        
remote: Counting objects:  62% (68354/110247)        
remote: Counting objects:  63% (69456/110247)        
remote: Counting objects:  64% (70559/110247)        
remote: Counting objects:  65% (71661/110247)        
remote: Counting objects:  66% (72764/110247)        
remote: Counting objects:  67% (73866/110247)        
remote: Counting objects:  68% (74968/110247)        
remote: Counting objects:  69% (76071/110247)        
remote: Counting objects:  70% (77173/110247)        
remote: Counting objects:  71% (78276/110247)        
remote: Counting objects:  72% (79378/110247)        
remote: Counting objects:  73% (80481/110247)        
remote: Counting objects:  74% (81583/110247)        
remote: Counting objects:  75% (82686/110247)        
remote: Counting objects:  76% (83788/110247)        
remote: Counting objects:  77% (84891/110247)        
remote: Counting objects:  78% (85993/110247)        
remote: Counting objects:  79% (87096/110247)        
remote: Counting objects:  80% (88198/110247)        
remote: Counting objects:  81% (89301/110247)        
remote: Counting objects:  82% (90403/110247)        
remote: Counting objects:  83% (91506/110247)        
remote: Counting objects:  84% (92608/110247)        
remote: Counting objects:  85% (93710/110247)        
remote: Counting objects:  86% (94813/110247)        
remote: Counting objects:  87% (95915/110247)        
remote: Counting objects:  88% (97018/110247)        
remote: Counting objects:  89% (98120/110247)        
remote: Counting objects:  90% (99223/110247)        
remote: Counting objects:  91% (100325/110247)        
remote: Counting objects:  92% (101428/110247)        
remote: Counting objects:  93% (102530/110247)        
remote: Counting objects:  94% (103633/110247)        
remote: Counting objects:  95% (104735/110247)        
remote: Counting objects:  96% (105838/110247)        
remote: Counting objects:  97% (106940/110247)        
remote: Counting objects:  98% (108043/110247)        
remote: Counting objects:  99% (109145/110247)        
remote: Counting objects: 100% (110247/110247)        
remote: Counting objects: 100% (110247/110247), done.        
remote: Compressing objects:   0% (1/75671)        
remote: Compressing objects:   1% (757/75671)        
remote: Compressing objects:   2% (1514/75671)        
remote: Compressing objects:   3% (2271/75671)        
remote: Compressing objects:   4% (3027/75671)        
remote: Compressing objects:   5% (3784/75671)        
remote: Compressing objects:   6% (4541/75671)        
remote: Compressing objects:   6% (4701/75671)        
remote: Compressing objects:   7% (5297/75671)        
remote: Compressing objects:   8% (6054/75671)        
remote: Compressing objects:   9% (6811/75671)        
remote: Compressing objects:  10% (7568/75671)        
remote: Compressing objects:  11% (8324/75671)        
remote: Compressing objects:  12% (9081/75671)        
remote: Compressing objects:  13% (9838/75671)        
remote: Compressing objects:  13% (9839/75671)        
remote: Compressing objects:  14% (10594/75671)        
remote: Compressing objects:  15% (11351/75671)        
remote: Compressing objects:  16% (12108/75671)        
remote: Compressing objects:  17% (12865/75671)        
remote: Compressing objects:  18% (13621/75671)        
remote: Compressing objects:  19% (14378/75671)        
remote: Compressing objects:  20% (15135/75671)        
remote: Compressing objects:  21% (15891/75671)        
remote: Compressing objects:  22% (16648/75671)        
remote: Compressing objects:  23% (17405/75671)        
remote: Compressing objects:  24% (18162/75671)        
remote: Compressing objects:  25% (18918/75671)        
remote: Compressing objects:  26% (19675/75671)        
remote: Compressing objects:  27% (20432/75671)        
remote: Compressing objects:  27% (20592/75671)        
remote: Compressing objects:  28% (21188/75671)        
remote: Compressing objects:  29% (21945/75671)        
remote: Compressing objects:  30% (22702/75671)        
remote: Compressing objects:  31% (23459/75671)        
remote: Compressing objects:  32% (24215/75671)        
remote: Compressing objects:  33% (24972/75671)        
remote: Compressing objects:  34% (25729/75671)        
remote: Compressing objects:  35% (26485/75671)        
remote: Compressing objects:  36% (27242/75671)        
remote: Compressing objects:  37% (27999/75671)        
remote: Compressing objects:  38% (28755/75671)        
remote: Compressing objects:  39% (29512/75671)        
remote: Compressing objects:  40% (30269/75671)        
remote: Compressing objects:  41% (31026/75671)        
remote: Compressing objects:  42% (31782/75671)        
remote: Compressing objects:  43% (32539/75671)        
remote: Compressing objects:  43% (32967/75671)        
remote: Compressing objects:  44% (33296/75671)        
remote: Compressing objects:  45% (34052/75671)        
remote: Compressing objects:  46% (34809/75671)        
remote: Compressing objects:  47% (35566/75671)        
remote: Compressing objects:  48% (36323/75671)        
remote: Compressing objects:  49% (37079/75671)        
remote: Compressing objects:  50% (37836/75671)        
remote: Compressing objects:  51% (38593/75671)        
remote: Compressing objects:  52% (39349/75671)        
remote: Compressing objects:  53% (40106/75671)        
remote: Compressing objects:  54% (40863/75671)        
remote: Compressing objects:  55% (41620/75671)        
remote: Compressing objects:  56% (42376/75671)        
remote: Compressing objects:  57% (43133/75671)        
remote: Compressing objects:  58% (43890/75671)        
remote: Compressing objects:  58% (44595/75671)        
remote: Compressing objects:  59% (44646/75671)        
remote: Compressing objects:  60% (45403/75671)        
remote: Compressing objects:  61% (46160/75671)        
remote: Compressing objects:  62% (46917/75671)        
remote: Compressing objects:  63% (47673/75671)        
remote: Compressing objects:  64% (48430/75671)        
remote: Compressing objects:  65% (49187/75671)        
remote: Compressing objects:  66% (49943/75671)        
remote: Compressing objects:  67% (50700/75671)        
remote: Compressing objects:  68% (51457/75671)        
remote: Compressing objects:  69% (52213/75671)        
remote: Compressing objects:  70% (52970/75671)        
remote: Compressing objects:  71% (53727/75671)        
remote: Compressing objects:  72% (54484/75671)        
remote: Compressing objects:  73% (55240/75671)        
remote: Compressing objects:  74% (55997/75671)        
remote: Compressing objects:  75% (56754/75671)        
remote: Compressing objects:  76% (57510/75671)        
remote: Compressing objects:  77% (58267/75671)        
remote: Compressing objects:  78% (59024/75671)        
remote: Compressing objects:  79% (59781/75671)        
remote: Compressing objects:  80% (60537/75671)        
remote: Compressing objects:  81% (61294/75671)        
remote: Compressing objects:  82% (62051/75671)        
remote: Compressing objects:  83% (62807/75671)        
remote: Compressing objects:  84% (63564/75671)        
remote: Compressing objects:  85% (64321/75671)        
remote: Compressing objects:  86% (65078/75671)        
remote: Compressing objects:  87% (65834/75671)        
remote: Compressing objects:  88% (66591/75671)        
remote: Compressing objects:  89% (67348/75671)        
remote: Compressing objects:  90% (68104/75671)        
remote: Compressing objects:  91% (68861/75671)        
remote: Compressing objects:  92% (69618/75671)        
remote: Compressing objects:  93% (70375/75671)        
remote: Compressing objects:  94% (71131/75671)        
remote: Compressing objects:  95% (71888/75671)        
remote: Compressing objects:  96% (72645/75671)        
remote: Compressing objects:  96% (73273/75671)        
remote: Compressing objects:  97% (73401/75671)        
remote: Compressing objects:  98% (74158/75671)        
remote: Compressing objects:  99% (74915/75671)        
remote: Compressing objects: 100% (75671/75671)        
remote: Compressing objects: 100% (75671/75671), done.        
Receiving objects:   0% (1/110247)
Receiving objects:   1% (1103/110247)
Receiving objects:   2% (2205/110247)
Receiving objects:   3% (3308/110247)
Receiving objects:   4% (4410/110247)
Receiving objects:   5% (5513/110247)
Receiving objects:   6% (6615/110247)
Receiving objects:   7% (7718/110247)
Receiving objects:   8% (8820/110247)
Receiving objects:   9% (9923/110247)
Receiving objects:  10% (11025/110247)
Receiving objects:  11% (12128/110247)
Receiving objects:  12% (13230/110247)
Receiving objects:  13% (14333/110247)
Receiving objects:  14% (15435/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  15% (16538/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  16% (17640/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  17% (18742/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  18% (19845/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  19% (20947/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  20% (22050/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  21% (23152/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  22% (24255/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  23% (25357/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  24% (26460/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  24% (26952/110247), 13.06 MiB | 26.11 MiB/s
Receiving objects:  25% (27562/110247), 26.34 MiB | 26.33 MiB/s
Receiving objects:  26% (28665/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  27% (29767/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  28% (30870/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  29% (31972/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  30% (33075/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  31% (34177/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  32% (35280/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  33% (36382/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  34% (37484/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  35% (38587/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  35% (39451/110247), 43.81 MiB | 29.20 MiB/s
Receiving objects:  36% (39689/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  37% (40792/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  38% (41894/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  39% (42997/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  40% (44099/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  41% (45202/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  42% (46304/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  43% (47407/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  44% (48509/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  45% (49612/110247), 56.52 MiB | 28.26 MiB/s
Receiving objects:  46% (50714/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  47% (51817/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  48% (52919/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  49% (54022/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  50% (55124/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  51% (56226/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  52% (57329/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  53% (58431/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  54% (59534/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  55% (60636/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  56% (61739/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  56% (61867/110247), 65.76 MiB | 26.30 MiB/s
Receiving objects:  57% (62841/110247), 74.72 MiB | 24.90 MiB/s
Receiving objects:  58% (63944/110247), 74.72 MiB | 24.90 MiB/s
Receiving objects:  59% (65046/110247), 74.72 MiB | 24.90 MiB/s
Receiving objects:  60% (66149/110247), 74.72 MiB | 24.90 MiB/s
Receiving objects:  61% (67251/110247), 74.72 MiB | 24.90 MiB/s
Receiving objects:  62% (68354/110247), 74.72 MiB | 24.90 MiB/s
Receiving objects:  63% (69456/110247), 74.72 MiB | 24.90 MiB/s
Receiving objects:  64% (70559/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  65% (71661/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  66% (72764/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  67% (73866/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  68% (74968/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  69% (76071/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  70% (77173/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  71% (78276/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  72% (79378/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  73% (80481/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  74% (81583/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  75% (82686/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  76% (83788/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  77% (84891/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  78% (85993/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  79% (87096/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  80% (88198/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  81% (89301/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  82% (90403/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  83% (91506/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  84% (92608/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  85% (93710/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  86% (94813/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  87% (95915/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  88% (97018/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  89% (98120/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  90% (99223/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  91% (100325/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  92% (101428/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  93% (102530/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  94% (103633/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  95% (104735/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  96% (105838/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  97% (106940/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  98% (108043/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects:  99% (109145/110247), 89.69 MiB | 25.62 MiB/s
remote: Total 110247 (delta 47970), reused 75452 (delta 30626), pack-reused 0        
Receiving objects:  99% (109582/110247), 89.69 MiB | 25.62 MiB/s
Receiving objects: 100% (110247/110247), 101.77 MiB | 25.44 MiB/s
Receiving objects: 100% (110247/110247), 101.87 MiB | 25.43 MiB/s, done.
Resolving deltas:   0% (0/47970)
Resolving deltas:   1% (579/47970)
Resolving deltas:   2% (1358/47970)
Resolving deltas:   3% (1440/47970)
Resolving deltas:   4% (1920/47970)
Resolving deltas:   5% (2399/47970)
Resolving deltas:   6% (2881/47970)
Resolving deltas:   7% (3362/47970)
Resolving deltas:   8% (3838/47970)
Resolving deltas:   9% (4321/47970)
Resolving deltas:  10% (4802/47970)
Resolving deltas:  11% (5303/47970)
Resolving deltas:  12% (5757/47970)
Resolving deltas:  13% (6238/47970)
Resolving deltas:  14% (6718/47970)
Resolving deltas:  15% (7196/47970)
Resolving deltas:  16% (7678/47970)
Resolving deltas:  17% (8159/47970)
Resolving deltas:  18% (8660/47970)
Resolving deltas:  19% (9137/47970)
Resolving deltas:  20% (9594/47970)
Resolving deltas:  21% (10108/47970)
Resolving deltas:  22% (10559/47970)
Resolving deltas:  23% (11053/47970)
Resolving deltas:  24% (11568/47970)
Resolving deltas:  25% (12007/47970)
Resolving deltas:  26% (12488/47970)
Resolving deltas:  27% (12952/47970)
Resolving deltas:  28% (13438/47970)
Resolving deltas:  29% (13934/47970)
Resolving deltas:  30% (14393/47970)
Resolving deltas:  31% (14949/47970)
Resolving deltas:  32% (15353/47970)
Resolving deltas:  33% (15842/47970)
Resolving deltas:  34% (16310/47970)
Resolving deltas:  35% (16855/47970)
Resolving deltas:  36% (17281/47970)
Resolving deltas:  36% (17459/47970)
Resolving deltas:  37% (17754/47970)
Resolving deltas:  38% (18229/47970)
Resolving deltas:  39% (18709/47970)
Resolving deltas:  40% (19188/47970)
Resolving deltas:  41% (19688/47970)
Resolving deltas:  42% (20149/47970)
Resolving deltas:  43% (20632/47970)
Resolving deltas:  44% (21109/47970)
Resolving deltas:  45% (21590/47970)
Resolving deltas:  46% (22068/47970)
Resolving deltas:  47% (22547/47970)
Resolving deltas:  48% (23075/47970)
Resolving deltas:  49% (23506/47970)
Resolving deltas:  50% (23995/47970)
Resolving deltas:  51% (24468/47970)
Resolving deltas:  52% (24948/47970)
Resolving deltas:  53% (25488/47970)
Resolving deltas:  54% (25926/47970)
Resolving deltas:  55% (26394/47970)
Resolving deltas:  56% (26864/47970)
Resolving deltas:  57% (27345/47970)
Resolving deltas:  58% (27827/47970)
Resolving deltas:  59% (28303/47970)
Resolving deltas:  60% (28783/47970)
Resolving deltas:  61% (29263/47970)
Resolving deltas:  62% (29914/47970)
Resolving deltas:  63% (30222/47970)
Resolving deltas:  64% (30701/47970)
Resolving deltas:  65% (31181/47970)
Resolving deltas:  66% (31976/47970)
Resolving deltas:  67% (32143/47970)
Resolving deltas:  68% (32620/47970)
Resolving deltas:  69% (33104/47970)
Resolving deltas:  70% (33584/47970)
Resolving deltas:  71% (34060/47970)
Resolving deltas:  72% (34541/47970)
Resolving deltas:  73% (35165/47970)
Resolving deltas:  74% (35503/47970)
Resolving deltas:  75% (35982/47970)
Resolving deltas:  76% (36556/47970)
Resolving deltas:  77% (36937/47970)
Resolving deltas:  78% (37419/47970)
Resolving deltas:  79% (37923/47970)
Resolving deltas:  80% (38376/47970)
Resolving deltas:  81% (38881/47970)
Resolving deltas:  82% (39399/47970)
Resolving deltas:  83% (39832/47970)
Resolving deltas:  84% (40472/47970)
Resolving deltas:  85% (40777/47970)
Resolving deltas:  86% (41256/47970)
Resolving deltas:  87% (41773/47970)
Resolving deltas:  88% (42217/47970)
Resolving deltas:  89% (42729/47970)
Resolving deltas:  90% (43174/47970)
Resolving deltas:  91% (43719/47970)
Resolving deltas:  92% (44133/47970)
Resolving deltas:  93% (44621/47970)
Resolving deltas:  94% (45095/47970)
Resolving deltas:  95% (45572/47970)
Resolving deltas:  96% (46158/47970)
Resolving deltas:  97% (46711/47970)
Resolving deltas:  98% (47139/47970)
Resolving deltas:  99% (47668/47970)
Resolving deltas: 100% (47970/47970)
Resolving deltas: 100% (47970/47970), done.
From https://gitlab.com/gitlab-org/gitlab
 * [new ref]             535e4adb5142269adb0ab6e75a281530634a8ca8 -> refs/pipelines/387872470
 * [new branch]          master     -> origin/master
Checking out 535e4adb as master...

Skipping Git submodules setup
section_end:1634149171:get_sources
section_start:1634149171:restore_cache
Restoring cache
Checking cache for ruby-gems-v1-4...
cache.zip is up to date                            
Successfully extracted cache
Checking cache for gitaly-ruby-gems-v1-4...
cache.zip is up to date                            
Successfully extracted cache
section_end:1634149198:restore_cache
section_start:1634149198:download_artifacts
Downloading artifacts
Downloading artifacts for compile-test-assets (1677157166)...
Downloading artifacts from coordinator... ok        id=1677157166 responseStatus=200 OK token=ycJW5xLW
Downloading artifacts for retrieve-tests-metadata (1677157175)...
Downloading artifacts from coordinator... ok        id=1677157175 responseStatus=200 OK token=TfUgejm2
Downloading artifacts for setup-test-env (1677157171)...
Downloading artifacts from coordinator... ok        id=1677157171 responseStatus=200 OK token=mKsuziZw
section_end:1634149213:download_artifacts
section_start:1634149213:step_script
Executing "step_script" stage of the job script
Using docker image sha256:3a2e6a9cad65fa0415ab85039d82beb91c1c065f731261c1b2b150f34d219920 for registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-12-graphicsmagick-1.3.36 with digest registry.gitlab.com/gitlab-org/gitlab-build-images@sha256:37c1a65d34690f6db5d9a6308136b2ef8361634b2bc1bed4057561128323c6e3 ...
$ echo $FOSS_ONLY

$ [ "$FOSS_ONLY" = "1" ] && rm -rf ee/ qa/spec/ee/ qa/qa/specs/features/ee/ qa/qa/ee/ qa/qa/ee.rb
$ export GOPATH=$CI_PROJECT_DIR/.go
$ mkdir -p $GOPATH
$ source scripts/utils.sh
$ source scripts/prepare_build.sh
Bundler version 2.1.4
production:development
Settings are listed in order of priority. The top value will be used.
path
Set for the current user (/root/.bundle/config): "/builds/gitlab-org/gitlab/vendor"

clean
Set for the current user (/root/.bundle/config): "true"

without
Set via BUNDLE_WITHOUT: [:production, :development]

install_flags
Set via BUNDLE_INSTALL_FLAGS: "--jobs=$(nproc) --retry=3 --quiet"

$ bundle install --jobs=$(nproc) --retry=3 --quiet  && bundle check
The Gemfile's dependencies are satisfied
==> 'bundle install --jobs=$(nproc) --retry=3 --quiet  && bundle check' succeeded in 2 seconds.
$ bundle pristine pg
Installing pg 1.2.3 with native extensions
==> 'bundle pristine pg' succeeded in 11 seconds.
$ setup_db_user_only
CREATE ROLE
GRANT
==> 'setup_db_user_only' succeeded in 1 seconds.
$ bundle exec rake db:drop db:create db:structure:load db:migrate gitlab:db:setup_ee
Dropped database 'gitlabhq_test'
Created database 'gitlabhq_test'
DEPRECATION WARNING: Using `bin/rails db:structure:load` is deprecated and will be removed in Rails 6.2. Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead. (called from load at /builds/gitlab-org/gitlab/vendor/ruby/2.7.0/bin/rake:23)
Dropped database 'gitlabhq_geo_test'
Created database 'gitlabhq_geo_test'
==> 'bundle exec rake db:drop db:create db:structure:load db:migrate gitlab:db:setup_ee' succeeded in 32 seconds.
$ run_timed_command "gem install knapsack --no-document"
$ gem install knapsack --no-document
Successfully installed knapsack-4.0.0
1 gem installed
==> 'gem install knapsack --no-document' succeeded in 0 seconds.
$ run_timed_command "scripts/gitaly-test-spawn"
$ scripts/gitaly-test-spawn
Settings are listed in order of priority. The top value will be used.
jobs
Set for your local app (/builds/gitlab-org/gitlab/tmp/tests/gitaly/ruby/.bundle/config): 4

retry
Set for your local app (/builds/gitlab-org/gitlab/tmp/tests/gitaly/ruby/.bundle/config): 3

path
Set for your local app (/builds/gitlab-org/gitlab/tmp/tests/gitaly/ruby/.bundle/config): "/builds/gitlab-org/gitlab/vendor/gitaly-ruby"

deployment
Set for your local app (/builds/gitlab-org/gitlab/tmp/tests/gitaly/ruby/.bundle/config): true

without
Set for your local app (/builds/gitlab-org/gitlab/tmp/tests/gitaly/ruby/.bundle/config): [:production, :development]
Set via BUNDLE_WITHOUT: [:production, :development]

app_config
Set via BUNDLE_APP_CONFIG: "/builds/gitlab-org/gitlab/tmp/tests/gitaly/ruby/.bundle"

gemfile
Set via BUNDLE_GEMFILE: "/builds/gitlab-org/gitlab/tmp/tests/gitaly/ruby/Gemfile"

Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.
Using abstract_type 0.0.7
Using concurrent-ruby 1.1.9
Using i18n 1.8.10
Using minitest 5.14.4
Using tzinfo 2.0.4
Using zeitwerk 2.4.2
Using activesupport 6.1.4.1
Using builder 3.2.4
Using erubi 1.10.0
Using mini_portile2 2.5.1
Using racc 1.5.2
Using nokogiri 1.11.7 (x86_64-linux)
Using rails-dom-testing 2.0.3
Using crass 1.0.6
Using loofah 2.12.0
Using rails-html-sanitizer 1.4.2
Using actionview 6.1.4.1
Using rack 2.2.3
Using rack-test 1.1.0
Using actionpack 6.1.4.1
Using ice_nine 0.11.2
Using thread_safe 0.3.6
Using memoizable 0.4.2
Using adamantium 0.2.0
Using public_suffix 4.0.6
Using addressable 2.7.0
Using ast 2.4.1
Using binding_ninja 0.2.3
Using bundler 2.1.4
Using charlock_holmes 0.7.7
Using coderay 1.1.2
Using equalizer 0.0.11
Using concord 0.1.5
Using diff-lcs 1.3
Using dotenv 2.7.6
Using escape_utils 1.2.1
Using factory_bot 5.0.2
Using multipart-post 2.1.1
Using faraday 1.0.1
Using ffi 1.15.3
Using json 2.5.1
Using gemojione 3.3.0
Using mini_mime 1.0.2
Using rugged 1.1.0
Using github-linguist 7.12.1
Using github-markup 1.7.0
Using mime-types-data 3.2020.1104
Using mime-types 3.3.1
Using gitlab-gollum-rugged_adapter 0.4.4.4.gitlab.1
Using rouge 3.26.0
Using nokogumbo 1.5.0
Using sanitize 4.6.6
Using stringex 2.8.5
Using gitlab-gollum-lib 4.2.7.10.gitlab.1
Using google-protobuf 3.17.3 (x86_64-linux)
Using googleapis-common-protos-types 1.1.0
Using grpc 1.30.2 (x86_64-linux)
Using opentracing 0.5.0
Using thrift 0.15.0
Using jaeger-client 1.1.0
Using pg_query 2.1.0
Using redis 4.4.0
Using gitlab-labkit 0.21.2
Using gitlab-markup 1.7.1
Using grpc-tools 1.30.2
Using sawyer 0.8.2
Using octokit 4.20.0
Using reverse_markdown 1.4.0
Using thor 1.1.0
Using licensee 9.14.1
Using method_source 0.9.2
Using msgpack 1.3.3
Using optimist 3.0.1
Using parallel 1.19.2
Using parser 2.7.2.0
Using procto 0.0.3
Using unparser 0.4.7
Using proc_to_ast 0.1.0
Using pry 0.12.2
Using rainbow 3.0.0
Using rbtrace 0.4.14
Using rdoc 6.3.2
Using regexp_parser 1.8.1
Using rexml 3.2.4
Using rspec-support 3.8.0
Using rspec-core 3.8.0
Using rspec-expectations 3.8.3
Using rspec-mocks 3.8.0
Using rspec 3.8.0
Using rspec-parameterized 0.4.2
Using rubocop-ast 0.2.0
Using ruby-progressbar 1.10.1
Using unicode-display_width 1.7.0
Using rubocop 0.86.0
Using sentry-raven 3.0.4
Using timecop 0.9.1
Bundle complete! 21 Gemfile dependencies, 96 gems now installed.
Gems in the groups production and development were not installed.
Bundled gems are installed into `/builds/gitlab-org/gitlab/vendor/gitaly-ruby`
Checking gitaly-ruby Gemfile...
Checking gitaly-ruby bundle...
The Gemfile's dependencies are satisfied
Trying to connect to gitaly: .............................................. OK
Trying to connect to gitaly2: .................................................................. OK
Trying to connect to praefect: .......... OK
==> 'scripts/gitaly-test-spawn' succeeded in 14 seconds.
$ source ./scripts/rspec_helpers.sh
$ rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag ~level:migration"
KNAPSACK_TEST_FILE_PATTERN: {ee/}spec/{bin,channels,config,db,dependencies,elastic,elastic_integration,experiments,factories,finders,frontend,graphql,haml_lint,helpers,initializers,javascripts,lib,models,policies,presenters,rack_servers,replicators,routing,rubocop,serializers,services,sidekiq,spam,support_specs,tasks,uploaders,validators,views,workers,tooling}{,/**/}*_spec.rb

Knapsack node specs:
ee/spec/models/project_spec.rb
ee/spec/lib/gitlab/elastic/project_search_results_spec.rb
ee/spec/models/merge_request_spec.rb
ee/spec/services/elastic/process_bookkeeping_service_spec.rb
ee/spec/services/ee/issues/update_service_spec.rb
ee/spec/services/epic_links/create_service_spec.rb
ee/spec/models/geo/terraform_state_version_registry_spec.rb
ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_confidence_spec.rb
ee/spec/models/ci/pipeline_spec.rb
ee/spec/models/upload_spec.rb
ee/spec/services/ci/compare_security_reports_service_spec.rb
ee/spec/services/vulnerabilities/dismiss_service_spec.rb
ee/spec/models/concerns/elastic/issue_spec.rb
ee/spec/services/dashboard/projects/list_service_spec.rb
ee/spec/models/concerns/elastic/merge_request_spec.rb
ee/spec/models/ee/protected_ref_access_spec.rb
ee/spec/services/search_service_spec.rb
ee/spec/lib/gitlab/geo/replication/file_retriever_spec.rb
ee/spec/graphql/resolvers/epics_resolver_spec.rb
ee/spec/models/ee/ci/pipeline_artifact_spec.rb
ee/spec/services/projects/alerting/notify_service_spec.rb
ee/spec/helpers/ee/groups_helper_spec.rb
ee/spec/services/approval_rules/params_filtering_service_spec.rb
ee/spec/lib/gitlab/auth/ldap/access_spec.rb
ee/spec/services/application_settings/update_service_spec.rb
ee/spec/workers/geo/registry_sync_worker_spec.rb
ee/spec/services/vulnerabilities/resolve_service_spec.rb
ee/spec/lib/gitlab/geo/log_cursor/events/design_repository_updated_event_spec.rb
ee/spec/workers/geo/design_repository_shard_sync_worker_spec.rb
ee/spec/services/alert_management/network_alert_service_spec.rb
ee/spec/models/concerns/elastic/project_wiki_spec.rb
ee/spec/services/vulnerabilities/update_service_spec.rb
ee/spec/workers/store_security_reports_worker_spec.rb
ee/spec/models/geo/container_repository_registry_spec.rb
ee/spec/serializers/epic_note_entity_spec.rb
ee/spec/finders/requirements_management/requirements_finder_spec.rb
ee/spec/models/group_wiki_repository_spec.rb
ee/spec/lib/gitlab/ci/reports/license_scanning/report_spec.rb
ee/spec/services/iterations/create_service_spec.rb
ee/spec/services/compliance_management/frameworks/create_service_spec.rb
ee/spec/presenters/audit_event_presenter_spec.rb
ee/spec/models/dast_site_validation_spec.rb
ee/spec/presenters/vulnerability_presenter_spec.rb
ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb
ee/spec/services/ci/retry_build_service_spec.rb
ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb
ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb
ee/spec/services/system_notes/merge_train_service_spec.rb
ee/spec/services/ee/issuable/common_system_notes_service_spec.rb
ee/spec/helpers/ee/lock_helper_spec.rb
ee/spec/services/projects/gitlab_projects_import_service_spec.rb
ee/spec/graphql/types/admin/cloud_licenses/current_license_type_spec.rb
ee/spec/lib/gitlab/ci/templates/api_fuzzing_latest_gitlab_ci_yaml_spec.rb
ee/spec/presenters/ee/clusters/cluster_presenter_spec.rb
ee/spec/services/network_policies/resources_service_spec.rb
ee/spec/models/geo/group_wiki_repository_registry_spec.rb
ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb
ee/spec/finders/geo/project_registry_finder_spec.rb
ee/spec/lib/gitlab/geo/oauth/logout_state_spec.rb
ee/spec/models/saml_group_link_spec.rb
ee/spec/lib/analytics/merge_request_metrics_refresh_spec.rb
ee/spec/workers/iterations/roll_over_issues_worker_spec.rb
ee/spec/graphql/types/issue_type_spec.rb
ee/spec/finders/geo/package_file_registry_finder_spec.rb
ee/spec/lib/ee/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb
ee/spec/workers/new_epic_worker_spec.rb
ee/spec/workers/sync_seat_link_request_worker_spec.rb
ee/spec/models/analytics/devops_adoption/snapshot_spec.rb
ee/spec/models/geo/secondary_usage_data_spec.rb
ee/spec/lib/ee/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
ee/spec/services/geo/node_status_request_service_spec.rb
ee/spec/helpers/ee/auth_helper_spec.rb
ee/spec/finders/clusters/agent_authorizations_finder_spec.rb
ee/spec/models/approval_wrapped_code_owner_rule_spec.rb
ee/spec/models/gitlab/seat_link_data_spec.rb
ee/spec/models/issuables_analytics_spec.rb
ee/spec/services/audit_events/repository_push_audit_event_service_spec.rb
ee/spec/graphql/mutations/merge_requests/set_assignees_spec.rb
ee/spec/services/audit_events/export_csv_service_spec.rb
ee/spec/graphql/resolvers/vulnerabilities/issue_links_resolver_spec.rb
ee/spec/lib/gitlab/geo/geo_tasks_spec.rb
ee/spec/serializers/status_page/incident_comment_entity_spec.rb
ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb
ee/spec/services/award_emojis/destroy_service_spec.rb
ee/spec/workers/geo/repository_verification/primary/batch_worker_spec.rb
ee/spec/models/compliance_management/framework_spec.rb
ee/spec/graphql/resolvers/scan_execution_policy_resolver_spec.rb
ee/spec/models/groups/repository_storage_move_spec.rb
ee/spec/models/vulnerabilities/finding_signature_spec.rb
ee/spec/services/analytics/cycle_analytics/stages/delete_service_spec.rb
ee/spec/policies/geo/registry_policy_spec.rb
ee/spec/models/iteration_note_spec.rb
ee/spec/views/projects/security/dast_profiles/show.html.haml_spec.rb
ee/spec/lib/gitlab/ci/templates/cluster_image_scanning_gitlab_ci_yaml_spec.rb
ee/spec/services/ee/service_ping/permit_data_categories_service_spec.rb
ee/spec/models/incident_management/issuable_escalation_status_spec.rb
ee/spec/models/commit_spec.rb
ee/spec/views/layouts/application.html.haml_spec.rb
ee/spec/lib/ee/gitlab/background_migration/create_security_setting_spec.rb
ee/spec/lib/gitlab/ci/yaml_processor_spec.rb
ee/spec/workers/analytics/code_review_metrics_worker_spec.rb
ee/spec/services/groups/recent_merge_requests_count_service_spec.rb
ee/spec/models/project_alias_spec.rb
ee/spec/lib/gitlab/auth/smartcard/san_extension_spec.rb
ee/spec/services/vulnerabilities/destroy_dismissal_feedback_service_spec.rb
ee/spec/services/vulnerability_exports/create_service_spec.rb
ee/spec/tasks/geo/git_rake_spec.rb
ee/spec/lib/gitlab/ci/config/entry/secret_spec.rb
ee/spec/services/security/store_scans_service_spec.rb
ee/spec/graphql/resolvers/ci/code_coverage_summary_resolver_spec.rb
ee/spec/graphql/types/dast_scanner_profile_type_spec.rb
ee/spec/workers/geo/verification_timeout_worker_spec.rb
ee/spec/services/system_notes/vulnerabilities_service_spec.rb
ee/spec/services/gitlab_subscriptions/plan_upgrade_service_spec.rb
ee/spec/graphql/mutations/gitlab_subscriptions/activate_spec.rb
ee/spec/lib/ee/gitlab/git_access_snippet_spec.rb
ee/spec/models/vulnerability_user_mention_spec.rb
ee/spec/services/security/store_findings_metadata_service_spec.rb
ee/spec/services/boards/epic_boards/destroy_service_spec.rb
ee/spec/finders/ee/projects_finder_spec.rb
ee/spec/lib/gitlab/ci/config/entry/job_spec.rb
ee/spec/helpers/security_helper_spec.rb
ee/spec/lib/ee/gitlab/verify/uploads_spec.rb
ee/spec/finders/boards/epic_boards_finder_spec.rb
ee/spec/lib/gitlab/geo/base_request_spec.rb
ee/spec/services/audit_events/protected_branch_audit_event_service_spec.rb
ee/spec/graphql/resolvers/epic_issues_resolver_spec.rb
ee/spec/workers/status_page/publish_worker_spec.rb
ee/spec/services/issues/duplicate_service_spec.rb
ee/spec/views/projects/_merge_request_status_checks_settings.html.haml_spec.rb
ee/spec/services/group_saml/sign_up_service_spec.rb
ee/spec/models/project_repository_state_spec.rb
ee/spec/graphql/mutations/vulnerabilities/dismiss_spec.rb
ee/spec/services/ee/issues/close_service_spec.rb
ee/spec/models/integrations/github/remote_project_spec.rb
ee/spec/services/security/security_orchestration_policies/scan_pipeline_service_spec.rb
ee/spec/lib/ee/gitlab/auth/ldap/config_spec.rb
ee/spec/graphql/resolvers/geo/lfs_object_registries_resolver_spec.rb
ee/spec/lib/ee/gitlab/search_results_spec.rb
ee/spec/serializers/ee/board_simple_entity_spec.rb
ee/spec/serializers/ee/blob_entity_spec.rb
ee/spec/services/feature_flag_issues/destroy_service_spec.rb
ee/spec/lib/ee/gitlab/database/connection_spec.rb
ee/spec/workers/iterations_update_status_worker_spec.rb
ee/spec/finders/geo/lfs_object_registry_finder_spec.rb
ee/spec/services/ee/groups/import_export/export_service_spec.rb
ee/spec/views/projects/merge_requests/show.html.haml_spec.rb
ee/spec/services/ee/alert_management/alerts/update_service_spec.rb
ee/spec/services/vulnerability_external_issue_links/destroy_service_spec.rb
ee/spec/models/ee/namespace/root_storage_statistics_spec.rb
ee/spec/helpers/ee/ci/pipeline_editor_helper_spec.rb
ee/spec/workers/repository_import_worker_spec.rb
ee/spec/services/applications/create_service_spec.rb
ee/spec/finders/incident_management/oncall_schedules_finder_spec.rb
ee/spec/policies/security/scan_policy_spec.rb
ee/spec/models/vulnerabilities/finding/evidence/supporting_message_spec.rb
ee/spec/services/licenses/destroy_service_spec.rb
ee/spec/services/app_sec/dast/site_profiles/audit/update_service_spec.rb
ee/spec/models/ee/project_authorization_spec.rb
ee/spec/graphql/ee/types/namespace_type_spec.rb
ee/spec/services/ee/design_management/delete_designs_service_spec.rb
ee/spec/models/concerns/elastic/application_versioned_search_spec.rb
ee/spec/lib/gitlab/ci/reports/license_scanning/reports_comparer_spec.rb
ee/spec/helpers/ee/application_settings_helper_spec.rb
ee/spec/models/geo/reset_checksum_event_spec.rb
ee/spec/workers/elastic_index_initial_bulk_cron_worker_spec.rb
ee/spec/lib/gitlab/incident_management_spec.rb
ee/spec/services/ee/merge_requests/post_merge_service_spec.rb
ee/spec/workers/create_github_webhook_worker_spec.rb
ee/spec/models/geo/job_artifact_deleted_event_spec.rb
ee/spec/graphql/types/group_stats_type_spec.rb
ee/spec/graphql/types/vulnerability/issue_link_type_spec.rb
ee/spec/graphql/types/query_type_spec.rb
ee/spec/services/audit_events/impersonation_audit_event_service_spec.rb
ee/spec/lib/gitlab/tracking/snowplow_schema_validation_spec.rb
ee/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
ee/spec/graphql/types/alert_management/payload_alert_field_type_enum_spec.rb
ee/spec/workers/ldap_sync_worker_spec.rb
ee/spec/views/groups/compliance_frameworks/edit.html.haml_spec.rb
ee/spec/graphql/types/requirements_management/test_report_type_spec.rb
ee/spec/services/boards/epic_boards/visits/create_service_spec.rb
ee/spec/graphql/types/permission_types/project_spec.rb
ee/spec/graphql/types/merge_requests/approval_state_type_spec.rb
ee/spec/helpers/incident_management/oncall_schedule_helper_spec.rb
ee/spec/graphql/types/path_lock_type_spec.rb
ee/spec/graphql/types/group_release_stats_type_spec.rb
ee/spec/models/boards/epic_board_label_spec.rb
ee/spec/services/base_count_service_spec.rb
ee/spec/models/integrations/gitlab_slack_application_spec.rb
ee/spec/graphql/types/vulnerability_location/container_scanning_type_spec.rb
ee/spec/graphql/resolvers/instance_security_dashboard_resolver_spec.rb
ee/spec/models/ci/processable_spec.rb
ee/spec/graphql/types/vulnerability_details/base_type_spec.rb

Filter specs:

Running specs:
Running all node tests without filter
ee/spec/models/project_spec.rb
ee/spec/lib/gitlab/elastic/project_search_results_spec.rb
ee/spec/models/merge_request_spec.rb
ee/spec/services/elastic/process_bookkeeping_service_spec.rb
ee/spec/services/ee/issues/update_service_spec.rb
ee/spec/services/epic_links/create_service_spec.rb
ee/spec/models/geo/terraform_state_version_registry_spec.rb
ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_confidence_spec.rb
ee/spec/models/ci/pipeline_spec.rb
ee/spec/models/upload_spec.rb
ee/spec/services/ci/compare_security_reports_service_spec.rb
ee/spec/services/vulnerabilities/dismiss_service_spec.rb
ee/spec/models/concerns/elastic/issue_spec.rb
ee/spec/services/dashboard/projects/list_service_spec.rb
ee/spec/models/concerns/elastic/merge_request_spec.rb
ee/spec/models/ee/protected_ref_access_spec.rb
ee/spec/services/search_service_spec.rb
ee/spec/lib/gitlab/geo/replication/file_retriever_spec.rb
ee/spec/graphql/resolvers/epics_resolver_spec.rb
ee/spec/models/ee/ci/pipeline_artifact_spec.rb
ee/spec/services/projects/alerting/notify_service_spec.rb
ee/spec/helpers/ee/groups_helper_spec.rb
ee/spec/services/approval_rules/params_filtering_service_spec.rb
ee/spec/lib/gitlab/auth/ldap/access_spec.rb
ee/spec/services/application_settings/update_service_spec.rb
ee/spec/workers/geo/registry_sync_worker_spec.rb
ee/spec/services/vulnerabilities/resolve_service_spec.rb
ee/spec/lib/gitlab/geo/log_cursor/events/design_repository_updated_event_spec.rb
ee/spec/workers/geo/design_repository_shard_sync_worker_spec.rb
ee/spec/services/alert_management/network_alert_service_spec.rb
ee/spec/models/concerns/elastic/project_wiki_spec.rb
ee/spec/services/vulnerabilities/update_service_spec.rb
ee/spec/workers/store_security_reports_worker_spec.rb
ee/spec/models/geo/container_repository_registry_spec.rb
ee/spec/serializers/epic_note_entity_spec.rb
ee/spec/finders/requirements_management/requirements_finder_spec.rb
ee/spec/models/group_wiki_repository_spec.rb
ee/spec/lib/gitlab/ci/reports/license_scanning/report_spec.rb
ee/spec/services/iterations/create_service_spec.rb
ee/spec/services/compliance_management/frameworks/create_service_spec.rb
ee/spec/presenters/audit_event_presenter_spec.rb
ee/spec/models/dast_site_validation_spec.rb
ee/spec/presenters/vulnerability_presenter_spec.rb
ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb
ee/spec/services/ci/retry_build_service_spec.rb
ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb
ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb
ee/spec/services/system_notes/merge_train_service_spec.rb
ee/spec/services/ee/issuable/common_system_notes_service_spec.rb
ee/spec/helpers/ee/lock_helper_spec.rb
ee/spec/services/projects/gitlab_projects_import_service_spec.rb
ee/spec/graphql/types/admin/cloud_licenses/current_license_type_spec.rb
ee/spec/lib/gitlab/ci/templates/api_fuzzing_latest_gitlab_ci_yaml_spec.rb
ee/spec/presenters/ee/clusters/cluster_presenter_spec.rb
ee/spec/services/network_policies/resources_service_spec.rb
ee/spec/models/geo/group_wiki_repository_registry_spec.rb
ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb
ee/spec/finders/geo/project_registry_finder_spec.rb
ee/spec/lib/gitlab/geo/oauth/logout_state_spec.rb
ee/spec/models/saml_group_link_spec.rb
ee/spec/lib/analytics/merge_request_metrics_refresh_spec.rb
ee/spec/workers/iterations/roll_over_issues_worker_spec.rb
ee/spec/graphql/types/issue_type_spec.rb
ee/spec/finders/geo/package_file_registry_finder_spec.rb
ee/spec/lib/ee/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb
ee/spec/workers/new_epic_worker_spec.rb
ee/spec/workers/sync_seat_link_request_worker_spec.rb
ee/spec/models/analytics/devops_adoption/snapshot_spec.rb
ee/spec/models/geo/secondary_usage_data_spec.rb
ee/spec/lib/ee/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
ee/spec/services/geo/node_status_request_service_spec.rb
ee/spec/helpers/ee/auth_helper_spec.rb
ee/spec/finders/clusters/agent_authorizations_finder_spec.rb
ee/spec/models/approval_wrapped_code_owner_rule_spec.rb
ee/spec/models/gitlab/seat_link_data_spec.rb
ee/spec/models/issuables_analytics_spec.rb
ee/spec/services/audit_events/repository_push_audit_event_service_spec.rb
ee/spec/graphql/mutations/merge_requests/set_assignees_spec.rb
ee/spec/services/audit_events/export_csv_service_spec.rb
ee/spec/graphql/resolvers/vulnerabilities/issue_links_resolver_spec.rb
ee/spec/lib/gitlab/geo/geo_tasks_spec.rb
ee/spec/serializers/status_page/incident_comment_entity_spec.rb
ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb
ee/spec/services/award_emojis/destroy_service_spec.rb
ee/spec/workers/geo/repository_verification/primary/batch_worker_spec.rb
ee/spec/models/compliance_management/framework_spec.rb
ee/spec/graphql/resolvers/scan_execution_policy_resolver_spec.rb
ee/spec/models/groups/repository_storage_move_spec.rb
ee/spec/models/vulnerabilities/finding_signature_spec.rb
ee/spec/services/analytics/cycle_analytics/stages/delete_service_spec.rb
ee/spec/policies/geo/registry_policy_spec.rb
ee/spec/models/iteration_note_spec.rb
ee/spec/views/projects/security/dast_profiles/show.html.haml_spec.rb
ee/spec/lib/gitlab/ci/templates/cluster_image_scanning_gitlab_ci_yaml_spec.rbKnapsack report generator started!
Run options: exclude {:quarantine=>true, :geo=>true, :level=>"migration"}
==> /builds/gitlab-org/gitlab/tmp/tests/gitlab-test_bare set up in 0.155567053 seconds...

Test environment set up in 0.810956118 seconds

Project
  associations
    is expected to delegate #shared_runners_seconds to the #statistics object
    is expected to delegate #shared_runners_seconds_last_reset to the #statistics object
    is expected to delegate #ci_minutes_quota to the #shared_runners_limit_namespace object
    is expected to delegate #shared_runners_minutes_limit_enabled? to the #shared_runners_limit_namespace object
    is expected to delegate #closest_gitlab_subscription to the #namespace object
    is expected to delegate #pipeline_configuration_full_path to the #compliance_management_framework object
    is expected to delegate #prevent_merge_without_jira_issue to the #project_setting object
    is expected to belong to deleting_user required:
    is expected to have one import_state class_name => ProjectImportState
    is expected to have one repository_state class_name => ProjectRepositoryState inverse_of => project
    is expected to have one push_rule inverse_of => project
    is expected to have one status_page_setting class_name => StatusPage::ProjectSetting
    is expected to have one compliance_framework_setting class_name => ComplianceManagement::ComplianceFramework::ProjectSettings
    is expected to have one compliance_management_framework class_name => ComplianceManagement::Framework
    is expected to have one security_setting class_name => ProjectSecuritySetting
    is expected to have one vulnerability_statistic class_name => Vulnerabilities::Statistic
    is expected to have one security_orchestration_policy_configuration class_name => Security::OrchestrationPolicyConfiguration inverse_of => project
    is expected to have many path_locks
    is expected to have many vulnerability_feedback
    is expected to have many vulnerability_exports
    is expected to have many vulnerability_scanners
    is expected to have many dast_site_profiles
    is expected to have many dast_site_tokens
    is expected to have many dast_sites
    is expected to have many audit_events dependent => false
    is expected to have many protected_environments
    is expected to have many approvers dependent => destroy
    is expected to have many approver_users through approvers
    is expected to have many approver_groups dependent => destroy
    is expected to have many upstream_project_subscriptions
    is expected to have many upstream_projects
    is expected to have many downstream_project_subscriptions
    is expected to have many downstream_projects
    is expected to have many vulnerability_historical_statistics class_name => Vulnerabilities::HistoricalStatistic
    is expected to have many vulnerability_remediations class_name => Vulnerabilities::Remediation
    is expected to have one github_integration
    is expected to have many project_aliases
    is expected to have many approval_rules
    is expected to have many incident_management_oncall_schedules class_name => IncidentManagement::OncallSchedule
    is expected to have many incident_management_oncall_rotations through incident_management_oncall_schedules source => rotations
    is expected to have many incident_management_escalation_policies class_name => IncidentManagement::EscalationPolicy
    is expected to have many security_scans
    when ci_cd_settings is destroyed but project is not
      allows methods delegated to ci_cd_settings to be nil
    #merge_pipelines_enabled?
      behaves like a ci_cd_settings predicate method
        when ci_cd_settings is nil
          returns false
        when ci_cd_settings is not nil
          delegated_method_return: true, subject_return: true
            returns the expected boolean value
          delegated_method_return: false, subject_return: false
            returns the expected boolean value
    #merge_pipelines_were_disabled?
      behaves like a ci_cd_settings predicate method
        when ci_cd_settings is nil
          returns false
        when ci_cd_settings is not nil
          delegated_method_return: true, subject_return: true
            returns the expected boolean value
          delegated_method_return: false, subject_return: false
            returns the expected boolean value
    #merge_trains_enabled?
      behaves like a ci_cd_settings predicate method
        when ci_cd_settings is nil
          returns false
        when ci_cd_settings is not nil
          delegated_method_return: true, subject_return: true
            returns the expected boolean value
          delegated_method_return: false, subject_return: false
            returns the expected boolean value
    #auto_rollback_enabled?
      behaves like a ci_cd_settings predicate method
        when ci_cd_settings is nil
          returns false
        when ci_cd_settings is not nil
          delegated_method_return: true, subject_return: true
            returns the expected boolean value
          delegated_method_return: false, subject_return: false
            returns the expected boolean value
    #jira_vulnerabilities_integration_enabled?
      when project lacks a jira_integration relation
        returns false
      when project has a jira_integration relation
        accesses the value from the jira_integration
    #configured_to_create_issues_from_vulnerabilities?
      when project lacks a jira_integration relation
        returns false
      when project has a jira_integration relation
        accesses the value from the jira_integration
    #jira_issue_association_required_to_merge_enabled?
      jira_integration_licensed: true, jira_integration_active: true, jira_enforcement_licensed: true
        is enabled if all values are true
      jira_integration_licensed: true, jira_integration_active: true, jira_enforcement_licensed: false
        is enabled if all values are true
      jira_integration_licensed: true, jira_integration_active: false, jira_enforcement_licensed: true
        is enabled if all values are true
      jira_integration_licensed: true, jira_integration_active: false, jira_enforcement_licensed: false
        is enabled if all values are true
      jira_integration_licensed: false, jira_integration_active: true, jira_enforcement_licensed: true
        is enabled if all values are true
      jira_integration_licensed: false, jira_integration_active: true, jira_enforcement_licensed: false
        is enabled if all values are true
      jira_integration_licensed: false, jira_integration_active: false, jira_enforcement_licensed: true
        is enabled if all values are true
      jira_integration_licensed: false, jira_integration_active: false, jira_enforcement_licensed: false
        is enabled if all values are true
    import_state dependant predicate method
      #mirror_last_update_succeeded?
        behaves like returns expected values
          when project lacks a import_state relation
            returns false
          when project has a import_state relation
            accesses the value from the import_state
      #mirror_last_update_failed?
        behaves like returns expected values
          when project lacks a import_state relation
            returns false
          when project has a import_state relation
            accesses the value from the import_state
      #mirror_ever_updated_successfully?
        behaves like returns expected values
          when project lacks a import_state relation
            returns false
          when project has a import_state relation
            accesses the value from the import_state
    approval_rules association
      #applicable_to_branch
        when there are no associated protected branches
          is expected to eq [#<ApprovalProjectRule id: 1, created_at: "2021-10-13 18:22:32.616290000 +0000", updated_at: "2021-10..."], vulnerabilities_allowed: 0, severity_levels: ["unknown", "high", "critical"], report_type: nil>]
        when there are associated protected branches
          and branch matches
            is expected to eq [#<ApprovalProjectRule id: 1, created_at: "2021-10-13 18:22:32.616290000 +0000", updated_at: "2021-10..."], vulnerabilities_allowed: 0, severity_levels: ["unknown", "high", "critical"], report_type: nil>]
          but branch does not match anything
            is expected to be empty
      #inapplicable_to_branch
        when there are no associated protected branches
          is expected to be empty
        when there are associated protected branches
          and branch does not match anything
            is expected to eq [#<ApprovalProjectRule id: 1, created_at: "2021-10-13 18:22:32.616290000 +0000", updated_at: "2021-10..."], vulnerabilities_allowed: 0, severity_levels: ["unknown", "high", "critical"], report_type: nil>]
          but branch matches
            is expected to be empty
    when deleting security policy project
      also deletes the associated security_orchestration_policy_configuration
  scopes
    .requiring_code_owner_approval
      only includes the right projects
    .with_wiki_enabled
      returns a project
    .github_imported
      returns the correct project
    .with_protected_branches
      returns the correct project
    .with_repositories_enabled
      returns the correct project
    .with_security_scans
      returns the correct project
    .with_github_integration_pipeline_events
      returns the correct project
    .with_active_prometheus_integration
      returns the correct project
    .with_enabled_incident_sla
      returns the correct project
    .has_vulnerabilities
      is expected to contain exactly #<Project id:53 namespace53/project53>>
    .has_vulnerability_statistics
      is expected to contain exactly #<Project id:56 namespace56/project56>>
    .not_aimed_for_deletion
      is expected to contain exactly #<Project id:58 namespace58/project58>>
    .order_by_total_repository_size_excess_desc
      is expected to eq [#<Project id:61 namespace61/project61>>, #<Project id:63 namespace63/project63>>, #<Project id:60 namespace60/project60>>]
    .with_code_coverage
      is expected to contain exactly #<Project id:64 namespace64/project64>> and #<Project id:65 namespace65/project65>>
    .with_coverage_feature_usage
      when default_branch is not specified
        is expected to contain exactly #<Project id:69 namespace69/project69>> and #<Project id:70 namespace70/project70>>
      when default_branch is set to true
        is expected to contain exactly #<Project id:69 namespace69/project69>>
      when default_branch is set to false
        is expected to contain exactly #<Project id:69 namespace69/project69>> and #<Project id:70 namespace70/project70>>
  validations
    creates import state when mirror gets enabled
    variables
      ensures max_pages_size is an integer greater than 0 (or equal to 0 to indicate unlimited/maximum)
      with duplicate variables with same environment scope
        is expected not to be valid
      with same variable keys and different environment scope
        is expected to be valid
    mirror
      is expected to validate that :import_url cannot be empty/falsy
      is expected to validate that :mirror_user cannot be empty/falsy
  setting up a mirror
    when new project
      creates import_state and sets next_execution_timestamp to now
    when project already exists
      when project is not import
        creates import_state and sets next_execution_timestamp to now
      when project is import
        sets current import_state next_execution_timestamp to now
  .mirrors_to_sync
    when mirror is scheduled
      returns empty
    when mirror is started
      returns empty
    when mirror is finished
      returns project if next_execution_timestamp is not in the future
      returns empty if next_execution_timestamp is in the future
      when a limit is applied
        returns project if next_execution_timestamp is not in the future
    when project is failed
      returns project if next_execution_timestamp is not in the future
      returns empty if next_execution_timestamp is in the future
      with retry limit exceeded
        returns empty
  #can_store_security_reports?
    when the feature is enabled for the namespace
      returns true
    when the project is public
      returns true
    when the feature is disabled for the namespace and the project is not public
      returns false
  #deployment_variables
    when environment name is review/name
      returns variables from this service
    when environment name is other
      returns variables from this service
  #ensure_external_webhook_token
    sets external_webhook_token when it's missing
  #push_rule
    is expected not to be nil
    push rules unlicensed
      is expected to be nil
  merge requests related settings
    #disable_overriding_approvers_per_merge_request
      when group_merge_request_approval_settings_feature_flag flag is disabled
        behaves like setting modified by application setting
          feature_enabled: true, app_setting: true, project_setting: true, final_setting: true
            shows proper setting
          feature_enabled: true, app_setting: false, project_setting: true, final_setting: true
            shows proper setting
          feature_enabled: true, app_setting: true, project_setting: false, final_setting: true
            shows proper setting
          feature_enabled: true, app_setting: false, project_setting: false, final_setting: false
            shows proper setting
          feature_enabled: false, app_setting: true, project_setting: true, final_setting: true
            shows proper setting
          feature_enabled: false, app_setting: false, project_setting: true, final_setting: true
            shows proper setting
          feature_enabled: false, app_setting: true, project_setting: false, final_setting: false
            shows proper setting
          feature_enabled: false, app_setting: false, project_setting: false, final_setting: false
            shows proper setting
      when group_merge_request_approval_settings_feature_flag flag is true
        returns false when the resolver returns true
        returns true when the resolver returns false
    #disable_overriding_approvers_per_merge_request?
      behaves like a predicate wrapper method
        wrapped_method_return: true, subject_return: true
          returns the expected boolean value
        wrapped_method_return: false, subject_return: false
          returns the expected boolean value
        wrapped_method_return: nil, subject_return: false
          returns the expected boolean value
    #merge_requests_disable_committers_approval
      when group_merge_request_approval_settings_feature_flag flag is disabled
        behaves like setting modified by application setting
          feature_enabled: true, app_setting: true, project_setting: true, final_setting: true
            shows proper setting
          feature_enabled: true, app_setting: false, project_setting: true, final_setting: true
            shows proper setting
          feature_enabled: true, app_setting: true, project_setting: false, final_setting: true
            shows proper setting
          feature_enabled: true, app_setting: false, project_setting: false, final_setting: false
            shows proper setting
          feature_enabled: false, app_setting: true, project_setting: true, final_setting: true
            shows proper setting
          feature_enabled: false, app_setting: false, project_setting: true, final_setting: true
            shows proper setting
          feature_enabled: false, app_setting: true, project_setting: false, final_setting: false
            shows proper setting
          feature_enabled: false, app_setting: false, project_setting: false, final_setting: false
            shows proper setting
      when group_merge_request_approval_settings_feature_flag flag is true
        returns false when the resolver returns true
        returns true when the resolver returns false
    #merge_requests_disable_committers_approval?
      behaves like a predicate wrapper method
        wrapped_method_return: true, subject_return: true
          returns the expected boolean value
        wrapped_method_return: false, subject_return: false
          returns the expected boolean value
        wrapped_method_return: nil, subject_return: false
          returns the expected boolean value
    #require_password_to_approve?
      when group_merge_request_approval_settings_feature_flag flag is disabled
        behaves like a predicate wrapper method
          wrapped_method_return: true, subject_return: true
            returns the expected boolean value
          wrapped_method_return: false, subject_return: false
            returns the expected boolean value
          wrapped_method_return: nil, subject_return: false
            returns the expected boolean value
      when group_merge_request_approval_settings_feature_flag flag is enabled
        returns true when the resolver returns true
        returns false when the resolver returns false
    #merge_requests_author_approval
      when group_merge_request_approval_settings_feature_flag flag is enabled
        returns true when the resolver returns true
        returns false when the resolver returns false
      when flag is disabled
        feature_enabled: true, app_setting: true, project_setting: true, final_setting: false
          shows proper setting
        feature_enabled: true, app_setting: false, project_setting: true, final_setting: true
          shows proper setting
        feature_enabled: true, app_setting: true, project_setting: false, final_setting: false
          shows proper setting
        feature_enabled: true, app_setting: false, project_setting: false, final_setting: false
          shows proper setting
        feature_enabled: false, app_setting: true, project_setting: true, final_setting: true
          shows proper setting
        feature_enabled: false, app_setting: false, project_setting: true, final_setting: true
          shows proper setting
        feature_enabled: false, app_setting: true, project_setting: false, final_setting: false
          shows proper setting
        feature_enabled: false, app_setting: false, project_setting: false, final_setting: false
          shows proper setting
    #merge_requests_author_approval?
      behaves like a predicate wrapper method
        wrapped_method_return: true, subject_return: true
          returns the expected boolean value
        wrapped_method_return: false, subject_return: false
          returns the expected boolean value
        wrapped_method_return: nil, subject_return: false
          returns the expected boolean value
  #has_active_hooks?
    with group hooks
      returns true
    with no group hooks
      returns false
  #has_group_hooks?
    is expected to eq nil
    project is in a group
      is expected to eq false
      behaves like returns nil when the feature is not available
        is expected to eq nil
      the group has hooks
        is expected to eq true
        behaves like returns nil when the feature is not available
          is expected to eq nil
        but the hook is not in scope
          is expected to eq false
          behaves like returns nil when the feature is not available
            is expected to eq nil
      the group inherits a hook
        is expected to eq true
        behaves like returns nil when the feature is not available
          is expected to eq nil
  #execute_external_compliance_hooks
    enqueues the correct number of workers
  #execute_hooks
    group hooks
      does not execute the hook when the feature is disabled
      when group_webhooks feature is enabled
        behaves like triggering group webhook
          executes the hook
        in sub group
          behaves like triggering group webhook
            executes the hook
  #allowed_to_share_with_group?
    returns true
    returns false
  #membership_locked?
    when project has no group
      is false
    with group_membership_lock enabled
      is true
    with group_membership_lock disabled
      is false
  #feature_available?
    only loads licensed availability once
    when feature symbol is included on Namespace features code
      audit_events
        checking audit_events availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking audit_events only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      blocked_issues
        checking blocked_issues availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking blocked_issues only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      board_iteration_lists
        checking board_iteration_lists availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking board_iteration_lists only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      code_owners
        checking code_owners availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking code_owners only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      code_review_analytics
        checking code_review_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking code_review_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      contribution_analytics
        checking contribution_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking contribution_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      description_diffs
        checking description_diffs availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking description_diffs only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      elastic_search
        when checking elastic_search only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      full_codequality_report
        checking full_codequality_report availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking full_codequality_report only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_activity_analytics
        checking group_activity_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking group_activity_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_bulk_edit
        checking group_bulk_edit availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking group_bulk_edit only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_webhooks
        checking group_webhooks availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking group_webhooks only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      issuable_default_templates
        checking issuable_default_templates availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking issuable_default_templates only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      issue_weights
        checking issue_weights availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking issue_weights only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      iterations
        checking iterations availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking iterations only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      ldap_group_sync
        when checking ldap_group_sync only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      member_lock
        checking member_lock availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking member_lock only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      merge_request_approvers
        checking merge_request_approvers availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking merge_request_approvers only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      milestone_charts
        checking milestone_charts availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking milestone_charts only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      multiple_issue_assignees
        checking multiple_issue_assignees availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking multiple_issue_assignees only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      multiple_ldap_servers
        when checking multiple_ldap_servers only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      multiple_merge_request_assignees
        checking multiple_merge_request_assignees availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking multiple_merge_request_assignees only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      multiple_merge_request_reviewers
        checking multiple_merge_request_reviewers availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking multiple_merge_request_reviewers only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      project_merge_request_analytics
        checking project_merge_request_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking project_merge_request_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      protected_refs_for_users
        checking protected_refs_for_users availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking protected_refs_for_users only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      push_rules
        checking push_rules availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking push_rules only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      repository_mirrors
        checking repository_mirrors availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking repository_mirrors only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      resource_access_token
        checking resource_access_token availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking resource_access_token only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      seat_link
        when checking seat_link only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      scoped_issue_board
        checking scoped_issue_board availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking scoped_issue_board only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      usage_quotas
        when checking usage_quotas only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      visual_review_app
        checking visual_review_app availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking visual_review_app only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      wip_limits
        checking wip_limits availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking wip_limits only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      send_emails_from_admin_area
        checking send_emails_from_admin_area availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Global License
            returns false
        when checking send_emails_from_admin_area only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      repository_size_limit
        when checking repository_size_limit only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_ip_restriction
        checking group_ip_restriction availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_ip_restriction only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      adjourned_deletion_for_projects_and_groups
        checking adjourned_deletion_for_projects_and_groups availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking adjourned_deletion_for_projects_and_groups only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      admin_audit_log
        when checking admin_audit_log only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      auditor_user
        when checking auditor_user only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      blocking_merge_requests
        checking blocking_merge_requests availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking blocking_merge_requests only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      board_assignee_lists
        checking board_assignee_lists availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking board_assignee_lists only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      board_milestone_lists
        checking board_milestone_lists availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking board_milestone_lists only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      ci_cd_projects
        checking ci_cd_projects availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking ci_cd_projects only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      ci_secrets_management
        checking ci_secrets_management availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking ci_secrets_management only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      cluster_agents
        checking cluster_agents availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking cluster_agents only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      cluster_agents_gitops
        checking cluster_agents_gitops availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking cluster_agents_gitops only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      cluster_deployments
        checking cluster_deployments availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking cluster_deployments only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      code_owner_approval_required
        checking code_owner_approval_required availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking code_owner_approval_required only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      commit_committer_check
        checking commit_committer_check availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking commit_committer_check only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      compliance_framework
        checking compliance_framework availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking compliance_framework only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      custom_compliance_frameworks
        checking custom_compliance_frameworks availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking custom_compliance_frameworks only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      cross_project_pipelines
        checking cross_project_pipelines availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking cross_project_pipelines only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      custom_file_templates
        when checking custom_file_templates only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      custom_file_templates_for_namespace
        checking custom_file_templates_for_namespace availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking custom_file_templates_for_namespace only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      custom_project_templates
        when checking custom_project_templates only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      cycle_analytics_for_groups
        checking cycle_analytics_for_groups availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking cycle_analytics_for_groups only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      cycle_analytics_for_projects
        checking cycle_analytics_for_projects availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking cycle_analytics_for_projects only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      db_load_balancing
        when checking db_load_balancing only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      default_branch_protection_restriction_in_groups
        when checking default_branch_protection_restriction_in_groups only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      default_project_deletion_protection
        checking default_project_deletion_protection availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking default_project_deletion_protection only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      disable_name_update_for_users
        checking disable_name_update_for_users availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking disable_name_update_for_users only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      email_additional_text
        checking email_additional_text availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking email_additional_text only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      epics
        checking epics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking epics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      extended_audit_events
        when checking extended_audit_events only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      external_authorization_service_api_management
        when checking external_authorization_service_api_management only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      feature_flags_related_issues
        checking feature_flags_related_issues availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking feature_flags_related_issues only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      feature_flags_code_references
        checking feature_flags_code_references availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking feature_flags_code_references only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      file_locks
        checking file_locks availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking file_locks only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      geo
        when checking geo only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      generic_alert_fingerprinting
        checking generic_alert_fingerprinting availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking generic_alert_fingerprinting only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      git_two_factor_enforcement
        checking git_two_factor_enforcement availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking git_two_factor_enforcement only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      github_project_service_integration
        checking github_project_service_integration availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking github_project_service_integration only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_allowed_email_domains
        checking group_allowed_email_domains availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_allowed_email_domains only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_coverage_reports
        checking group_coverage_reports availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_coverage_reports only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_forking_protection
        checking group_forking_protection availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_forking_protection only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_merge_request_analytics
        checking group_merge_request_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_merge_request_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_milestone_project_releases
        checking group_milestone_project_releases availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_milestone_project_releases only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_project_templates
        checking group_project_templates availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_project_templates only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_repository_analytics
        checking group_repository_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_repository_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_saml
        checking group_saml availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_saml only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_saml_group_sync
        checking group_saml_group_sync availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_saml_group_sync only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_scoped_ci_variables
        checking group_scoped_ci_variables availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_scoped_ci_variables only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_wikis
        checking group_wikis availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_wikis only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      incident_sla
        checking incident_sla availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking incident_sla only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      incident_metric_upload
        checking incident_metric_upload availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking incident_metric_upload only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      ide_schema_config
        checking ide_schema_config availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking ide_schema_config only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      issues_analytics
        checking issues_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking issues_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      jira_issues_integration
        checking jira_issues_integration availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking jira_issues_integration only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      ldap_group_sync_filter
        when checking ldap_group_sync_filter only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      merge_pipelines
        checking merge_pipelines availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking merge_pipelines only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      merge_request_performance_metrics
        checking merge_request_performance_metrics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking merge_request_performance_metrics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      admin_merge_request_approvers_rules
        checking admin_merge_request_approvers_rules availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking admin_merge_request_approvers_rules only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      merge_trains
        checking merge_trains availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking merge_trains only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      metrics_reports
        checking metrics_reports availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking metrics_reports only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      multiple_alert_http_integrations
        checking multiple_alert_http_integrations availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking multiple_alert_http_integrations only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      multiple_approval_rules
        checking multiple_approval_rules availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking multiple_approval_rules only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      multiple_group_issue_boards
        checking multiple_group_issue_boards availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking multiple_group_issue_boards only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      multiple_iteration_cadences
        checking multiple_iteration_cadences availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking multiple_iteration_cadences only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      object_storage
        when checking object_storage only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      operations_dashboard
        checking operations_dashboard availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking operations_dashboard only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      package_forwarding
        checking package_forwarding availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking package_forwarding only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      pages_size_limit
        when checking pages_size_limit only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      productivity_analytics
        checking productivity_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking productivity_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      project_aliases
        when checking project_aliases only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      protected_environments
        checking protected_environments availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking protected_environments only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      reject_unsigned_commits
        checking reject_unsigned_commits availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking reject_unsigned_commits only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      required_ci_templates
        when checking required_ci_templates only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      scoped_labels
        checking scoped_labels availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking scoped_labels only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      smartcard_auth
        checking smartcard_auth availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking smartcard_auth only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      swimlanes
        checking swimlanes availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking swimlanes only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      type_of_work_analytics
        checking type_of_work_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking type_of_work_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      minimal_access_role
        checking minimal_access_role availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking minimal_access_role only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      unprotection_restrictions
        checking unprotection_restrictions availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking unprotection_restrictions only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      ci_project_subscriptions
        checking ci_project_subscriptions availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking ci_project_subscriptions only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      incident_timeline_view
        checking incident_timeline_view availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking incident_timeline_view only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      oncall_schedules
        checking oncall_schedules availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking oncall_schedules only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      escalation_policies
        checking escalation_policies availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking escalation_policies only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      export_user_permissions
        checking export_user_permissions availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking export_user_permissions only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      zentao_issues_integration
        checking zentao_issues_integration availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking zentao_issues_integration only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      api_fuzzing
        checking api_fuzzing availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking api_fuzzing only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      auto_rollback
        checking auto_rollback availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking auto_rollback only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      cilium_alerts
        checking cilium_alerts availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking cilium_alerts only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      cluster_image_scanning
        checking cluster_image_scanning availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking cluster_image_scanning only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      external_status_checks
        checking external_status_checks availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking external_status_checks only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      container_scanning
        checking container_scanning availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking container_scanning only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      coverage_fuzzing
        checking coverage_fuzzing availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking coverage_fuzzing only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      credentials_inventory
        checking credentials_inventory availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking credentials_inventory only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      dast
        checking dast availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking dast only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      dependency_scanning
        checking dependency_scanning availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking dependency_scanning only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      devops_adoption
        checking devops_adoption availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking devops_adoption only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      dora4_analytics
        checking dora4_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking dora4_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      enforce_personal_access_token_expiration
        checking enforce_personal_access_token_expiration availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking enforce_personal_access_token_expiration only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      enforce_ssh_key_expiration
        checking enforce_ssh_key_expiration availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking enforce_ssh_key_expiration only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      enterprise_templates
        when checking enterprise_templates only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      environment_alerts
        checking environment_alerts availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking environment_alerts only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      evaluate_group_level_compliance_pipeline
        checking evaluate_group_level_compliance_pipeline availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking evaluate_group_level_compliance_pipeline only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      external_audit_events
        checking external_audit_events availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking external_audit_events only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_ci_cd_analytics
        checking group_ci_cd_analytics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_ci_cd_analytics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_level_compliance_dashboard
        checking group_level_compliance_dashboard availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_level_compliance_dashboard only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      group_level_devops_adoption
        checking group_level_devops_adoption availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking group_level_devops_adoption only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      incident_management
        checking incident_management availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking incident_management only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      inline_codequality
        checking inline_codequality availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking inline_codequality only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      insights
        checking insights availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking insights only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      instance_level_devops_adoption
        checking instance_level_devops_adoption availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking instance_level_devops_adoption only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      issuable_health_status
        checking issuable_health_status availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking issuable_health_status only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      jira_vulnerabilities_integration
        checking jira_vulnerabilities_integration availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking jira_vulnerabilities_integration only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      jira_issue_association_enforcement
        checking jira_issue_association_enforcement availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking jira_issue_association_enforcement only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      license_scanning
        checking license_scanning availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking license_scanning only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      personal_access_token_expiration_policy
        checking personal_access_token_expiration_policy availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking personal_access_token_expiration_policy only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      prometheus_alerts
        checking prometheus_alerts availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking prometheus_alerts only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      pseudonymizer
        checking pseudonymizer availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking pseudonymizer only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      quality_management
        checking quality_management availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking quality_management only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      release_evidence_test_artifacts
        checking release_evidence_test_artifacts availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking release_evidence_test_artifacts only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      report_approver_rules
        checking report_approver_rules availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking report_approver_rules only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      requirements
        checking requirements availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking requirements only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      sast
        checking sast availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking sast only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      sast_custom_rulesets
        checking sast_custom_rulesets availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking sast_custom_rulesets only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      sast_fp_reduction
        checking sast_fp_reduction availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking sast_fp_reduction only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      secret_detection
        checking secret_detection availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking secret_detection only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      security_dashboard
        checking security_dashboard availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking security_dashboard only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      security_on_demand_scans
        checking security_on_demand_scans availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking security_on_demand_scans only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      security_orchestration_policies
        checking security_orchestration_policies availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking security_orchestration_policies only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      status_page
        checking status_page availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking status_page only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      subepics
        checking subepics availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking subepics only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      threat_monitoring
        checking threat_monitoring availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking threat_monitoring only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      vulnerability_auto_fix
        checking vulnerability_auto_fix availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking vulnerability_auto_fix only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
      vulnerability_finding_signatures
        checking vulnerability_finding_signatures availability both on Global and Namespace license
          allowed by Plan License AND Global License
            returns true
          not allowed by Plan License but project and namespace are public
            returns true
          not allowed by Plan License
            returns false
          not allowed by Global License
            returns false
        when checking vulnerability_finding_signatures only for Global license
          allowed by Global License
            returns true
          not allowed by Global License
            returns false
    when feature symbol is not included on Namespace features code
      checks availability of licensed feature
  #fetch_mirror
    import_url: "http://foo:bar@example.com", auth_method: "password", expected: "http://foo:bar@example.com"
      is expected to receive fetch_upstream("http://foo:bar@example.com", {:check_tags_changed=>false, :forced=>false}) 1 time
    import_url: "ssh://foo:bar@example.com", auth_method: "password", expected: "ssh://foo:bar@example.com"
      is expected to receive fetch_upstream("ssh://foo:bar@example.com", {:check_tags_changed=>false, :forced=>false}) 1 time
    import_url: "ssh://foo:bar@example.com", auth_method: "ssh_public_key", expected: "ssh://foo@example.com"
      is expected to receive fetch_upstream("ssh://foo@example.com", {:check_tags_changed=>false, :forced=>false}) 1 time
  updating import_url
    removes previous remote
  #any_online_runners?
    is expected to be truthy
    with used pipeline minutes
      does not have any online runners
  #shared_runners_available?
    with used pipeline minutes
      shared runners are not available
    without used pipeline minutes
      shared runners are not available
  #ci_minutes_used
    when CI minutes have not been used
      is expected to be zero
      when ci_use_new_monthly_minutes feature flag is disabled
        is expected to be zero
    when CI minutes have been used
      is expected to eq 70
      when ci_use_new_monthly_minutes feature flag is disabled
        is expected to eq 60
  #root_namespace
    when namespace has parent group
      returns root ancestor
    when namespace is root ancestor
      returns current namespace
  #shared_runners_limit_namespace
    returns root namespace
  #shared_runners_minutes_limit_enabled?
    with shared runners enabled
      for public project
        is expected to be truthy
      for internal project
        is expected to be truthy
      for private project
        is expected to be truthy
    without shared runners
      is expected to be falsey
  #approvals_before_merge
    license_value: true, db_value: 5, expected: 5
      is expected to eq 5
    license_value: true, db_value: 0, expected: 0
      is expected to eq 0
    license_value: false, db_value: 5, expected: 0
      is expected to eq 0
    license_value: false, db_value: 0, expected: 0
      is expected to eq 0
  #reset_approvals_on_push?
    when group_merge_request_approval_settings_feature_flag flag is disabled
      license_value: true, db_value: true, expected: true
        is expected to eq true
      license_value: true, db_value: false, expected: false
        is expected to eq false
      license_value: false, db_value: true, expected: false
        is expected to eq false
      license_value: false, db_value: false, expected: false
        is expected to eq false
    when group_merge_request_approval_settings_feature_flag flag is enabled
      returns false when the resolver returns true
      returns true when the resolver returns false
  #approvals_before_merge
    license_value: true, db_value: 5, expected: 5
      is expected to eq 5
    license_value: true, db_value: 0, expected: 0
      is expected to eq 0
    license_value: false, db_value: 5, expected: 0
      is expected to eq 0
    license_value: false, db_value: 0, expected: 0
      is expected to eq 0
  #visible_user_defined_rules
    returns all approval rules
    when multiple approval rules is not available
      returns the first approval rule
    when branch is provided
      caches the rules
  #visible_user_defined_inapplicable_rules
    when multiple approval rules is available
      when rules are scoped
        returns rules that are not applicable to target_branch
      when rules are not scoped
        returns empty array
    when multiple approval rules is not available
      returns empty array
  #min_fallback_approvals
    returns the maximum requirement
    returns the first rule requirement if there is a rule
  #merge_requests_require_code_owner_approval?
    feature_available: true, feature_enabled: true, approval_required: true
      requires code owner approval when needed
    feature_available: false, feature_enabled: true, approval_required: false
      requires code owner approval when needed
    feature_available: true, feature_enabled: false, approval_required: false
      requires code owner approval when needed
  #branch_requires_code_owner_approval?
    when feature is enabled
      returns true when code owner approval is required
      returns false when code owner approval is not required
    when feature is not enabled
      returns true when code owner approval is required
      returns false when code owner approval is not required
  #disabled_integrations
    license_feature: :github_project_service_integration, disabled_integrations: ["github"]
      when feature is available
        is expected not to include "github"
      when feature is unavailable
        is expected to include "github"
  #pull_mirror_available?
    when mirror global setting is enabled
      returns true
    when mirror global setting is disabled
      returns true when overridden
      returns false when not overridden
  #username_only_import_url
    import_url: "", username: "foo", expected_import_url: ""
      is expected to eq ""
    import_url: "", username: "", expected_import_url: ""
      is expected to eq ""
    import_url: "", username: nil, expected_import_url: ""
      is expected to eq ""
    import_url: nil, username: "foo", expected_import_url: nil
      is expected to eq nil
    import_url: nil, username: "", expected_import_url: nil
      is expected to eq nil
    import_url: nil, username: nil, expected_import_url: nil
      is expected to eq nil
    import_url: "http://example.com", username: "foo", expected_import_url: "http://foo@example.com"
      is expected to eq "http://foo@example.com"
    import_url: "http://example.com", username: "", expected_import_url: "http://example.com"
      is expected to eq "http://example.com"
    import_url: "http://example.com", username: nil, expected_import_url: "http://example.com"
      is expected to eq "http://example.com"
  #username_only_import_url=
    sets the import url and username
    does not unset the password
    clears the username if passed the empty string
  #with_slack_application_disabled
    returns projects where Slack application is disabled
  #licensed_features
    when the namespace should be checked
      when bronze
        filters for bronze features
      when premium
        filters for premium features
      when ultimate
        filters for ultimate features
      when free plan
        filters out paid features
        when public project and namespace
          includes all features in global license
    when namespace should not be checked
      includes all features in global license
    when there is no license
      is expected to be empty
  #find_path_lock
    returns path_lock
    returns nil
  #any_path_locks?
    returns false when there are no path locks
    returns a cached true when there are path locks
  #latest_pipeline_with_security_reports
    when all pipelines are used
      when there is no associated `vulnerability_statistic` record with the project
        behaves like on-the-fly latest_pipeline_with_security_reports calculation
          when legacy reports are used
            returns the latest pipeline with security reports
          when new reports are used
            returns the latest pipeline with security reports
            when legacy used
              prefers the new reports
      when there is an associated `vulnerability_statistic` record with the project
        when the pipeline of `vulnerability_statistic` has not been set
          behaves like on-the-fly latest_pipeline_with_security_reports calculation
            when legacy reports are used
              returns the latest pipeline with security reports
            when new reports are used
              returns the latest pipeline with security reports
              when legacy used
                prefers the new reports
        when the pipeline of `vulnerability_statistic` has been set
          is expected to eq #<Ci::Pipeline id: 5, ref: "master", sha: "b83d6e391c22777fca1ed3012fce84f633d7fed0", before_sha: nil..._sha: nil, target_sha: nil, external_pull_request_id: nil, ci_ref_id: 5, locked: "artifacts_locked">
    when only successful pipelines are used
      behaves like on-the-fly latest_pipeline_with_security_reports calculation
        when legacy reports are used
          returns the latest pipeline with security reports
        when new reports are used
          returns the latest pipeline with security reports
          when legacy used
            prefers the new reports
  #latest_pipeline_with_reports
    when reports are found
      returns the latest pipeline with reports of right type
      and one of the pipelines has not yet completed
        returns the latest successful pipeline with reports
    when reports are not found
      returns nothing
  #security_reports_up_to_date_for_ref?
    when the target branch security reports are up to date
      is expected to equal true
    when the target branch security reports are out of date
      is expected to equal false
  #after_import
    Geo repository update events
      calls Geo::RepositoryUpdatedService when running on a Geo primary node
      does not call Geo::RepositoryUpdatedService when not running on a Geo primary node
    elasticsearch indexing
      elasticsearch indexing disabled for this project
        does not index the wiki repository
      elasticsearch indexing enabled for this project
        schedules a full index of the wiki repository
        when project is forked
          does not index the wiki repository
  #lfs_http_url_to_repo
    with a Geo setup that is a primary
      for an upload operation
        returns the project HTTP URL for the primary
    with a Geo setup that is a secondary
      and has a primary
        for an upload operation
          returns the project HTTP URL for the primary
        for a download operation
          returns the project HTTP URL for the secondary
      without a primary
        returns the project HTTP URL for the secondary
    without a Geo setup
      returns the project HTTP URL for the main node
  #add_import_job
    when import_type is gitlab_custom_project_template
      does not create import job
    when mirror true on a jira imported project
      when jira import is in progress
        does trigger mirror update
  #gitlab_custom_project_template_import?
    when licensed
      returns true
    when unlicensed
      returns false
  #feature_flags_client_token
    when there is no access token
      creates a new one
    when there is access token
      provides an existing one
  #has_pool_repository?
    returns false when there is no pool repository
    returns true when there is a pool repository
  #link_pool_repository
    logs geo event
  #object_pool_missing?
    returns true when object pool is missing
    returns false when pool repository doesnt't exist
    returns false when object pool exists
  #insights_config
    when project has no Insights config file
      returns the project default config
      when the project is inside a group
        when the group has no Insights config
          returns the group default config
        when the group has an Insights config from another project
          with a valid config file
            returns the group config data from the other project
            when the project is inside a nested group
              returns the project default config
          with an invalid config file
            returns nil
    when project has an Insights config file
      with a valid config file
        returns the insights config data
        when the project is inside a group having another config
          returns the project insights config data
      with an invalid config file
        returns nil
        when the project is inside a group having another config
          returns nil
  #kerberos_url_to_repo
    returns valid kerberos url for this repo
  #actual_size_limit
    when repository_size_limit is set on the project
      returns the repository_size_limit
    when repository_size_limit is not set on the project
      returns the actual_size_limit of the namespace
  #repository_size_checker
    #current_size
      returns the total repository and lfs size
    #limit
      returns the value set in the namespace when available
      returns the value set locally when available
    #enabled?
      returns true when not equal to zero
      returns false when equals to zero
      when repository_size_limit is configured
        when license feature enabled
          size limit is enabled
        when license feature disabled
          size limit is disabled
        when usage ping is enabled
          when usage_ping_features is activated
            size limit is enabled
          when usage_ping_features is disabled
            size limit is disabled
        when usage ping is disabled
          size limit is disabled
  #repository_size_excess
    total_repository_size: 50, size_limit: nil, result: 0
      is expected to eq 0
    total_repository_size: 50, size_limit: 0, result: 0
      is expected to eq 0
    total_repository_size: 50, size_limit: 60, result: 0
      is expected to eq 0
    total_repository_size: 50, size_limit: 50, result: 0
      is expected to eq 0
    total_repository_size: 50, size_limit: 10, result: 40
      is expected to eq 40
  #repository_size_limit column
    support values up to 8 exabytes
  handling import URL
    when project is a mirror
      returns the full URL
    project is inside a fork network
      feature flag is disabled
        is expected to be valid
      the project is the root of the fork network
        is expected to be valid
      the URL is inside the fork network
        is expected to be valid
      the URL is external but the project exists
        raises an error
      the URL is not inside the fork network
        raises an error
  #add_import_job
    forked
      without mirror
        returns nil
      with mirror
        schedules RepositoryUpdateMirrorWorker
  .where_full_path_in
    without any paths
      returns an empty relation
    without any valid paths
      returns an empty relation
    with valid paths
      returns the projects matching the paths
      returns projects regardless of the casing of paths
  #approver_group_ids=
    create approver_groups
  #create_import_state
    is called after save
  #allowed_to_share_with_group?
    for group related project
      with lock_memberships_to_ldap application setting enabled
        is expected not to be allowed to share with group
    personal project
      with lock_memberships_to_ldap application setting enabled
        is expected to be allowed to share with group
  #ancestor_marked_for_deletion
    delayed deletion feature is not available
      the parent namespace has been marked for deletion
        returns nil
    delayed deletion feature is available
      the parent namespace has been marked for deletion
        returns the parent namespace
      project or its parent group has not been marked for deletion
        returns nil
      ordering
        returns the first group that is marked for deletion, up its ancestry chain
  #adjourned_deletion?
    licensed?: true, feature_enabled_on_group?: true, adjourned_period: 0, result: false
      is expected to equal false
    licensed?: true, feature_enabled_on_group?: true, adjourned_period: 1, result: true
      is expected to equal true
    licensed?: true, feature_enabled_on_group?: false, adjourned_period: 0, result: false
      is expected to equal false
    licensed?: true, feature_enabled_on_group?: false, adjourned_period: 1, result: false
      is expected to equal false
    licensed?: false, feature_enabled_on_group?: true, adjourned_period: 0, result: false
      is expected to equal false
    licensed?: false, feature_enabled_on_group?: true, adjourned_period: 1, result: false
      is expected to equal false
    licensed?: false, feature_enabled_on_group?: false, adjourned_period: 0, result: false
      is expected to equal false
    licensed?: false, feature_enabled_on_group?: false, adjourned_period: 1, result: false
      is expected to equal false
    when project belongs to user namespace
      deletes immediately
  calculate template repositories
    counts instance level templates
    counts group level templates
  #license_compliance
    is expected to be an instance of SCA::LicenseCompliance
  #template_source?
    when project is not template source
      returns false
    instance-level custom project templates
      returns true
    group-level custom project templates
      returns true
  #remove_import_data
    when mirror
      does not remove import data
  #add_template_export_job
    starts project template export job
  #prevent_merge_without_jira_issue?
    feature_available: true, prevent_merge: true, result: true
      is expected to equal true
    feature_available: true, prevent_merge: false, result: false
      is expected to equal false
    feature_available: false, prevent_merge: true, result: false
      is expected to equal false
    feature_available: false, prevent_merge: false, result: false
      is expected to equal false
  indexing updates in Elasticsearch
    on update
      when updating the visibility_level
        triggers ElasticAssociationIndexerWorker to update issues, merge_requests and notes
        ensures all visibility_level updates are correctly applied in issue searches
        ensures all visibility_level updates are correctly applied in merge_request searches
      when changing the title
        does not trigger ElasticAssociationIndexerWorker to update issues
  #available_shared_runners
    when CI minutes are available for project
      returns a list of shared runners
    when out of CI minutes for project
      returns a empty list
  #all_available_runners
    when CI minutes are available for project
      returns a list with all runners
    when out of CI minutes for project
      returns a list with specific runners
  #force_cost_factor?
    on gitlab.com
      when public
        when ci_minutes_public_project_cost_factor is enabled
          when in a namespace created after 17 July, 2021
            returns true
          when in a namespace created before 17 July, 2021
            returns false
        when ci_minutes_public_project_cost_factor is disabled
          returns false
      when not public
        returns false
    when not on gitlab.com
      returns false
  #upstream_projects
    returns the upstream projects
  #upstream_projects_count
    returns the upstream projects count
  #downstream_projects
    returns the downstream projects
  #downstream_projects_count
    returns the downstream projects count
  #vulnerability_report_rule
    with vulnerability report rule
      is expected to eql #<ApprovalProjectRule id: 24, created_at: "2021-10-13 18:25:51.061502098 +0000", updated_at: "2021-10...bilities_allowed: 0, severity_levels: ["unknown", "high", "critical"], report_type: "vulnerability">
    without vulnerability report rule
      is expected to be nil
    with multiple rules
      is expected to eql #<ApprovalProjectRule id: 27, created_at: "2021-10-13 18:25:51.689052838 +0000", updated_at: "2021-10...bilities_allowed: 0, severity_levels: ["unknown", "high", "critical"], report_type: "vulnerability">
  #visible_approval_rules
    is expected not to include #<ApprovalProjectRule id: 28, created_at: "2021-10-13 18:25:51.893430635 +0000", updated_at: "2021-10...abilities_allowed: 0, severity_levels: ["unknown", "high", "critical"], report_type: "scan_finding">

Gitlab::Elastic::ProjectSearchResults
  initialize with empty ref
    is expected to eq #<Project id:326 namespace1254/project1278>>
    is expected to eq "master"
    is expected to eq "hello world"
  initialize with ref
    is expected to eq #<Project id:326 namespace1254/project1278>>
    is expected to eq "refs/heads/test"
    is expected to eq "hello world"
  search
    returns correct amounts
    visibility checks
      shows wiki for guests
    filtering
      issues
        state not provided
          returns opened and closed results
        all state
          returns opened and closed results
        closed state
          returns only closed results
        opened state
          returns only opened results
        unsupported state
          returns only opened results
        filter not provided (all behavior)
          returns confidential and not confidential results
        confidential filter
          returns only confidential results
        not confidential filter
          returns not confidential results
      merge_requests
        state not provided
          returns opened and closed results
        all state
          returns opened and closed results
        closed state
          returns only closed results
        opened state
          returns only opened results
        unsupported state
          returns only opened results
  confidential issues
    when the user is non-member
      does not list project confidential issues for non project members
    when the member is guest
      does not list project confidential issues for project members with guest role
    when the user is the author
      lists project confidential issues
    when the user is the assignee
      lists project confidential issues for assignee
    when the user is a developer
      lists project confidential issues
    when the user is admin
      when admin mode is enabled
        lists all project issues
      when admin mode is disabled
        does not list project confidential issues
  query performance
    for scope notes
      makes 1 Elasticsearch query
    for scope blobs
      makes 1 Elasticsearch query
    for scope wiki_blobs
      makes 1 Elasticsearch query
    for scope commits
      makes 1 Elasticsearch query
    for scope issues
      makes 1 Elasticsearch query
    for scope merge_requests
      makes 1 Elasticsearch query
    for scope milestones
      makes 1 Elasticsearch query
    for scope notes
      makes count query
    for scope blobs
      makes count query
    for scope wiki_blobs
      makes count query
    for scope commits
      makes count query
    for scope issues
      makes count query
    for scope merge_requests
      makes count query
    for scope milestones
      makes count query

MergeRequest
  associations
    is expected to have many approvals dependent => delete_all
    is expected to have many approvers dependent => delete_all
    is expected to have many approver_users through approvers
    is expected to have many approver_groups dependent => delete_all
    is expected to have many approved_by_users
    is expected to have one merge_train
    is expected to have many approval_rules
    is expected to have many approval_merge_request_rule_sources through approval_rules
    is expected to have many approval_project_rules through approval_merge_request_rule_sources
    is expected to have many status_check_responses class_name => MergeRequests::StatusCheckResponse inverse_of => merge_request
    approval_rules association
      #applicable_to_branch
        when there are no associated source rules
          behaves like with applicable rules to specified branch
            is expected to eq [#<ApprovalMergeRequestRule id: 1, created_at: "2021-10-13 18:28:38.225003965 +0000", updated_at: "20...efault-1", rule_type: "regular", report_type: nil, section: nil, modified_from_project_rule: false>]
        when there are associated source rules
          and rule is not overridden
            and there are no associated protected branches to source rule
              behaves like with applicable rules to specified branch
                is expected to eq [#<ApprovalMergeRequestRule id: 2, created_at: "2021-10-13 18:28:38.815595999 +0000", updated_at: "20...fault-26", rule_type: "regular", report_type: nil, section: nil, modified_from_project_rule: false>]
            and there are associated protected branches to source rule
              and branch matches
                behaves like with applicable rules to specified branch
                  is expected to eq [#<ApprovalMergeRequestRule id: 3, created_at: "2021-10-13 18:28:39.585090272 +0000", updated_at: "20...fault-27", rule_type: "regular", report_type: nil, section: nil, modified_from_project_rule: false>]
              and branch does not match anything
                is expected to be empty
          and rule is overridden
            behaves like with applicable rules to specified branch
              is expected to eq [#<ApprovalMergeRequestRule id: 5, created_at: "2021-10-13 18:28:41.272534163 +0000", updated_at: "20...dden Rule", rule_type: "regular", report_type: nil, section: nil, modified_from_project_rule: true>]
    #merge_requests_author_approval?
      when project lacks a target_project relation
        returns false
      when project has a target_project relation
        accesses the value from the target_project
    #merge_requests_disable_committers_approval?
      when project lacks a target_project relation
        returns false
      when project has a target_project relation
        accesses the value from the target_project
  behaves like an editable mentionable with EE-specific mentions
    creates new cross-reference notes when the mentionable text is edited
    behaves like a mentionable with EE-specific mentions
      extracts references from its reference property
      creates cross-reference notes
  #allows_multiple_assignees?
    does not allow multiple assignees without license
    allows multiple assignees when licensed
  #allows_multiple_reviewers?
    returns false without license
    returns true when licensed
  #participants
    with approval rule
      returns only the author as a participant
  #has_denied_policies?
    without existing pipeline
      is expected to be falsey
    with existing pipeline
      without license_scanning report
        is expected to be falsey
      with license_scanning report
        without denied policy
          is expected to be falsey
        with allowed policy
          is expected to be falsey
        with denied policy
          is expected to be truthy
          with disabled licensed feature
            is expected to be falsey
          with License-Check enabled
            when rule is not approved
              is expected to be truthy
            when rule is approved
              is expected to be falsey
  #enabled_reports
    report_type: :sast, with_reports: :with_sast_reports, feature: :sast
      when head pipeline has reports
        is expected to be truthy
      when head pipeline does not have reports
        is expected to be falsy
    report_type: :container_scanning, with_reports: :with_container_scanning_reports, feature: :container_scanning
      when head pipeline has reports
        is expected to be truthy
      when head pipeline does not have reports
        is expected to be falsy
    report_type: :dast, with_reports: :with_dast_reports, feature: :dast
      when head pipeline has reports
        is expected to be truthy
      when head pipeline does not have reports
        is expected to be falsy
    report_type: :dependency_scanning, with_reports: :with_dependency_scanning_reports, feature: :dependency_scanning
      when head pipeline has reports
        is expected to be truthy
      when head pipeline does not have reports
        is expected to be falsy
    report_type: :license_scanning, with_reports: :with_license_scanning_reports, feature: :license_scanning
      when head pipeline has reports
        is expected to be truthy
      when head pipeline does not have reports
        is expected to be falsy
    report_type: :coverage_fuzzing, with_reports: :with_coverage_fuzzing_reports, feature: :coverage_fuzzing
      when head pipeline has reports
        is expected to be truthy
      when head pipeline does not have reports
        is expected to be falsy
    report_type: :secret_detection, with_reports: :with_secret_detection_reports, feature: :secret_detection
      when head pipeline has reports
        is expected to be truthy
      when head pipeline does not have reports
        is expected to be falsy
    report_type: :api_fuzzing, with_reports: :with_api_fuzzing_reports, feature: :api_fuzzing
      when head pipeline has reports
        is expected to be truthy
      when head pipeline does not have reports
        is expected to be falsy
  #approvals_before_merge
    license_value: true, db_value: 5, expected: 5
      is expected to eq 5
    license_value: true, db_value: nil, expected: nil
      is expected to eq nil
    license_value: false, db_value: 5, expected: nil
      is expected to eq nil
    license_value: false, db_value: nil, expected: nil
      is expected to eq nil
  #has_security_reports?
    when head pipeline has security reports
      is expected to be truthy
    when head pipeline does not have security reports
      is expected to be falsey
  #has_license_scanning_reports?
    when head pipeline has license scanning reports
      is expected to be truthy
    when head pipeline does not have license scanning reports
      is expected to be falsey
  #has_dependency_scanning_reports?
    when head pipeline has dependency scannning reports
      is expected to be truthy
    when head pipeline does not have dependency scanning reports
      is expected to be falsey
  #has_container_scanning_reports?
    when head pipeline has container scanning reports
      is expected to be truthy
    when head pipeline does not have container scanning reports
      is expected to be falsey
  #has_dast_reports?
    when head pipeline has dast reports
      is expected to be truthy
    when pipeline ran for an older commit than the branch head
      is expected to be falsey
    when head pipeline does not have dast reports
      is expected to be falsey
  #has_metrics_reports?
    when head pipeline has metrics reports
      is expected to be truthy
    when head pipeline does not have license scanning reports
      is expected to be falsey
  #has_coverage_fuzzing_reports?
    when head pipeline has coverage fuzzing reports
      is expected to be truthy
    when head pipeline does not have coverage fuzzing reports
      is expected to be falsey
  #has_api_fuzzing_reports?
    when head pipeline has coverage fuzzing reports
      is expected to be truthy
    when head pipeline does not have coverage fuzzing reports
      is expected to be falsey
  #calculate_reactive_cache with current_user
    when given a known service class name
      does not raises a NameError exception
  #compare_container_scanning_reports
    when head pipeline has container scanning reports
      when reactive cache worker is parsing asynchronously
        returns status
      when reactive cache worker is inline
        returns status and data
        when cached results is not latest
          raises and InvalidateReactiveCache error
  #compare_secret_detection_reports
    when head pipeline has secret detection reports
      when reactive cache worker is parsing asynchronously
        returns status
      when reactive cache worker is inline
        returns status and data
        when cached results is not latest
          raises and InvalidateReactiveCache error
  #compare_sast_reports
    when head pipeline has sast reports
      when reactive cache worker is parsing asynchronously
        returns status
      when reactive cache worker is inline
        returns status and data
        when cached results is not latest
          raises and InvalidateReactiveCache error
  #compare_license_scanning_reports
    when head pipeline has license scanning reports
      when reactive cache worker is parsing asynchronously
        returns status
      when reactive cache worker is inline
        returns status and data
        cache key includes sofware license policies
          returns key with license information
        when cached results is not latest
          raises and InvalidateReactiveCache error
    when head pipeline does not have license scanning reports
      returns status and error message
    when a license scan report is produced from the head pipeline
      pipeline_status: :blocked, build_types: [:license_scan_v2_1], expected_status: :parsed
        is expected to eq :parsed
      pipeline_status: :blocked, build_types: [:container_scanning], expected_status: :error
        is expected to eq :error
      pipeline_status: :blocked, build_types: [:license_scan_v2_1, :container_scanning], expected_status: :parsed
        is expected to eq :parsed
      pipeline_status: :blocked, build_types: [], expected_status: :error
        is expected to eq :error
      pipeline_status: :failed, build_types: [:container_scanning], expected_status: :error
        is expected to eq :error
      pipeline_status: :failed, build_types: [:license_scan_v2_1], expected_status: :parsed
        is expected to eq :parsed
      pipeline_status: :failed, build_types: [:license_scan_v2_1, :container_scanning], expected_status: :parsed
        is expected to eq :parsed
      pipeline_status: :failed, build_types: [], expected_status: :error
        is expected to eq :error
      pipeline_status: :running, build_types: [:container_scanning], expected_status: :error
        is expected to eq :error
      pipeline_status: :running, build_types: [:license_scan_v2_1], expected_status: :parsed
        is expected to eq :parsed
      pipeline_status: :running, build_types: [:license_scan_v2_1, :container_scanning], expected_status: :parsed
        is expected to eq :parsed
      pipeline_status: :running, build_types: [], expected_status: :error
        is expected to eq :error
      pipeline_status: :success, build_types: [:container_scanning], expected_status: :error
        is expected to eq :error
      pipeline_status: :success, build_types: [:license_scan_v2_1], expected_status: :parsed
        is expected to eq :parsed
      pipeline_status: :success, build_types: [:license_scan_v2_1, :container_scanning], expected_status: :parsed
        is expected to eq :parsed
      pipeline_status: :success, build_types: [], expected_status: :error
        is expected to eq :error
  #compare_metrics_reports
    when head pipeline has metrics reports
      when reactive cache worker is parsing asynchronously
        returns status
      when reactive cache worker is inline
        returns status and data
        when cached results is not latest
          raises and InvalidateReactiveCache error
    when head pipeline does not have metrics reports
      returns status and error message
  #compare_coverage_fuzzing_reports
    when head pipeline has coverage fuzzing reports
      when reactive cache worker is parsing asynchronously
        returns status
      when reactive cache worker is inline
        returns status and data
        when cached results is not latest
          raises and InvalidateReactiveCache error
  #compare_api_fuzzing_reports
    when head pipeline has api fuzzing reports
      when reactive cache worker is parsing asynchronously
        returns status
      when reactive cache worker is inline
        returns status and data
        when cached results is not latest
          raises an InvalidateReactiveCache error
  #approver_group_ids=
    create approver_groups
  #predefined_variables
    when merge request has approver feature
      without any rules
        includes variable CI_MERGE_REQUEST_APPROVED=true
      with a rule
        that has been approved
          includes variable CI_MERGE_REQUEST_APPROVED=true
        that has not been approved
          does not include variable CI_MERGE_REQUEST_APPROVED
    when merge request does not have approver feature
      does not include variable CI_MERGE_REQUEST_APPROVED
  #mergeable?
    when using approvals
      return false if not approved
      return true if approved
    when running license_scanning ci job
      when merge request has denied policies
        when approval is required and granted
          is not mergeable
        when is not approved
          is not mergeable
      when merge request has no denied policies
        is mergeable
  #on_train?
    when the merge request is on a merge train
      is expected to be truthy
    when the merge request was on a merge train
      is expected to be falsy
    when the merge request is not on a merge train
      is expected to be falsy
  review time sorting
    orders by first_comment_at or first_approved_at whatever is earlier
  #missing_security_scan_types
    when there is no head pipeline
      when there is no base pipeline
        is expected to be empty
      when there is a base pipeline
        when there is no security scan for the base pipeline
          is expected to be empty
        when there are security scans for the base_pipeline
          is expected to be empty
    when there is a head pipeline
      when there is no base pipeline
        is expected to be empty
      when there is a base pipeline
        when the head pipeline does not have security scans
          when the base pipeline does not have security scans
            is expected to be empty
          when the base pipeline has security scans
            is expected to eq ["sast"]
        when the head pipeline has security scans
          when the base pipeline does not have security scans
            is expected to be empty
          when the base pipeline has security scans
            when there are no missing security scans for the head pipeline
              is expected to be empty
            when there are missing security scans for the head pipeline
              is expected to eq ["sast"]
              when there are multiple scans for the same type for base pipeline
                is expected to eq ["sast"]
  #security_reports_up_to_date?
    when the target branch security reports are up to date
      is expected to equal true
    when the target branch security reports are out of date
      is expected to equal false

Elastic::ProcessBookkeepingService
  .shard_number
    returns correct shard number
  .track
    enqueues a record
    enqueues a set of unique records
    orders items based on when they were added and moves them to the back of the queue if they were added again
    enqueues 10 identical records as 1 entry
    deduplicates across multiple inserts
  .queue_size
    reports the queue size
  .queued_items
    reports queued items
  .clear_tracking!
    removes all entries from the queue
  .maintain_indexed_associations
    calls track! for each associated object
    correctly scopes associated note objects to not include system notes
  #execute
    submits a batch of documents
    returns the number of documents processed
    returns 0 without writing to the index when there are no documents
    retries failed documents
    discards malformed documents
    fails, preserving documents, when processing fails with an exception
    limit is less than refs count
      processes only up to limit
    N+1 queries
      does not have N+1 queries for projects
      does not have N+1 queries for notes
      does not have N+1 queries for issues
      does not have N+1 queries for merge_requests

Issues::UpdateService
  execute
    refresh epic dates
      updating milestone
        calls UpdateDatesService
      updating iteration
        when issue does not already have an iteration
          calls NotificationService#changed_iteration_issue
        when issue already has an iteration
          setting to nil
            calls NotificationService#removed_iteration_issue
          setting to IssuableFinder::Params::NONE
            calls NotificationService#removed_iteration_issue
            removes the iteration properly
          setting to another iteration
            calls NotificationService#changed_iteration_issue
      updating weight
        when weight is integer
          updates to the exact value
        when weight is float
          rounds the value down
        when weight is zero
          sets the value to zero
        when weight is a string
          sets the value to 0
      behaves like updating issuable health status
        updating health_status
          when feature is not available
            does not update issue health status
          when feature is available
            when user has reporter permissions
              updates issuable with given health_status
            when user does not have permissions
              does not update issuable status
      updating other fields
        does not call UpdateDatesService
    assigning iteration
      group iterations
        behaves like creates iteration resource event
          creates a system note
          does not create a iteration change event
      project iterations
        behaves like creates iteration resource event
          creates a system note
          does not create a iteration change event
    changing issue_type
      from issue to incident
        behaves like creates an SLA
          is expected to be present
        system note fails to be created
          behaves like creates an SLA
            is expected to be present
      from incident to issue
        does not remove the SLA or create a new one
      from issue to restricted issue types
        with permissions
          changes the type
          does not create or remove an SLA
        without sufficient permissions
          excludes the issue type param
    assigning epic
      when a user does not have permissions to assign an epic
        raises an exception
      when a user has permissions to assign an epic
        when EpicIssues::CreateService returns failure
          does not send usage data for added or changed epic action
        when issue does not belong to an epic yet
          assigns an issue to the provided epic
          calls EpicIssues::CreateService
          tracks usage data for added to epic action
        when issue belongs to another epic
          assigns the issue passed to the provided epic
          calls EpicIssues::CreateService
          tracks usage data for changed epic action
        when updating issue epic and milestone and assignee attributes
          assigns the issue passed to the provided epic
          when milestone and epic attributes are changed from description
            assigns the issue passed to the provided epic
          when assigning epic raises an exception
            assigns the issue passed to the provided epic
    removing epic
      when a user has permissions to assign an epic
        when issue does not belong to an epic yet
          does not do anything
          does not send usage data for removed epic action
        when issue belongs to an epic
          unassigns the epic
          calls EpicIssues::DestroyService
          tracks usage data for removed from epic action
          but EpicIssues::DestroyService returns failure
            does not send usage data for removed epic action
    behaves like existing issuable with scoped labels
      when scoped labels are available
        when using label_ids parameter
          adds only last selected exclusive scoped label
        when using label_ids parameter
          adds only last selected exclusive scoped label
        when only removing labels
          preserves multiple exclusive scoped labels
      when scoped labels are not available
        adds all scoped labels
    behaves like issue with epic_id parameter
      when epic_id does not exist
        raises an exception
      when epic_id is 0
        does not assign any epic
      when user can not add issues to the epic
        raises an exception
        does not send usage data for added epic action
      when user can add issues to the epic
        when a project is a direct child of the epic group
          creates epic issue link
          calls EpicIssues::CreateService
          tracks usage data for added to epic action
        when epic param is also present
          when epic_id belongs to another valid epic
            creates epic issue link based on the epic param
          when epic_id is empty
            creates epic issue link based on the epic param
        when a project is from a subgroup of the epic group
          creates epic issue link
          tracks usage data for added to epic action
    when epic_id is nil
      removes epic issue link
      calls EpicIssues::DestroyService
    promoting to epic
      when promote_to_epic param is present
        promotes issue to epic
      when promote_to_epic param is not present
        does not promote issue to epic
    publish to status page
      when update succeeds
        triggers status page publish
      when closing
        triggers status page publish
      when reopening
        triggers status page publish
      when update fails
        does not trigger status page publish service
    sync Requirement work item with Requirement object
      if there is an associated requirement
        does not update the unrelated field
        updates the synced requirement with title and/or description
        when the issue title is very long
          behaves like does not persist any changes
            does not update the issue
            does not update the requirement
        behaves like keeps issue and its requirement in sync
          keeps title and description in sync
        if update of issue fails
          behaves like keeps issue and its requirement in sync
            keeps title and description in sync
          behaves like does not persist any changes
            does not update the issue
            does not update the requirement
        if update of issue succeeds but update of requirement fails
          when requirement is not valid
            adds an informative sync error to issue
            behaves like keeps issue and its requirement in sync
              keeps title and description in sync
            behaves like does not persist any changes
              does not update the issue
              does not update the requirement
          if requirement is valid but still does not save
            adds a helpful log
        if the issue is also marked as spam
          only shows the spam error
          behaves like keeps issue and its requirement in sync
            keeps title and description in sync
          behaves like does not persist any changes
            does not update the issue
            does not update the requirement
      if there is no associated requirement
        does not call the RequirementsManagement::UpdateRequirementService

EpicLinks::CreateService
  #execute
    when subepics feature is disabled
      returns an error
      no relationship is created
    when subepics feature is enabled
      when an error occurs
        when a single epic is given
          when a user does not have permissions to add an epic
            returns an error
            no relationship is created
          when a user has permissions to add an epic
            when an epic from another group is given
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
              returns an error
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
              no relationship is created
            when hierarchy is cyclic
              when given child epic is the same as given parent
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
                returns an error
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
                no relationship is created
              when given child epic is parent of the given parent
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
                returns an error
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
                no relationship is created
              when new child epic is an ancestor of the given parent
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
                returns an error
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
                no relationship is created
            when adding an epic that is already a child of the parent epic
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
              returns an error
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
              no relationship is created
            when adding to an Epic that is already at maximum depth
              returns an error
              no relationship is created
            when total depth after adding would exceed depth limit
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
              returns an error
DEPRECATION WARNING: ActiveModel::Errors#values is deprecated and will be removed in Rails 6.2.

To achieve the same use:

  errors.map { |error| error.message } (called from create_single_link at /builds/gitlab-org/gitlab/ee/app/services/epic_links/create_service.rb:30)
              no relationship is created
        when multiple epics are given
          when a user dos not have permissions to add an epic
            returns an error
            no relationship is created
          when a user has permissions to add an epic
            when adding epics that are already a child of the parent epic
              returns an error
              no relationship is created
            when total depth after adding would exceed limit
              returns an error
              no relationship is created
            when an epic from a another group is given
              returns an error
              no relationship is created
            when hierarchy is cyclic
              when given child epic is the same as given parent
                returns an error
                no relationship is created
              when given child epic is parent of the given parent
                returns an error
                no relationship is created
            when the reference list is empty
              returns an error
              no relationship is created
            when there are invalid references
              adds only valid references
              returns error status
      when everything is ok
        when a correct reference is given
          creates a new relationship and updates epic
          moves the new child epic to the top and moves the existing ones down
          returns success status
          creates system notes
        when an epic from a subgroup is given
          creates a new relationship and updates epic
          moves the new child epic to the top and moves the existing ones down
          returns success status
          creates system notes
        when multiple valid epics are given
          creates new relationships
          creates system notes
          returns success status
          avoids un-necessary database queries
        when at least one epic is still not assigned to the parent epic
          creates new relationships
          creates system notes
          returns success status
        when adding an Epic that has existing children
          when Epic to add has more than 5 children
            creates a new relationship and updates epic
            moves the new child epic to the top and moves the existing ones down
            returns success status
            creates system notes
        when an epic is already assigned to another epic
          creates a new relationship and updates epic
          moves the new child epic to the top and moves the existing ones down
          returns success status
          creates system notes

Ci::Pipeline
  associations
    is expected to have many security_scans class_name => Security::Scan
    is expected to have many security_findings class_name => Security::Finding through security_scans source => findings
    is expected to have many downstream_bridges
    is expected to have many vulnerability_findings class_name => Vulnerabilities::Finding through vulnerabilities_finding_pipelines
    is expected to have many vulnerabilities_finding_pipelines class_name => Vulnerabilities::FindingPipeline
    is expected to have one dast_profiles_pipeline class_name => Dast::ProfilesPipeline
    is expected to have one dast_profile class_name => Dast::Profile through dast_profiles_pipeline
  .failure_reasons
    contains failure reasons about exceeded limits
  #batch_lookup_report_artifact_for_file_type
    with security report artifact
      when feature is available
        returns the dependency_scanning artifact
      when feature is not available
        doesn't return the dependency_scanning artifact
    with license scanning artifact
      when feature is available
        returns the license_scanning artifact
      when feature is not available
        doesn't return the license_scanning artifact
    with browser performance artifact
      when feature is available
        returns the browser_performance artifact
      when feature is not available
        doesn't return the browser_performance artifact
    with load performance artifact
      when feature is available
        returns the load_performance artifact
      when feature is not available
        doesn't return the load_performance artifact
  #expose_license_scanning_data?
    is expected to be truthy
  #security_reports
    when pipeline has multiple builds with security reports
      assigns pipeline to the reports
      returns security reports with collected data grouped as expected
      when builds are retried
        does not take retried builds into account
      when the `report_types` parameter is provided
        returns only the reports which are requested
    when pipeline does not have any builds with security reports
      returns empty security reports
  ::Security::StoreScansWorker
    when pipeline is succeeded
      behaves like storing the security scans
        when the security scans can be stored for the pipeline
          schedules store security scans job
        when the security scans can not be stored for the pipeline
          does not schedule store security scans job
    when pipeline is dropped
      behaves like storing the security scans
        when the security scans can be stored for the pipeline
          schedules store security scans job
        when the security scans can not be stored for the pipeline
          does not schedule store security scans job
    when pipeline is skipped
      behaves like storing the security scans
        when the security scans can be stored for the pipeline
          schedules store security scans job
        when the security scans can not be stored for the pipeline
          does not schedule store security scans job
    when pipeline is canceled
      behaves like storing the security scans
        when the security scans can be stored for the pipeline
          schedules store security scans job
        when the security scans can not be stored for the pipeline
          does not schedule store security scans job
  #license_scanning_reports
    when pipeline has multiple builds with license scanning reports
      returns a license scanning report with collected data
      when builds are retried
        does not take retried builds into account
    when pipeline does not have any builds with license scanning reports
      returns an empty license scanning report
  #dependency_list_reports
    when pipeline has a build with dependency list reports
      returns a dependency list report with collected data
      when builds are retried
        does not take retried builds into account
    when pipeline does not have any builds with dependency_list reports
      returns an empty dependency_list report
  #metrics_report
    when pipeline has multiple builds with metrics reports
      returns a metrics report with collected data
    when pipeline has multiple builds with metrics reports that are retried
      does not take retried builds into account
    when pipeline does not have any builds with metrics reports
      returns an empty metrics report
  state machine transitions
    on pipeline complete
      from waiting_for_resource
        schedules Ci::SyncReportsToReportApprovalRulesWorker
      from preparing
        schedules Ci::SyncReportsToReportApprovalRulesWorker
      from pending
        schedules Ci::SyncReportsToReportApprovalRulesWorker
      from running
        schedules Ci::SyncReportsToReportApprovalRulesWorker
    when pipeline has downstream bridges
      when transitioning to success
        schedules the pipeline bridge worker
      when transitioning to blocked
        schedules the pipeline bridge worker
    when pipeline project has downstream subscriptions
      when pipeline runs on a tag
        when feature is not available
          does not schedule the trigger downstream subscriptions worker
        when feature is available
          schedules the trigger downstream subscriptions worker
  #latest_merged_result_pipeline?
    is expected to be truthy
    when pipeline is not merge request pipeline
      is expected to be falsy
    when source sha is outdated
      is expected to be falsy
    when target sha is outdated
      is expected to be falsy
  #retryable?
    with pipeline for merged results
      is expected to equal true
  #merge_train_pipeline?
    is expected to be truthy
    when ref is merge ref
      is expected to be falsy
  #merge_request_event_type
    when pipeline is merge train pipeline
      is expected to eq :merge_train
    when pipeline is merge request pipeline
      is expected to eq :merged_result
    when pipeline is detached merge request pipeline
      is expected to eq :detached
  #latest_failed_security_builds
    is expected to contain exactly #<Ci::Build status: "failed", finished_at: "2021-10-13 08:53:29.000000000 +0000", trace: nil, created...resource_at: nil, processed: false, scheduling_type: "stage", id: 197, stage_id: 161, tag_list: nil>
  #license_scan_completed?
    pipeline_status: :blocked, build_types: [:container_scanning], expected_status: false
      is expected to eq false
    pipeline_status: :blocked, build_types: [:cluster_image_scanning], expected_status: false
      is expected to eq false
    pipeline_status: :blocked, build_types: [:license_scan_v2_1, :container_scanning], expected_status: true
      is expected to eq true
    pipeline_status: :blocked, build_types: [:license_scan_v2_1], expected_status: true
      is expected to eq true
    pipeline_status: :blocked, build_types: [], expected_status: false
      is expected to eq false
    pipeline_status: :failed, build_types: [:container_scanning], expected_status: false
      is expected to eq false
    pipeline_status: :failed, build_types: [:cluster_image_scanning], expected_status: false
      is expected to eq false
    pipeline_status: :failed, build_types: [:license_scan_v2_1, :container_scanning], expected_status: true
      is expected to eq true
    pipeline_status: :failed, build_types: [:license_scan_v2_1], expected_status: true
      is expected to eq true
    pipeline_status: :failed, build_types: [], expected_status: false
      is expected to eq false
    pipeline_status: :running, build_types: [:container_scanning], expected_status: false
      is expected to eq false
    pipeline_status: :running, build_types: [:cluster_image_scanning], expected_status: false
      is expected to eq false
    pipeline_status: :running, build_types: [:license_scan_v2_1, :container_scanning], expected_status: true
      is expected to eq true
    pipeline_status: :running, build_types: [:license_scan_v2_1], expected_status: true
      is expected to eq true
    pipeline_status: :running, build_types: [], expected_status: false
      is expected to eq false
    pipeline_status: :success, build_types: [:container_scanning], expected_status: false
      is expected to eq false
    pipeline_status: :success, build_types: [:cluster_image_scanning], expected_status: false
      is expected to eq false
    pipeline_status: :success, build_types: [:license_scan_v2_1, :container_scanning], expected_status: true
      is expected to eq true
    pipeline_status: :success, build_types: [:license_scan_v2_1], expected_status: true
      is expected to eq true
    pipeline_status: :success, build_types: [], expected_status: false
      is expected to eq false
  #can_store_security_reports?
    when the security reports can not be stored for the project
      when the pipeline does not have security reports
        is expected to be falsy
      when the pipeline has security reports
        is expected to be falsy
    when the security reports can be stored for the project
      when the pipeline does not have security reports
        is expected to be falsy
      when the pipeline has security reports
        is expected to be truthy
  #has_security_findings?
    when the pipeline has security_findings
      is expected to be truthy
    when the pipeline does not have security_findings
      is expected to be falsey
  #triggered_for_ondemand_dast_scan?
    when the feature flag is enabled
      is expected to be truthy
      when the pipeline only has the correct source
        is expected to be falsey
      when the pipeline only has the correct config_source
        is expected to be falsey
  #needs_touch?
    when pipeline was updated less than 5 minutes ago
      is expected to eq false
    when pipeline was updated more than 5 minutes ago
      is expected to eq true
  #authorized_cluster_agents
    retrieves agent records from the finder and caches the result
    group_authorized_agents feature flag is disabled
      retrieves agent records from the legacy finder and caches the result

Upload
  .replicables_for_current_secondary
    selective_sync_namespaces: nil, selective_sync_shards: nil, factory: [:upload], model_factory: [:project], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: nil, factory: [:upload, :issuable_upload], model_factory: [:project], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: nil, factory: [:upload, :namespace_upload], model_factory: [:group], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: nil, factory: [:upload, :favicon_upload], model_factory: [:appearance], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: :model, factory: [:upload], model_factory: [:project], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: :other, factory: [:upload], model_factory: [:project], is_upload_included: false
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to eq false
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: :model_project, factory: [:upload, :namespace_upload], model_factory: [:group], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: :other, factory: [:upload, :namespace_upload], model_factory: [:group], is_upload_included: false
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to eq false
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: :other, factory: [:upload, :favicon_upload], model_factory: [:appearance], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :model_parent, selective_sync_shards: nil, factory: [:upload], model_factory: [:project], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :model_parent_parent, selective_sync_shards: nil, factory: [:upload], model_factory: [:project, :in_subgroup], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :model, selective_sync_shards: nil, factory: [:upload, :namespace_upload], model_factory: [:group], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :model_parent, selective_sync_shards: nil, factory: [:upload, :namespace_upload], model_factory: [:group, :nested], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :other, selective_sync_shards: nil, factory: [:upload], model_factory: [:project], is_upload_included: false
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to eq false
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :other, selective_sync_shards: nil, factory: [:upload], model_factory: [:project, :in_subgroup], is_upload_included: false
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to eq false
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :other, selective_sync_shards: nil, factory: [:upload, :namespace_upload], model_factory: [:group], is_upload_included: false
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to eq false
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :other, selective_sync_shards: nil, factory: [:upload, :namespace_upload], model_factory: [:group, :nested], is_upload_included: false
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to eq false
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq false
        when the upload is object stored
          is expected to be falsey
    selective_sync_namespaces: :other, selective_sync_shards: nil, factory: [:upload, :favicon_upload], model_factory: [:appearance], is_upload_included: true
      when sync object storage is enabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to eq true
      when sync object storage is disabled
        when the upload is locally stored
          is expected to eq true
        when the upload is object stored
          is expected to be falsey
  #destroy
    when running in a Geo primary node
      logs an event to the Geo event log

Ci::CompareSecurityReportsService
  vulnerability_finding_signatures: true
    #execute DS
      when head pipeline has dependency scanning reports
        reports new vulnerabilities
      when base and head pipelines have dependency scanning reports
        reports status as parsed
        populates fields based on current_user
        reports fixed vulnerability
        reports fixed dependency scanning vulnerabilities
      when head pipeline has corrupted dependency scanning vulnerability reports
        returns status and error message
        returns status and error message when pipeline is nil
    #execute CS
      when head pipeline has container scanning reports
        reports new and fixed vulnerabilities
      when base and head pipelines have container scanning reports
        populates fields based on current_user
        reports new vulnerability
        reports fixed container scanning vulnerabilities
    #execute DAST
      when head pipeline has DAST reports containing some vulnerabilities
        reports the new vulnerabilities, while not changing the counts of fixed vulnerabilities
      when base and head pipelines have DAST reports containing vulnerabilities
        populates fields based on current_user
        reports new vulnerability
        reports fixed DAST vulnerabilities
    #execute SAST
      when head pipeline has sast reports
        reports new vulnerabilities
      when base and head pipelines have sast reports
        populates fields based on current_user
        reports new vulnerability
        reports fixed sast vulnerabilities
    #execute SECRET DETECTION
      when head pipeline has secret_detection reports
        reports new vulnerabilities
      when base and head pipelines have secret_detection reports
        populates fields based on current_user
        does not report any new vulnerability
        reports fixed secret_detection vulnerabilities
  vulnerability_finding_signatures: false
    #execute DS
      when head pipeline has dependency scanning reports
        reports new vulnerabilities
      when base and head pipelines have dependency scanning reports
        reports status as parsed
        populates fields based on current_user
        reports fixed vulnerability
        reports fixed dependency scanning vulnerabilities
      when head pipeline has corrupted dependency scanning vulnerability reports
        returns status and error message
        returns status and error message when pipeline is nil
    #execute CS
      when head pipeline has container scanning reports
        reports new and fixed vulnerabilities
      when base and head pipelines have container scanning reports
        populates fields based on current_user
        reports new vulnerability
        reports fixed container scanning vulnerabilities
    #execute DAST
      when head pipeline has DAST reports containing some vulnerabilities
        reports the new vulnerabilities, while not changing the counts of fixed vulnerabilities
      when base and head pipelines have DAST reports containing vulnerabilities
        populates fields based on current_user
        reports new vulnerability
        reports fixed DAST vulnerabilities
    #execute SAST
      when head pipeline has sast reports
        reports new vulnerabilities
      when base and head pipelines have sast reports
        populates fields based on current_user
        reports new vulnerability
        reports fixed sast vulnerabilities
    #execute SECRET DETECTION
      when head pipeline has secret_detection reports
        reports new vulnerabilities
      when base and head pipelines have secret_detection reports
        populates fields based on current_user
        does not report any new vulnerability
        reports fixed secret_detection vulnerabilities

Vulnerabilities::DismissService
  with an authorized user with proper permissions
    creates note
    behaves like calls vulnerability statistics utility services in order
      calls the service classes in order
    when the `dismiss_findings` argument is false
      dismisses only vulnerability
    when the `dismiss_findings` argument is not false
      dismisses a vulnerability and its associated findings with correct attributes
    when comment is added
      dismisses a vulnerability and its associated findings with comment
    when the dismissal_reason is added
      dismisses a vulnerability and its associated findings with comment
    when there is a finding dismissal error
      responds with error
    when security dashboard feature is disabled
      raises an "access denied" error
  permissions
    is expected to be allowed for :owner
    is expected to be allowed for :maintainer
    is expected to be allowed for :developer
    is expected to be denied for :auditor
    is expected to be denied for :reporter
    is expected to be denied for :guest
    is expected to be denied for :anonymous
    when admin mode is enabled
      is expected to be allowed for :admin
    when admin mode is disabled
      is expected to be denied for :admin

Issue
  searches issues
  names elasticsearch queries
  searches by iid and scopes to type: issue only
  handles a project missing project_feature
  when limited indexing is on
    when the project is not enabled specifically
      #searchable?
        returns false
    when a project is enabled specifically
      #searchable?
        returns true
    when a group is enabled
      #searchable?
        returns true
  json
    returns json with all needed elements
    when add_namespace_ancestry_ids_to_issues_mapping migration is not done
      returns json without namespace_ancestry
  field length limits
    when there is an elasticsearch_indexed_field_length limit
      truncates to the default plan limit
    when the elasticsearch_indexed_field_length limit is 0
      does not truncate the fields
  behaves like no results when the user cannot read cross project
    returns the record if a single project was passed
    does not return anything when trying to search cross project

Dashboard::Projects::ListService
  #execute
    when passing a project id
      behaves like project found
        returns the project
    when passing a project record
      behaves like project found
        returns the project
    when passing invalid project id
      behaves like project not found
        returns an empty list
    with insufficient access
      behaves like project not found
        returns an empty list
    checking license
      plan: "ultimate", trial: false, expired: false, available: true
        behaves like project found
          returns the project
      plan: "ultimate", trial: false, expired: true, available: true
        behaves like project found
          returns the project
      plan: "ultimate", trial: true, expired: false, available: false
        behaves like project not found
          returns an empty list
      plan: "ultimate", trial: true, expired: true, available: false
        behaves like project not found
          returns an empty list
      plan: "premium", trial: false, expired: false, available: true
        behaves like project found
          returns the project
      plan: nil, trial: false, expired: false, available: false
        behaves like project not found
          returns an empty list
    checking plans
      check_namespace_plan: true, plan: :gold, available: true
        behaves like project found
          returns the project
        if :include_unavailable option is provided
          behaves like project found
            returns the project
      check_namespace_plan: true, plan: :premium, available: true
        behaves like project found
          returns the project
        if :include_unavailable option is provided
          behaves like project found
            returns the project
      check_namespace_plan: true, plan: :ultimate, available: true
        behaves like project found
          returns the project
        if :include_unavailable option is provided
          behaves like project found
            returns the project
      check_namespace_plan: true, plan: nil, available: false
        behaves like project not found
          returns an empty list
        if :include_unavailable option is provided
          behaves like project found
            returns the project
      check_namespace_plan: false, plan: :gold, available: true
        behaves like project found
          returns the project
        if :include_unavailable option is provided
          behaves like project found
            returns the project
      check_namespace_plan: false, plan: :premium, available: true
        behaves like project found
          returns the project
        if :include_unavailable option is provided
          behaves like project found
            returns the project
      check_namespace_plan: false, plan: :ultimate, available: true
        behaves like project found
          returns the project
        if :include_unavailable option is provided
          behaves like project found
            returns the project
      check_namespace_plan: false, plan: nil, available: true
        behaves like project found
          returns the project
        if :include_unavailable option is provided
          behaves like project found
            returns the project
    checking availability of public projects on GitLab.com
      check_namespace_plan: true, project_visibility: 20, namespace_visibility: 20, available: true
        behaves like project found
          returns the project
      check_namespace_plan: true, project_visibility: 0, namespace_visibility: 20, available: false
        behaves like project not found
          returns an empty list
      check_namespace_plan: true, project_visibility: 20, namespace_visibility: 0, available: false
        behaves like project not found
          returns an empty list
      check_namespace_plan: true, project_visibility: 0, namespace_visibility: 0, available: false
        behaves like project not found
          returns an empty list
      check_namespace_plan: false, project_visibility: 20, namespace_visibility: 20, available: true
        behaves like project found
          returns the project
      check_namespace_plan: false, project_visibility: 0, namespace_visibility: 20, available: true
        behaves like project found
          returns the project
      check_namespace_plan: false, project_visibility: 20, namespace_visibility: 0, available: true
        behaves like project found
          returns the project
      check_namespace_plan: false, project_visibility: 0, namespace_visibility: 0, available: true
        behaves like project found
          returns the project
    when the user is an auditor
      behaves like project found
        returns the project

MergeRequest
  searches merge requests
  names elasticsearch queries
  searches by iid and scopes to type: merge_request only
  returns json with all needed elements
  handles when a project is missing project_feature
  behaves like limited indexing is enabled
    when the project is not enabled specifically
      #searchable?
        returns false
    when a project is enabled specifically
      #searchable?
        returns true
    when a group is enabled
      #searchable?
        returns true
  behaves like no results when the user cannot read cross project
    returns the record if a single project was passed
    does not return anything when trying to search cross project

EE::ProtectedRefAccess
  in ProtectedBranch::MergeAccessLevel
    ProtectedBranch::MergeAccessLevel includes {described_class}
    requires access_level if no user or group is specified
    doesn't require access_level if user specified
    doesn't require access_level if group specified
    with the `protected_refs_for_users` feature disabled
      does not allow to create an ProtectedBranch::MergeAccessLevel with a group
      does not allow to create an ProtectedBranch::MergeAccessLevel with a user
    with the `protected_refs_for_users` feature enabled
      allows creating an ProtectedBranch::MergeAccessLevel with a group
      does not allow to add non member groups
      allows creating an ProtectedBranch::MergeAccessLevel with a user
      does not allow to add non member users
      allows users with access through group
  in ProtectedBranch::PushAccessLevel
    ProtectedBranch::PushAccessLevel includes {described_class}
    requires access_level if no user or group is specified
    doesn't require access_level if user specified
    doesn't require access_level if group specified
    with the `protected_refs_for_users` feature disabled
      does not allow to create an ProtectedBranch::PushAccessLevel with a group
      does not allow to create an ProtectedBranch::PushAccessLevel with a user
    with the `protected_refs_for_users` feature enabled
      allows creating an ProtectedBranch::PushAccessLevel with a group
      does not allow to add non member groups
      allows creating an ProtectedBranch::PushAccessLevel with a user
      does not allow to add non member users
      allows users with access through group
  in ProtectedTag::CreateAccessLevel
    ProtectedTag::CreateAccessLevel includes {described_class}
    requires access_level if no user or group is specified
    doesn't require access_level if user specified
    doesn't require access_level if group specified
    with the `protected_refs_for_users` feature disabled
      does not allow to create an ProtectedTag::CreateAccessLevel with a group
      does not allow to create an ProtectedTag::CreateAccessLevel with a user
    with the `protected_refs_for_users` feature enabled
      allows creating an ProtectedTag::CreateAccessLevel with a group
      does not allow to add non member groups
      allows creating an ProtectedTag::CreateAccessLevel with a user
      does not allow to add non member users
      allows users with access through group

SearchService
  #search_objects
    redacting search results (repository)
      commits
        behaves like it redacts incorrect results
          when allowed
            does nothing
          when disallowed
            redacts results
      blobs
        behaves like it redacts incorrect results
          when allowed
            does nothing
          when disallowed
            redacts results
      wiki blobs
        behaves like it redacts incorrect results
          when allowed
            does nothing
          when disallowed
            redacts results
    redacting search results
      redacts projects the user does not have access to
      redacts issues the user does not have access to
      redacts merge requests the user does not have access to
      redacts milestones the user does not have access to
      redacts notes the user does not have access to
  #projects
    when all projects are accessible
      returns the project
      returns the projects for guests
      handles spaces in the param
      returns nil if projects param is not a String
    when some projects are accessible
      returns only accessible projects
    when no projects are accessible
      returns nil
    when no project_ids are provided
      returns nil
    when the advanced_search_multi_project_select feature is not enabled
      returns nil

Resolvers::EpicsResolver
  with a group
    #resolve
      returns nothing when feature disabled
      finds all epics
      with iid
        finds a specific epic with iid
        does not inflate the complexity
      with iids
        finds a specific epic with iids
        finds multiple epics with iids
        increases the complexity based on child_complexity and number of iids
      within timeframe
        when start_date and end_date are present
          returns epics within timeframe
        when timeframe start and end are present
          returns epics within timeframe
      with state
        lists epics with opened state
        lists epics with closed state
      with search
        filters epics by title
        filters epics by description
        with in param
          returns an error if param search is missing
          filters epics by description only
          filters epics by title only
          filters epics by title and description
        with anonymous user
          with disable_anonymous_search enabled
            returns an error
          with disable_anonymous_search disabled
            filters epics by search term
      with author_username
        filters epics by author
      with label_name
        filters epics by labels
      with my_reaction_emoji
        filters epics by reaction emoji
      with milestone_title
        filters epics by issues milestone
        returns empty result if milestone is not assigned to any epic issues
      with sort
        orders epics by start date in descending order
        orders epics by start date in ascending order
        orders epics by end date in descending order
        orders epics by end date in ascending order
        orders epics by title in descending order
        orders epics by title in ascending order
      with subgroups
        finds only the epics within the group we are looking at
        returns all epics
        does not return subgroup epics when include_descendant_groups is false
        filters by milestones in subgroups
        when the resolved group is a subgroup
          returns only the epics belonging to the subgroup by default
          returns the epics belonging to the ancestor groups when include_ancestor_groups is true
      with partial iids
        returns the expected epics if just the first number of iid is requested
        returns the expected epics if first two numbers of iid are requested
        returns the expected epics if last two numbers of iid are given
        returns the expected epics if exact number of iid is given
    with negated filters
      for label
        is expected to contain exactly #<Epic id:284 group287&2> and #<Epic id:285 group287&3>
      for author
        is expected to contain exactly #<Epic id:283 group287&1> and #<Epic id:285 group287&3>
      for emoji
        is expected to contain exactly #<Epic id:283 group287&1> and #<Epic id:284 group287&2>
  when passing a non existent, batch loaded group
    returns nil without breaking

Ci::PipelineArtifact
  #replicables_for_current_secondary
    selective_sync_namespaces: nil, selective_sync_shards: nil, factory: [:ci_pipeline_artifact], project_factory: [:project], include_expectation: true
      when sync object storage is enabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to eq true
      when sync object storage is disabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: :model, factory: [:ci_pipeline_artifact], project_factory: [:project], include_expectation: true
      when sync object storage is enabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to eq true
      when sync object storage is disabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: :other, factory: [:ci_pipeline_artifact], project_factory: [:project], include_expectation: false
      when sync object storage is enabled
        when the pipeline artifact is locally stored
          is expected to eq false
        when the pipeline artifact is object stored
          is expected to eq false
      when sync object storage is disabled
        when the pipeline artifact is locally stored
          is expected to eq false
        when the pipeline artifact is object stored
          is expected to be falsey
    selective_sync_namespaces: :model_parent, selective_sync_shards: nil, factory: [:ci_pipeline_artifact], project_factory: [:project], include_expectation: true
      when sync object storage is enabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to eq true
      when sync object storage is disabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to be falsey
    selective_sync_namespaces: :model_parent_parent, selective_sync_shards: nil, factory: [:ci_pipeline_artifact], project_factory: [:project, :in_subgroup], include_expectation: true
      when sync object storage is enabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to eq true
      when sync object storage is disabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to be falsey
    selective_sync_namespaces: :other, selective_sync_shards: nil, factory: [:ci_pipeline_artifact], project_factory: [:project], include_expectation: false
      when sync object storage is enabled
        when the pipeline artifact is locally stored
          is expected to eq false
        when the pipeline artifact is object stored
          is expected to eq false
      when sync object storage is disabled
        when the pipeline artifact is locally stored
          is expected to eq false
        when the pipeline artifact is object stored
          is expected to be falsey
    selective_sync_namespaces: :other, selective_sync_shards: nil, factory: [:ci_pipeline_artifact], project_factory: [:project, :in_subgroup], include_expectation: false
      when sync object storage is enabled
        when the pipeline artifact is locally stored
          is expected to eq false
        when the pipeline artifact is object stored
          is expected to eq false
      when sync object storage is disabled
        when the pipeline artifact is locally stored
          is expected to eq false
        when the pipeline artifact is object stored
          is expected to be falsey
    selective_sync_namespaces: nil, selective_sync_shards: nil, factory: [:ci_pipeline_artifact, :expired], project_factory: [:project], include_expectation: true
      when sync object storage is enabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to eq true
      when sync object storage is disabled
        when the pipeline artifact is locally stored
          is expected to eq true
        when the pipeline artifact is object stored
          is expected to be falsey

Projects::Alerting::NotifyService
  #execute
    existing alert with same payload fingerprint
      generic fingerprinting license not enabled
        creates AlertManagement::Alert
        does not increment the existing alert count
      generic fingerprinting license enabled
        does not create AlertManagement::Alert
        increments the existing alert count
        end_time provided for subsequent alert
          does not create AlertManagement::Alert
          resolves the existing alert
    with on-call schedules
      behaves like sends on-call notification if enabled
        with on-call schedules enabled
          behaves like sends on-call notification
            is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
          with escalation policy feature disabled
            behaves like sends on-call notification
              is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
        with on-call schedules disabled
          behaves like does not send on-call notification
            is expected not to receive new(*(any args)) 0 times
      when alert with the same fingerprint already exists
        which is triggered
          behaves like sends on-call notification if enabled
            with on-call schedules enabled
              behaves like sends on-call notification
                is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
              with escalation policy feature disabled
                behaves like sends on-call notification
                  is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
            with on-call schedules disabled
              behaves like does not send on-call notification
                is expected not to receive new(*(any args)) 0 times
        which is acknowledged
          behaves like does not send on-call notification
            is expected not to receive new(*(any args)) 0 times
        which is resolved
          behaves like sends on-call notification if enabled
            with on-call schedules enabled
              behaves like sends on-call notification
                is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
              with escalation policy feature disabled
                behaves like sends on-call notification
                  is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
            with on-call schedules disabled
              behaves like does not send on-call notification
                is expected not to receive new(*(any args)) 0 times
        which is ignored
          behaves like does not send on-call notification
            is expected not to receive new(*(any args)) 0 times
      with resolving payload
        behaves like sends on-call notification if enabled
          with on-call schedules enabled
            behaves like sends on-call notification
              is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
            with escalation policy feature disabled
              behaves like sends on-call notification
                is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
          with on-call schedules disabled
            behaves like does not send on-call notification
              is expected not to receive new(*(any args)) 0 times
        when alert with the same fingerprint already exists
          which is triggered
            behaves like sends on-call notification if enabled
              with on-call schedules enabled
                behaves like sends on-call notification
                  is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
                with escalation policy feature disabled
                  behaves like sends on-call notification
                    is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
              with on-call schedules disabled
                behaves like does not send on-call notification
                  is expected not to receive new(*(any args)) 0 times
          which is acknowledged
            behaves like sends on-call notification if enabled
              with on-call schedules enabled
                behaves like sends on-call notification
                  is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
                with escalation policy feature disabled
                  behaves like sends on-call notification
                    is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
              with on-call schedules disabled
                behaves like does not send on-call notification
                  is expected not to receive new(*(any args)) 0 times
          which is resolved
            behaves like sends on-call notification if enabled
              with on-call schedules enabled
                behaves like sends on-call notification
                  is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
                with escalation policy feature disabled
                  behaves like sends on-call notification
                    is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
              with on-call schedules disabled
                behaves like does not send on-call notification
                  is expected not to receive new(*(any args)) 0 times
          which is ignored
            behaves like sends on-call notification if enabled
              with on-call schedules enabled
                behaves like sends on-call notification
                  is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
                with escalation policy feature disabled
                  behaves like sends on-call notification
                    is expected to receive notify_oncall_users_of_alert([#<User id:1528 @user1489>], having attributes {:class => AlertManagement::Alert(id: integer, created_at: datetime_with_timezone, ...vironment_id: integer, domain: integer), :fingerprint => "b5448ce070e8ff567c4870e9fe0aeba3c0a98330"}) 1 time
              with on-call schedules disabled
                behaves like does not send on-call notification
                  is expected not to receive new(*(any args)) 0 times
      with escalation policies ready
        is expected to receive perform_async(a kind of Integer) 1 time
        behaves like does not send on-call notification
          is expected not to receive new(*(any args)) 0 times
        existing alert with same payload fingerprint
          does not create an escalation
          with resolving payload
            with existing alert escalation
              is expected to change `target.pending_escalations.reload.count` from 2 to 0

GroupsHelper
  #render_setting_to_allow_project_access_token_creation?
    with self-managed
      returns true if group is root
      returns false if group is subgroup
    on .com
      with a free plan
        returns false
      with a paid plan
        returns true if group is root
        returns false if group is subgroup
  #permanent_deletion_date
    returns the sum of the date passed as argument and the deletion_adjourned_period set in application setting
  #remove_group_message
    delayed deletion feature is available
      returns the message related to delayed deletion
      group is already marked for deletion
        returns the message related to permanent deletion
    delayed deletion feature is not available
      returns the message related to permanent deletion
  #immediately_remove_group_message
    returns the message related to immediate deletion
  #show_discover_group_security?
    gitlab_com?: true, user?: true, security_dashboard_feature_available?: true, can_admin_group?: true
      returns the expected value
    gitlab_com?: true, user?: true, security_dashboard_feature_available?: true, can_admin_group?: false
      returns the expected value
    gitlab_com?: true, user?: true, security_dashboard_feature_available?: false, can_admin_group?: true
      returns the expected value
    gitlab_com?: true, user?: true, security_dashboard_feature_available?: false, can_admin_group?: false
      returns the expected value
    gitlab_com?: true, user?: false, security_dashboard_feature_available?: true, can_admin_group?: true
      returns the expected value
    gitlab_com?: true, user?: false, security_dashboard_feature_available?: true, can_admin_group?: false
      returns the expected value
    gitlab_com?: true, user?: false, security_dashboard_feature_available?: false, can_admin_group?: true
      returns the expected value
    gitlab_com?: true, user?: false, security_dashboard_feature_available?: false, can_admin_group?: false
      returns the expected value
    gitlab_com?: false, user?: true, security_dashboard_feature_available?: true, can_admin_group?: true
      returns the expected value
    gitlab_com?: false, user?: true, security_dashboard_feature_available?: true, can_admin_group?: false
      returns the expected value
    gitlab_com?: false, user?: true, security_dashboard_feature_available?: false, can_admin_group?: true
      returns the expected value
    gitlab_com?: false, user?: true, security_dashboard_feature_available?: false, can_admin_group?: false
      returns the expected value
    gitlab_com?: false, user?: false, security_dashboard_feature_available?: true, can_admin_group?: true
      returns the expected value
    gitlab_com?: false, user?: false, security_dashboard_feature_available?: true, can_admin_group?: false
      returns the expected value
    gitlab_com?: false, user?: false, security_dashboard_feature_available?: false, can_admin_group?: true
      returns the expected value
    gitlab_com?: false, user?: false, security_dashboard_feature_available?: false, can_admin_group?: false
      returns the expected value
  #show_group_activity_analytics?
    when feature is not available for group
      returns false
    when current user does not have access to the group
      returns false
    when feature is available and user has access to it
      returns true
  #show_delayed_project_removal_setting?
    licensed?: true, result: true
      is expected to equal true
    licensed?: false, result: false
      is expected to equal false
  #show_product_purchase_success_alert?
    when purchased_product is present
      product: "product", result: true
        is expected to equal true
      product: "", result: false
        is expected to equal false
      product: nil, result: false
        is expected to equal false
    when purchased_product is not present
      is expected to equal false

ApprovalRules::ParamsFilteringService
  #execute
    create
      behaves like assigning_users_and_groups
        user can update approvers
          only assigns eligible users and groups
        user cannot update approvers
          deletes the approval_rules_attributes from params
      empty project approval rule
        adds empty rule
      inapplicable user defined rules
        when multiple_approval_rules feature is available
          adds inapplicable user defined rules
        when multiple_approval_rules feature is not available
          does not add inapplicable user defined rules
      any approver rule
        sets rule type for the rules attributes
      any approver rule from a project rule
        and the project rule has hidden groups
          sets rule type for the rules attributes
    update
      behaves like assigning_users_and_groups
        user can update approvers
          only assigns eligible users and groups
        user cannot update approvers
          deletes the approval_rules_attributes from params
      inapplicable user defined rules
        does not add inapplicable user defined rules
        when reset_approval_rules_to_defaults is true
          when multiple_approval_rules feature is available
            adds inapplicable user defined rules
          when multiple_approval_rules feature is not available
            does not add inapplicable user defined rules
      with remove_hidden_groups being true
        behaves like assigning_users_and_groups
          user can update approvers
            only assigns eligible users and groups
          user cannot update approvers
            deletes the approval_rules_attributes from params

Gitlab::Auth::Ldap::Access
  #allowed?
    LDAP user
Deprecation warning: Net::LDAP::ConnectionRefused will be deprecated. Use Errno::ECONNREFUSED instead.
Deprecation warning: Net::LDAP::ConnectionRefused will be deprecated. Use Errno::ECONNREFUSED instead.
      finds a user by dn first
      finds a user by email if not found by dn
      returns false if user cannot be found
      when exists in LDAP/AD
        user blocked in LDAP/AD
          blocks user in GitLab
          on a read-only instance
            does not block user in GitLab
        user unblocked in LDAP/AD
          unblocks user in GitLab
          on a read-only instance
            does not unblock user in GitLab
      when no longer exist in LDAP/AD
        blocks user in GitLab
        on a read-only instance
          does not block user in GitLab
  #update_user
    email address
      does not update email if email attribute is not set
      does not update the email if the user has the same email in GitLab and in LDAP
      does not update the email if the user has the same email GitLab and in LDAP, but with upper case in LDAP
      when mail is different
        does not update the email when in a read-only GitLab instance
        updates the email if the user email is different
        does not update the name if the user email is different
    name
      does not update name if name attribute is not set
      does not update the name if the user has the same name in GitLab and in LDAP
      when cn is different
        does not update the name when in a read-only GitLab instance
        updates the name if the user name is different
        does not update the email if the user name is different
      when first and last name attributes passed
        does not update the name when in a read-only GitLab instance
        updates the name if the user name is different
        does not update the email if the user name is different
    group memberships
      doesn't continue when there is no `memberOf` param
      when there is `memberof` param
        triggers a sync for all groups found in `memberof` for new users
        doesn't trigger a sync when in a read-only GitLab instance
        doesn't trigger a sync when there are no links for the provider
        does not performs the membership update for existing users
    SSH keys
      adds a SSH key if it is in LDAP but not in gitlab
      adds a SSH key and give it a proper name
      does not add a SSH key if it is invalid
      does not add a SSH key when in a read-only GitLab instance
      user has at least one LDAPKey
        removes a SSH key if it is no longer in LDAP
        removes a SSH key if the ldap attribute was removed
    kerberos identity
      adds a Kerberos identity if it is in Active Directory but not in GitLab
      updates existing Kerberos identity in GitLab if Active Directory has a different one
      does not remove Kerberos identities from GitLab if they are none in the LDAP provider
      does not modify identities in GitLab if they are no kerberos principal in the LDAP provider
      does not add a Kerberos identity when in a read-only GitLab instance
    LDAP entity
      whent external UID changed in the entry
        updates the external UID
        does not update the external UID when in a read-only GitLab instance

ApplicationSettings::UpdateService
  #execute
    common params
      properly updates settings with given params
    with valid params
      returns success params
    with invalid params
      returns error params
    elasticsearch_indexing update
      index creation
        when index does not exist
          creates a new index
        when ES service is not reachable
          does not throw exception
        when modifying a non Advanced Search setting
          does not check index_exists
    repository_size_limit assignment as Bytes
      when param present
        converts from MB to Bytes
      when param not present
        does not update due to invalidity
        assign nil value
      elasticsearch
        limiting namespaces and projects
          namespaces
            creates ElasticsearchIndexedNamespace objects when given elasticsearch_namespace_ids
            deletes ElasticsearchIndexedNamespace objects not in elasticsearch_namespace_ids
            disregards already existing ElasticsearchIndexedNamespace in elasticsearch_namespace_ids
          projects
            creates ElasticsearchIndexedProject objects when given elasticsearch_project_ids
            deletes ElasticsearchIndexedProject objects not in elasticsearch_project_ids
            disregards already existing ElasticsearchIndexedProject in elasticsearch_project_ids
        setting number_of_shards and number_of_replicas
          accepts hash values
          accepts legacy (integer) values
    user cap setting
      when new user cap is set to nil
        when changing new user cap to any number
          does not call ApproveBlockedPendingApprovalUsersWorker
        when leaving new user cap set to nil
          does not call ApproveBlockedPendingApprovalUsersWorker
      when new user cap is set to a number
        when decreasing new user cap
          does not call ApproveBlockedPendingApprovalUsersWorker
        when increasing new user cap
          calls ApproveBlockedPendingApprovalUsersWorker
        when changing user cap to nil
          calls ApproveBlockedPendingApprovalUsersWorker

Vulnerabilities::ResolveService
  with an authorized user with proper permissions
    resolves a vulnerability
    creates note
    behaves like calls vulnerability statistics utility services in order
      calls the service classes in order
    behaves like removes dismissal feedback from associated findings
      when there is no error
        removes dismissal feedback from associated findings
      when there is an error
        does not remove any feedback
        responds with error
    when security dashboard feature is disabled
      raises an "access denied" error
  permissions
    is expected to be allowed for :owner
    is expected to be allowed for :maintainer
    is expected to be allowed for :developer
    is expected to be denied for :auditor
    is expected to be denied for :reporter
    is expected to be denied for :guest
    is expected to be denied for :anonymous
    when admin mode is enabled
      is expected to be allowed for :admin
    when admin mode is disabled
      is expected to be denied for :admin

AlertManagement::NetworkAlertService
  #execute
    with valid payload
      behaves like never-before-seen network alert
        assigns the correct properties
        behaves like creates an alert management alert or errors
          is expected to be success
          creates AlertManagement::Alert
          executes the alert service hooks
          and fails to save
            writes a warning to the log
            behaves like alerts service responds with an error
              is expected to eq :bad_request
        behaves like creates expected system notes for alert
          for new_alert
        behaves like does not send alert notification emails
          is expected not to receive new(*(any args)) 0 times
        behaves like does not process incident issues
          is expected not to receive perform_async(*(any args)) 0 times
      for an existing alert with the same fingerprint
        which is triggered
          behaves like existing network alert
            behaves like adds an alert management alert event
              is expected to be success
              behaves like does not create an alert management alert
                is expected not to change `AlertManagement::Alert.count`
            behaves like does not create a system note for alert
              is expected not to change `Note.count`
            behaves like does not send alert notification emails
              is expected not to receive new(*(any args)) 0 times
            behaves like does not process incident issues
              is expected not to receive perform_async(*(any args)) 0 times
          with an additional existing resolved alert
            behaves like existing network alert
              behaves like adds an alert management alert event
                is expected to be success
                behaves like does not create an alert management alert
                  is expected not to change `AlertManagement::Alert.count`
              behaves like does not create a system note for alert
                is expected not to change `Note.count`
              behaves like does not send alert notification emails
                is expected not to receive new(*(any args)) 0 times
              behaves like does not process incident issues
                is expected not to receive perform_async(*(any args)) 0 times
        which is resolved
          behaves like never-before-seen network alert
            assigns the correct properties
            behaves like creates an alert management alert or errors
              is expected to be success
              creates AlertManagement::Alert
              executes the alert service hooks
              and fails to save
                writes a warning to the log
                behaves like alerts service responds with an error
                  is expected to eq :bad_request
            behaves like creates expected system notes for alert
              for new_alert
            behaves like does not send alert notification emails
              is expected not to receive new(*(any args)) 0 times
            behaves like does not process incident issues
              is expected not to receive perform_async(*(any args)) 0 times
    with overlong payload
      behaves like alerts service responds with an error and takes no actions
        is expected to eq :bad_request
        behaves like does not create an alert management alert
          is expected not to change `AlertManagement::Alert.count`
        behaves like does not create a system note for alert
          is expected not to change `Note.count`
        behaves like does not process incident issues
          is expected not to receive perform_async(*(any args)) 0 times
        behaves like does not send alert notification emails
          is expected not to receive new(*(any args)) 0 times

ProjectWiki
  searches wiki page
  indexes
  can delete wiki pages
  #use_elasticsearch?
    delegates to Project#use_elasticsearch?

Vulnerabilities::UpdateService
  with an authorized user with proper permissions
    behaves like calls Vulnerabilities::Statistics::UpdateService
      calls the service class
    behaves like calls Vulnerabilities::HistoricalStatistics::UpdateService
      calls the service class
    when finding name is longer than 255 characters
      truncates vulnerability title to have 255 characters
    when neither severity nor confidence are overridden
      updates the vulnerability from updated finding (title, severity and confidence only)
    when severity is overridden
      updates the vulnerability from updated finding (title and confidence only)
    when confidence is overridden
      updates the vulnerability from updated finding (title and severity only)
    when the `resolved_on_default_branch` kwarg is provided
      updates the resolved_on_default_branch attribute of vulnerability
    when the `resolved_on_default_branch` kwarg is not provided
      does not update the resolved_on_default_branch attribute of vulnerability
    when security dashboard feature is disabled
      raises an "access denied" error
  when user does not have rights to update a vulnerability
    raises an "access denied" error

StoreSecurityReportsWorker
  #secret_detection_vulnerability_found?
    is expected to equal true
  #revoke_secret_detection_token?
    visibility: :public, token_revocation_enabled: true, secret_detection_vulnerability_found: true
      is expected to eql true
    visibility: :public, token_revocation_enabled: true, secret_detection_vulnerability_found: false
      is expected to eql false
    visibility: :public, token_revocation_enabled: false, secret_detection_vulnerability_found: true
      is expected to eql false
    visibility: :public, token_revocation_enabled: false, secret_detection_vulnerability_found: false
      is expected to eql false
    visibility: :private, token_revocation_enabled: true, secret_detection_vulnerability_found: true
      is expected to eql false
    visibility: :private, token_revocation_enabled: true, secret_detection_vulnerability_found: false
      is expected to eql false
    visibility: :private, token_revocation_enabled: false, secret_detection_vulnerability_found: true
      is expected to eql false
    visibility: :private, token_revocation_enabled: false, secret_detection_vulnerability_found: false
      is expected to eql false
    visibility: nil, token_revocation_enabled: true, secret_detection_vulnerability_found: true
      is expected to eql false
    visibility: nil, token_revocation_enabled: true, secret_detection_vulnerability_found: false
      is expected to eql false
    visibility: nil, token_revocation_enabled: false, secret_detection_vulnerability_found: true
      is expected to eql false
    visibility: nil, token_revocation_enabled: false, secret_detection_vulnerability_found: false
      is expected to eql false
  #perform
    when at least one security report feature is enabled
      report_type: :sast
        scans security reports for token revocation
        when the `security_report_ingestion_framework` feature is enabled
          executes IngestReportsService for given pipeline
        when the `security_report_ingestion_framework` feature is disabled
          executes StoreReportsService for given pipeline
      report_type: :dast
        scans security reports for token revocation
        when the `security_report_ingestion_framework` feature is enabled
          executes IngestReportsService for given pipeline
        when the `security_report_ingestion_framework` feature is disabled
          executes StoreReportsService for given pipeline
      report_type: :dependency_scanning
        scans security reports for token revocation
        when the `security_report_ingestion_framework` feature is enabled
          executes IngestReportsService for given pipeline
        when the `security_report_ingestion_framework` feature is disabled
          executes StoreReportsService for given pipeline
      report_type: :container_scanning
        scans security reports for token revocation
        when the `security_report_ingestion_framework` feature is enabled
          executes IngestReportsService for given pipeline
        when the `security_report_ingestion_framework` feature is disabled
          executes StoreReportsService for given pipeline
      report_type: :cluster_image_scanning
        scans security reports for token revocation
        when the `security_report_ingestion_framework` feature is enabled
          executes IngestReportsService for given pipeline
        when the `security_report_ingestion_framework` feature is disabled
          executes StoreReportsService for given pipeline
    when security reports feature is not available
      does not execute StoreReportsService

EpicNoteEntity
  exposes epic-specific elements
  behaves like note entity
    basic note
      exposes correct elements
      does not expose elements for specific notes cases
      exposes author correctly
      does not expose web_url for author
      exposes permission fields on current_user
      :can_resolve_discussion
        discussion is resolvable
          user can resolve
            is true
          user cannot resolve
            is false
        discussion is not resolvable
          is false
    when note was edited
      exposes last_edited_at and last_edited_by elements
    when note is a system note
      exposes system_note_icon_name element
  on a system note
    sets system_note_icon_name for epic system notes

RequirementsManagement::RequirementsFinder
  #execute
    when requirements are enabled
      when project is not set
        does not return any requirements
      when project is set
        returns all requirements in the project
      when state is set
        returns matched requirements
      when iid is set
        returns matched requirements
      when last_test_report_state is set
        returns matched requirements
        when last_test_report_state is not valid
          does not filter requirements
          does not raise error
      when user can not read requirements in the project
        does not return any requirements
      filter by author
        author_username: "projectusername", filtered_requirements: [:requirement1, :requirement2]
          returns the requirements filtered
        author_username: "nonexistent_user", filtered_requirements: []
          returns the requirements filtered
        author_username: nil, filtered_requirements: [:requirement3, :requirement2, :requirement1]
          returns the requirements filtered
        author_username: ["projectusername", "otheruser123"], filtered_requirements: [:requirement3, :requirement2, :requirement1]
          returns the requirements filtered
        author_username: ["nonexistentuser", "nonsense"], filtered_requirements: []
          returns the requirements filtered
      filter by search
        query: "nonsense", filtered_requirements: []
          returns the requirements filtered
        query: "serverless", filtered_requirements: [:requirement1]
          returns the requirements filtered
        query: "with", filtered_requirements: [:requirement1, :requirement3]
          returns the requirements filtered
        query: nil, filtered_requirements: [:requirement3, :requirement2, :requirement1]
          returns the requirements filtered
        query: "", filtered_requirements: [:requirement3, :requirement2, :requirement1]
          returns the requirements filtered
      ordering
        sort: "id_asc", ordered_requirements: [:requirement1, :requirement2, :requirement3]
          returns the requirements ordered
        sort: "id_desc", ordered_requirements: [:requirement3, :requirement2, :requirement1]
          returns the requirements ordered
        sort: "updated_at_asc", ordered_requirements: [:requirement1, :requirement3, :requirement2]
          returns the requirements ordered
        sort: "updated_at_desc", ordered_requirements: [:requirement2, :requirement3, :requirement1]
          returns the requirements ordered
        sort: "err", ordered_requirements: [:requirement3, :requirement2, :requirement1]
          returns the requirements ordered
    when requirements are disabled
      when project is set
        does not return any requirements

Gitlab::Ci::Reports::LicenseScanning::Report
  #by_license_name
    with existing license
      finds right name
    without existing license
      is expected to be nil
  #merge_dependencies_info!
    without licensed dependencies
      does not merge dependency path
    with licensed dependencies
      merge path to matched dependencies
  #violates?
    when checking for violations using v1 license scan report
      when a denied license is found in the report
        is expected to be truthy
      when a denied license is discovered with a different casing for the name
        is expected to be truthy
      when none of the licenses discovered in the report violate the denied policy
        is expected to be falsey
    when checking for violations using the v2 license scan reports
      when a denied license with a SPDX identifier is also in the report
        is expected to be truthy
      when a denied license does not have an SPDX identifier because it was provided by an end user
        is expected to be truthy
      when none of the licenses discovered match any of the denied software policies
        is expected to be falsey
  #diff_with
    when the other report is not available
      is expected to be empty
    when diffing two v1 reports
      is expected to contain exactly "Apache 2.0"
      is expected to contain exactly "MIT" and "BSD"
      is expected to contain exactly "WTFPL"
    when diffing two v2 reports
      is expected to contain exactly "Apache 2.0"
      is expected to contain exactly "MIT" and "BSD"
      is expected to contain exactly "WTFPL"
    when diffing a v1 report with a v2 report
      is expected to contain exactly "Apache 2.0"
      is expected to contain exactly "MIT" and "BSD"
      is expected to contain exactly "WTFPL"
    when diffing a v2 report with a v1 report
      is expected to contain exactly "Apache 2.0"
      is expected to contain exactly "MIT" and "BSD"
      is expected to contain exactly "WTFPL"
  #empty?
    is expected to be empty
    is expected not to be empty
  .parse_from
    when parsing a v1 report
      is expected to eql "1.0"
      is expected to eq 4
    when parsing a v2 report
      is expected to eql "2.0"
      is expected to eq 3

Iterations::CreateService
  for projects
    behaves like iterations create service
      iterations feature enabled
        #execute
          valid params
            creates an iteration
          invalid params
            does not create an iteration but returns errors
          no permissions
            is not allowed
      iterations feature disabled
        #execute
          is not allowed
  for groups
    group without cadences
      behaves like iterations create service
        iterations feature enabled
          #execute
            valid params
              creates an iteration
            invalid params
              does not create an iteration but returns errors
            no permissions
              is not allowed
        iterations feature disabled
          #execute
            is not allowed
    group with a cadence
      behaves like iterations create service
        iterations feature enabled
          #execute
            valid params
              creates an iteration
            invalid params
              does not create an iteration but returns errors
            no permissions
              is not allowed
        iterations feature disabled
          #execute
            is not allowed
    group with multiple cadences
      behaves like iterations create service
        iterations feature enabled
          #execute
            valid params
              creates an iteration
            invalid params
              does not create an iteration but returns errors
            no permissions
              is not allowed
        iterations feature disabled
          #execute
            is not allowed
      with specific cadence being passed as param
        valid params
          creates an iteration

ComplianceManagement::Frameworks::CreateService
  custom_compliance_frameworks is disabled
    does not create a new compliance framework
    responds with an error message
  custom_compliance_frameworks is enabled
    namespace has a parent
      responds with a successful service response
      creates the new framework in the root namespace
    when using invalid parameters
      responds with an error service response
    when creating a compliance framework for a namespace that current_user is not the owner of
      responds with an error service response
      does not create a new compliance framework
    when pipeline_configuration_full_path parameter is used and feature is not available
      returns an error
    when using parameters for a valid compliance framework
      creates a new compliance framework
      responds with a successful service response
      has the expected attributes
      when compliance pipeline configuration is available
        sets the pipeline configuration path attribute

AuditEventPresenter
  exposes the date
  exposes the action
  exposes the author
    gets the event author name
    event authored by a user that exists
      returns a url
    event authored by a user that no longer exists
      when `author_name` is not included in the details
        does not return a url
      when `author_name` is included in the details and not in the author_name column
        shows the author name as provided in the details
  #target
    delegates to the model object
  exposes the ip address
    exposes the database value by default
    survives a round trip from JSON
  exposes the object
    returns the object path if it exists
    returns the stored name if it has been deleted
    returns the object url if it exists
    returns no object url if it has been deleted

DastSiteValidation
  associations
    is expected to belong to dast_site_token required:
    is expected to have many dast_sites
  validations
    is expected to be valid
    is expected to validate that :dast_site_token_id cannot be empty/falsy
  before_create
    #set_normalized_url_base
      normalizes the dast_site_token url
  scopes
    by_project_id
      includes the correct records
    by_url_base
      includes the correct records
    by_most_recent
      includes the correct records
  enums
    is expected to define :validation_strategy as an enum, backed by an integer, with possible values ‹{text_file: 0, header: 1, meta_tag: 2}›
  #project
    returns project through dast_site_token
  #dast_site
    returns dast_site through dast_site_token
  #validation_url
    formats the url correctly
  #start
    is always possible to start over
    records a timestamp
    transitions to the correct state
  #retry
    when state=failed
      returns true
      records a timestamp
      transitions to the correct state
    otherwise
      returns false
  #fail_op
    when state=failed
      returns false
    otherwise
      returns true
      records a timestamp
      transitions to the correct state
  #pass
    when state=inprogress
      returns true
      records a timestamp
      transitions to the correct state
    otherwise
      returns false

VulnerabilityPresenter
  #scanner
    returns the scanner for a finding
    returns empty hash if scanner is missing for a vulnerabilities_finding
  #scan
    returns the scan for a finding
    returns empty hash if scan is missing for a vulnerabilities_finding
  #remediations
    returns remediations
  #location_link_with_raw_path
    returns the location link in raw format
  #location_link
    returns the location link in blob format
  #blob_path
    returns the path in blob format
    returns nil if file is missing in the finding
  #raw_path
    returns the path in raw format
    returns nil if file is missing in the finding
  #jira_issue_description
DEPRECATION WARNING: Rendering actions with '.' in the name is deprecated: vulnerabilities/jira_issue_description.md.erb (called from jira_issue_description at /builds/gitlab-org/gitlab/ee/app/presenters/vulnerability_presenter.rb:52)
    returns the jira description in string format
  #description
    when the vulnerability description field is populated
      returns the description for the vulnerability
    when the vulnerability description field is empty
      returns the description for the vulnerability finding

Ci::RetryBuildService
  behaves like restricts access to protected environments
    when build is related to a protected environment
      when user does not have access to the environment
        raises Gitlab::Access::DeniedError
      when user has access to the environment
        enqueues the build
  #clone!
    when user has ability to execute build
      dast
        clones the profile associations
      when build has secrets
        clones secrets
      credit card requirement
        when credit card is required
          when project is on free plan
            when user has credit card
              behaves like creates a retried build
                creates a retried build
            when user does not have credit card
              raises an exception
              when feature flag is disabled
                behaves like creates a retried build
                  creates a retried build
        when credit card is not required
          behaves like creates a retried build
            creates a retried build
  #execute
    when the CI quota is exceeded
      when there are no runners available
        is expected not to be failed
      when shared runners are available
        fails the build
        with private runners
          is expected not to be failed

Gitlab::ImportExport::Group::RelationFactory
  epic object
    does not have the original ID
    does not have the original group_id
    has the new group_id
    excluded attributes
      are removed from the imported object
    overridden model
      does not raise errors
  behaves like Notes user references
    when the importer is admin
      and the note author is not mapped
        is expected to eq #<User id:1970 @user1757>
        is expected to include "*By Administrator"
      and the note author is the importer user
        is expected to eq #<User id:1972 @user1759>
        is expected not to include "*By Administrator"
      and the note author exists in the target instance
        is expected to eq #<User id:1974 @user1761>
        is expected not to include "*By Administrator"
    when the importer is not admin
      and the note author is not mapped
        is expected to eq #<User id:1978 @user1765>
        is expected to include "*By Administrator"
      and the note author is the importer user
        is expected to eq #<User id:1980 @user1767>
        is expected to include "*By Administrator"
      and the note author exists in the target instance
        is expected to eq #<User id:1983 @user1770>
        is expected to include "*By Administrator"

SystemNotes::MergeTrainService
  #enqueue
    posts the 'merge train' system note
    behaves like a system note
      has the correct attributes
    when index of the merge request is not zero
      posts the 'merge train' system note
  #cancel
    posts the 'merge train' system note
    behaves like a system note
      has the correct attributes
  #abort
    posts the 'merge train' system note
    behaves like a system note
      has the correct attributes
    behaves like creates a removed merge train TODO
      creates Todo of MERGE_TRAIN_REMOVED
  #add_when_pipeline_succeeds
    posts the 'add to merge train when pipeline succeeds' system note
    behaves like a system note
      has the correct attributes
  #cancel_add_when_pipeline_succeeds
    posts the 'add to merge train when pipeline succeeds' system note
    behaves like a system note
      has the correct attributes
  #abort_add_when_pipeline_succeeds
    posts the 'add to merge train when pipeline succeeds' system note
    behaves like a system note
      has the correct attributes
    behaves like creates a removed merge train TODO
      creates Todo of MERGE_TRAIN_REMOVED

Issuable::CommonSystemNotesService
  on issuable update
    when weight is changed
      creates a resource weight event
    when health status is updated
      when setting a health_status
        creates system note
      when health status is removed
        creates system note
    when issuable is an epic
      creates 2 system notes with the correct content
    behaves like issuable iteration changed
      when iteration is changed
        creates a resource iteration event
  on issuable create
    creates a resource weight event
    does not create a system note
    behaves like issuable iteration changed
      when iteration is changed
        creates a resource iteration event

EE::LockHelper
  #lock_file_link
    there is no locks
      returns Lock with no toltip
      returns Lock button with tooltip
    exact lock
      returns Unlock with no toltip
      returns Lock button with tooltip
    upstream lock
      returns Lock with no toltip
      returns Lock button with tooltip
    downstream lock
      returns Lock with no toltip
      returns Lock button with tooltip

Projects::GitlabProjectsImportService
  #execute
    creates template export job
      if project saved and custom template exists
      sets custom template import strategy after export
    does not create export job
      if project not saved
    behaves like gitlab projects import validations
      with an invalid path
        returns an invalid project
      with a valid path
        creates a project
      override params
        stores them as import data when passed
      when there is a project with the same path
        does not create the project
        when overwrite param is set
          creates a project in a temporary full_path

Types::Admin::CloudLicenses::CurrentLicenseType
  is expected to eq "CurrentLicense"
  is expected to include graphql fields "last_sync", "billable_users_count", "maximum_user_count", and "users_over_license_count"
  with license type fields
    is expected to include graphql fields "id", "type", "plan", "name", "email", "company", "starts_at", "expires_at", "block_changes_at", "activated_at", and "users_in_license_count"
    field values
      id
        is expected to eq #<GlobalID:0x00007f9e9cc6e868 @uri=#<URI::GID gid://gitlab/License/86>>
      type
        is expected to eq "cloud"
      plan
        is expected to eq "ultimate"
      name
        is expected to eq "User Example"
      email
        is expected to eq "user@example.com"
      company
        is expected to eq "Example Inc."
      starts_at
        is expected to eq Tue, 13 Jul 2021
      expires_at
        is expected to eq Wed, 13 Jul 2022
      block_changes_at
        is expected to eq Sat, 13 Aug 2022
      activated_at
        is expected to eq Fri, 13 Aug 2021 18:41:24.000000000 +0000
      users_in_license_count
        is expected to eq 25
  #users_over_license_count
    returns the number of users over the paid users in the license
    when license is for a trial
      returns 0
  field values
    last_sync
      is expected to eq 2021-10-13 18:41:23.931300311 +0000
    billable_users_count
      is expected to eq 10
    maximum_user_count
      is expected to eq 20

API-Fuzzing.latest.gitlab-ci.yml
  is expected not to be nil
  the template file
    uses the production repository
    doesn't use the staging repository
  the created pipeline
    when no stages
      when project has no stages
        includes no jobs
    when stages includes fuzz
      when project has no license
        includes job to display error
      when project has Ultimate license
        by default
          includes a job
        when configured with HAR
          includes job
        when configured with OpenAPI
          includes job
        when configured with Postman
          includes job
        when API_FUZZING_DISABLED=1
          includes no jobs

Clusters::ClusterPresenter
  #health_data
    with project cluster
      behaves like cluster health data
        is expected to include {:"metrics-endpoint" => "/namespace2090/project2142/-/clusters/11/metrics.json", :"alerts-endpoint" => "/", :"prometheus-alerts-available" => "true"}
        when prometheus_computed_alerts feature is disabled
          alerts-endpoint is nil
          prometheus-alerts-available is nil
    with group cluster
      behaves like cluster health data
        is expected to include {:"metrics-endpoint" => "/groups/group514/-/clusters/20/metrics.json", :"alerts-endpoint" => "/", :"prometheus-alerts-available" => "true"}
        when prometheus_computed_alerts feature is disabled
          alerts-endpoint is nil
          prometheus-alerts-available is nil

NetworkPolicies::ResourcesService
  #execute
    returns success response with policies from the deployment namespace
    behaves like tracking unique hll events
      tracks unique event
    without deployment_platform
      returns error response
    with Kubeclient::HttpError related to network policies
      returns error response
    with Kubeclient::HttpError related to cilium network policies
      returns error response
    without environment_id
      returns success response with policies from two deployment namespaces
      with a partial successful response
        returns error response for the platforms with failures
        returns error response with the policies for all successful platforms

SamlGroupLink
  associations
    is expected to belong to group required:
  validations
    is expected to validate that :group cannot be empty/falsy
    is expected to validate that :access_level cannot be empty/falsy
    is expected to validate that :saml_group_name cannot be empty/falsy
    is expected to validate that the length of :saml_group_name is at most 255
    is expected to define :access_level as an enum, backed by an integer, with possible values ‹{Guest: 10, Reporter: 20, Developer: 30, Maintainer: 40, Owner: 50}›
    group name uniqueness
      is expected to validate that :saml_group_name is case-sensitively unique within the scope of :group_id
    saml_group_name with whitespaces
      saves group link name without whitespace
  .by_id_and_group_id
    finds the group link
    with multiple groups and group links
      finds group links within the given groups
      does not find group links outside the given groups
  .by_saml_group_name
    finds the group link
    with multiple groups and group links
      finds group links within the given groups

Analytics::MergeRequestMetricsRefresh
  #execute
    updates metric via update_metric! method
    when metric is already present
      does not update metric
      updates metric when forced
  #execute_async
    schedules CodeReviewMetricsWorker with params

Iterations::RollOverIssuesWorker
  is labeled as idempotent
  performs multiple times sequentially without raising an exception
  #perform
    when iteration cadence is not automatic
      exits early
    when roll-over option on iteration cadence is not enabled
      exits early
    when roll-over option on iteration cadence is enabled
      avoids N+1 database queries
      when service fails to create future iteration
        logs error
      when cadence has upcoming iteration
        filters out any iterations that are not closed
      when cadence does not have upcoming iteration
        creates a new iteration to roll-over issues
        when service fails to create future iteration
          logs error and exits early
      with batches
        run in batches

Types::IssueType
  is expected to have graphql field :epic
  is expected to have graphql field :iteration
  is expected to have graphql field :weight
  is expected to have graphql field :health_status
  is expected to have graphql field :blocking_count
  is expected to have graphql field :blocked
  is expected to have graphql field :blocked_by_count
  is expected to have graphql field :blocked_by_issues
  is expected to have graphql field :sla_due_at
  is expected to have graphql field :metric_images
  N+1 queries
    group issues
      behaves like avoids N+1 queries on blocked
        is expected not to exceed query limit 5
    project issues
      behaves like avoids N+1 queries on blocked
        is expected not to exceed query limit 7

Gitlab::Ci::Parsers::Security::Validators::SchemaValidator
  report_type: :cluster_image_scanning, expected_errors: ["root is missing required keys: vulnerabilities"], valid_data: {"version"=>"10.0.0", "vulnerabilities"=>[]}
    #valid?
      when given data is invalid according to the schema
        is expected to be falsey
      when given data is valid according to the schema
        is expected to be truthy
    #errors
      is expected to eq ["root is missing required keys: vulnerabilities"]
  report_type: :container_scanning, expected_errors: ["root is missing required keys: vulnerabilities"], valid_data: {"version"=>"10.0.0", "vulnerabilities"=>[]}
    #valid?
      when given data is invalid according to the schema
        is expected to be falsey
      when given data is valid according to the schema
        is expected to be truthy
    #errors
      is expected to eq ["root is missing required keys: vulnerabilities"]
  report_type: :coverage_fuzzing, expected_errors: ["root is missing required keys: vulnerabilities"], valid_data: {"version"=>"10.0.0", "vulnerabilities"=>[]}
    #valid?
      when given data is invalid according to the schema
        is expected to be falsey
      when given data is valid according to the schema
        is expected to be truthy
    #errors
      is expected to eq ["root is missing required keys: vulnerabilities"]
  report_type: :dast, expected_errors: ["root is missing required keys: vulnerabilities"], valid_data: {"version"=>"10.0.0", "vulnerabilities"=>[]}
    #valid?
      when given data is invalid according to the schema
        is expected to be falsey
      when given data is valid according to the schema
        is expected to be truthy
    #errors
      is expected to eq ["root is missing required keys: vulnerabilities"]
  report_type: :dependency_scanning, expected_errors: ["root is missing required keys: dependency_files, vulnerabilities"], valid_data: {"version"=>"10.0.0", "vulnerabilities"=>[], "dependency_files"=>[]}
    #valid?
      when given data is invalid according to the schema
        is expected to be falsey
      when given data is valid according to the schema
        is expected to be truthy
    #errors
      is expected to eq ["root is missing required keys: dependency_files, vulnerabilities"]

Analytics::CycleAnalytics::ProjectStage
  when creating label based event
    when the label id is not passed
      returns validation error when `start_event_label_id` is missing
      returns validation error when `end_event_label_id` is missing
    when group label is defined on the root group
      succeeds
    when subgroup is given
      succeeds
    when label is defined for a different group
      returns validation for `start_event_label_id`
      returns validation for `end_event_label_id`
    when `ProjectLabel is given
      raises error when `ProjectLabel` is given for `start_event_label`
      raises error when `ProjectLabel` is given for `end_event_label`
  project without group
    returns validation error when end event is label based
    returns validation error when start event is label based

NewEpicWorker
  #perform
    when an epic not found
      does not call Services
      logs an error
    when a user not found
      does not call Services
      logs an error
    with a user
      when the new epic author is not confirmed
        behaves like a new epic where the current user cannot trigger notifications
          does not create a notification for the mentioned user
      when the new epic author is blocked
        behaves like a new epic where the current user cannot trigger notifications
          does not create a notification for the mentioned user
      when the new epic author is a ghost
        behaves like a new epic where the current user cannot trigger notifications
          does not create a notification for the mentioned user
      when everything is ok
        creates an event
        user watches group
          creates a notification for watcher
        mention
          creates a notification for the mentioned user

SyncSeatLinkRequestWorker
  #perform
    makes an HTTP POST request with passed params
    when response contains a license
      when there is no previous license
        behaves like successful license creation
          persists the new license
      when there is a previous license
        when it is a cloud license
          when the current license key does not match the one returned from sync
            creates a new license
          when the current license key matches the one returned from sync
            reuses the current license and updates the last_synced_at
          when persisting fails
WARNING: Using the `raise_error` matcher without providing a specific error or message risks false positives, since `raise_error` will match when Ruby raises a `NoMethodError`, `NameError` or `ArgumentError`, potentially allowing the expectation to pass without even executing the method you are intending to call. Actual error raised was #<ActiveRecord::RecordInvalid: Validation failed: The license key is invalid. Make sure it is exactly as you received it from GitLab Inc.>. Instead consider providing a specific error class or message. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`. Called from /builds/gitlab-org/gitlab/ee/spec/workers/sync_seat_link_request_worker_spec.rb:110:in `block (7 levels) in <top (required)>'.
            does not delete the current license and logs error
        when it is not a cloud license
          behaves like successful license creation
            persists the new license
    when response contains reconciliation dates
      saves the reconciliation dates
      when an upcoming_reconciliation already exists
        updates the upcoming_reconciliation
    behaves like unsuccessful request
      when the request is not successful
        raises an error with the expected message

Analytics::DevopsAdoption::Snapshot
  is expected to belong to namespace required:
  is expected to validate that :namespace cannot be empty/falsy
  is expected to validate that :recorded_at cannot be empty/falsy
  is expected to validate that :end_time cannot be empty/falsy
  .latest_for_namespace_ids
    returns for previous month finalized snapshot for the given namespace ids based on snapshot end_time
  .for_month
    returns all snapshots where end_time equals given datetime end of month
  .not_finalized
    returns all snapshots which were recorded earlier than snapshot end_time
  .finalized
    returns all snapshots which were recorded later than snapshot end_time
  .for_timespan
    returns snapshots for given timespan
  .for_namespaces
    returns all snapshots with given namespaces
  #start_time
    is start of the month of end_time

Gitlab::UsageDataCounters::IssueActivityUniqueCounter
  for Issue health status changed actions
    behaves like a daily tracked issuable event
      is expected to be truthy
      does not track edit actions if author is not present
  for Issue iteration changed actions
    behaves like a daily tracked issuable event
      is expected to be truthy
      does not track edit actions if author is not present
  for Issue weight changed actions
    behaves like a daily tracked issuable event
      is expected to be truthy
      does not track edit actions if author is not present
  for Issue added to epic actions
    behaves like a daily tracked issuable event
      is expected to be truthy
      does not track edit actions if author is not present
  for Issue removed from epic actions
    behaves like a daily tracked issuable event
      is expected to be truthy
      does not track edit actions if author is not present
  for Issue changed epic actions
    behaves like a daily tracked issuable event
      is expected to be truthy
      does not track edit actions if author is not present

EE::AuthHelper
  button_based_providers
    excludes group_saml
  providers_for_base_controller
    excludes group_saml
  form_based_providers
    includes kerberos provider
  form_based_auth_provider_has_active_class?
    selects main LDAP server
  form_based_providers
    with smartcard_auth feature flag off
      does not include smartcard provider
    with smartcard_auth feature flag on
      includes smartcard provider
  smartcard_enabled_for_ldap?
    LDAP server with optional smartcard auth
      returns true
      returns false with required flag
    LDAP server with required smartcard auth
      returns true
      returns true with required flag
    LDAP server with disabled smartcard auth
      returns false
      returns false with required flag
    no matching LDAP server
      returns false
  smartcard_login_button_classes
    when smartcard auth is optional
      returns the correct CSS classes
    when smartcard auth is required
      returns the correct CSS classes

Clusters::AgentAuthorizationsFinder
  #execute
    feature is not available
      is expected to be empty
    project authorizations
      agent configuration project does not share a root namespace with the given project
        is expected to be empty
      with project authorizations present
        is expected to contain exactly #<Clusters::Agents::ProjectAuthorization id: 2, project_id: 1182, agent_id: 2, config: {"default_namespace"=>"production"}>
      with overlapping authorizations
        is expected to contain exactly #<Clusters::Agents::ProjectAuthorization id: 3, project_id: 1182, agent_id: 4, config: {"default_namespace"=>"production"}>
    implicit authorizations
      returns authorizations for agents directly associated with the project
    authorized groups
      agent configuration project is outside the requesting project hierarchy
        is expected to be empty
      multiple agents are authorized for the same group
        returns authorizations for all agents
      a single agent is authorized to more than one matching group
        picks the authorization for the closest group to the requesting project

ApprovalWrappedCodeOwnerRule
  #approvals_required
    feature_enabled: true, optional_section: false, approver_count: 0, expected_required_approvals: 0
      when project.code_owner_approval_required_available? is true
        when the project doesn't require code owner approval on all MRs
          returns the expected number of approvals for protected_branches that do require approval
      when project.code_owner_approval_required_available? is falsy
        returns nil
    feature_enabled: true, optional_section: false, approver_count: 2, expected_required_approvals: 1
      when project.code_owner_approval_required_available? is true
        when the project doesn't require code owner approval on all MRs
          returns the expected number of approvals for protected_branches that do require approval
      when project.code_owner_approval_required_available? is falsy
        returns nil
    feature_enabled: true, optional_section: true, approver_count: 2, expected_required_approvals: 0
      when project.code_owner_approval_required_available? is true
        when the project doesn't require code owner approval on all MRs
          returns the expected number of approvals for protected_branches that do require approval
      when project.code_owner_approval_required_available? is falsy
        returns nil
    feature_enabled: false, optional_section: false, approver_count: 2, expected_required_approvals: 0
      when project.code_owner_approval_required_available? is true
        when the project doesn't require code owner approval on all MRs
          returns the expected number of approvals for protected_branches that do require approval
      when project.code_owner_approval_required_available? is falsy
        returns nil
    feature_enabled: false, optional_section: false, approver_count: 0, expected_required_approvals: 0
      when project.code_owner_approval_required_available? is true
        when the project doesn't require code owner approval on all MRs
          returns the expected number of approvals for protected_branches that do require approval
      when project.code_owner_approval_required_available? is falsy
        returns nil

Gitlab::SeatLinkData
  #initialize
    when passing no params
      returns object with default attributes set
    when passing params
      returns object with given attributes set
      when passing date param only
        returns object with attributes set using given date
  .to_json
    is expected to delegate #to_json to the #data object
    returns payload data as a JSON string
    when instance has no current license
      returns payload data as a JSON string
  #sync
    when ready to sync seats
      performs the sync
    when not ready to sync seats
      does not perform the sync
  #should_sync_seats?
    when all the pre conditions are valid
      is expected to eq true
    when license key is missing
      is expected to be falsey
    when expires_at is not set
      is expected to be falsey
    when license is trial
      is expected to be falsey
    when timestamp is out of the range
      is expected to eq true
    when historical data not found
      is expected to eq true

IssuablesAnalytics
  #data
    when issuable relation is ordered by priority
      generates chart data correctly
    when months_back parameter is nil
      returns a hash containing the issues count created in the past 12 months
    when months_back parameter is present
      returns a hash containing the issues count created in the past x months

AuditEvents::RepositoryPushAuditEventService
  #attributes
    when branch push
      returns audit event attributes
    when tag push
      returns audit event attributes
  #enabled?
    when not licensed and not enabled
      is expected to equal false
    when licensed but not enabled
      is expected to equal false
    when licensed and enabled
      is expected to equal true

Mutations::MergeRequests::SetAssignees
  behaves like a multi-assignable resource
    #resolve
      when the user can update the resource
        sets the assignees
        removes assignees not in the list
        when passing "append" as true
          does not remove assignees not in the list

AuditEvents::ExportCsvService
  includes the appropriate headers
  data verification
    ID
    Author ID
    Author Name
    Entity ID
    Entity Type
    Entity Path
    Target ID
    Target Type
    Target Details
    Action
    IP Address
    Created At (UTC)

Resolvers::Vulnerabilities::IssueLinksResolver
  #ready?
    when the link_type filter is given but is not `CREATED` or `RELATED`
      when the filter is a string
        is expected to raise Gitlab::Graphql::Errors::ArgumentError with "Provide a valid vulnerability issue link type"
      when the filter is a number
        is expected to raise Gitlab::Graphql::Errors::ArgumentError
      when the filter is a symbol
        is expected to raise Gitlab::Graphql::Errors::ArgumentError
  #resolve
    when there is no filter given
      is expected to contain exactly #<Vulnerabilities::IssueLink id: 1, vulnerability_id: 48, issue_id: 181, link_type: "related", created_at: "2021-10-13 18:42:32.571410153 +0000", updated_at: "2021-10-13 18:42:32.571410153 +0000"> and #<Vulnerabilities::IssueLink id: 2, vulnerability_id: 48, issue_id: 182, link_type: "created", created_at: "2021-10-13 18:42:32.825015505 +0000", updated_at: "2021-10-13 18:42:32.825015505 +0000">
      is expected not to raise Exception
    when the link_type filter is given
      when the filter is `CREATED`
        is expected to contain exactly #<Vulnerabilities::IssueLink id: 2, vulnerability_id: 48, issue_id: 182, link_type: "created", created_at: "2021-10-13 18:42:32.825015505 +0000", updated_at: "2021-10-13 18:42:32.825015505 +0000">
        is expected not to raise Exception
      when the filter is `RELATED`
        is expected to contain exactly #<Vulnerabilities::IssueLink id: 1, vulnerability_id: 48, issue_id: 181, link_type: "related", created_at: "2021-10-13 18:42:32.571410153 +0000", updated_at: "2021-10-13 18:42:32.571410153 +0000">
        is expected not to raise Exception

StatusPage::IncidentCommentEntity
  exposes JSON fields
  field #note
    behaves like reference links for status page
      with public project
        with public issue
          shows link anchor with HTML data attributes
        with confidential issue
          redacts link anchor and HTML data attributes
      with private project
        with public issue
          redacts link anchor and HTML data attributes
      mentions
        with username
          anonymizes mention
        with arbitrary username
          shows the mention
        with @all
          anonymizes mention
        with groups
          group_visibility: :public
            anonymizes mention
          group_visibility: :internal
            anonymizes mention
          group_visibility: :private
            anonymizes mention
    behaves like img upload tags for status page
      converts to html

Gitlab::ContributionAnalytics::DataCollector
  #totals
    collects event counts grouped by users by calling #base_query
  deriving various counts from #raw_counts
    extracts correct counts from raw_counts
      for #push_by_author_count
      for #total_push_author_count
      for #total_push_count
      for #total_merge_requests_closed_count
      for #total_merge_requests_created_count
      for #total_merge_requests_merged_count
      for #total_merge_requests_approved_count
      for #total_issues_closed_count
      handles empty result

AwardEmojis::DestroyService
  #execute
    publish to status page
      with recognized emoji
        triggers status page publish
      with unrecognized emoji
        does not trigger status page publish service
    tracking emoji removing
      when awardable is an epic
        tracks usage
      when awardable is not an epic
        does not track epic emoji awarding

ComplianceManagement::Framework
  validation
    is expected to validate that :namespace_id is case-sensitively unique within the scope of :name
    is expected to validate that :name cannot be empty/falsy
    is expected to validate that the length of :name is at most 255
    is expected to validate that the length of :description is at most 255
    is expected to validate that the length of :color is at most 10
    is expected to validate that :regulated cannot be empty/falsy
    is expected to validate that the length of :pipeline_configuration_full_path is at most 255
  color
    with whitespace
      strips whitespace

Resolvers::ScanExecutionPolicyResolver
  #resolve
    when feature is not licensed
      raises ResourceNotAvailable error
    when feature is licensed
      returns scan execution policies
      when user is unauthorized
        raises ResourceNotAvailable error

Groups::RepositoryStorageMove
  behaves like handles repository moves
    associations
      is expected to belong to container required:
    validations
      is expected to validate that :container cannot be empty/falsy
      is expected to validate that :state cannot be empty/falsy
      is expected to validate that :source_storage_name cannot be empty/falsy
      is expected to validate that :destination_storage_name cannot be empty/falsy
      source_storage_name inclusion
        does not allow repository storages that don't match a label in the configuration
      destination_storage_name inclusion
        does not allow repository storages that don't match a label in the configuration
      container repository read-only
        does not allow the container to be read-only on create
    defaults
      destination_storage_name
        can pick new storage
    state transitions
      when in the default state
        and transits to scheduled
          triggers the corresponding repository storage worker
          when the transition fails
            does not trigger the corresponding repository storage worker and adds an error
        and transits to started
          does not allow the transition
      when started
        and transits to replicated
          marks the container as writable
          updates the updated_at column of the container
        and transits to failed
          marks the container as writable

Vulnerabilities::FindingSignature
  associations
    is expected to belong to finding class_name => Vulnerabilities::Finding required:
  validations
    is expected to validate that :finding cannot be empty/falsy
  .by_project
    is expected to eq [#<Vulnerabilities::FindingSignature id: 2, finding_id: 87, created_at: "2021-10-13 18:42:48.69460026...000", algorithm_type: "hash", signature_sha: ".;\x01\xAA\xEB\xBCig\xAD\xBAd\xBB\xC6\x0F\xB3EaE<\\">]
  .by_signature_sha
    is expected to eq [#<Vulnerabilities::FindingSignature id: 3, finding_id: 88, created_at: "2021-10-13 18:42:49.81353032...3530325 +0000", algorithm_type: "hash", signature_sha: "~!\x02\xE9\x04@v?YQ\xA1}\x0F\x94U\x06>lUC">]

Analytics::CycleAnalytics::Stages::DeleteService
  behaves like permission check for Value Stream Analytics Stage services
    when user has no access
      is expected to be error
      is expected to eq :forbidden
    when license is missing
      is expected to be error
      is expected to eq :forbidden
  when persisted stage is given
    is expected to be success
    deletes the stage
  disallows deletion when default stage is given
    is expected not to be success
    is expected to eq :forbidden

IterationNote
  .from_event
    behaves like a synthetic note
      behaves like a system note
        has the correct attributes
      #discussion_id
        returns the expected discussion id
    with a remove iteration event
      creates the expected note

projects/security/dast_profiles/show
  renders Vue app root
  passes new dast saved scan path
  passes new dast site profile path
  passes new dast scanner profile path
  passes project's full path

Cluster-Image-Scanning.gitlab-ci.yml
  the created pipeline
    when project has no license
      includes no jobs
    when project has Ultimate license
      by default
        includes job
      with CIS_MAJOR_VERSION greater than 3
        includes job
      when CLUSTER_IMAGE_SCANNING_DISABLED=1
        includes no jobs

ServicePing::PermitDataCategoriesService
  #execute
    with out current license
      when usage ping setting is set to true
        returns all categories
      when usage ping setting is set to false
        returns no categories
    with current license
      when usage ping setting is set to true
        and license has operational_metrics_enabled set to true
          returns all categories
          when User.single_user&.requires_usage_stats_consent? is required
            returns no categories
        and license has operational_metrics_enabled set to false
          returns all categories
      when usage ping setting is set to false
        and license has operational_metrics_enabled set to true
          returns all categories
        and license has operational_metrics_enabled set to false
          returns all categories

IncidentManagement::IssuableEscalationStatus
  validations
    when policy and escalation start time are both provided
      is expected to be valid
    when neither policy and escalation start time are provided
      is expected to be valid
    when escalation start time is provided without a policy
      is invalid
    when policy is provided without an escalation start time
      is invalid
  #trigger
    with escalation policy
      updates escalations_started_at
    without escalation policy
      does not change escalations_started_at
  acknowledge
    does not change escalations_started_at
  ignore
    does not change escalations_started_at
  resolve
    does not change escalations_started_at

Commit
  behaves like a mentionable with EE-specific mentions
    extracts references from its reference property
    creates cross-reference notes

layouts/application
  layouts/_user_notification_dot
    when we show the notification dot
DEPRECATION WARNING: Rendering actions with '.' in the name is deprecated: shared/_logo.svg (called from brand_header_logo at /builds/gitlab-org/gitlab/app/helpers/appearances_helper.rb:42)
DEPRECATION WARNING: Rendering actions with '.' in the name is deprecated: shared/_logo.svg (called from brand_header_logo at /builds/gitlab-org/gitlab/app/helpers/appearances_helper.rb:42)
DEPRECATION WARNING: Rendering actions with '.' in the name is deprecated: shared/_logo_type.svg (called from brand_header_logo_type at /builds/gitlab-org/gitlab/app/helpers/appearances_helper.rb:49)
DEPRECATION WARNING: Rendering actions with '.' in the name is deprecated: shared/_logo_type.svg (called from brand_header_logo_type at /builds/gitlab-org/gitlab/app/helpers/appearances_helper.rb:49)
      has the notification dot
    when we do not show the notification dot
      does not have the notification dot

Gitlab::Ci::YamlProcessor
  Bridge Needs
    needs upstream pipeline
      creates jobs with valid specification
    needs both job and pipeline
      creates jobs with valid specification
    needs cross projects artifacts
      creates jobs with valid specification
    needs cross projects artifacts and pipelines
      returns errors
    with invalid needs cross projects artifacts
      returns errors
    cross pipeline needs
      when job is not present
        returns an error
    with cross project and cross pipeline needs
      returns a valid specification
    dast configuration
      creates a job with a valid specification
  secrets
    returns secrets info

Analytics::CodeReviewMetricsWorker
  #perform
    with code review analytics feature available
      executes operation for provided MR
      for invalid MR id
        does not  execute  operation
      for invalid operation
        raises an error

Groups::RecentMergeRequestsCountService
  #relation_for_count
    uses the MergeRequestsFinder to scope issues
  #count
    only returns the count of recent MRs
    when user does not have access to some MRs
      caches per-user so users will see the correct value
      does not include those MRs

ProjectAlias
  is expected to belong to project required:
  is expected to validate that :project cannot be empty/falsy
  is expected to validate that :name cannot be empty/falsy
  is expected to validate that :name is case-sensitively unique
  is expected not to allow :name to be ‹"/foo"›
  is expected not to allow :name to be ‹"foo/foo"›
  is expected not to allow :name to be ‹"foo.git"›

Gitlab::Auth::Smartcard::SANExtension
  #alternate_emails
    without SAN extensions
      is expected to be empty
    with SAN extensions
      single extension
        is expected to match [{6=>"https://gitlab.example.com"}]
      multiple entries using ASN1
        is expected to match [{1=>"my@other.address", 6=>"1.2.3.4"}]
      custom General Name
        can't use custom alt names that are not part of general names
  #email_identity
    is expected to eq "singleEntryEmail@some.domain"
    multiple email identity SAN entries
      alternate name email for GitLab defined in the certificate
        is expected to eq "newemail@some.domain"
        inappropriate URI format
          is expected to be nil
      no alternate name defined to use with GitLab
        is expected to be nil
      when the host is partially matched to the URI
        is expected to be nil

Vulnerabilities::DestroyDismissalFeedbackService
  #execute
    without necessary permissions
      raises `Gitlab::Access::AccessDeniedError` error
    with necessary permissions
      destroys the feedback records associated with the findings of the given vulnerability

VulnerabilityExports::CreateService
  #execute
    when security dashboard feature is disabled
      raises an "access denied" error
    when security dashboard feature is enabled
      does not raise an "access denied" error
      creates new Vulnerabilities::Export
      schedules ::VulnerabilityExports::ExportWorker background job
      returns new Vulnerabilities::Export with project and format assigned

Gitlab::Ci::Config::Entry::Secret
  validation
    when entry config value is correct
      when file setting is not defined
        behaves like configures secrets
          #value
            returns secret configuration
          #valid?
            is valid
      when file setting is defined
        behaves like configures secrets
          #value
            returns secret configuration
          #valid?
            is valid
  when entry value is not correct
    #errors
      when there is an unknown key present
        reports error
      when there is no vault entry
        reports error

Security::StoreScansService
  .execute
    delegates the call to an instance of `Security::StoreScansService`
  #execute
    executes Security::StoreGroupedScansService for each group of artifacts if the feature is available
    when the pipeline is for the default branch
      schedules the `StoreSecurityReportsWorker`
    when the pipeline is not for the default branch
      does not schedule the `StoreSecurityReportsWorker`

Resolvers::Ci::CodeCoverageSummaryResolver
  #resolve
    when project has coverage
      returns coverage summary for the project as a batch
    when project does not have coverage
      returns nil

Types::DastScannerProfileType
  is expected to eq "DastScannerProfile"
  is expected to require graphql authorizations :read_on_demand_dast_scan
  is expected to have graphql fields :id, :profileName, :spiderTimeout, :targetTimeout, :editPath, :scanType, :useAjaxSpider, :showDebugMessages, and :referencedInSecurityPolicies
  dast_scanner_profiles
    profile_name field
      is expected to eq "Digital Portable Component 1cb5f9b9 - 2"
    when security policies are enabled
      only calls Gitaly twice when multiple profiles are present

SystemNotes::VulnerabilitiesService
  #change_vulnerability_state
    state changed to dismissed
      creates the note text correctly
      behaves like a system note
        has the correct attributes
    state changed to resolved
      creates the note text correctly
      behaves like a system note
        has the correct attributes
    state changed to confirmed
      creates the note text correctly
      behaves like a system note
        has the correct attributes

GitlabSubscriptions::PlanUpgradeService
  #execute
    when the response is a failure
      returns nil values
    when the response is successful
      eligible: true, assisted_id: "111", free_id: "222", plan_id: "111"
        returns the correct values
      eligible: true, assisted_id: nil, free_id: "222", plan_id: "222"
        returns the correct values
      eligible: true, assisted_id: "111", free_id: nil, plan_id: "111"
        returns the correct values
      eligible: true, assisted_id: nil, free_id: nil, plan_id: nil
        returns the correct values
      eligible: false, assisted_id: "111", free_id: "222", plan_id: "111"
        returns the correct values
      eligible: false, assisted_id: "111", free_id: nil, plan_id: "111"
        returns the correct values
      eligible: false, assisted_id: nil, free_id: "222", plan_id: "222"
        returns the correct values
      eligible: nil, assisted_id: "111", free_id: "222", plan_id: nil
        returns the correct values

Mutations::GitlabSubscriptions::Activate
  #resolve
    when successful
      adds the issue to the epic
    when failure
      returns errors
    when non-admin
      raises errors

Gitlab::GitAccessSnippet
  #check
    protocol_name: "ssh"
      is expected to be a kind of Gitlab::GitAccessResult::Success
    protocol_name: "web"
      is expected to be a kind of Gitlab::GitAccessResult::Success
    protocol_name: "http"
      is expected to be a kind of Gitlab::GitAccessResult::Success
    protocol_name: "https"
      is expected to be a kind of Gitlab::GitAccessResult::Success

VulnerabilityUserMention
  associations
    is expected to belong to vulnerability required:
    is expected to belong to note required:
  behaves like has user mentions
    #has_mentions?
      when no mentions
        returns false
      when mentioned_users_ids not null
        returns true
      when mentioned projects
        returns true
      when mentioned groups
        returns true

Security::StoreFindingsMetadataService
  #execute
    when the given security scan already has findings
      does not create new findings in database
    when the given security scan does not have any findings
      creates the security finding entries in database
      when the scanners already exist in the database
        does not create new scanner entries in the database
      when the scanner does not exist in the database
        creates new scanner entry in the database

Boards::EpicBoards::DestroyService
  behaves like board destroy service
    #execute
      when there is more than one board
        destroys the board
      when there is only one board
        does not remove board

ProjectsFinder
  #execute
    filter by plans
      with ultimate plan
        is expected to contain exactly #<Project id:1255 namespace2211/project2251>> and #<Project id:1256 namespace2212/project2252>>
      with multiple plans
        is expected to contain exactly #<Project id:1255 namespace2211/project2251>>, #<Project id:1256 namespace2212/project2252>>, and #<Project id:1257 namespace2213/project2253>>
      with other plans
        is expected to be empty
      without plans
        is expected to contain exactly #<Project id:1255 namespace2211/project2251>>, #<Project id:1256 namespace2212/project2252>>, #<Project id:1257 namespace2213/project2253>>, and #<Project id:1258 namespace2214/project2254>>
      with empty plans
        is expected to contain exactly #<Project id:1255 namespace2211/project2251>>, #<Project id:1256 namespace2212/project2252>>, #<Project id:1257 namespace2213/project2253>>, and #<Project id:1258 namespace2214/project2254>>
      filter by aimed for deletion
        is expected to contain exactly #<Project id:1259 namespace2215/project2255>>

Gitlab::Ci::Config::Entry::Job
  .nodes
    when filtering all the entry/node names
      is expected to include :dast_configuration and :secrets
  validations
    when entry value is correct
      when has secrets
        behaves like a valid entry
          #valid?
            is valid
      when has dast_configuration
        behaves like a valid entry
          #valid?
            is valid
    when entry value is not correct
      when has needs
        when needs is bridge type
          behaves like an invalid entry
            reports error
      when has invalid dast_configuration
        behaves like an invalid entry
          reports error
      when has invalid secrets
        behaves like an invalid entry
          reports error
  dast_configuration
    includes dast_profile value
  secrets
    includes secrets value

SecurityHelper
  #instance_security_dashboard_data
    returns vulnerability, project, feedback, asset, and docs paths for the instance security dashboard
  #instance_security_settings_data
    when user is not auditor
      is expected to eq {:is_auditor=>"false"}
    when user is auditor
      is expected to eq {:is_auditor=>"true"}

Gitlab::Verify::Uploads
  includes uploads in object storage

Boards::EpicBoardsFinder
  #execute
    finds all epic boards in the group ordered by case-insensitive name
    when include_ancestor_groups parameter is set
      finds all epic boards in the group or ancestor groups
    when ID parameter is set
      finds epic board by ID

AuditEvents::ProtectedBranchAuditEventService
  #security_event
    when a protected_branch is add
      creates an event
      logs to a file with the provided details
    when a protected_branch is remove
      creates an event
      logs to a file with the provided details
    when not licensed
      doesn't create an event or log to a file

Resolvers::EpicIssuesResolver
  is expected to have nullable GraphQL type EpicIssueConnection
  #resolve
    finds all epic issues
    finds only epic issues that user can read

StatusPage::PublishWorker
  #perform
    behaves like an idempotent worker
      is labeled as idempotent
      performs multiple times sequentially without raising an exception
      when service succeeds
        execute the service
      with unknown project
        does not execute the service
      when service returns an error
        succeeds and logs the error
    when service raises an exception
      re-raises exception

Issues::DuplicateService
  #execute
    relates the duplicate issues

projects/_merge_request_status_checks_settings
  renders the settings title
  renders the settings description
  renders the settings app element
  renders the loading spinner

GroupSaml::SignUpService
  #execute
    creates new user
    links new user to oauth identity
    when group has enforced_group_managed_accounts enabled
      creates new user managed by given group

ProjectRepositoryState
  assocations
    is expected to belong to project required:  inverse_of => repository_state
  validations
    is expected to validate that :project cannot be empty/falsy
    is expected to validate that :project is case-sensitively unique

Mutations::Vulnerabilities::Dismiss
  #resolve
    when the user can dismiss the vulnerability
      when user does not have access to the project
        raises an error
      with invalid params
        raises an error
      when user has access to the project
        returns the dismissed vulnerability

Issues::CloseService
  sync requirement
    behaves like sync requirement with issue state
      when skip_authorization is false
        does not change issue state
      when skip_authorization is true
        keeps requirement and requirement issue in sync
        when issue is not of requirement_type
          does not sync state
        when saving requirement fails
          does not change requirement and issue states
          logs error

Integrations::Github::RemoteProject
  #api_url
    uses github.com API endpoint
    when git repo mirror URL is used
      excludes auth token set as username
    for a custom host
      is extracted from the url
  #owner
    is extracted from the url
  #repository_name
    is extracted from the url
    when https git URL is used
      doesn't include '.git' at the end
    when project sub-route accidentally used
      ignores the sub-route

Security::SecurityOrchestrationPolicies::ScanPipelineService
  #execute
    when there is an invalid action
      does not create scan job
    when there is only one action
      behaves like creates scan jobs
        returns created jobs
    when there are multiple actions
      behaves like creates scan jobs
        returns created jobs
    when there are valid and invalid actions
      behaves like creates scan jobs
        returns created jobs

Gitlab::Auth::Ldap::Config
  .available_providers
    when multiple LDAP servers are licensed
      returns multiple configured providers
  ._available_servers
    when no database connection occurs
      returns an empty array

Gitlab::SearchResults
  #projects
    avoid N+1 queries

BoardSimpleEntity
  #milestone
    has no `milestone` attribute
    has `milestone` attribute
  #iteration
    has no `iteration` attribute
    has `iteration` attribute

BlobEntity
  as json
    exposes needed attributes

FeatureFlagIssues::DestroyService
  #execute
    unlinks the feature flag and the issue
    does not unlink the feature flag and the issue when the user cannot admin the feature flag

Gitlab::Database::Connection
  #geo_uncached_queries
    when no block is given
      raises error
    when the current node is a primary
      wraps the block in an ActiveRecord::Base.uncached block
    when the current node is a secondary
      wraps the block in a Geo::TrackingBase.uncached block and an ActiveRecord::Base.uncached block
    when there is no current node
      wraps the block in an ActiveRecord::Base.uncached block

IterationsUpdateStatusWorker
  #perform
    schedules an issues roll-over job
    when iterations with passed due dates are in `upcoming`, `current` or `closes` states
      updates the status of iterations that require it
      in batches
        run in batches

Groups::ImportExport::ExportService
  #execute
    exports group and descendants wiki repositories
    when ndjson is not enabled
      does not export group wiki repositories

projects/merge_requests/show.html.haml
  when merge request is created by a GitLab team member
    renders an employee badge next to their name

AlertManagement::Alerts::UpdateService
  #execute
    when a status is included
      when moving from a closed status to an open status
        behaves like creates an escalation
          is expected to receive perform_async(a kind of Integer) 1 time
      moving from an open status to closed status
        is expected to change `target.pending_escalations.reload.count` from 1 to 0
      moving from a status of the same group
        does not create or delete escalations

VulnerabilityExternalIssueLinks::DestroyService
  deletes the specified vulnerability-external issue link

EE::Namespace::RootStorageStatistics
  #recalculate!
    when namespace belongs to a group
      aggregates namespace statistics
      works when there are no namespace statistics
    when namespace belong to a user
      does not aggregate namespace statistics

EE::Ci::PipelineEditorHelper
  #js_pipeline_editor_data
    with licensed feature
      returns ee specific values
    without licensed feature
      does not return the API fuzzing path

RepositoryImportWorker
  updates the error on custom project template Import/Export
  when project is a mirror
    adds mirror in front of the mirror scheduler queue
  sidekiq options
    disables retry
    disables dead
    sets default status expiration

Applications::CreateService
  #audit_event_service
    instance application
      creates AuditEvent with correct entity type
    group application
      creates AuditEvent with correct entity type
    user application
      creates AuditEvent with correct entity type

IncidentManagement::OncallSchedulesFinder
  #execute
    when feature is available
      when user has permissions
        returns project on-call schedules
        when iid given
          returns an on-call schedule for iid
      when user has no permissions
        is expected to eq #<ActiveRecord::Relation []>
    when feature is not avaiable
      is expected to eq #<ActiveRecord::Relation []>

Security::ScanPolicy
  read_scan
    when the security_dashboard feature is enabled
      when the current user has developer access to the scan's project
        is expected to be allowed :read_scan
      when the current user does not have developer access to the scan's project
        is expected to be disallowed :read_scan
    when the security_dashboard feature is disabled
      is expected to be disallowed :read_scan

Vulnerabilities::Finding::Evidence::SupportingMessage
  is expected to belong to evidence class_name => Vulnerabilities::Finding::Evidence inverse_of => supporting_messages required: true
  is expected to have one request class_name => Vulnerabilities::Finding::Evidence::Request inverse_of => supporting_message
  is expected to have one response class_name => Vulnerabilities::Finding::Evidence::Response inverse_of => supporting_message
  is expected to validate that the length of :name is at most 2048
  is expected to validate that :name cannot be empty/falsy

Licenses::DestroyService
  raises an error if license is nil
  raises an error if the user is not an admin
  when admin mode is enabled
    destroys a license
    with cloud license
      destroys a license
  when admin mode is disabled
    raises not allowed error

AppSec::Dast::SiteProfiles::Audit::UpdateService
  #execute
    audits the changes in the given properties
    omits the values for secret properties
    omits the values for properties too long to be displayed
    sorts properties that are arrays before comparing them

ProjectAuthorization
  .visible_to_user_and_access_level
    returns the records for given user that have at least the given access

Types::NamespaceType
  has specific fields
  Customized fields
    returns the expected values for customized fields defined in NamespaceType

DesignManagement::DeleteDesignsService
  #execute
    when service is successful
      calls repository#log_geo_updated_event
    when service errors
      does not call repository#log_geo_updated_event

Elastic::ApplicationVersionedSearch
  .elastic_index_dependant_association
    adds the associations to elastic_index_dependants
    when the association does not exist
      raises an error
    when the class is not an ApplicationRecord
      raises an error

Gitlab::Ci::Reports::LicenseScanning::ReportsComparer
  #new_licenses
    is expected to contain exactly "Apache 2.0"
  #existing_licenses
    is expected to contain exactly "MIT" and "BSD"
  #removed_licenses
    is expected to contain exactly "WTFPL"

EE::ApplicationSettingsHelper
  .visible_attributes
    personal access token parameters
      is expected to include :max_personal_access_token_lifetime, :enforce_pat_expiration, and :enforce_ssh_key_expiration

ElasticIndexInitialBulkCronWorker
  behaves like worker with data consistency
    .get_data_consistency_feature_flag_enabled?
      returns true
    .get_data_consistency
      returns correct data consistency

Gitlab::IncidentManagement
  .oncall_schedules_available?
    is expected to be truthy
    when there is no license
      is expected to be falsey
  .escalation_policies_available?
    is expected to be truthy
    when escalation policies not avaialble
      is expected to be falsey
    when on-call schedules not available
      is expected to be falsey

MergeRequests::PostMergeService
  #execute
    finalize approvals
      executes ApprovalRules::FinalizeService

CreateGithubWebhookWorker
  #perform
    creates the webhook

Types::GroupStatsType
  is expected to require graphql authorizations :read_group
  has the expected fields

Types::Vulnerability::IssueLinkType
  is expected to have graphql fields :id, :link_type, and :issue
  is expected to require graphql authorizations :read_issue_link

Types::QueryType
  is expected to have graphql fields :ci_minutes_usage, :current_license, :geo_node, :instance_security_dashboard, :iteration, :license_history_entries, :vulnerabilities, :vulnerabilities_count_by_day, and :vulnerability

AuditEvents::ImpersonationAuditEventService
  #security_event
    creates an event and logs to a file with the provided details

Snowplow Schema Validation
  snowplow events definition
    matches the schema for EE
      behaves like matches schema
        conforms schema json

Gitlab::Usage::Metrics::Aggregates::Aggregate
  .new
    loads aggregated metrics from both sources

Types::AlertManagement::PayloadAlertFieldTypeEnum
  exposes all alert field types

LdapSyncWorker
  #perform
    with the default license key
      syncs all LDAP users
    without a license key
      does not sync LDAP users

groups/compliance_frameworks/edit.html.haml
  shows the compliance frameworks form

Types::RequirementsManagement::TestReportType
  is expected to eq "TestReport"
  is expected to have graphql fields :id, :state, :author, and :created_at

Boards::EpicBoards::Visits::CreateService
  #execute
    with epic board
      behaves like boards recent visit create service
        returns nil when there is no user
        returns nil when database is read only
        records the visit

Types::PermissionTypes::Project
  is expected to have graphql field :admin_path_locks

Types::MergeRequests::ApprovalStateType
  is expected to have graphql fields :approval_rules_overwritten and :rules
  is expected to require graphql authorizations :read_merge_request

IncidentManagement::OncallScheduleHelper
  #oncall_schedule_data
    returns on-call schedule data

Types::PathLockType
  is expected to eq "PathLock"
  has the expected fields

Types::GroupReleaseStatsType
  is expected to require graphql authorizations :read_group_release_stats
  has the expected fields

Boards::EpicBoardLabel
  associations
    is expected to belong to epic_board required: true inverse_of => epic_board_labels
    is expected to belong to label required: true inverse_of => epic_board_labels

BaseCountService
  #update_cache_for_key
    calls Gitlab::Cache.delete_on_geo_secondaries

Integrations::GitlabSlackApplication
  #chat_responder
    returns the chat responder to use

Types::VulnerabilityLocation::ContainerScanningType
  is expected to have graphql fields :dependency, :image, and :operating_system

Resolvers::InstanceSecurityDashboardResolver
  #resolve
    is expected to be a kind of InstanceSecurityDashboard

Ci::Processable
  delegations
    is expected to delegate #merge_train_pipeline? to the #pipeline object

Types::VulnerabilityDetails::BaseType
  is expected to have graphql fields :name, :description, and :fieldName
Knapsack report was generated. Preview:
{
  "ee/spec/models/project_spec.rb": 218.9642327270003,
  "ee/spec/lib/gitlab/elastic/project_search_results_spec.rb": 164.4367483820006,
  "ee/spec/models/merge_request_spec.rb": 91.15452670299965,
  "ee/spec/services/elastic/process_bookkeeping_service_spec.rb": 69.61769353899945,
  "ee/spec/services/ee/issues/update_service_spec.rb": 46.585044903999005,
  "ee/spec/services/epic_links/create_service_spec.rb": 56.407052381999165,
  "ee/spec/models/ci/pipeline_spec.rb": 30.96329387700098,
  "ee/spec/models/upload_spec.rb": 31.709340002998943,
  "ee/spec/services/ci/compare_security_reports_service_spec.rb": 35.14824414599934,
  "ee/spec/services/vulnerabilities/dismiss_service_spec.rb": 44.92809592999947,
  "ee/spec/models/concerns/elastic/issue_spec.rb": 34.336115296999196,
  "ee/spec/services/dashboard/projects/list_service_spec.rb": 21.63565587300036,
  "ee/spec/models/concerns/elastic/merge_request_spec.rb": 29.71846493599878,
  "ee/spec/models/ee/protected_ref_access_spec.rb": 21.056487117999495,
  "ee/spec/services/search_service_spec.rb": 25.972286986001563,
  "ee/spec/graphql/resolvers/epics_resolver_spec.rb": 15.678745571000036,
  "ee/spec/models/ee/ci/pipeline_artifact_spec.rb": 16.257532626001193,
  "ee/spec/services/projects/alerting/notify_service_spec.rb": 10.168148329999894,
  "ee/spec/helpers/ee/groups_helper_spec.rb": 14.705349630001365,
  "ee/spec/services/approval_rules/params_filtering_service_spec.rb": 16.467086053000457,
  "ee/spec/lib/gitlab/auth/ldap/access_spec.rb": 9.932837394999297,
  "ee/spec/services/application_settings/update_service_spec.rb": 14.463518668999313,
  "ee/spec/services/vulnerabilities/resolve_service_spec.rb": 13.15031987400107,
  "ee/spec/services/alert_management/network_alert_service_spec.rb": 6.535301366999192,
  "ee/spec/models/concerns/elastic/project_wiki_spec.rb": 12.615233104999788,
  "ee/spec/services/vulnerabilities/update_service_spec.rb": 11.826000430999557,
  "ee/spec/workers/store_security_reports_worker_spec.rb": 9.110520722000729,
  "ee/spec/serializers/epic_note_entity_spec.rb": 7.918046894001236,
  "ee/spec/finders/requirements_management/requirements_finder_spec.rb": 4.910537457000828,
  "ee/spec/lib/gitlab/ci/reports/license_scanning/report_spec.rb": 4.185168316998897,
  "ee/spec/services/iterations/create_service_spec.rb": 5.1984105949995865,
  "ee/spec/services/compliance_management/frameworks/create_service_spec.rb": 8.299099541998658,
  "ee/spec/presenters/audit_event_presenter_spec.rb": 2.9710153110008832,
  "ee/spec/models/dast_site_validation_spec.rb": 2.9913883189983608,
  "ee/spec/presenters/vulnerability_presenter_spec.rb": 3.743703746000392,
  "ee/spec/services/ci/retry_build_service_spec.rb": 6.721526687000733,
  "ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb": 6.247094667998681,
  "ee/spec/services/system_notes/merge_train_service_spec.rb": 5.218240963000426,
  "ee/spec/services/ee/issuable/common_system_notes_service_spec.rb": 6.581784111998786,
  "ee/spec/helpers/ee/lock_helper_spec.rb": 4.5366389179998805,
  "ee/spec/services/projects/gitlab_projects_import_service_spec.rb": 6.960796339000808,
  "ee/spec/graphql/types/admin/cloud_licenses/current_license_type_spec.rb": 2.1686342410012003,
  "ee/spec/lib/gitlab/ci/templates/api_fuzzing_latest_gitlab_ci_yaml_spec.rb": 4.372215516999859,
  "ee/spec/presenters/ee/clusters/cluster_presenter_spec.rb": 7.928034901999126,
  "ee/spec/services/network_policies/resources_service_spec.rb": 6.686994850000701,
  "ee/spec/models/saml_group_link_spec.rb": 1.695681731998775,
  "ee/spec/lib/analytics/merge_request_metrics_refresh_spec.rb": 3.185018478001439,
  "ee/spec/workers/iterations/roll_over_issues_worker_spec.rb": 2.734372887000063,
  "ee/spec/graphql/types/issue_type_spec.rb": 3.6491273259998707,
  "ee/spec/lib/ee/gitlab/ci/parsers/security/validators/schema_validator_spec.rb": 1.2628029099996638,
  "ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb": 2.8387583659987286,
  "ee/spec/workers/new_epic_worker_spec.rb": 5.388535004000005,
  "ee/spec/workers/sync_seat_link_request_worker_spec.rb": 1.4746976360002009,
  "ee/spec/models/analytics/devops_adoption/snapshot_spec.rb": 2.6340274890008004,
  "ee/spec/lib/ee/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb": 1.001569959000335,
  "ee/spec/helpers/ee/auth_helper_spec.rb": 1.0246886670011008,
  "ee/spec/finders/clusters/agent_authorizations_finder_spec.rb": 3.3120550229996297,
  "ee/spec/models/approval_wrapped_code_owner_rule_spec.rb": 2.984585349999179,
  "ee/spec/models/gitlab/seat_link_data_spec.rb": 1.633454967999569,
  "ee/spec/models/issuables_analytics_spec.rb": 3.7626398440006597,
  "ee/spec/services/audit_events/repository_push_audit_event_service_spec.rb": 2.699489241000265,
  "ee/spec/graphql/mutations/merge_requests/set_assignees_spec.rb": 3.962814532000266,
  "ee/spec/services/audit_events/export_csv_service_spec.rb": 1.4918366149995563,
  "ee/spec/graphql/resolvers/vulnerabilities/issue_links_resolver_spec.rb": 1.8748884629985696,
  "ee/spec/serializers/status_page/incident_comment_entity_spec.rb": 3.8713431420001143,
  "ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb": 2.281647787000111,
  "ee/spec/services/award_emojis/destroy_service_spec.rb": 2.3435814710010163,
  "ee/spec/models/compliance_management/framework_spec.rb": 1.2965435570004047,
  "ee/spec/graphql/resolvers/scan_execution_policy_resolver_spec.rb": 2.326640391998808,
  "ee/spec/models/groups/repository_storage_move_spec.rb": 1.5163108420001663,
  "ee/spec/models/vulnerabilities/finding_signature_spec.rb": 3.2220117739998386,
  "ee/spec/services/analytics/cycle_analytics/stages/delete_service_spec.rb": 1.6155225109996536,
  "ee/spec/models/iteration_note_spec.rb": 2.5097644120014593,
  "ee/spec/views/projects/security/dast_profiles/show.html.haml_spec.rb": 2.542867099000432,
  "ee/spec/lib/gitlab/ci/templates/cluster_image_scanning_gitlab_ci_yaml_spec.rb": 2.3189988329995685,
  "ee/spec/services/ee/service_ping/permit_data_categories_service_spec.rb": 1.3102803749989107,
  "ee/spec/models/incident_management/issuable_escalation_status_spec.rb": 1.4817039059998933,
  "ee/spec/models/commit_spec.rb": 2.745103866000136,
  "ee/spec/views/layouts/application.html.haml_spec.rb": 2.5540136769996025,
  "ee/spec/lib/gitlab/ci/yaml_processor_spec.rb": 1.0146546279993345,
  "ee/spec/workers/analytics/code_review_metrics_worker_spec.rb": 2.3489176300008694,
  "ee/spec/services/groups/recent_merge_requests_count_service_spec.rb": 2.6107380610010296,
  "ee/spec/models/project_alias_spec.rb": 1.1597090609993757,
  "ee/spec/lib/gitlab/auth/smartcard/san_extension_spec.rb": 1.4534498189987062,
  "ee/spec/services/vulnerabilities/destroy_dismissal_feedback_service_spec.rb": 2.44124310999905,
  "ee/spec/services/vulnerability_exports/create_service_spec.rb": 2.890151560999584,
  "ee/spec/lib/gitlab/ci/config/entry/secret_spec.rb": 0.7815277339996101,
  "ee/spec/services/security/store_scans_service_spec.rb": 1.0152304479997838,
  "ee/spec/graphql/resolvers/ci/code_coverage_summary_resolver_spec.rb": 1.5403850599996076,
  "ee/spec/graphql/types/dast_scanner_profile_type_spec.rb": 2.1987409869998373,
  "ee/spec/services/system_notes/vulnerabilities_service_spec.rb": 1.8230429880004522,
  "ee/spec/services/gitlab_subscriptions/plan_upgrade_service_spec.rb": 1.088806288998967,
  "ee/spec/graphql/mutations/gitlab_subscriptions/activate_spec.rb": 1.0233886869991693,
  "ee/spec/lib/ee/gitlab/git_access_snippet_spec.rb": 1.5366904700003943,
  "ee/spec/models/vulnerability_user_mention_spec.rb": 1.0345963750005467,
  "ee/spec/services/security/store_findings_metadata_service_spec.rb": 1.4000951349989919,
  "ee/spec/services/boards/epic_boards/destroy_service_spec.rb": 0.7041214620003302,
  "ee/spec/finders/ee/projects_finder_spec.rb": 2.2437338920008187,
  "ee/spec/lib/gitlab/ci/config/entry/job_spec.rb": 0.9854305909993855,
  "ee/spec/helpers/security_helper_spec.rb": 0.9731188620007742,
  "ee/spec/lib/ee/gitlab/verify/uploads_spec.rb": 1.3793298269993102,
  "ee/spec/finders/boards/epic_boards_finder_spec.rb": 1.0384180749988445,
  "ee/spec/services/audit_events/protected_branch_audit_event_service_spec.rb": 1.1058532879997074,
  "ee/spec/graphql/resolvers/epic_issues_resolver_spec.rb": 2.6621218450000015,
  "ee/spec/workers/status_page/publish_worker_spec.rb": 1.1300285550005356,
  "ee/spec/services/issues/duplicate_service_spec.rb": 1.9664712229987344,
  "ee/spec/views/projects/_merge_request_status_checks_settings.html.haml_spec.rb": 1.0724574319992826,
  "ee/spec/services/group_saml/sign_up_service_spec.rb": 1.5885838349986443,
  "ee/spec/models/project_repository_state_spec.rb": 0.9717784919994301,
  "ee/spec/graphql/mutations/vulnerabilities/dismiss_spec.rb": 3.134147913000561,
  "ee/spec/services/ee/issues/close_service_spec.rb": 2.5201335510009812,
  "ee/spec/models/integrations/github/remote_project_spec.rb": 1.0249775369993586,
  "ee/spec/services/security/security_orchestration_policies/scan_pipeline_service_spec.rb": 0.8001296709990129,
  "ee/spec/lib/ee/gitlab/auth/ldap/config_spec.rb": 0.7555748559989297,
  "ee/spec/lib/ee/gitlab/search_results_spec.rb": 2.6847027330004494,
  "ee/spec/serializers/ee/board_simple_entity_spec.rb": 1.4125294240002404,
  "ee/spec/serializers/ee/blob_entity_spec.rb": 0.8762343630005489,
  "ee/spec/services/feature_flag_issues/destroy_service_spec.rb": 1.5270535409999866,
  "ee/spec/lib/ee/gitlab/database/connection_spec.rb": 0.9519361849997949,
  "ee/spec/workers/iterations_update_status_worker_spec.rb": 1.1665657309986273,
  "ee/spec/services/ee/groups/import_export/export_service_spec.rb": 1.7690582550003455,
  "ee/spec/views/projects/merge_requests/show.html.haml_spec.rb": 2.3234949140005483,
  "ee/spec/services/ee/alert_management/alerts/update_service_spec.rb": 1.7266697980012395,
  "ee/spec/services/vulnerability_external_issue_links/destroy_service_spec.rb": 1.2994268859984004,
  "ee/spec/models/ee/namespace/root_storage_statistics_spec.rb": 2.0444016740002553,
  "ee/spec/helpers/ee/ci/pipeline_editor_helper_spec.rb": 0.9984867889997986,
  "ee/spec/workers/repository_import_worker_spec.rb": 1.6795295649990294,
  "ee/spec/services/applications/create_service_spec.rb": 1.0390395560007164,
  "ee/spec/finders/incident_management/oncall_schedules_finder_spec.rb": 1.8689618829994288,
  "ee/spec/policies/security/scan_policy_spec.rb": 1.3615432799997507,
  "ee/spec/models/vulnerabilities/finding/evidence/supporting_message_spec.rb": 0.7374121180000657,
  "ee/spec/services/licenses/destroy_service_spec.rb": 1.2385599129993352,
  "ee/spec/services/app_sec/dast/site_profiles/audit/update_service_spec.rb": 1.428958282000167,
  "ee/spec/models/ee/project_authorization_spec.rb": 1.5391291689993523,
  "ee/spec/graphql/ee/types/namespace_type_spec.rb": 1.029026526000962,
  "ee/spec/services/ee/design_management/delete_designs_service_spec.rb": 1.7729576639994775,
  "ee/spec/models/concerns/elastic/application_versioned_search_spec.rb": 0.7400812290015892,
  "ee/spec/lib/gitlab/ci/reports/license_scanning/reports_comparer_spec.rb": 0.8646866849994694,
  "ee/spec/helpers/ee/application_settings_helper_spec.rb": 0.7111025220001466,
  "ee/spec/workers/elastic_index_initial_bulk_cron_worker_spec.rb": 0.7560944260003453,
  "ee/spec/lib/gitlab/incident_management_spec.rb": 1.2736359890004678,
  "ee/spec/services/ee/merge_requests/post_merge_service_spec.rb": 1.4488821400009328,
  "ee/spec/workers/create_github_webhook_worker_spec.rb": 1.1407327940014511,
  "ee/spec/graphql/types/group_stats_type_spec.rb": 0.6460089779993723,
  "ee/spec/graphql/types/vulnerability/issue_link_type_spec.rb": 0.7343326580012217,
  "ee/spec/graphql/types/query_type_spec.rb": 0.69001677399865,
  "ee/spec/services/audit_events/impersonation_audit_event_service_spec.rb": 0.9312924570003815,
  "ee/spec/lib/gitlab/tracking/snowplow_schema_validation_spec.rb": 0.8234857789993839,
  "ee/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb": 0.6010954430003039,
  "ee/spec/graphql/types/alert_management/payload_alert_field_type_enum_spec.rb": 0.5804978249998385,
  "ee/spec/workers/ldap_sync_worker_spec.rb": 0.9001217500008352,
  "ee/spec/views/groups/compliance_frameworks/edit.html.haml_spec.rb": 0.6428306479992898,
  "ee/spec/graphql/types/requirements_management/test_report_type_spec.rb": 0.6415831590002199,
  "ee/spec/services/boards/epic_boards/visits/create_service_spec.rb": 0.7807823739985906,
  "ee/spec/graphql/types/permission_types/project_spec.rb": 0.6612557570006175,
  "ee/spec/graphql/types/merge_requests/approval_state_type_spec.rb": 0.6430738580002071,
  "ee/spec/helpers/incident_management/oncall_schedule_helper_spec.rb": 0.7668786150006781,
  "ee/spec/graphql/types/path_lock_type_spec.rb": 0.8243539979994239,
  "ee/spec/graphql/types/group_release_stats_type_spec.rb": 0.6738425259991345,
  "ee/spec/models/boards/epic_board_label_spec.rb": 0.6654315470004804,
  "ee/spec/services/base_count_service_spec.rb": 0.6303877800000919,
  "ee/spec/models/integrations/gitlab_slack_application_spec.rb": 0.6002858430001652,
  "ee/spec/graphql/types/vulnerability_location/container_scanning_type_spec.rb": 0.6194287220005208,
  "ee/spec/graphql/resolvers/instance_security_dashboard_resolver_spec.rb": 0.6614382770003431,
  "ee/spec/models/ci/processable_spec.rb": 0.6588839670002926,
  "ee/spec/graphql/types/vulnerability_details/base_type_spec.rb": 0.6071875719990203
}

Knapsack global time execution for tests: 22m 42s

Finished in 22 minutes 44 seconds (files took 53.15 seconds to load)
3082 examples, 0 failures

Wed 13 Oct 2021 06:45:10 PM UTC
section_end:1634150710:step_script
section_start:1634150710:archive_cache
Saving cache for successful job
Not uploading cache ruby-gems-v1-4 due to policy
Not uploading cache gitaly-ruby-gems-v1-4 due to policy
section_end:1634150712:archive_cache
section_start:1634150712:upload_artifacts_on_success
Uploading artifacts for successful job
Uploading artifacts...
coverage/: found 5 matching files and directories  
WARNING: crystalball/: no matching files           
deprecations/: found 11 matching files and directories 
knapsack/: found 3 matching files and directories  
rspec_flaky/: found 4 matching files and directories 
rspec_profiling/: found 1 matching files and directories 
WARNING: tmp/capybara/: no matching files          
tmp/memory_test/: found 2 matching files and directories 
log/*.log: found 19 matching files and directories 
Uploading artifacts as "archive" to coordinator... ok  id=1677157349 responseStatus=201 Created token=gsJ2UfBe
Uploading artifacts...
junit_rspec.xml: found 1 matching files and directories 
Uploading artifacts as "junit" to coordinator... ok  id=1677157349 responseStatus=201 Created token=gsJ2UfBe
section_end:1634150715:upload_artifacts_on_success
section_start:1634150715:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1634150716:cleanup_file_variables
Job succeeded