summaryrefslogtreecommitdiff
path: root/qa/qa/specs/features/sanity/feature_flags_spec.rb
blob: acb9528fe6a4c72f42b57007922471f5ea83fe14 (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
# frozen_string_literal: true

module QA
  RSpec.describe 'Feature flag handler sanity checks', :sanity_feature_flags do
    context 'with an existing feature flag definition file' do
      let(:definition) do
        path = Pathname.new('../config/feature_flags')
          .expand_path(Runtime::Path.qa_root)
          .glob('**/*.yml')
          .first
        YAML.safe_load(File.read(path))
      end

      it 'reads the correct default enabled state' do
        # This test will fail if we ever remove all the feature flags, but that's very unlikely given how many there
        # are and how much we rely on them.
        expect(QA::Runtime::Feature.enabled?(definition['name'])).to be definition['default_enabled']
      end
    end

    describe 'feature flag definition files' do
      let(:file) do
        path = Pathname.new("#{root}/config/feature_flags/development").expand_path(Runtime::Path.qa_root)
        path.mkpath
        Tempfile.new(%w[ff-test .yml], path)
      end

      let(:flag) { Pathname.new(file.path).basename('.yml').to_s }
      let(:root) { '..' }

      before do
        definition = <<~YAML
          name: #{flag}
          type: development
          default_enabled: #{flag_enabled}
        YAML
        File.write(file, definition)
      end

      after do
        file.close!
      end

      shared_examples 'gets flag value' do
        context 'with a default disabled feature flag' do
          let(:flag_enabled) { 'false' }

          it 'reads the flag as disabled' do
            expect(QA::Runtime::Feature.enabled?(flag)).to be false
          end

          it 'reads as enabled after the flag is enabled' do
            QA::Runtime::Feature.enable(flag)

            expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_truthy
                                                                .within(max_duration: 60, sleep_interval: 5)
          end
        end

        context 'with a default enabled feature flag' do
          let(:flag_enabled) { 'true' }

          it 'reads the flag as enabled' do
            expect(QA::Runtime::Feature.enabled?(flag)).to be true
          end

          it 'reads as disabled after the flag is disabled' do
            QA::Runtime::Feature.disable(flag)

            expect { QA::Runtime::Feature.enabled?(flag) }.to eventually_be_falsey
                                                                .within(max_duration: 60, sleep_interval: 5)
          end
        end
      end

      context 'with a CE feature flag' do
        include_examples 'gets flag value'
      end

      context 'with an EE feature flag' do
        let(:root) { '../ee' }

        include_examples 'gets flag value'
      end
    end
  end
end