summaryrefslogtreecommitdiff
path: root/spec/features/projects/settings/registry_settings_spec.rb
blob: 1cc54b71d4af00cf29088b0d9a169dc0f06617bc (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
132
133
134
135
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration policy', :js do
  using RSpec::Parameterized::TableSyntax

  let_it_be(:user) { create(:user) }
  let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) }

  let(:container_registry_enabled) { true }
  let(:container_registry_enabled_on_project) { true }

  shared_examples 'an expiration policy form' do
    before do
      project.update!(container_registry_enabled: container_registry_enabled_on_project)
      project.container_expiration_policy.update!(enabled: true)

      sign_in(user)
      stub_container_registry_config(enabled: container_registry_enabled)
    end

    context 'as owner' do
      it 'shows available section' do
        subject

        settings_block = find('[data-testid="registry-settings-app"]')
        expect(settings_block).to have_text 'Clean up image tags'
      end

      it 'saves cleanup policy submit the form' do
        subject

        within '[data-testid="registry-settings-app"]' do
          select('Every day', from: 'Run cleanup')
          select('50 tags per image name', from: 'Keep the most recent:')
          fill_in('Keep tags matching:', with: 'stable')
          select('7 days', from: 'Remove tags older than:')
          fill_in('Remove tags matching:', with: '.*-production')

          submit_button = find('[data-testid="save-button"')
          expect(submit_button).not_to be_disabled
          submit_button.click
        end

        expect(find('.gl-toast')).to have_content('Cleanup policy successfully saved.')
      end

      it 'does not save cleanup policy submit form with invalid regex' do
        subject

        within '[data-testid="registry-settings-app"]' do
          fill_in('Remove tags matching:', with: '*-production')

          submit_button = find('[data-testid="save-button"')
          expect(submit_button).not_to be_disabled
          submit_button.click
        end

        expect(find('.gl-toast')).to have_content('Something went wrong while updating the cleanup policy.')
      end
    end

    context 'with a project without expiration policy' do
      where(:application_setting, :feature_flag, :result) do
        true  | true  | :available_section
        true  | false | :available_section
        false | true  | :available_section
        false | false | :disabled_message
      end

      with_them do
        before do
          project.container_expiration_policy.destroy!
          stub_feature_flags(container_expiration_policies_historic_entry: false)
          stub_application_setting(container_expiration_policies_enable_historic_entries: application_setting)
          stub_feature_flags(container_expiration_policies_historic_entry: project) if feature_flag
        end

        it 'displays the expected result' do
          subject

          within '[data-testid="registry-settings-app"]' do
            case result
            when :available_section
              expect(find('[data-testid="enable-toggle"]')).to have_content('Disabled - Tags will not be automatically deleted.')
            when :disabled_message
              expect(find('.gl-alert-title')).to have_content('Cleanup policy for tags is disabled')
            end
          end
        end
      end
    end

    context 'when registry is disabled' do
      let(:container_registry_enabled) { false }

      it 'does not exists' do
        subject

        expect(page).not_to have_selector('[data-testid="registry-settings-app"]')
      end
    end

    context 'when container registry is disabled on project' do
      let(:container_registry_enabled_on_project) { false }

      it 'does not exists' do
        subject

        expect(page).not_to have_selector('[data-testid="registry-settings-app"]')
      end
    end
  end

  context 'with sidebar feature flag off' do
    subject { visit project_settings_ci_cd_path(project) }

    before do
      stub_feature_flags(sidebar_refactor: false)
    end

    it_behaves_like 'an expiration policy form'
  end

  context 'with sidebar feature flag on' do
    subject { visit project_settings_packages_and_registries_path(project) }

    before do
      stub_feature_flags(sidebar_refactor: true)
    end

    it_behaves_like 'an expiration policy form'
  end
end