BigW Consortium Gitlab

gitlab_controller_spec.rb 8.26 KB
Newer Older
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
13 14 15

  before do
    sign_in(user)
16
    allow(controller).to receive(:gitlab_import_enabled?).and_return(true)
17 18 19 20
  end

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

      get :callback
26

27
      expect(session[:gitlab_access_token]).to eq(token)
28
      expect(controller).to redirect_to(status_import_gitlab_url)
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
36 37 38
    end

    it "assigns variables" do
39
      @project = create(:empty_project, import_type: 'gitlab', creator_id: user.id)
40
      stub_client(projects: [@repo])
41

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(:empty_project, import_type: 'gitlab', creator_id: user.id, import_source: 'asd/vim')
50
      stub_client(projects: [@repo])
51

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
Douwe Maan committed
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
Douwe Maan committed
65
      {
66
        path: 'vim',
Douwe Maan committed
67 68 69
        path_with_namespace: "#{gitlab_username}/vim",
        owner: { name: gitlab_username },
        namespace: { path: gitlab_username }
70
      }.with_indifferent_access
71
    end
Douwe Maan committed
72 73

    before do
74
      stub_client(user: gitlab_user, project: gitlab_repo)
75
      assign_session_token
Douwe Maan committed
76 77 78 79 80 81
    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
          expect(Gitlab::GitlabImport::ProjectCreator).
82
            to receive(:new).with(gitlab_repo, user.namespace, user, access_params).
Douwe Maan committed
83 84 85 86 87 88 89 90 91 92 93
            and_return(double(execute: true))

          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
          expect(Gitlab::GitlabImport::ProjectCreator).
94
            to receive(:new).with(gitlab_repo, user.namespace, user, access_params).
Douwe Maan committed
95 96 97 98 99
            and_return(double(execute: true))

          post :create, format: :js
        end
      end
100 101
    end

Douwe Maan committed
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
Douwe Maan committed
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) }
Douwe Maan committed
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

Douwe Maan committed
118 119
          it "takes the existing namespace" do
            expect(Gitlab::GitlabImport::ProjectCreator).
120
              to receive(:new).with(gitlab_repo, existing_namespace, user, access_params).
Douwe Maan committed
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
              and_return(double(execute: true))

            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
            expect(Gitlab::GitlabImport::ProjectCreator).
              not_to receive(:new)

            post :create, format: :js
          end
        end
      end

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

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

          it "takes the new namespace" do
            expect(Gitlab::GitlabImport::ProjectCreator).
              to receive(:new).with(gitlab_repo, an_instance_of(Group), user, access_params).
              and_return(double(execute: true))
Douwe Maan committed
150

151 152
            post :create, format: :js
          end
Douwe Maan committed
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
159

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

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

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

            post :create, format: :js
          end
Douwe Maan committed
174 175
        end
      end
Douwe Maan committed
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 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226

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

          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
          expect(Gitlab::GitlabImport::ProjectCreator).
            to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params).
              and_return(double(execute: true))

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

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

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

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

          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 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

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

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

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

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