summaryrefslogtreecommitdiff
path: root/spec/controllers
diff options
context:
space:
mode:
Diffstat (limited to 'spec/controllers')
-rw-r--r--spec/controllers/autocomplete_controller_spec.rb51
-rw-r--r--spec/controllers/help_controller_spec.rb61
-rw-r--r--spec/controllers/import/bitbucket_controller_spec.rb113
-rw-r--r--spec/controllers/import/github_controller_spec.rb96
-rw-r--r--spec/controllers/import/gitlab_controller_spec.rb106
-rw-r--r--spec/controllers/import/google_code_controller_spec.rb47
-rw-r--r--spec/controllers/namespaces_controller_spec.rb121
-rw-r--r--spec/controllers/projects/refs_controller_spec.rb41
-rw-r--r--spec/controllers/projects/repositories_controller_spec.rb65
9 files changed, 667 insertions, 34 deletions
diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb
new file mode 100644
index 00000000000..a0909cec3bd
--- /dev/null
+++ b/spec/controllers/autocomplete_controller_spec.rb
@@ -0,0 +1,51 @@
+require 'spec_helper'
+
+describe AutocompleteController do
+ let!(:project) { create(:project) }
+ let!(:user) { create(:user) }
+ let!(:user2) { create(:user) }
+
+ context 'project members' do
+ before do
+ sign_in(user)
+ project.team << [user, :master]
+
+ get(:users, project_id: project.id)
+ end
+
+ let(:body) { JSON.parse(response.body) }
+
+ it { body.should be_kind_of(Array) }
+ it { body.size.should eq(1) }
+ it { body.first["username"].should == user.username }
+ end
+
+ context 'group members' do
+ let(:group) { create(:group) }
+
+ before do
+ sign_in(user)
+ group.add_owner(user)
+
+ get(:users, group_id: group.id)
+ end
+
+ let(:body) { JSON.parse(response.body) }
+
+ it { body.should be_kind_of(Array) }
+ it { body.size.should eq(1) }
+ it { body.first["username"].should == user.username }
+ end
+
+ context 'all users' do
+ before do
+ sign_in(user)
+ get(:users)
+ end
+
+ let(:body) { JSON.parse(response.body) }
+
+ it { body.should be_kind_of(Array) }
+ it { body.size.should eq(User.count) }
+ end
+end
diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb
new file mode 100644
index 00000000000..93535ced7ae
--- /dev/null
+++ b/spec/controllers/help_controller_spec.rb
@@ -0,0 +1,61 @@
+require 'spec_helper'
+
+describe HelpController do
+ let(:user) { create(:user) }
+
+ before do
+ sign_in(user)
+ end
+
+ describe 'GET #show' do
+ context 'for Markdown formats' do
+ context 'when requested file exists' do
+ before do
+ get :show, category: 'ssh', file: 'README', format: :md
+ end
+
+ it 'assigns to @markdown' do
+ expect(assigns[:markdown]).not_to be_empty
+ end
+
+ it 'renders HTML' do
+ expect(response).to render_template('show.html.haml')
+ expect(response.content_type).to eq 'text/html'
+ end
+ end
+
+ context 'when requested file is missing' do
+ it 'renders not found' do
+ get :show, category: 'foo', file: 'bar', format: :md
+ expect(response).to be_not_found
+ end
+ end
+ end
+
+ context 'for image formats' do
+ context 'when requested file exists' do
+ it 'renders the raw file' do
+ get :show, category: 'workflow/protected_branches',
+ file: 'protected_branches1', format: :png
+ expect(response).to be_success
+ expect(response.content_type).to eq 'image/png'
+ expect(response.headers['Content-Disposition']).to match(/^inline;/)
+ end
+ end
+
+ context 'when requested file is missing' do
+ it 'renders not found' do
+ get :show, category: 'foo', file: 'bar', format: :png
+ expect(response).to be_not_found
+ end
+ end
+ end
+
+ context 'for other formats' do
+ it 'always renders not found' do
+ get :show, category: 'ssh', file: 'README', format: :foo
+ expect(response).to be_not_found
+ end
+ end
+ end
+end
diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb
index 5dd4124061c..c31563e6d77 100644
--- a/spec/controllers/import/bitbucket_controller_spec.rb
+++ b/spec/controllers/import/bitbucket_controller_spec.rb
@@ -55,24 +55,109 @@ describe Import::BitbucketController do
end
describe "POST create" do
- before do
- @repo = {
- slug: 'vim',
- owner: "john"
+ let(:bitbucket_username) { user.username }
+
+ let(:bitbucket_user) {
+ {
+ user: {
+ username: bitbucket_username
+ }
}.with_indifferent_access
- end
+ }
- it "takes already existing namespace" do
- namespace = create(:namespace, name: "john", owner: user)
- expect(Gitlab::BitbucketImport::KeyAdder).
- to receive(:new).with(@repo, user).
- and_return(double(execute: true))
- expect(Gitlab::BitbucketImport::ProjectCreator).
- to receive(:new).with(@repo, namespace, user).
+ let(:bitbucket_repo) {
+ {
+ slug: "vim",
+ owner: bitbucket_username
+ }.with_indifferent_access
+ }
+
+ before do
+ allow(Gitlab::BitbucketImport::KeyAdder).
+ to receive(:new).with(bitbucket_repo, user).
and_return(double(execute: true))
- controller.stub_chain(:client, :project).and_return(@repo)
- post :create, format: :js
+ controller.stub_chain(:client, :user).and_return(bitbucket_user)
+ controller.stub_chain(:client, :project).and_return(bitbucket_repo)
+ end
+
+ context "when the repository owner is the Bitbucket user" do
+ context "when the Bitbucket user and GitLab user's usernames match" do
+ it "takes the current user's namespace" do
+ expect(Gitlab::BitbucketImport::ProjectCreator).
+ to receive(:new).with(bitbucket_repo, user.namespace, user).
+ and_return(double(execute: true))
+
+ post :create, format: :js
+ end
+ end
+
+ context "when the Bitbucket user and GitLab user's usernames don't match" do
+ let(:bitbucket_username) { "someone_else" }
+
+ it "takes the current user's namespace" do
+ expect(Gitlab::BitbucketImport::ProjectCreator).
+ to receive(:new).with(bitbucket_repo, user.namespace, user).
+ and_return(double(execute: true))
+
+ post :create, format: :js
+ end
+ end
+ end
+
+ context "when the repository owner is not the Bitbucket user" do
+ let(:other_username) { "someone_else" }
+
+ before do
+ bitbucket_repo["owner"] = other_username
+ end
+
+ context "when a namespace with the Bitbucket 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 user" do
+ it "takes the existing namespace" do
+ expect(Gitlab::BitbucketImport::ProjectCreator).
+ to receive(:new).with(bitbucket_repo, existing_namespace, user).
+ and_return(double(execute: true))
+
+ post :create, format: :js
+ end
+ end
+
+ context "when the namespace is not owned by the GitLab user" do
+ before do
+ existing_namespace.owner = create(:user)
+ existing_namespace.save
+ end
+
+ it "doesn't create a project" do
+ expect(Gitlab::BitbucketImport::ProjectCreator).
+ not_to receive(:new)
+
+ post :create, format: :js
+ end
+ end
+ end
+
+ context "when a namespace with the Bitbucket user's username doesn't exist" do
+ it "creates the namespace" do
+ expect(Gitlab::BitbucketImport::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::BitbucketImport::ProjectCreator).
+ to receive(:new).with(bitbucket_repo, an_instance_of(Group), user).
+ and_return(double(execute: true))
+
+ post :create, format: :js
+ end
+ end
end
end
end
diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb
index 5b967bfcc0c..3d3846b2e3a 100644
--- a/spec/controllers/import/github_controller_spec.rb
+++ b/spec/controllers/import/github_controller_spec.rb
@@ -56,18 +56,98 @@ describe Import::GithubController do
end
describe "POST create" do
+ let(:github_username) { user.username }
+
+ let(:github_user) {
+ OpenStruct.new(login: github_username)
+ }
+
+ let(:github_repo) {
+ OpenStruct.new(name: 'vim', full_name: "#{github_username}/vim", owner: OpenStruct.new(login: github_username))
+ }
+
before do
- @repo = OpenStruct.new(login: 'vim', full_name: 'asd/vim', owner: OpenStruct.new(login: "john"))
+ controller.stub_chain(:client, :user).and_return(github_user)
+ controller.stub_chain(:client, :repo).and_return(github_repo)
+ end
+
+ context "when the repository owner is the GitHub user" do
+ context "when the GitHub user and GitLab user's usernames match" do
+ it "takes the current user's namespace" do
+ expect(Gitlab::GithubImport::ProjectCreator).
+ to receive(:new).with(github_repo, user.namespace, user).
+ and_return(double(execute: true))
+
+ post :create, format: :js
+ end
+ end
+
+ context "when the GitHub user and GitLab user's usernames don't match" do
+ let(:github_username) { "someone_else" }
+
+ it "takes the current user's namespace" do
+ expect(Gitlab::GithubImport::ProjectCreator).
+ to receive(:new).with(github_repo, user.namespace, user).
+ and_return(double(execute: true))
+
+ post :create, format: :js
+ end
+ end
end
- it "takes already existing namespace" do
- namespace = create(:namespace, name: "john", owner: user)
- expect(Gitlab::GithubImport::ProjectCreator).
- to receive(:new).with(@repo, namespace, user).
- and_return(double(execute: true))
- controller.stub_chain(:client, :repo).and_return(@repo)
+ context "when the repository owner is not the GitHub user" do
+ let(:other_username) { "someone_else" }
+
+ before do
+ github_repo.owner = OpenStruct.new(login: other_username)
+ end
+
+ context "when a namespace with the GitHub 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 user" do
+ it "takes the existing namespace" do
+ expect(Gitlab::GithubImport::ProjectCreator).
+ to receive(:new).with(github_repo, existing_namespace, user).
+ and_return(double(execute: true))
+
+ post :create, format: :js
+ end
+ end
+
+ context "when the namespace is not owned by the GitLab user" do
+ before do
+ existing_namespace.owner = create(:user)
+ existing_namespace.save
+ end
+
+ it "doesn't create a project" do
+ expect(Gitlab::GithubImport::ProjectCreator).
+ not_to receive(:new)
+
+ post :create, format: :js
+ end
+ end
+ end
+
+ context "when a namespace with the GitHub user's username doesn't exist" do
+ it "creates the namespace" do
+ expect(Gitlab::GithubImport::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::GithubImport::ProjectCreator).
+ to receive(:new).with(github_repo, an_instance_of(Group), user).
+ and_return(double(execute: true))
- post :create, format: :js
+ post :create, format: :js
+ end
+ end
end
end
end
diff --git a/spec/controllers/import/gitlab_controller_spec.rb b/spec/controllers/import/gitlab_controller_spec.rb
index b6b86b1bcee..112e51d431e 100644
--- a/spec/controllers/import/gitlab_controller_spec.rb
+++ b/spec/controllers/import/gitlab_controller_spec.rb
@@ -48,23 +48,105 @@ describe Import::GitlabController do
end
describe "POST create" do
- before do
- @repo = {
+ let(:gitlab_username) { user.username }
+
+ let(:gitlab_user) {
+ {
+ username: gitlab_username
+ }.with_indifferent_access
+ }
+
+ let(:gitlab_repo) {
+ {
path: 'vim',
- path_with_namespace: 'asd/vim',
- owner: {name: "john"},
- namespace: {path: "john"}
+ path_with_namespace: "#{gitlab_username}/vim",
+ owner: { name: gitlab_username },
+ namespace: { path: gitlab_username }
}.with_indifferent_access
+ }
+
+ before do
+ controller.stub_chain(:client, :user).and_return(gitlab_user)
+ controller.stub_chain(:client, :project).and_return(gitlab_repo)
+ 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).
+ to receive(:new).with(gitlab_repo, user.namespace, user).
+ 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).
+ to receive(:new).with(gitlab_repo, user.namespace, user).
+ and_return(double(execute: true))
+
+ post :create, format: :js
+ end
+ end
end
- it "takes already existing namespace" do
- namespace = create(:namespace, name: "john", owner: user)
- expect(Gitlab::GitlabImport::ProjectCreator).
- to receive(:new).with(@repo, namespace, user).
- and_return(double(execute: true))
- controller.stub_chain(:client, :project).and_return(@repo)
+ 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
+ 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).
+ to receive(:new).with(gitlab_repo, existing_namespace, user).
+ 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).
+ to receive(:new).with(gitlab_repo, an_instance_of(Group), user).
+ and_return(double(execute: true))
- post :create, format: :js
+ post :create, format: :js
+ end
+ end
end
end
end
diff --git a/spec/controllers/import/google_code_controller_spec.rb b/spec/controllers/import/google_code_controller_spec.rb
new file mode 100644
index 00000000000..037cddb4600
--- /dev/null
+++ b/spec/controllers/import/google_code_controller_spec.rb
@@ -0,0 +1,47 @@
+require 'spec_helper'
+
+describe Import::GoogleCodeController do
+ let(:user) { create(:user) }
+ let(:dump_file) { fixture_file_upload(Rails.root + 'spec/fixtures/GoogleCodeProjectHosting.json', 'application/json') }
+
+ before do
+ sign_in(user)
+ end
+
+ describe "POST callback" do
+ it "stores Google Takeout dump list in session" do
+ post :callback, dump_file: dump_file
+
+ expect(session[:google_code_dump]).to be_a(Hash)
+ expect(session[:google_code_dump]["kind"]).to eq("projecthosting#user")
+ expect(session[:google_code_dump]).to have_key("projects")
+ end
+ end
+
+ describe "GET status" do
+ before do
+ @repo = OpenStruct.new(name: 'vim')
+ controller.stub_chain(:client, :valid?).and_return(true)
+ end
+
+ it "assigns variables" do
+ @project = create(:project, import_type: 'google_code', creator_id: user.id)
+ controller.stub_chain(:client, :repos).and_return([@repo])
+
+ 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: 'google_code', creator_id: user.id, import_source: 'vim')
+ controller.stub_chain(:client, :repos).and_return([@repo])
+
+ get :status
+
+ expect(assigns(:already_added_projects)).to eq([@project])
+ expect(assigns(:repos)).to eq([])
+ end
+ end
+end
diff --git a/spec/controllers/namespaces_controller_spec.rb b/spec/controllers/namespaces_controller_spec.rb
new file mode 100644
index 00000000000..9c8619722cd
--- /dev/null
+++ b/spec/controllers/namespaces_controller_spec.rb
@@ -0,0 +1,121 @@
+require 'spec_helper'
+
+describe NamespacesController do
+ let!(:user) { create(:user, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) }
+
+ describe "GET show" do
+ context "when the namespace belongs to a user" do
+ let!(:other_user) { create(:user) }
+
+ it "redirects to the user's page" do
+ get :show, id: other_user.username
+
+ expect(response).to redirect_to(user_path(other_user))
+ end
+ end
+
+ context "when the namespace belongs to a group" do
+ let!(:group) { create(:group) }
+ let!(:project) { create(:project, namespace: group) }
+
+ context "when the group has public projects" do
+ before do
+ project.update_attribute(:visibility_level, Project::PUBLIC)
+ end
+
+ context "when not signed in" do
+ it "redirects to the group's page" do
+ get :show, id: group.path
+
+ expect(response).to redirect_to(group_path(group))
+ end
+ end
+
+ context "when signed in" do
+ before do
+ sign_in(user)
+ end
+
+ it "redirects to the group's page" do
+ get :show, id: group.path
+
+ expect(response).to redirect_to(group_path(group))
+ end
+ end
+ end
+
+ context "when the project doesn't have public projects" do
+ context "when not signed in" do
+ it "redirects to the sign in page" do
+ get :show, id: group.path
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+
+ context "when signed in" do
+ before do
+ sign_in(user)
+ end
+
+ context "when the user has access to the project" do
+ before do
+ project.team << [user, :master]
+ end
+
+ context "when the user is blocked" do
+ before do
+ user.block
+ project.team << [user, :master]
+ end
+
+ it "redirects to the sign in page" do
+ get :show, id: group.path
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+
+ context "when the user isn't blocked" do
+ it "redirects to the group's page" do
+ get :show, id: group.path
+
+ expect(response).to redirect_to(group_path(group))
+ end
+ end
+ end
+
+ context "when the user doesn't have access to the project" do
+ it "responds with status 404" do
+ get :show, id: group.path
+
+ expect(response.status).to eq(404)
+ end
+ end
+ end
+ end
+ end
+
+ context "when the namespace doesn't exist" do
+ context "when signed in" do
+ before do
+ sign_in(user)
+ end
+
+ it "responds with status 404" do
+ get :show, id: "doesntexist"
+
+ expect(response.status).to eq(404)
+ end
+ end
+
+ context "when not signed in" do
+ it "redirects to the sign in page" do
+ get :show, id: "doesntexist"
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/controllers/projects/refs_controller_spec.rb b/spec/controllers/projects/refs_controller_spec.rb
new file mode 100644
index 00000000000..c254ab7cb6e
--- /dev/null
+++ b/spec/controllers/projects/refs_controller_spec.rb
@@ -0,0 +1,41 @@
+require 'spec_helper'
+
+describe Projects::RefsController do
+ let(:project) { create(:project) }
+ let(:user) { create(:user) }
+
+ before do
+ sign_in(user)
+ project.team << [user, :developer]
+ end
+
+ describe 'GET #logs_tree' do
+ def default_get(format = :html)
+ get :logs_tree, namespace_id: project.namespace.to_param,
+ project_id: project.to_param, id: 'master',
+ path: 'foo/bar/baz.html', format: format
+ end
+
+ def xhr_get(format = :html)
+ xhr :get, :logs_tree, namespace_id: project.namespace.to_param,
+ project_id: project.to_param, id: 'master',
+ path: 'foo/bar/baz.html', format: format
+ end
+
+ it 'never throws MissingTemplate' do
+ expect { default_get }.not_to raise_error
+ expect { xhr_get }.not_to raise_error
+ end
+
+ it 'renders 404 for non-JS requests' do
+ xhr_get
+
+ expect(response).to be_not_found
+ end
+
+ it 'renders JS' do
+ xhr_get(:js)
+ expect(response).to be_success
+ end
+ end
+end
diff --git a/spec/controllers/projects/repositories_controller_spec.rb b/spec/controllers/projects/repositories_controller_spec.rb
new file mode 100644
index 00000000000..91856ed0cc0
--- /dev/null
+++ b/spec/controllers/projects/repositories_controller_spec.rb
@@ -0,0 +1,65 @@
+require "spec_helper"
+
+describe Projects::RepositoriesController do
+ let(:project) { create(:project) }
+ let(:user) { create(:user) }
+
+ describe "GET archive" do
+ before do
+ sign_in(user)
+ project.team << [user, :developer]
+
+ allow(ArchiveRepositoryService).to receive(:new).and_return(service)
+ end
+
+ let(:service) { ArchiveRepositoryService.new(project, "master", "zip") }
+
+ it "executes ArchiveRepositoryService" do
+ expect(ArchiveRepositoryService).to receive(:new).with(project, "master", "zip")
+ expect(service).to receive(:execute)
+
+ get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip"
+ end
+
+ context "when the service raises an error" do
+
+ before do
+ allow(service).to receive(:execute).and_raise("Archive failed")
+ end
+
+ it "renders Not Found" do
+ get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip"
+
+ expect(response.status).to eq(404)
+ end
+ end
+
+ context "when the service doesn't return a path" do
+
+ before do
+ allow(service).to receive(:execute).and_return(nil)
+ end
+
+ it "reloads the page" do
+ get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip"
+
+ expect(response).to redirect_to(archive_namespace_project_repository_path(project.namespace, project, ref: "master", format: "zip"))
+ end
+ end
+
+ context "when the service returns a path" do
+
+ let(:path) { Rails.root.join("spec/fixtures/dk.png").to_s }
+
+ before do
+ allow(service).to receive(:execute).and_return(path)
+ end
+
+ it "sends the file" do
+ get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip"
+
+ expect(response.body).to eq(File.binread(path))
+ end
+ end
+ end
+end