BigW Consortium Gitlab

environments_spec.rb 5.9 KB
Newer Older
1 2
require 'spec_helper'

3
describe API::Environments do
4 5
  let(:user)          { create(:user) }
  let(:non_member)    { create(:user) }
6
  let(:project)       { create(:empty_project, :private, namespace: user.namespace) }
7 8 9 10 11 12 13 14
  let!(:environment)  { create(:environment, project: project) }

  before do
    project.team << [user, :master]
  end

  describe 'GET /projects/:id/environments' do
    context 'as member of the project' do
15
      it 'returns project environments' do
16 17
        project_data_keys = %w(id http_url_to_repo web_url name name_with_namespace path path_with_namespace)

18 19 20
        get api("/projects/#{project.id}/environments", user)

        expect(response).to have_http_status(200)
21
        expect(response).to include_pagination_headers
22 23 24 25
        expect(json_response).to be_an Array
        expect(json_response.size).to eq(1)
        expect(json_response.first['name']).to eq(environment.name)
        expect(json_response.first['external_url']).to eq(environment.external_url)
26
        expect(json_response.first['project'].keys).to contain_exactly(*project_data_keys)
27 28 29 30
      end
    end

    context 'as non member' do
31
      it 'returns a 404 status code' do
32 33 34 35 36 37 38
        get api("/projects/#{project.id}/environments", non_member)

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

Z.J. van de Weg committed
39
  describe 'POST /projects/:id/environments' do
40 41 42 43 44 45
    context 'as a member' do
      it 'creates a environment with valid params' do
        post api("/projects/#{project.id}/environments", user), name: "mepmep"

        expect(response).to have_http_status(201)
        expect(json_response['name']).to eq('mepmep')
Nick Thomas committed
46
        expect(json_response['slug']).to eq('mepmep')
47 48 49 50 51 52 53 54 55
        expect(json_response['external']).to be nil
      end

      it 'requires name to be passed' do
        post api("/projects/#{project.id}/environments", user), external_url: 'test.gitlab.com'

        expect(response).to have_http_status(400)
      end

56
      it 'returns a 400 if environment already exists' do
57 58
        post api("/projects/#{project.id}/environments", user), name: environment.name

Z.J. van de Weg committed
59
        expect(response).to have_http_status(400)
60
      end
Nick Thomas committed
61 62 63 64 65 66 67

      it 'returns a 400 if slug is specified' do
        post api("/projects/#{project.id}/environments", user), name: "foo", slug: "foo"

        expect(response).to have_http_status(400)
        expect(json_response["error"]).to eq("slug is automatically generated and cannot be changed")
      end
68 69 70 71
    end

    context 'a non member' do
      it 'rejects the request' do
72
        post api("/projects/#{project.id}/environments", non_member), name: 'gitlab.com'
73

74 75 76 77 78
        expect(response).to have_http_status(404)
      end

      it 'returns a 400 when the required params are missing' do
        post api("/projects/12345/environments", non_member), external_url: 'http://env.git.com'
79 80 81 82
      end
    end
  end

83 84 85 86 87
  describe 'PUT /projects/:id/environments/:environment_id' do
    it 'returns a 200 if name and external_url are changed' do
      url = 'https://mepmep.whatever.ninja'
      put api("/projects/#{project.id}/environments/#{environment.id}", user),
          name: 'Mepmep', external_url: url
88

89 90 91
      expect(response).to have_http_status(200)
      expect(json_response['name']).to eq('Mepmep')
      expect(json_response['external_url']).to eq(url)
92 93
    end

Nick Thomas committed
94 95 96 97 98 99 100 101 102
    it "won't allow slug to be changed" do
      slug = environment.slug
      api_url = api("/projects/#{project.id}/environments/#{environment.id}", user)
      put api_url, slug: slug + "-foo"

      expect(response).to have_http_status(400)
      expect(json_response["error"]).to eq("slug is automatically generated and cannot be changed")
    end

103 104
    it "won't update the external_url if only the name is passed" do
      url = environment.external_url
105
      put api("/projects/#{project.id}/environments/#{environment.id}", user),
106
          name: 'Mepmep'
107 108 109

      expect(response).to have_http_status(200)
      expect(json_response['name']).to eq('Mepmep')
110
      expect(json_response['external_url']).to eq(url)
111 112
    end

113
    it 'returns a 404 if the environment does not exist' do
114 115 116 117 118
      put api("/projects/#{project.id}/environments/12345", user)

      expect(response).to have_http_status(404)
    end
  end
119 120 121 122 123 124

  describe 'DELETE /projects/:id/environments/:environment_id' do
    context 'as a master' do
      it 'returns a 200 for an existing environment' do
        delete api("/projects/#{project.id}/environments/#{environment.id}", user)

125
        expect(response).to have_http_status(204)
126 127 128 129 130 131 132 133 134
      end

      it 'returns a 404 for non existing id' do
        delete api("/projects/#{project.id}/environments/12345", user)

        expect(response).to have_http_status(404)
        expect(json_response['message']).to eq('404 Not found')
      end
    end
135 136 137 138 139 140 141 142

    context 'a non member' do
      it 'rejects the request' do
        delete api("/projects/#{project.id}/environments/#{environment.id}", non_member)

        expect(response).to have_http_status(404)
      end
    end
143
  end
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178

  describe 'POST /projects/:id/environments/:environment_id/stop' do
    context 'as a master' do
      context 'with a stoppable environment' do
        before do
          environment.update(state: :available)

          post api("/projects/#{project.id}/environments/#{environment.id}/stop", user)
        end

        it 'returns a 200' do
          expect(response).to have_http_status(200)
        end

        it 'actually stops the environment' do
          expect(environment.reload).to be_stopped
        end
      end

      it 'returns a 404 for non existing id' do
        post api("/projects/#{project.id}/environments/12345/stop", user)

        expect(response).to have_http_status(404)
        expect(json_response['message']).to eq('404 Not found')
      end
    end

    context 'a non member' do
      it 'rejects the request' do
        post api("/projects/#{project.id}/environments/#{environment.id}/stop", non_member)

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