summaryrefslogtreecommitdiff
path: root/spec/services/admin/propagate_integration_service_spec.rb
blob: 2e879cf06d1d7f835eac6ef00412249d4a77c8b1 (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Admin::PropagateIntegrationService do
  describe '.propagate' do
    let(:excluded_attributes) { %w[id project_id inherit_from_id instance created_at updated_at default] }
    let!(:project) { create(:project) }
    let!(:instance_integration) do
      JiraService.create!(
        instance: true,
        active: true,
        push_events: true,
        url: 'http://update-jira.instance.com',
        username: 'user',
        password: 'secret'
      )
    end

    let!(:inherited_integration) do
      JiraService.create!(
        project: create(:project),
        inherit_from_id: instance_integration.id,
        instance: false,
        active: true,
        push_events: false,
        url: 'http://jira.instance.com',
        username: 'user',
        password: 'secret'
      )
    end

    let!(:not_inherited_integration) do
      JiraService.create!(
        project: create(:project),
        inherit_from_id: nil,
        instance: false,
        active: true,
        push_events: false,
        url: 'http://jira.instance.com',
        username: 'user',
        password: 'secret'
      )
    end

    let!(:another_inherited_integration) do
      BambooService.create!(
        project: create(:project),
        inherit_from_id: instance_integration.id,
        instance: false,
        active: true,
        push_events: false,
        bamboo_url: 'http://gitlab.com',
        username: 'mic',
        password: 'password',
        build_key: 'build'
      )
    end

    shared_examples 'inherits settings from integration' do
      it 'updates the inherited integrations' do
        described_class.propagate(integration: instance_integration, overwrite: overwrite)

        expect(integration.reload.inherit_from_id).to eq(instance_integration.id)
        expect(integration.attributes.except(*excluded_attributes))
          .to eq(instance_integration.attributes.except(*excluded_attributes))
      end

      context 'integration with data fields' do
        let(:excluded_attributes) { %w[id service_id created_at updated_at] }

        it 'updates the data fields from inherited integrations' do
          described_class.propagate(integration: instance_integration, overwrite: overwrite)

          expect(integration.reload.data_fields.attributes.except(*excluded_attributes))
            .to eq(instance_integration.data_fields.attributes.except(*excluded_attributes))
        end
      end
    end

    shared_examples 'does not inherit settings from integration' do
      it 'does not update the not inherited integrations' do
        described_class.propagate(integration: instance_integration, overwrite: overwrite)

        expect(integration.reload.attributes.except(*excluded_attributes))
          .not_to eq(instance_integration.attributes.except(*excluded_attributes))
      end
    end

    context 'update only inherited integrations' do
      let(:overwrite) { false }

      it_behaves_like 'inherits settings from integration' do
        let(:integration) { inherited_integration }
      end

      it_behaves_like 'does not inherit settings from integration' do
        let(:integration) { not_inherited_integration }
      end

      it_behaves_like 'does not inherit settings from integration' do
        let(:integration) { another_inherited_integration }
      end

      it_behaves_like 'inherits settings from integration' do
        let(:integration) { project.jira_service }
      end
    end

    context 'update all integrations' do
      let(:overwrite) { true }

      it_behaves_like 'inherits settings from integration' do
        let(:integration) { inherited_integration }
      end

      it_behaves_like 'inherits settings from integration' do
        let(:integration) { not_inherited_integration }
      end

      it_behaves_like 'does not inherit settings from integration' do
        let(:integration) { another_inherited_integration }
      end

      it_behaves_like 'inherits settings from integration' do
        let(:integration) { project.jira_service }
      end
    end

    it 'updates project#has_external_issue_tracker for issue tracker services' do
      described_class.propagate(integration: instance_integration, overwrite: true)

      expect(project.reload.has_external_issue_tracker).to eq(true)
    end

    it 'updates project#has_external_wiki for external wiki services' do
      instance_integration = ExternalWikiService.create!(
        instance: true,
        active: true,
        push_events: false,
        external_wiki_url: 'http://external-wiki-url.com'
      )

      described_class.propagate(integration: instance_integration, overwrite: true)

      expect(project.reload.has_external_wiki).to eq(true)
    end
  end
end