services_spec.rb 4.8 KB
Newer Older
1 2
require "spec_helper"

3
describe API::Services, api: true  do
4
  include ApiHelpers
R
Robert Schilling 已提交
5

6
  let(:user) { create(:user) }
7 8
  let(:admin) { create(:admin) }
  let(:user2) { create(:user) }
D
Dmitriy Zaporozhets 已提交
9
  let(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
10

K
Kirilll Zaitsev 已提交
11 12 13 14
  Service.available_services_names.each do |service|
    describe "PUT /projects/:id/services/#{service.dasherize}" do
      include_context service

15
      it "updates #{service} settings" do
K
Kirilll Zaitsev 已提交
16 17
        put api("/projects/#{project.id}/services/#{dashed_service}", user), service_attrs

Z
Z.J. van de Weg 已提交
18
        expect(response).to have_http_status(200)
K
Kirilll Zaitsev 已提交
19 20
      end

21
      it "returns if required fields missing" do
K
Kirilll Zaitsev 已提交
22
        attrs = service_attrs
V
Valery Sizov 已提交
23

K
Kirilll Zaitsev 已提交
24
        required_attributes = service_attrs_list.select do |attr|
V
Valery Sizov 已提交
25
          service_klass.validators_on(attr).any? do |v|
K
Kirilll Zaitsev 已提交
26 27 28 29 30 31 32
            v.class == ActiveRecord::Validations::PresenceValidator
          end
        end

        if required_attributes.empty?
          expected_code = 200
        else
G
Gabriel Mazetto 已提交
33
          attrs.delete(required_attributes.sample)
K
Kirilll Zaitsev 已提交
34 35
          expected_code = 400
        end
36

K
Kirilll Zaitsev 已提交
37 38 39 40 41 42 43 44 45
        put api("/projects/#{project.id}/services/#{dashed_service}", user), attrs

        expect(response.status).to eq(expected_code)
      end
    end

    describe "DELETE /projects/:id/services/#{service.dasherize}" do
      include_context service

46
      it "deletes #{service}" do
K
Kirilll Zaitsev 已提交
47 48
        delete api("/projects/#{project.id}/services/#{dashed_service}", user)

Z
Z.J. van de Weg 已提交
49
        expect(response).to have_http_status(200)
50
        project.send(service_method).reload
K
Kirilll Zaitsev 已提交
51 52
        expect(project.send(service_method).activated?).to be_falsey
      end
K
Kevin Houdebert 已提交
53
    end
54 55 56 57

    describe "GET /projects/:id/services/#{service.dasherize}" do
      include_context service

58 59
      # inject some properties into the service
      before do
60
        service_object = project.find_or_initialize_service(service)
61 62 63 64
        service_object.properties = service_attrs
        service_object.save
      end

65
      it 'returns authentication error when unauthenticated' do
66
        get api("/projects/#{project.id}/services/#{dashed_service}")
Z
Z.J. van de Weg 已提交
67
        expect(response).to have_http_status(401)
68
      end
69 70

      it "returns all properties of service #{service} when authenticated as admin" do
71
        get api("/projects/#{project.id}/services/#{dashed_service}", admin)
72

Z
Z.J. van de Weg 已提交
73
        expect(response).to have_http_status(200)
74 75 76
        expect(json_response['properties'].keys.map(&:to_sym)).to match_array(service_attrs_list.map)
      end

77
      it "returns properties of service #{service} other than passwords when authenticated as project owner" do
78 79
        get api("/projects/#{project.id}/services/#{dashed_service}", user)

Z
Z.J. van de Weg 已提交
80
        expect(response).to have_http_status(200)
81
        expect(json_response['properties'].keys.map(&:to_sym)).to match_array(service_attrs_list_without_passwords)
82
      end
83

84
      it "returns error when authenticated but not a project owner" do
85 86
        project.team << [user2, :developer]
        get api("/projects/#{project.id}/services/#{dashed_service}", user2)
87

Z
Z.J. van de Weg 已提交
88
        expect(response).to have_http_status(403)
89
      end
90
    end
K
Kevin Houdebert 已提交
91
  end
Z
Z.J. van de Weg 已提交
92 93 94

  describe 'POST /projects/:id/services/:slug/trigger' do
    let!(:project) { create(:empty_project) }
95
    let(:service_name) { 'mattermost_slash_commands' }
Z
Z.J. van de Weg 已提交
96 97 98

    context 'no service is available' do
      it 'returns a not found message' do
99
        post api("/projects/#{project.id}/services/idonotexist/trigger")
Z
Z.J. van de Weg 已提交
100 101

        expect(response).to have_http_status(404)
R
Robert Schilling 已提交
102
        expect(json_response["error"]).to eq("404 Not Found")
Z
Z.J. van de Weg 已提交
103 104 105 106
      end
    end

    context 'the service exists' do
Z
Z.J. van de Weg 已提交
107 108
      let(:params) { { token: 'token' } }

Z
Z.J. van de Weg 已提交
109 110
      context 'the service is not active' do
        let!(:inactive_service) do
111
          project.create_mattermost_slash_commands_service(
Z
Z.J. van de Weg 已提交
112 113 114 115 116 117
            active: false,
            properties: { token: 'token' }
          )
        end

        it 'when the service is inactive' do
R
Robert Schilling 已提交
118
          post api("/projects/#{project.id}/services/mattermost_slash_commands/trigger"), params
Z
Z.J. van de Weg 已提交
119 120 121 122 123 124 125

          expect(response).to have_http_status(404)
        end
      end

      context 'the service is active' do
        let!(:active_service) do
126
          project.create_mattermost_slash_commands_service(
Z
Z.J. van de Weg 已提交
127 128 129 130 131
            active: true,
            properties: { token: 'token' }
          )
        end

Z
Z.J. van de Weg 已提交
132
        it 'returns status 200' do
133
          post api("/projects/#{project.id}/services/mattermost_slash_commands/trigger"), params
Z
Z.J. van de Weg 已提交
134 135 136 137

          expect(response).to have_http_status(200)
        end
      end
Z
Z.J. van de Weg 已提交
138 139 140

      context 'when the project can not be found' do
        it 'returns a generic 404' do
141
          post api("/projects/404/services/mattermost_slash_commands/trigger"), params
Z
Z.J. van de Weg 已提交
142 143

          expect(response).to have_http_status(404)
144
          expect(json_response["message"]).to eq("404 Service Not Found")
Z
Z.J. van de Weg 已提交
145 146
        end
      end
Z
Z.J. van de Weg 已提交
147 148
    end
  end
149
end