summaryrefslogtreecommitdiff
path: root/spec/models/integrations/field_spec.rb
blob: 6b1ce7fcbde5958489bea113f8c54f621c13bc61 (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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe ::Integrations::Field do
  subject(:field) { described_class.new(**attrs) }

  let(:attrs) { { name: nil, integration_class: test_integration } }
  let(:test_integration) do
    Class.new(Integration) do
      def self.default_placeholder
        'my placeholder'
      end
    end
  end

  describe '#name' do
    before do
      attrs[:name] = :foo
    end

    it 'is stringified' do
      expect(field.name).to eq 'foo'
      expect(field[:name]).to eq 'foo'
    end

    context 'when not set' do
      before do
        attrs.delete(:name)
      end

      it 'complains' do
        expect { field }.to raise_error(ArgumentError)
      end
    end
  end

  described_class::ATTRIBUTES.each do |name|
    describe "##{name}" do
      it "responds to #{name}" do
        expect(field).to be_respond_to(name)
      end

      context 'when not set' do
        before do
          attrs.delete(name)
        end

        let(:have_correct_default) do
          case name
          when :api_only
            be false
          when :type
            eq 'text'
          else
            be_nil
          end
        end

        it 'has the correct default' do
          expect(field[name]).to have_correct_default
          expect(field.send(name)).to have_correct_default
        end
      end

      context 'when set to a static value' do
        before do
          attrs[name] = :known
        end

        it 'is known' do
          expect(field[name]).to eq(:known)
          expect(field.send(name)).to eq(:known)
        end
      end

      context 'when set to a dynamic value' do
        it 'is computed' do
          attrs[name] = -> { Time.current }
          start = Time.current

          travel_to(start + 1.minute) do
            expect(field[name]).to be_after(start)
            expect(field.send(name)).to be_after(start)
          end
        end

        it 'is executed in the class scope' do
          attrs[name] = -> { default_placeholder }

          expect(field[name]).to eq('my placeholder')
          expect(field.send(name)).to eq('my placeholder')
        end
      end
    end
  end

  describe '#secret?' do
    context 'when empty' do
      it { is_expected.not_to be_secret }
    end

    context 'when a secret field' do
      before do
        attrs[:type] = 'password'
      end

      it { is_expected.to be_secret }
    end

    %w[token api_token api_key secret_key secret_sauce password passphrase].each do |name|
      context "when named #{name}" do
        before do
          attrs[:name] = name
        end

        it { is_expected.to be_secret }
      end
    end

    context "when named url" do
      before do
        attrs[:name] = :url
      end

      it { is_expected.not_to be_secret }
    end
  end
end