BigW Consortium Gitlab

gitlab_controller_spec.rb 4.75 KB
Newer Older
1
require 'spec_helper'
2
require_relative 'import_spec_helper'
3

4
describe Import::GitlabController do
5 6
  include ImportSpecHelper

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

  def assign_session_token
    session[:gitlab_access_token] = token
  end
14 15 16

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

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

      get :callback
27

28
      expect(session[:gitlab_access_token]).to eq(token)
29
      expect(controller).to redirect_to(status_import_gitlab_url)
30 31 32 33 34 35
    end
  end

  describe "GET status" do
    before do
      @repo = OpenStruct.new(path: 'vim', path_with_namespace: 'asd/vim')
36
      assign_session_token
37 38 39 40
    end

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

43 44 45 46 47 48 49 50
      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
      @project = create(:project, import_type: 'gitlab', creator_id: user.id, import_source: 'asd/vim')
51
      stub_client(projects: [@repo])
52

53 54 55 56 57 58 59 60
      get :status

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

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

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

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

Douwe Maan committed
103 104 105 106 107
    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
108
        assign_session_token
Douwe Maan committed
109 110 111 112 113 114 115 116
      end

      context "when a namespace with the GitLab.com user's username already exists" do
        let!(:existing_namespace) { create(:namespace, name: other_username, owner: user) }

        context "when the namespace is owned by the GitLab server user" do
          it "takes the existing namespace" do
            expect(Gitlab::GitlabImport::ProjectCreator).
117
              to receive(:new).with(gitlab_repo, existing_namespace, user, access_params).
Douwe Maan committed
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
              and_return(double(execute: true))

            post :create, format: :js
          end
        end

        context "when the namespace is not owned by the GitLab server user" do
          before do
            existing_namespace.owner = create(:user)
            existing_namespace.save
          end

          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
        it "creates the namespace" do
          expect(Gitlab::GitlabImport::ProjectCreator).
            to receive(:new).and_return(double(execute: true))

          post :create, format: :js

          expect(Namespace.where(name: other_username).first).not_to be_nil
        end

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

Douwe Maan committed
154 155 156
          post :create, format: :js
        end
      end
157 158 159
    end
  end
end