gitlab_controller_spec.rb 9.4 KB
Newer Older
V
Valery Sizov 已提交
1 2
require 'spec_helper'

3
describe Import::GitlabController do
4 5
  include ImportSpecHelper

6 7 8 9 10 11 12
  let(:user) { create(:user) }
  let(:token) { "asdasd12345" }
  let(:access_params) { { gitlab_access_token: token } }

  def assign_session_token
    session[:gitlab_access_token] = token
  end
V
Valery Sizov 已提交
13 14 15

  before do
    sign_in(user)
16
    allow(controller).to receive(:gitlab_import_enabled?).and_return(true)
V
Valery Sizov 已提交
17 18 19 20
  end

  describe "GET callback" do
    it "updates access token" do
21 22
      allow_any_instance_of(Gitlab::GitlabImport::Client)
        .to receive(:get_token).and_return(token)
23
      stub_omniauth_provider('gitlab')
V
Valery Sizov 已提交
24 25

      get :callback
J
Jeroen van Baarsen 已提交
26

27
      expect(session[:gitlab_access_token]).to eq(token)
28
      expect(controller).to redirect_to(status_import_gitlab_url)
V
Valery Sizov 已提交
29 30 31 32 33 34
    end
  end

  describe "GET status" do
    before do
      @repo = OpenStruct.new(path: 'vim', path_with_namespace: 'asd/vim')
35
      assign_session_token
V
Valery Sizov 已提交
36 37 38
    end

    it "assigns variables" do
39
      @project = create(:project, import_type: 'gitlab', creator_id: user.id)
40
      stub_client(projects: [@repo])
J
Jeroen van Baarsen 已提交
41

V
Valery Sizov 已提交
42 43 44 45 46 47 48
      get :status

      expect(assigns(:already_added_projects)).to eq([@project])
      expect(assigns(:repos)).to eq([@repo])
    end

    it "does not show already added project" do
49
      @project = create(:project, import_type: 'gitlab', creator_id: user.id, import_source: 'asd/vim')
50
      stub_client(projects: [@repo])
J
Jeroen van Baarsen 已提交
51

V
Valery Sizov 已提交
52 53 54 55 56 57 58 59
      get :status

      expect(assigns(:already_added_projects)).to eq([@project])
      expect(assigns(:repos)).to eq([])
    end
  end

  describe "POST create" do
60
    let(:project) { create(:project) }
D
Douwe Maan 已提交
61
    let(:gitlab_username) { user.username }
62 63 64 65
    let(:gitlab_user) do
      { username: gitlab_username }.with_indifferent_access
    end
    let(:gitlab_repo) do
D
Douwe Maan 已提交
66
      {
V
Valery Sizov 已提交
67
        path: 'vim',
D
Douwe Maan 已提交
68 69 70
        path_with_namespace: "#{gitlab_username}/vim",
        owner: { name: gitlab_username },
        namespace: { path: gitlab_username }
V
Valery Sizov 已提交
71
      }.with_indifferent_access
72
    end
D
Douwe Maan 已提交
73 74

    before do
75
      stub_client(user: gitlab_user, project: gitlab_repo)
76
      assign_session_token
D
Douwe Maan 已提交
77 78
    end

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
    it 'returns 200 response when the project is imported successfully' do
      allow(Gitlab::GitlabImport::ProjectCreator)
        .to receive(:new).with(gitlab_repo, user.namespace, user, access_params)
        .and_return(double(execute: project))

      post :create, format: :json

      expect(response).to have_gitlab_http_status(200)
    end

    it 'returns 422 response when the project could not be imported' do
      allow(Gitlab::GitlabImport::ProjectCreator)
        .to receive(:new).with(gitlab_repo, user.namespace, user, access_params)
        .and_return(double(execute: build(:project)))

      post :create, format: :json

      expect(response).to have_gitlab_http_status(422)
    end

D
Douwe Maan 已提交
99 100 101
    context "when the repository owner is the GitLab.com user" do
      context "when the GitLab.com user and GitLab server user's usernames match" do
        it "takes the current user's namespace" do
102 103
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, user.namespace, user, access_params)
104
            .and_return(double(execute: project))
D
Douwe Maan 已提交
105

106
          post :create, format: :json
D
Douwe Maan 已提交
107 108 109 110 111 112 113
        end
      end

      context "when the GitLab.com user and GitLab server user's usernames don't match" do
        let(:gitlab_username) { "someone_else" }

        it "takes the current user's namespace" do
114 115
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, user.namespace, user, access_params)
116
            .and_return(double(execute: project))
D
Douwe Maan 已提交
117

118
          post :create, format: :json
D
Douwe Maan 已提交
119 120
        end
      end
V
Valery Sizov 已提交
121 122
    end

D
Douwe Maan 已提交
123 124 125 126 127
    context "when the repository owner is not the GitLab.com user" do
      let(:other_username) { "someone_else" }

      before do
        gitlab_repo["namespace"]["path"] = other_username
128
        assign_session_token
D
Douwe Maan 已提交
129 130 131
      end

      context "when a namespace with the GitLab.com user's username already exists" do
132
        let!(:existing_namespace) { create(:group, name: other_username) }
