summaryrefslogtreecommitdiff
path: root/spec/factories/groups.rb
blob: aa264ad3377bd533e3b57cea540f4b3c35ae0a7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# frozen_string_literal: true

FactoryBot.define do
  factory :group, class: 'Group', parent: :namespace do
    sequence(:name) { |n| "group#{n}" }
    path { name.downcase.gsub(/\s/, '_') }
    type { Group.sti_name }
    owner { nil }
    project_creation_level { ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS }

    after(:create) do |group|
      if group.owner
        # We could remove this after we have proper constraint:
        # https://gitlab.com/gitlab-org/gitlab-foss/issues/43292
        raise "Don't set owner for groups, use `group.add_owner(user)` instead"
      end

      create(:namespace_settings, namespace: group) unless group.namespace_settings
    end

    trait :public do
      visibility_level { Gitlab::VisibilityLevel::PUBLIC }
    end

    trait :internal do
      visibility_level { Gitlab::VisibilityLevel::INTERNAL }
    end

    trait :private do
      visibility_level { Gitlab::VisibilityLevel::PRIVATE }
    end

    trait :with_avatar do
      avatar { fixture_file_upload('spec/fixtures/dk.png') }
    end

    trait :request_access_disabled do
      request_access_enabled { false }
    end

    trait :nested do
      parent factory: :group
    end

    trait :auto_devops_enabled do
      auto_devops_enabled { true }
    end

    trait :auto_devops_disabled do
      auto_devops_enabled { false }
    end

    trait :owner_subgroup_creation_only do
      subgroup_creation_level { ::Gitlab::Access::OWNER_SUBGROUP_ACCESS }
    end

    trait :shared_runners_disabled do
      shared_runners_enabled { false }
    end

    trait :with_export do
      after(:create) do |group, _evaluator|
        export_file = fixture_file_upload('spec/fixtures/group_export.tar.gz')
        create(:import_export_upload, group: group, export_file: export_file)
      end
    end

    trait :allow_descendants_override_disabled_shared_runners do
      allow_descendants_override_disabled_shared_runners { true }
    end

    trait :disabled_and_unoverridable do
      shared_runners_disabled
      allow_descendants_override_disabled_shared_runners { false }
    end

    trait :disabled_with_override do
      shared_runners_disabled
      allow_descendants_override_disabled_shared_runners
    end

    trait :shared_runners_enabled do
      shared_runners_enabled { true }
    end

    # Construct a hierarchy underneath the group.
    # Each group will have `children` amount of children,
    # and `depth` levels of descendants.
    trait :with_hierarchy do
      transient do
        children { 4 }
        depth    { 4 }
      end

      after(:create) do |group, evaluator|
        def create_graph(parent: nil, children: 4, depth: 4)
          return unless depth > 1

          children.times do
            factory_name = parent.model_name.singular
            child = FactoryBot.create(factory_name, parent: parent)
            create_graph(parent: child, children: children, depth: depth - 1)
          end

          parent
        end

        create_graph(
          parent:   group,
          children: evaluator.children,
          depth:    evaluator.depth
        )
      end
    end

    trait :crm_enabled do
      after(:create) do |group|
        create(:crm_settings, group: group, enabled: true)
      end
    end

    trait :test_group do
      path { "test-group-fulfillment#{SecureRandom.hex(4)}" }
      created_at { 4.days.ago }

      after(:create) do |group|
        group.add_owner(create(:user, email: "test-user-#{SecureRandom.hex(4)}@test.com"))
      end
    end
  end
end