gitlab_controller_spec.rb 8.2 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
D
Douwe Maan 已提交
60
    let(:gitlab_username) { user.username }
61 62 63 64
    let(:gitlab_user) do
      { username: gitlab_username }.with_indifferent_access
    end
    let(:gitlab_repo) do
D
Douwe Maan 已提交
65
      {
V
Valery Sizov 已提交
66
        path: 'vim',
D
Douwe Maan 已提交
67 68 69
        path_with_namespace: "#{gitlab_username}/vim",
        owner: { name: gitlab_username },
        namespace: { path: gitlab_username }
V
Valery Sizov 已提交
70
      }.with_indifferent_access
71
    end
D
Douwe Maan 已提交
72 73

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

    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
81 82 83
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, user.namespace, user, access_params)
            .and_return(double(execute: true))
D
Douwe Maan 已提交
84 85 86 87 88 89 90 91 92

          post :create, format: :js
        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
93 94 95
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, user.namespace, user, access_params)
            .and_return(double(execute: true))
D
Douwe Maan 已提交
96 97 98 99

          post :create, format: :js
        end
      end
V
Valery Sizov 已提交
100 101
    end

D
Douwe Maan 已提交
102 103 104 105 106
    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
107
        assign_session_token
D
Douwe Maan 已提交
108 109 110
      end

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

        context "when the namespace is owned by the GitLab server user" do
114 115 116 117
          before do
            existing_namespace.add_owner(user)
          end

D
Douwe Maan 已提交
118
          it "takes the existing namespace" do
119 120 121
            expect(Gitlab::GitlabImport::ProjectCreator)
              .to receive(:new).with(gitlab_repo, existing_namespace, user, access_params)
              .and_return(double(execute: true))
D
Douwe Maan 已提交
122 123 124 125 126 127 128

            post :create, format: :js
          end
        end

        context "when the namespace is not owned by the GitLab server user" do
          it "doesn't create a project" do
129 130
            expect(Gitlab::GitlabImport::ProjectCreator)
              .not_to receive(:new)
D
Douwe Maan 已提交
131 132 133 134 135 136 137

            post :create, format: :js
          end
        end
      end

      context "when a namespace with the GitLab.com user's username doesn't exist" do
138 139
        context "when current user can create namespaces" do
          it "creates the namespace" do
140 141
            expect(Gitlab::GitlabImport::ProjectCreator)
              .to receive(:new).and_return(double(execute: true))
D
Douwe Maan 已提交
142

143 144 145 146
            expect { post :create, format: :js }.to change(Namespace, :count).by(1)
          end

          it "takes the new namespace" do
147 148 149
            expect(Gitlab::GitlabImport::ProjectCreator)
              .to receive(:new).with(gitlab_repo, an_instance_of(Group), user, access_params)
              .and_return(double(execute: true))
D
Douwe Maan 已提交
150

151 152
            post :create, format: :js
          end
D
Douwe Maan 已提交
153 154
        end

155 156 157 158
        context "when current user can't create namespaces" do
          before do
            user.update_attribute(:can_create_group, false)
          end
V
Valery Sizov 已提交
159

160
          it "doesn't create the namespace" do
161 162
            expect(Gitlab::GitlabImport::ProjectCreator)
              .to receive(:new).and_return(double(execute: true))
163 164 165 166 167

            expect { post :create, format: :js }.not_to change(Namespace, :count)
          end

          it "takes the current user's namespace" do
168 169 170
            expect(Gitlab::GitlabImport::ProjectCreator)
              .to receive(:new).with(gitlab_repo, user.namespace, user, access_params)
              .and_return(double(execute: true))
171 172 173

            post :create, format: :js
          end
D
Douwe Maan 已提交
174 175
        end
      end
D
Douwe Maan 已提交
176

177
      context 'user has chosen an existing nested namespace for the project' do
178 179 180 181 182 183
        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
184 185

        it 'takes the selected namespace and name' do
186 187 188
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, nested_namespace, user, access_params)
              .and_return(double(execute: true))
189 190 191 192 193 194 195 196 197

          post :create, { target_namespace: nested_namespace.full_path, format: :js }
        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
198 199 200
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
              .and_return(double(execute: true))
201 202 203 204 205

          post :create, { target_namespace: 'foo/bar', format: :js }
        end

        it 'creates the namespaces' do
206 207 208
          allow(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
              .and_return(double(execute: true))
209 210 211 212 213 214

          expect { post :create, { target_namespace: 'foo/bar', format: :js } }
            .to change { Namespace.count }.by(2)
        end

        it 'new namespace has the right parent' do
215 216 217
          allow(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
              .and_return(double(execute: true))
218 219 220 221 222 223 224 225 226

          post :create, { target_namespace: 'foo/bar', format: :js }

          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' }
227
        let!(:parent_namespace) { create(:group, name: 'foo', owner: user) }
228 229

        it 'takes the selected namespace and name' do
230 231 232
          expect(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
              .and_return(double(execute: true))
233 234 235 236 237

          post :create, { target_namespace: 'foo/foobar/bar', format: :js }
        end

        it 'creates the namespaces' do
238 239 240
          allow(Gitlab::GitlabImport::ProjectCreator)
            .to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params)
              .and_return(double(execute: true))
241 242 243 244 245

          expect { post :create, { target_namespace: 'foo/foobar/bar', format: :js } }
            .to change { Namespace.count }.by(2)
        end
      end
V
Valery Sizov 已提交
246 247 248
    end
  end
end