D
Douwe Maan 已提交
133 134

        context "when the namespace is owned by the GitLab server user" do
135 136 137 138
          before do
            existing_namespace.add_owner(user)
          end

D
Douwe Maan 已提交
139
          it "takes the existing namespace" do
140 141
            expect(Gitlab::GitlabImport::ProjectCreator)
              .to receive(:new).with(gitlab_repo, existing_namespace, user, access_params)
142
              .and_return(double(execute: project))
D
Douwe Maan 已提交
143

144
            post :create, format: :json
D
Douwe Maan 已提交
145 146 147 148 149
          end
        end

        context "when the namespace is not owned by the GitLab server user" do
          it "doesn't create a project" do
150 151
            expect(Gitlab::GitlabImport::ProjectCreator)
              .not_to receive(:new)
D
Douwe Maan 已提交
152

153
            post :create, format: :json
D
Douwe Maan 已提交
154 155 156 157 158
          end
        end
      end

      context "when a namespace with the GitLab.com user's username doesn't exist" do
159 160
        context "when current user can create namespaces" do
          it "creates the namespace" do
161
            expect(Gitlab::GitlabImport::ProjectCreator)
162
              .to receive(:new).and_return(double(execute: project))
D
Douwe Maan 已提交
163

164
            expect { post :create, format: :json }.to change(Namespace, :count).by(1)
165 166 167
          end

          it "takes the new namespace" do
168 169
            expect(Gitlab::GitlabImport::ProjectCreator)
              .to receive(:new).with(gitlab_repo, an_instance_of(Group), user, access_params)
170
              .and_return(double(execute: project))
D
Douwe Maan 已提交
171

172
            post :create, format: :json
173
          end
D
Douwe Maan 已提交
174 175
        end

176 177 178 179
        context "when current user can't create namespaces" do
          before do
            user.update_attribute(:can_create_group, false)
          end
V
Valery Sizov 已提交
180

181
          it "doesn't create the namespace" do
182
            expect(Gitlab::GitlabImport::ProjectCreator)
183
              .to receive(:new).and_return(double(execute: project))
184

185
            expect { post :create, format: :json }.not_to change(Namespace, :count)
186 187 188
          end

          it "takes the current user's namespace" do
189 190
            expect(Gitlab::GitlabImport::ProjectCreator)
              .to receive(:new).with(gitlab_repo, user.namespace, user, access_params)
191
              .and_return(double(execute: project))
192

193
            post :create, format: :json
194
          end
D
Douwe Maan 已提交
195 196
        end
      end
D
Douwe Maan 已提交
197

198
      context 'user has chosen an existing nested namespace for the project' do
199 200 201 202 203 204
        let(:parent_namespace) { create(:group, name: 'foo', owner: user) }
        let(:nested_namespace) { create(:group, name: 'bar', parent: parent_namespace) }

        before do
          nested_namespace.add_owner(user)
        end
205 206

        it 'takes the selected namespace and name' do
207 208
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, nested_namespace, user, access_params)
209
              .and_return(double(execute: project))
210

211
          post :create, { target_namespace: nested_namespace.full_path, format: :json }
212 213 214 215 216 217 218
        end
      end

      context 'user has chosen a non-existent nested namespaces for the project' do
        let(:test_name) { 'test_name' }

        it 'takes the selected namespace and name' do
219 220
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
221
              .and_return(double(execute: project))
222

223
          post :create, { target_namespace: 'foo/bar', format: :json }
224 225 226
        end

        it 'creates the namespaces' do
227 228
          allow(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
229
              .and_return(double(execute: project))
230

231
          expect { post :create, { target_namespace: 'foo/bar', format: :json } }
232 233 234 235
            .to change { Namespace.count }.by(2)
        end

        it 'new namespace has the right parent' do
236 237
          allow(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
238
              .and_return(double(execute: project))
239

240
          post :create, { target_namespace: 'foo/bar', format: :json }
241 242 243 244 245 246 247

          expect(Namespace.find_by_path_or_name('bar').parent.path).to eq('foo')
        end
      end

      context 'user has chosen existent and non-existent nested namespaces and name for the project' do
        let(:test_name) { 'test_name' }
248
        let!(:parent_namespace) { create(:group, name: 'foo', owner: user) }
249 250

        it 'takes the selected namespace and name' do
251 252
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
253
              .and_return(double(execute: project))
254

255
          post :create, { target_namespace: 'foo/foobar/bar', format: :json }
256 257 258
        end

        it 'creates the namespaces' do
259 260
          allow(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
261
              .and_return(double(execute: project))
262

263
          expect { post :create, { target_namespace: 'foo/foobar/bar', format: :json } }
264 265 266
            .to change { Namespace.count }.by(2)
        end
      end
267 268 269 270 271 272 273 274 275 276

      context 'when user can not create projects in the chosen namespace' do
        it 'returns 422 response' do
          other_namespace = create(:group, name: 'other_namespace')

          post :create, { target_namespace: other_namespace.name, format: :json }

          expect(response).to have_gitlab_http_status(422)
        end
      end
V
Valery Sizov 已提交
277 278 279
    end
  end
end