Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorJob van der Voort <jobvandervoort@gmail.com>2015-04-21 17:21:51 +0300
committerJob van der Voort <jobvandervoort@gmail.com>2015-04-21 17:21:51 +0300
commita8e93b7f51d968c1380ed210499869b62b07fd15 (patch)
treec864e80dfd9cf4f83fcede678acc986e3a125bf5 /spec
parent0625b15a481b3a3edd88110b3c18031ad9068d2f (diff)
Version 7.10.0.rc5v7.10.0.rc5
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/application_controller_spec.rb33
-rw-r--r--spec/controllers/autocomplete_controller_spec.rb51
-rw-r--r--spec/controllers/blob_controller_spec.rb58
-rw-r--r--spec/controllers/branches_controller_spec.rb58
-rw-r--r--spec/controllers/commit_controller_spec.rb91
-rw-r--r--spec/controllers/commits_controller_spec.rb22
-rw-r--r--spec/controllers/import/bitbucket_controller_spec.rb163
-rw-r--r--spec/controllers/import/github_controller_spec.rb153
-rw-r--r--spec/controllers/import/gitlab_controller_spec.rb152
-rw-r--r--spec/controllers/import/gitorious_controller_spec.rb67
-rw-r--r--spec/controllers/import/google_code_controller_spec.rb47
-rw-r--r--spec/controllers/merge_requests_controller_spec.rb81
-rw-r--r--spec/controllers/namespaces_controller_spec.rb121
-rw-r--r--spec/controllers/profile_keys_controller_spec.rb59
-rw-r--r--spec/controllers/projects/protected_branches_controller_spec.rb10
-rw-r--r--spec/controllers/projects/refs_controller_spec.rb41
-rw-r--r--spec/controllers/projects/repositories_controller_spec.rb65
-rw-r--r--spec/controllers/projects_controller_spec.rb47
-rw-r--r--spec/controllers/tree_controller_spec.rb64
-rw-r--r--spec/controllers/uploads_controller_spec.rb296
-rw-r--r--spec/controllers/users_controller_spec.rb46
-rw-r--r--spec/factories.rb193
-rw-r--r--spec/factories/broadcast_messages.rb27
-rw-r--r--spec/factories/forked_project_links.rb19
-rw-r--r--spec/factories/group_members.rb20
-rw-r--r--spec/factories/label_links.rb20
-rw-r--r--spec/factories/labels.rb21
-rw-r--r--spec/factories/merge_requests.rb70
-rw-r--r--spec/factories/notes.rb65
-rw-r--r--spec/factories/projects.rb95
-rw-r--r--spec/factories_spec.rb9
-rw-r--r--spec/features/admin/admin_hooks_spec.rb51
-rw-r--r--spec/features/admin/admin_projects_spec.rb34
-rw-r--r--spec/features/admin/admin_users_spec.rb109
-rw-r--r--spec/features/admin/security_spec.rb27
-rw-r--r--spec/features/atom/dashboard_issues_spec.rb30
-rw-r--r--spec/features/atom/dashboard_spec.rb44
-rw-r--r--spec/features/atom/issues_spec.rb37
-rw-r--r--spec/features/atom/users_spec.rb77
-rw-r--r--spec/features/gitlab_flavored_markdown_spec.rb129
-rw-r--r--spec/features/issues_spec.rb320
-rw-r--r--spec/features/notes_on_merge_requests_spec.rb230
-rw-r--r--spec/features/profile_spec.rb35
-rw-r--r--spec/features/projects_spec.rb32
-rw-r--r--spec/features/search_spec.rb20
-rw-r--r--spec/features/security/dashboard_access_spec.rb63
-rw-r--r--spec/features/security/group/group_access_spec.rb98
-rw-r--r--spec/features/security/group/internal_group_access_spec.rb82
-rw-r--r--spec/features/security/group/mixed_group_access_spec.rb83
-rw-r--r--spec/features/security/group/public_group_access_spec.rb82
-rw-r--r--spec/features/security/profile_access_spec.rb65
-rw-r--r--spec/features/security/project/internal_access_spec.rb227
-rw-r--r--spec/features/security/project/private_access_spec.rb205
-rw-r--r--spec/features/security/project/public_access_spec.rb232
-rw-r--r--spec/features/users_spec.rb37
-rw-r--r--spec/finders/issues_finder_spec.rb81
-rw-r--r--spec/finders/merge_requests_finder_spec.rb33
-rw-r--r--spec/finders/notes_finder_spec.rb38
-rw-r--r--spec/finders/projects_finder_spec.rb51
-rw-r--r--spec/finders/snippets_finder_spec.rb101
-rw-r--r--spec/fixtures/GoogleCodeProjectHosting.json407
-rw-r--r--spec/fixtures/banana_sample.gifbin71759 -> 0 bytes
-rw-r--r--spec/fixtures/dk.pngbin1143 -> 0 bytes
-rw-r--r--spec/fixtures/doc_sample.txt3
-rw-r--r--spec/fixtures/rails_sample.jpgbin35255 -> 0 bytes
-rw-r--r--spec/helpers/application_helper_spec.rb262
-rw-r--r--spec/helpers/broadcast_messages_helper_spec.rb22
-rw-r--r--spec/helpers/diff_helper_spec.rb102
-rw-r--r--spec/helpers/events_helper_spec.rb65
-rw-r--r--spec/helpers/gitlab_markdown_helper_spec.rb916
-rw-r--r--spec/helpers/groups_helper.rb21
-rw-r--r--spec/helpers/icons_helper_spec.rb109
-rw-r--r--spec/helpers/issues_helper_spec.rb138
-rw-r--r--spec/helpers/labels_helper_spec.rb6
-rw-r--r--spec/helpers/merge_requests_helper.rb12
-rw-r--r--spec/helpers/nav_helper_spec.rb25
-rw-r--r--spec/helpers/notifications_helper_spec.rb38
-rw-r--r--spec/helpers/oauth_helper_spec.rb20
-rw-r--r--spec/helpers/projects_helper_spec.rb11
-rw-r--r--spec/helpers/search_helper_spec.rb55
-rw-r--r--spec/helpers/submodule_helper_spec.rb154
-rw-r--r--spec/helpers/tab_helper_spec.rb44
-rw-r--r--spec/helpers/tree_helper_spec.rb28
-rw-r--r--spec/javascripts/helpers/.gitkeep0
-rw-r--r--spec/javascripts/stat_graph_contributors_graph_spec.js126
-rw-r--r--spec/javascripts/stat_graph_contributors_util_spec.js208
-rw-r--r--spec/javascripts/stat_graph_spec.js17
-rw-r--r--spec/javascripts/support/jasmine.yml76
-rw-r--r--spec/javascripts/support/jasmine_helper.rb11
-rw-r--r--spec/lib/disable_email_interceptor_spec.rb26
-rw-r--r--spec/lib/extracts_path_spec.rb60
-rw-r--r--spec/lib/file_size_validator_spec.rb43
-rw-r--r--spec/lib/git_ref_validator_spec.rb20
-rw-r--r--spec/lib/gitlab/auth_spec.rb54
-rw-r--r--spec/lib/gitlab/backend/grack_auth_spec.rb196
-rw-r--r--spec/lib/gitlab/backend/rack_attack_helpers_spec.rb35
-rw-r--r--spec/lib/gitlab/backend/shell_spec.rb18
-rw-r--r--spec/lib/gitlab/bitbucket_import/client_spec.rb17
-rw-r--r--spec/lib/gitlab/bitbucket_import/project_creator_spec.rb26
-rw-r--r--spec/lib/gitlab/closing_issue_extractor_spec.rb176
-rw-r--r--spec/lib/gitlab/diff/file_spec.rb21
-rw-r--r--spec/lib/gitlab/diff/parser_spec.rb93
-rw-r--r--spec/lib/gitlab/git_access_spec.rb235
-rw-r--r--spec/lib/gitlab/git_access_wiki_spec.rb22
-rw-r--r--spec/lib/gitlab/github_import/client_spec.rb16
-rw-r--r--spec/lib/gitlab/github_import/project_creator_spec.rb28
-rw-r--r--spec/lib/gitlab/gitlab_import/client_spec.rb16
-rw-r--r--spec/lib/gitlab/gitlab_import/project_creator_spec.rb28
-rw-r--r--spec/lib/gitlab/gitlab_markdown_helper_spec.rb28
-rw-r--r--spec/lib/gitlab/gitorious_import/project_creator_spec.rb26
-rw-r--r--spec/lib/gitlab/google_code_import/client_spec.rb34
-rw-r--r--spec/lib/gitlab/google_code_import/project_creator_spec.rb27
-rw-r--r--spec/lib/gitlab/key_fingerprint_spec.rb12
-rw-r--r--spec/lib/gitlab/ldap/access_spec.rb55
-rw-r--r--spec/lib/gitlab/ldap/adapter_spec.rb31
-rw-r--r--spec/lib/gitlab/ldap/authentication_spec.rb53
-rw-r--r--spec/lib/gitlab/ldap/config_spec.rb20
-rw-r--r--spec/lib/gitlab/ldap/user_spec.rb106
-rw-r--r--spec/lib/gitlab/note_data_builder_spec.rb73
-rw-r--r--spec/lib/gitlab/o_auth/auth_hash_spec.rb55
-rw-r--r--spec/lib/gitlab/o_auth/user_spec.rb109
-rw-r--r--spec/lib/gitlab/popen_spec.rb45
-rw-r--r--spec/lib/gitlab/push_data_builder_spec.rb39
-rw-r--r--spec/lib/gitlab/reference_extractor_spec.rb156
-rw-r--r--spec/lib/gitlab/regex_spec.rb21
-rw-r--r--spec/lib/gitlab/satellite/action_spec.rb118
-rw-r--r--spec/lib/gitlab/satellite/merge_action_spec.rb104
-rw-r--r--spec/lib/gitlab/upgrader_spec.rb24
-rw-r--r--spec/lib/gitlab/url_builder_spec.rb77
-rw-r--r--spec/lib/gitlab/version_info_spec.rb69
-rw-r--r--spec/lib/repository_cache_spec.rb34
-rw-r--r--spec/lib/votes_spec.rb185
-rw-r--r--spec/mailers/notify_spec.rb808
-rw-r--r--spec/models/application_setting_spec.rb24
-rw-r--r--spec/models/broadcast_message_spec.rb39
-rw-r--r--spec/models/commit_spec.rb80
-rw-r--r--spec/models/concerns/issuable_spec.rb66
-rw-r--r--spec/models/concerns/mentionable_spec.rb14
-rw-r--r--spec/models/deploy_key_spec.rb25
-rw-r--r--spec/models/deploy_keys_project_spec.rb72
-rw-r--r--spec/models/event_spec.rb67
-rw-r--r--spec/models/external_wiki_service_spec.rb39
-rw-r--r--spec/models/forked_project_link_spec.rb67
-rw-r--r--spec/models/group_spec.rb73
-rw-r--r--spec/models/hooks/project_hook_spec.rb36
-rw-r--r--spec/models/hooks/service_hook_spec.rb24
-rw-r--r--spec/models/hooks/system_hook_spec.rb100
-rw-r--r--spec/models/hooks/web_hook_spec.rb74
-rw-r--r--spec/models/issue_spec.rb67
-rw-r--r--spec/models/key_spec.rb88
-rw-r--r--spec/models/label_link_spec.rb21
-rw-r--r--spec/models/label_spec.rb43
-rw-r--r--spec/models/member_spec.rb148
-rw-r--r--spec/models/members/group_member_spec.rb46
-rw-r--r--spec/models/members/project_member_spec.rb92
-rw-r--r--spec/models/merge_request_spec.rb127
-rw-r--r--spec/models/milestone_spec.rb143
-rw-r--r--spec/models/namespace_spec.rb96
-rw-r--r--spec/models/note_spec.rb637
-rw-r--r--spec/models/project_security_spec.rb126
-rw-r--r--spec/models/project_services/asana_service_spec.rb65
-rw-r--r--spec/models/project_services/assembla_service_spec.rb53
-rw-r--r--spec/models/project_services/buildkite_service_spec.rb82
-rw-r--r--spec/models/project_services/flowdock_service_spec.rb52
-rw-r--r--spec/models/project_services/gemnasium_service_spec.rb48
-rw-r--r--spec/models/project_services/gitlab_ci_service_spec.rb70
-rw-r--r--spec/models/project_services/gitlab_issue_tracker_service_spec.rb66
-rw-r--r--spec/models/project_services/hipchat_service_spec.rb217
-rw-r--r--spec/models/project_services/irker_service_spec.rb108
-rw-r--r--spec/models/project_services/jira_service_spec.rb102
-rw-r--r--spec/models/project_services/pushover_service_spec.rb74
-rw-r--r--spec/models/project_services/slack_service/issue_message_spec.rb56
-rw-r--r--spec/models/project_services/slack_service/merge_message_spec.rb51
-rw-r--r--spec/models/project_services/slack_service/note_message_spec.rb129
-rw-r--r--spec/models/project_services/slack_service/push_message_spec.rb88
-rw-r--r--spec/models/project_services/slack_service_spec.rb170
-rw-r--r--spec/models/project_snippet_spec.rb31
-rw-r--r--spec/models/project_spec.rb360
-rw-r--r--spec/models/project_team_spec.rb70
-rw-r--r--spec/models/project_wiki_spec.rb244
-rw-r--r--spec/models/protected_branch_spec.rb27
-rw-r--r--spec/models/repository_spec.rb28
-rw-r--r--spec/models/service_spec.rb92
-rw-r--r--spec/models/snippet_spec.rb40
-rw-r--r--spec/models/user_spec.rb532
-rw-r--r--spec/models/wiki_page_spec.rb210
-rw-r--r--spec/requests/api/api_helpers_spec.rb173
-rw-r--r--spec/requests/api/branches_spec.rb170
-rw-r--r--spec/requests/api/commits_spec.rb149
-rw-r--r--spec/requests/api/doorkeeper_access_spec.rb31
-rw-r--r--spec/requests/api/files_spec.rb164
-rw-r--r--spec/requests/api/fork_spec.rb73
-rw-r--r--spec/requests/api/group_members_spec.rb199
-rw-r--r--spec/requests/api/groups_spec.rb187
-rw-r--r--spec/requests/api/internal_spec.rb229
-rw-r--r--spec/requests/api/issues_spec.rb330
-rw-r--r--spec/requests/api/labels_spec.rb170
-rw-r--r--spec/requests/api/merge_requests_spec.rb409
-rw-r--r--spec/requests/api/milestones_spec.rb116
-rw-r--r--spec/requests/api/namespaces_spec.rb27
-rw-r--r--spec/requests/api/notes_spec.rb188
-rw-r--r--spec/requests/api/project_hooks_spec.rb129
-rw-r--r--spec/requests/api/project_members_spec.rb153
-rw-r--r--spec/requests/api/projects_spec.rb825
-rw-r--r--spec/requests/api/repositories_spec.rb247
-rw-r--r--spec/requests/api/services_spec.rb56
-rw-r--r--spec/requests/api/session_spec.rb78
-rw-r--r--spec/requests/api/system_hooks_spec.rb81
-rw-r--r--spec/requests/api/users_spec.rb524
-rw-r--r--spec/routing/admin_routing_spec.rb121
-rw-r--r--spec/routing/notifications_routing_spec.rb13
-rw-r--r--spec/routing/project_routing_spec.rb492
-rw-r--r--spec/services/archive_repository_service_spec.rb93
-rw-r--r--spec/services/create_snippet_service_spec.rb44
-rw-r--r--spec/services/event_create_service_spec.rb103
-rw-r--r--spec/services/git_push_service_spec.rb238
-rw-r--r--spec/services/git_tag_push_service_spec.rb89
-rw-r--r--spec/services/issues/bulk_update_service_spec.rb121
-rw-r--r--spec/services/issues/close_service_spec.rb35
-rw-r--r--spec/services/issues/create_service_spec.rb23
-rw-r--r--spec/services/issues/update_service_spec.rb54
-rw-r--r--spec/services/merge_requests/close_service_spec.rb44
-rw-r--r--spec/services/merge_requests/create_service_spec.rb34
-rw-r--r--spec/services/merge_requests/merge_service_spec.rb44
-rw-r--r--spec/services/merge_requests/refresh_service_spec.rb98
-rw-r--r--spec/services/merge_requests/reopen_service_spec.rb45
-rw-r--r--spec/services/merge_requests/update_service_spec.rb65
-rw-r--r--spec/services/milestones/group_service_spec.rb70
-rw-r--r--spec/services/notes/create_service_spec.rb26
-rw-r--r--spec/services/notification_service_spec.rb455
-rw-r--r--spec/services/projects/create_service_spec.rb90
-rw-r--r--spec/services/projects/fork_service_spec.rb108
-rw-r--r--spec/services/projects/transfer_service_spec.rb41
-rw-r--r--spec/services/projects/update_service_spec.rb108
-rw-r--r--spec/services/projects/upload_service_spec.rb85
-rw-r--r--spec/services/search_service_spec.rb46
-rw-r--r--spec/services/system_hooks_service_spec.rb69
-rw-r--r--spec/services/test_hook_service_spec.rb14
-rw-r--r--spec/services/update_snippet_service_spec.rb52
-rw-r--r--spec/spec_helper.rb48
-rw-r--r--spec/support/api_helpers.rb34
-rw-r--r--spec/support/db_cleaner.rb50
-rw-r--r--spec/support/login_helpers.rb26
-rw-r--r--spec/support/matchers.rb79
-rw-r--r--spec/support/mentionable_shared_examples.rb115
-rw-r--r--spec/support/repo_helpers.rb118
-rw-r--r--spec/support/select2_helper.rb25
-rw-r--r--spec/support/taskable_shared_examples.rb42
-rw-r--r--spec/support/test_env.rb122
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb152
-rw-r--r--spec/tasks/gitlab/mail_google_schema_whitelisting.rb27
-rw-r--r--spec/workers/fork_registration_worker_spec.rb10
-rw-r--r--spec/workers/post_receive_spec.rb45
-rw-r--r--spec/workers/repository_archive_worker_spec.rb80
254 files changed, 0 insertions, 25332 deletions
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
deleted file mode 100644
index 186239d3096..00000000000
--- a/spec/controllers/application_controller_spec.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-require 'spec_helper'
-
-describe ApplicationController do
- describe '#check_password_expiration' do
- let(:user) { create(:user) }
- let(:controller) { ApplicationController.new }
-
- it 'should redirect if the user is over their password expiry' do
- user.password_expires_at = Time.new(2002)
- expect(user.ldap_user?).to be_falsey
- allow(controller).to receive(:current_user).and_return(user)
- expect(controller).to receive(:redirect_to)
- expect(controller).to receive(:new_profile_password_path)
- controller.send(:check_password_expiration)
- end
-
- it 'should not redirect if the user is under their password expiry' do
- user.password_expires_at = Time.now + 20010101
- expect(user.ldap_user?).to be_falsey
- allow(controller).to receive(:current_user).and_return(user)
- expect(controller).not_to receive(:redirect_to)
- controller.send(:check_password_expiration)
- end
-
- it 'should not redirect if the user is over their password expiry but they are an ldap user' do
- user.password_expires_at = Time.new(2002)
- allow(user).to receive(:ldap_user?).and_return(true)
- allow(controller).to receive(:current_user).and_return(user)
- expect(controller).not_to receive(:redirect_to)
- controller.send(:check_password_expiration)
- end
- end
-end
diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb
deleted file mode 100644
index a0909cec3bd..00000000000
--- a/spec/controllers/autocomplete_controller_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-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/blob_controller_spec.rb b/spec/controllers/blob_controller_spec.rb
deleted file mode 100644
index a1102f28340..00000000000
--- a/spec/controllers/blob_controller_spec.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-require 'spec_helper'
-
-describe Projects::BlobController do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- before do
- sign_in(user)
-
- project.team << [user, :master]
-
- allow(project).to receive(:branches).and_return(['master', 'foo/bar/baz'])
- allow(project).to receive(:tags).and_return(['v1.0.0', 'v2.0.0'])
- controller.instance_variable_set(:@project, project)
- end
-
- describe "GET show" do
- render_views
-
- before do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: id)
- end
-
- context "valid branch, valid file" do
- let(:id) { 'master/README.md' }
- it { is_expected.to respond_with(:success) }
- end
-
- context "valid branch, invalid file" do
- let(:id) { 'master/invalid-path.rb' }
- it { is_expected.to respond_with(:not_found) }
- end
-
- context "invalid branch, valid file" do
- let(:id) { 'invalid-branch/README.md' }
- it { is_expected.to respond_with(:not_found) }
- end
- end
-
- describe 'GET show with tree path' do
- render_views
-
- before do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: id)
- controller.instance_variable_set(:@blob, nil)
- end
-
- context 'redirect to tree' do
- let(:id) { 'markdown/doc' }
- it 'redirects' do
- expect(subject).
- to redirect_to("/#{project.path_with_namespace}/tree/markdown/doc")
- end
- end
- end
-end
diff --git a/spec/controllers/branches_controller_spec.rb b/spec/controllers/branches_controller_spec.rb
deleted file mode 100644
index 51397382cfb..00000000000
--- a/spec/controllers/branches_controller_spec.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-require 'spec_helper'
-
-describe Projects::BranchesController do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- before do
- sign_in(user)
-
- project.team << [user, :master]
-
- allow(project).to receive(:branches).and_return(['master', 'foo/bar/baz'])
- allow(project).to receive(:tags).and_return(['v1.0.0', 'v2.0.0'])
- controller.instance_variable_set(:@project, project)
- end
-
- describe "POST create" do
- render_views
-
- before {
- post :create,
- namespace_id: project.namespace.to_param,
- project_id: project.to_param,
- branch_name: branch,
- ref: ref
- }
-
- context "valid branch name, valid source" do
- let(:branch) { "merge_branch" }
- let(:ref) { "master" }
- it 'redirects' do
- expect(subject).
- to redirect_to("/#{project.path_with_namespace}/tree/merge_branch")
- end
- end
-
- context "invalid branch name, valid ref" do
- let(:branch) { "<script>alert('merge');</script>" }
- let(:ref) { "master" }
- it 'redirects' do
- expect(subject).
- to redirect_to("/#{project.path_with_namespace}/tree/alert('merge');")
- end
- end
-
- context "valid branch name, invalid ref" do
- let(:branch) { "merge_branch" }
- let(:ref) { "<script>alert('ref');</script>" }
- it { is_expected.to render_template('new') }
- end
-
- context "invalid branch name, invalid ref" do
- let(:branch) { "<script>alert('merge');</script>" }
- let(:ref) { "<script>alert('ref');</script>" }
- it { is_expected.to render_template('new') }
- end
- end
-end
diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb
deleted file mode 100644
index 3394a1f863f..00000000000
--- a/spec/controllers/commit_controller_spec.rb
+++ /dev/null
@@ -1,91 +0,0 @@
-require 'spec_helper'
-
-describe Projects::CommitController do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- let(:commit) { project.repository.commit("master") }
-
- before do
- sign_in(user)
- project.team << [user, :master]
- end
-
- describe "#show" do
- shared_examples "export as" do |format|
- it "should generally work" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: commit.id, format: format)
-
- expect(response).to be_success
- end
-
- it "should generate it" do
- expect_any_instance_of(Commit).to receive(:"to_#{format}")
-
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: commit.id, format: format)
- end
-
- it "should render it" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: commit.id, format: format)
-
- expect(response.body).to eq(commit.send(:"to_#{format}"))
- end
-
- it "should not escape Html" do
- allow_any_instance_of(Commit).to receive(:"to_#{format}").
- and_return('HTML entities &<>" ')
-
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: commit.id, format: format)
-
- expect(response.body).to_not include('&amp;')
- expect(response.body).to_not include('&gt;')
- expect(response.body).to_not include('&lt;')
- expect(response.body).to_not include('&quot;')
- end
- end
-
- describe "as diff" do
- include_examples "export as", :diff
- let(:format) { :diff }
-
- it "should really only be a git diff" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: commit.id, format: format)
-
- expect(response.body).to start_with("diff --git")
- end
- end
-
- describe "as patch" do
- include_examples "export as", :patch
- let(:format) { :patch }
-
- it "should really be a git email patch" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: commit.id, format: format)
-
- expect(response.body).to start_with("From #{commit.id}")
- end
-
- it "should contain a git diff" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: commit.id, format: format)
-
- expect(response.body).to match(/^diff --git/)
- end
- end
- end
-
- describe "#branches" do
- it "contains branch and tags information" do
- get(:branches, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: commit.id)
-
- expect(assigns(:branches)).to include("master", "feature_conflict")
- expect(assigns(:tags)).to include("v1.1.0")
- end
- end
-end
diff --git a/spec/controllers/commits_controller_spec.rb b/spec/controllers/commits_controller_spec.rb
deleted file mode 100644
index 2184b35152e..00000000000
--- a/spec/controllers/commits_controller_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require 'spec_helper'
-
-describe Projects::CommitsController do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- before do
- sign_in(user)
- project.team << [user, :master]
- end
-
- describe "GET show" do
- context "as atom feed" do
- it "should render as atom" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: "master", format: "atom")
- expect(response).to be_success
- expect(response.content_type).to eq('application/atom+xml')
- end
- end
- end
-end
diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb
deleted file mode 100644
index c31563e6d77..00000000000
--- a/spec/controllers/import/bitbucket_controller_spec.rb
+++ /dev/null
@@ -1,163 +0,0 @@
-require 'spec_helper'
-
-describe Import::BitbucketController do
- let(:user) { create(:user, bitbucket_access_token: 'asd123', bitbucket_access_token_secret: "sekret") }
-
- before do
- sign_in(user)
- controller.stub(:bitbucket_import_enabled?).and_return(true)
- end
-
- describe "GET callback" do
- before do
- session[:oauth_request_token] = {}
- end
-
- it "updates access token" do
- token = "asdasd12345"
- secret = "sekrettt"
- access_token = double(token: token, secret: secret)
- Gitlab::BitbucketImport::Client.any_instance.stub(:get_token).and_return(access_token)
- Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "bitbucket")
-
- get :callback
-
- expect(user.reload.bitbucket_access_token).to eq(token)
- expect(user.reload.bitbucket_access_token_secret).to eq(secret)
- expect(controller).to redirect_to(status_import_bitbucket_url)
- end
- end
-
- describe "GET status" do
- before do
- @repo = OpenStruct.new(slug: 'vim', owner: 'asd')
- end
-
- it "assigns variables" do
- @project = create(:project, import_type: 'bitbucket', creator_id: user.id)
- controller.stub_chain(:client, :projects).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: 'bitbucket', creator_id: user.id, import_source: 'asd/vim')
- controller.stub_chain(:client, :projects).and_return([@repo])
-
- get :status
-
- expect(assigns(:already_added_projects)).to eq([@project])
- expect(assigns(:repos)).to eq([])
- end
- end
-
- describe "POST create" do
- let(:bitbucket_username) { user.username }
-
- let(:bitbucket_user) {
- {
- user: {
- username: bitbucket_username
- }
- }.with_indifferent_access
- }
-
- 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, :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
deleted file mode 100644
index 3d3846b2e3a..00000000000
--- a/spec/controllers/import/github_controller_spec.rb
+++ /dev/null
@@ -1,153 +0,0 @@
-require 'spec_helper'
-
-describe Import::GithubController do
- let(:user) { create(:user, github_access_token: 'asd123') }
-
- before do
- sign_in(user)
- controller.stub(:github_import_enabled?).and_return(true)
- end
-
- describe "GET callback" do
- it "updates access token" do
- token = "asdasd12345"
- allow_any_instance_of(Gitlab::GithubImport::Client).
- to receive(:get_token).and_return(token)
- Gitlab.config.omniauth.providers << OpenStruct.new(app_id: 'asd123',
- app_secret: 'asd123',
- name: 'github')
-
- get :callback
-
- expect(user.reload.github_access_token).to eq(token)
- expect(controller).to redirect_to(status_import_github_url)
- end
- end
-
- describe "GET status" do
- before do
- @repo = OpenStruct.new(login: 'vim', full_name: 'asd/vim')
- @org = OpenStruct.new(login: 'company')
- @org_repo = OpenStruct.new(login: 'company', full_name: 'company/repo')
- end
-
- it "assigns variables" do
- @project = create(:project, import_type: 'github', creator_id: user.id)
- controller.stub_chain(:client, :repos).and_return([@repo])
- controller.stub_chain(:client, :orgs).and_return([@org])
- controller.stub_chain(:client, :org_repos).with(@org.login).and_return([@org_repo])
-
- get :status
-
- expect(assigns(:already_added_projects)).to eq([@project])
- expect(assigns(:repos)).to eq([@repo, @org_repo])
- end
-
- it "does not show already added project" do
- @project = create(:project, import_type: 'github', creator_id: user.id, import_source: 'asd/vim')
- controller.stub_chain(:client, :repos).and_return([@repo])
- controller.stub_chain(:client, :orgs).and_return([])
-
- get :status
-
- expect(assigns(:already_added_projects)).to eq([@project])
- expect(assigns(:repos)).to eq([])
- end
- 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
- 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
-
- 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
- end
- end
- end
- end
-end
diff --git a/spec/controllers/import/gitlab_controller_spec.rb b/spec/controllers/import/gitlab_controller_spec.rb
deleted file mode 100644
index 112e51d431e..00000000000
--- a/spec/controllers/import/gitlab_controller_spec.rb
+++ /dev/null
@@ -1,152 +0,0 @@
-require 'spec_helper'
-
-describe Import::GitlabController do
- let(:user) { create(:user, gitlab_access_token: 'asd123') }
-
- before do
- sign_in(user)
- controller.stub(:gitlab_import_enabled?).and_return(true)
- end
-
- describe "GET callback" do
- it "updates access token" do
- token = "asdasd12345"
- Gitlab::GitlabImport::Client.any_instance.stub_chain(:client, :auth_code, :get_token, :token).and_return(token)
- Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "gitlab")
-
- get :callback
-
- expect(user.reload.gitlab_access_token).to eq(token)
- expect(controller).to redirect_to(status_import_gitlab_url)
- end
- end
-
- describe "GET status" do
- before do
- @repo = OpenStruct.new(path: 'vim', path_with_namespace: 'asd/vim')
- end
-
- it "assigns variables" do
- @project = create(:project, import_type: 'gitlab', creator_id: user.id)
- controller.stub_chain(:client, :projects).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: 'gitlab', creator_id: user.id, import_source: 'asd/vim')
- controller.stub_chain(:client, :projects).and_return([@repo])
-
- get :status
-
- expect(assigns(:already_added_projects)).to eq([@project])
- expect(assigns(:repos)).to eq([])
- end
- end
-
- describe "POST create" do
- let(:gitlab_username) { user.username }
-
- let(:gitlab_user) {
- {
- username: gitlab_username
- }.with_indifferent_access
- }
-
- let(:gitlab_repo) {
- {
- path: 'vim',
- 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
-
- 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
- end
- end
- end
- end
-end
diff --git a/spec/controllers/import/gitorious_controller_spec.rb b/spec/controllers/import/gitorious_controller_spec.rb
deleted file mode 100644
index 07c9484bf1a..00000000000
--- a/spec/controllers/import/gitorious_controller_spec.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-require 'spec_helper'
-
-describe Import::GitoriousController do
- let(:user) { create(:user) }
-
- before do
- sign_in(user)
- end
-
- describe "GET new" do
- it "redirects to import endpoint on gitorious.org" do
- get :new
-
- expect(controller).to redirect_to("https://gitorious.org/gitlab-import?callback_url=http://test.host/import/gitorious/callback")
- end
- end
-
- describe "GET callback" do
- it "stores repo list in session" do
- get :callback, repos: 'foo/bar,baz/qux'
-
- expect(session[:gitorious_repos]).to eq('foo/bar,baz/qux')
- end
- end
-
- describe "GET status" do
- before do
- @repo = OpenStruct.new(full_name: 'asd/vim')
- end
-
- it "assigns variables" do
- @project = create(:project, import_type: 'gitorious', 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: 'gitorious', creator_id: user.id, import_source: 'asd/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
-
- describe "POST create" do
- before do
- @repo = Gitlab::GitoriousImport::Repository.new('asd/vim')
- end
-
- it "takes already existing namespace" do
- namespace = create(:namespace, name: "asd", owner: user)
- expect(Gitlab::GitoriousImport::ProjectCreator).
- to receive(:new).with(@repo, namespace, user).
- and_return(double(execute: true))
- controller.stub_chain(:client, :repo).and_return(@repo)
-
- post :create, format: :js
- end
- end
-end
diff --git a/spec/controllers/import/google_code_controller_spec.rb b/spec/controllers/import/google_code_controller_spec.rb
deleted file mode 100644
index 037cddb4600..00000000000
--- a/spec/controllers/import/google_code_controller_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-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/merge_requests_controller_spec.rb b/spec/controllers/merge_requests_controller_spec.rb
deleted file mode 100644
index d6f56ed33d6..00000000000
--- a/spec/controllers/merge_requests_controller_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-require 'spec_helper'
-
-describe Projects::MergeRequestsController do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) }
-
- before do
- sign_in(user)
- project.team << [user, :master]
- end
-
- describe "#show" do
- shared_examples "export merge as" do |format|
- it "should generally work" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: merge_request.iid, format: format)
-
- expect(response).to be_success
- end
-
- it "should generate it" do
- expect_any_instance_of(MergeRequest).to receive(:"to_#{format}")
-
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: merge_request.iid, format: format)
- end
-
- it "should render it" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: merge_request.iid, format: format)
-
- expect(response.body).to eq((merge_request.send(:"to_#{format}",user)).to_s)
- end
-
- it "should not escape Html" do
- allow_any_instance_of(MergeRequest).to receive(:"to_#{format}").
- and_return('HTML entities &<>" ')
-
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: merge_request.iid, format: format)
-
- expect(response.body).to_not include('&amp;')
- expect(response.body).to_not include('&gt;')
- expect(response.body).to_not include('&lt;')
- expect(response.body).to_not include('&quot;')
- end
- end
-
- describe "as diff" do
- include_examples "export merge as", :diff
- let(:format) { :diff }
-
- it "should really only be a git diff" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: merge_request.iid, format: format)
-
- expect(response.body).to start_with("diff --git")
- end
- end
-
- describe "as patch" do
- include_examples "export merge as", :patch
- let(:format) { :patch }
-
- it "should really be a git email patch with commit" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: merge_request.iid, format: format)
-
- expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}")
- end
-
- it "should contain git diffs" do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: merge_request.iid, format: format)
-
- expect(response.body).to match(/^diff --git/)
- end
- end
- end
-end
diff --git a/spec/controllers/namespaces_controller_spec.rb b/spec/controllers/namespaces_controller_spec.rb
deleted file mode 100644
index 9c8619722cd..00000000000
--- a/spec/controllers/namespaces_controller_spec.rb
+++ /dev/null
@@ -1,121 +0,0 @@
-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/profile_keys_controller_spec.rb b/spec/controllers/profile_keys_controller_spec.rb
deleted file mode 100644
index 593d3e9eb56..00000000000
--- a/spec/controllers/profile_keys_controller_spec.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-require 'spec_helper'
-
-describe Profiles::KeysController do
- let(:user) { create(:user) }
-
- describe "#get_keys" do
- describe "non existant user" do
- it "should generally not work" do
- get :get_keys, username: 'not-existent'
-
- expect(response).not_to be_success
- end
- end
-
- describe "user with no keys" do
- it "should generally work" do
- get :get_keys, username: user.username
-
- expect(response).to be_success
- end
-
- it "should render all keys separated with a new line" do
- get :get_keys, username: user.username
-
- expect(response.body).to eq("")
- end
-
- it "should respond with text/plain content type" do
- get :get_keys, username: user.username
- expect(response.content_type).to eq("text/plain")
- end
- end
-
- describe "user with keys" do
- before do
- user.keys << create(:key)
- user.keys << create(:another_key)
- end
-
- it "should generally work" do
- get :get_keys, username: user.username
-
- expect(response).to be_success
- end
-
- it "should render all keys separated with a new line" do
- get :get_keys, username: user.username
-
- expect(response.body).not_to eq("")
- expect(response.body).to eq(user.all_ssh_keys.join("\n"))
- end
-
- it "should respond with text/plain content type" do
- get :get_keys, username: user.username
- expect(response.content_type).to eq("text/plain")
- end
- end
- end
-end
diff --git a/spec/controllers/projects/protected_branches_controller_spec.rb b/spec/controllers/projects/protected_branches_controller_spec.rb
deleted file mode 100644
index 596d8d34b7c..00000000000
--- a/spec/controllers/projects/protected_branches_controller_spec.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-require('spec_helper')
-
-describe Projects::ProtectedBranchesController do
- describe "GET #index" do
- let(:project) { create(:project_empty_repo, :public) }
- it "redirect empty repo to projects page" do
- get(:index, namespace_id: project.namespace.to_param, project_id: project.to_param)
- end
- end
-end
diff --git a/spec/controllers/projects/refs_controller_spec.rb b/spec/controllers/projects/refs_controller_spec.rb
deleted file mode 100644
index c254ab7cb6e..00000000000
--- a/spec/controllers/projects/refs_controller_spec.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-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
deleted file mode 100644
index 91856ed0cc0..00000000000
--- a/spec/controllers/projects/repositories_controller_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-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
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
deleted file mode 100644
index a1b82a32150..00000000000
--- a/spec/controllers/projects_controller_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-require('spec_helper')
-
-describe ProjectsController do
- let(:project) { create(:project) }
- let(:public_project) { create(:project, :public) }
- let(:user) { create(:user) }
- let(:jpg) { fixture_file_upload(Rails.root + 'spec/fixtures/rails_sample.jpg', 'image/jpg') }
- let(:txt) { fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain') }
-
- describe "GET show" do
-
- context "when requested by `go get`" do
- render_views
-
- it "renders the go-import meta tag" do
- get :show, "go-get" => "1", namespace_id: "bogus_namespace", id: "bogus_project"
-
- expect(response.body).to include("name='go-import'")
-
- content = "localhost/bogus_namespace/bogus_project git http://localhost/bogus_namespace/bogus_project.git"
- expect(response.body).to include("content='#{content}'")
- end
- end
- end
-
- describe "POST #toggle_star" do
- it "toggles star if user is signed in" do
- sign_in(user)
- expect(user.starred?(public_project)).to be_falsey
- post(:toggle_star, namespace_id: public_project.namespace.to_param,
- id: public_project.to_param)
- expect(user.starred?(public_project)).to be_truthy
- post(:toggle_star, namespace_id: public_project.namespace.to_param,
- id: public_project.to_param)
- expect(user.starred?(public_project)).to be_falsey
- end
-
- it "does nothing if user is not signed in" do
- post(:toggle_star, namespace_id: project.namespace.to_param,
- id: public_project.to_param)
- expect(user.starred?(public_project)).to be_falsey
- post(:toggle_star, namespace_id: project.namespace.to_param,
- id: public_project.to_param)
- expect(user.starred?(public_project)).to be_falsey
- end
- end
-end
diff --git a/spec/controllers/tree_controller_spec.rb b/spec/controllers/tree_controller_spec.rb
deleted file mode 100644
index 7b219819bbc..00000000000
--- a/spec/controllers/tree_controller_spec.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-require 'spec_helper'
-
-describe Projects::TreeController do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- before do
- sign_in(user)
-
- project.team << [user, :master]
-
- allow(project).to receive(:branches).and_return(['master', 'foo/bar/baz'])
- allow(project).to receive(:tags).and_return(['v1.0.0', 'v2.0.0'])
- controller.instance_variable_set(:@project, project)
- end
-
- describe "GET show" do
- # Make sure any errors accessing the tree in our views bubble up to this spec
- render_views
-
- before do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: id)
- end
-
- context "valid branch, no path" do
- let(:id) { 'master' }
- it { is_expected.to respond_with(:success) }
- end
-
- context "valid branch, valid path" do
- let(:id) { 'master/encoding/' }
- it { is_expected.to respond_with(:success) }
- end
-
- context "valid branch, invalid path" do
- let(:id) { 'master/invalid-path/' }
- it { is_expected.to respond_with(:not_found) }
- end
-
- context "invalid branch, valid path" do
- let(:id) { 'invalid-branch/encoding/' }
- it { is_expected.to respond_with(:not_found) }
- end
- end
-
- describe 'GET show with blob path' do
- render_views
-
- before do
- get(:show, namespace_id: project.namespace.to_param,
- project_id: project.to_param, id: id)
- end
-
- context 'redirect to blob' do
- let(:id) { 'master/README.md' }
- it 'redirects' do
- redirect_url = "/#{project.path_with_namespace}/blob/master/README.md"
- expect(subject).
- to redirect_to(redirect_url)
- end
- end
- end
-end
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
deleted file mode 100644
index 0f9780356b1..00000000000
--- a/spec/controllers/uploads_controller_spec.rb
+++ /dev/null
@@ -1,296 +0,0 @@
-require 'spec_helper'
-
-describe UploadsController do
- let!(:user) { create(:user, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) }
-
- describe "GET show" do
- context "when viewing a user avatar" do
- context "when signed in" do
- before do
- sign_in(user)
- end
-
- context "when the user is blocked" do
- before do
- user.block
- end
-
- it "redirects to the sign in page" do
- get :show, model: "user", mounted_as: "avatar", id: user.id, filename: "image.png"
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- context "when the user isn't blocked" do
- it "responds with status 200" do
- get :show, model: "user", mounted_as: "avatar", id: user.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
- end
-
- context "when not signed in" do
- it "responds with status 200" do
- get :show, model: "user", mounted_as: "avatar", id: user.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
- end
-
- context "when viewing a project avatar" do
- let!(:project) { create(:project, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) }
-
- context "when the project is public" do
- before do
- project.update_attribute(:visibility_level, Project::PUBLIC)
- end
-
- context "when not signed in" do
- it "responds with status 200" do
- get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
-
- context "when signed in" do
- before do
- sign_in(user)
- end
-
- it "responds with status 200" do
- get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
- end
-
- context "when the project is private" do
- before do
- project.update_attribute(:visibility_level, Project::PRIVATE)
- end
-
- context "when not signed in" do
- it "redirects to the sign in page" do
- get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png"
-
- 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, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png"
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- context "when the user isn't blocked" do
- it "responds with status 200" do
- get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
- end
-
- context "when the user doesn't have access to the project" do
- it "responds with status 404" do
- get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png"
-
- expect(response.status).to eq(404)
- end
- end
- end
- end
- end
-
- context "when viewing a group avatar" do
- let!(:group) { create(:group, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) }
- 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 "responds with status 200" do
- get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
-
- context "when signed in" do
- before do
- sign_in(user)
- end
-
- it "responds with status 200" do
- get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- 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, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png"
-
- 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, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png"
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- context "when the user isn't blocked" do
- it "responds with status 200" do
- get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
- end
-
- context "when the user doesn't have access to the project" do
- it "responds with status 404" do
- get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png"
-
- expect(response.status).to eq(404)
- end
- end
- end
- end
- end
-
- context "when viewing a note attachment" do
- let!(:note) { create(:note, :with_attachment) }
- let(:project) { note.project }
-
- context "when the project is public" do
- before do
- project.update_attribute(:visibility_level, Project::PUBLIC)
- end
-
- context "when not signed in" do
- it "responds with status 200" do
- get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
-
- context "when signed in" do
- before do
- sign_in(user)
- end
-
- it "responds with status 200" do
- get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
- end
-
- context "when the project is private" do
- before do
- project.update_attribute(:visibility_level, Project::PRIVATE)
- end
-
- context "when not signed in" do
- it "redirects to the sign in page" do
- get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png"
-
- 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, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png"
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- context "when the user isn't blocked" do
- it "responds with status 200" do
- get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png"
-
- expect(response.status).to eq(200)
- end
- end
- end
-
- context "when the user doesn't have access to the project" do
- it "responds with status 404" do
- get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png"
-
- expect(response.status).to eq(404)
- end
- end
- end
- end
- end
- end
-end
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
deleted file mode 100644
index d47a37914df..00000000000
--- a/spec/controllers/users_controller_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-require 'spec_helper'
-
-describe UsersController do
- let(:user) { create(:user, username: 'user1', name: 'User 1', email: 'user1@gitlab.com') }
-
- before do
- sign_in(user)
- end
-
- describe 'GET #show' do
- render_views
-
- it 'renders the show template' do
- get :show, username: user.username
- expect(response.status).to eq(200)
- expect(response).to render_template('show')
- end
- end
-
- describe 'GET #calendar' do
- it 'renders calendar' do
- get :calendar, username: user.username
- expect(response).to render_template('calendar')
- end
- end
-
- describe 'GET #calendar_activities' do
- let!(:project) { create(:project) }
- let!(:user) { create(:user) }
-
- before do
- allow_any_instance_of(User).to receive(:contributed_projects_ids).and_return([project.id])
- project.team << [user, :developer]
- end
-
- it 'assigns @calendar_date' do
- get :calendar_activities, username: user.username, date: '2014-07-31'
- expect(assigns(:calendar_date)).to eq(Date.parse('2014-07-31'))
- end
-
- it 'renders calendar_activities' do
- get :calendar_activities, username: user.username
- expect(response).to render_template('calendar_activities')
- end
- end
-end
diff --git a/spec/factories.rb b/spec/factories.rb
deleted file mode 100644
index a5c335c82bc..00000000000
--- a/spec/factories.rb
+++ /dev/null
@@ -1,193 +0,0 @@
-include ActionDispatch::TestProcess
-
-FactoryGirl.define do
- sequence :sentence, aliases: [:title, :content] do
- Faker::Lorem.sentence
- end
-
- sequence :name do
- Faker::Name.name
- end
-
- sequence :file_name do
- Faker::Internet.user_name
- end
-
- sequence(:url) { Faker::Internet.uri('http') }
-
- factory :user, aliases: [:author, :assignee, :owner, :creator] do
- email { Faker::Internet.email }
- name
- sequence(:username) { |n| "#{Faker::Internet.user_name}#{n}" }
- password "12345678"
- confirmed_at { Time.now }
- confirmation_token { nil }
-
- trait :admin do
- admin true
- end
-
- factory :omniauth_user do
- ignore do
- extern_uid '123456'
- provider 'ldapmain'
- end
-
- after(:create) do |user, evaluator|
- user.identities << create(:identity,
- provider: evaluator.provider,
- extern_uid: evaluator.extern_uid
- )
- end
- end
-
- factory :admin, traits: [:admin]
- end
-
- factory :group do
- sequence(:name) { |n| "group#{n}" }
- path { name.downcase.gsub(/\s/, '_') }
- type 'Group'
- end
-
- factory :namespace do
- sequence(:name) { |n| "namespace#{n}" }
- path { name.downcase.gsub(/\s/, '_') }
- owner
- end
-
- factory :project_member do
- user
- project
- access_level { ProjectMember::MASTER }
- end
-
- factory :issue do
- title
- author
- project
-
- trait :closed do
- state :closed
- end
-
- trait :reopened do
- state :reopened
- end
-
- factory :closed_issue, traits: [:closed]
- factory :reopened_issue, traits: [:reopened]
- end
-
- factory :event do
- factory :closed_issue_event do
- project
- action { Event::CLOSED }
- target factory: :closed_issue
- author factory: :user
- end
- end
-
- factory :key do
- title
- key do
- "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0="
- end
-
- factory :deploy_key, class: 'DeployKey' do
- end
-
- factory :personal_key do
- user
- end
-
- factory :another_key do
- key do
- "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmTillFzNTrrGgwaCKaSj+QCz81E6jBc/s9av0+3b1Hwfxgkqjl4nAK/OD2NjgyrONDTDfR8cRN4eAAy6nY8GLkOyYBDyuc5nTMqs5z3yVuTwf3koGm/YQQCmo91psZ2BgDFTor8SVEE5Mm1D1k3JDMhDFxzzrOtRYFPci9lskTJaBjpqWZ4E9rDTD2q/QZntCqbC3wE9uSemRQB5f8kik7vD/AD8VQXuzKladrZKkzkONCPWsXDspUitjM8HkQdOf0PsYn1CMUC1xKYbCxkg5TkEosIwGv6CoEArUrdu/4+10LVslq494mAvEItywzrluCLCnwELfW+h/m8UHoVhZ"
- end
-
- factory :another_deploy_key, class: 'DeployKey' do
- end
- end
- end
-
- factory :email do
- user
- email do
- Faker::Internet.email('alias')
- end
-
- factory :another_email do
- email do
- Faker::Internet.email('another.alias')
- end
- end
- end
-
- factory :milestone do
- title
- project
-
- trait :closed do
- state :closed
- end
-
- factory :closed_milestone, traits: [:closed]
- end
-
- factory :system_hook do
- url
- end
-
- factory :project_hook do
- url
- end
-
- factory :project_snippet do
- project
- author
- title
- content
- file_name
- end
-
- factory :personal_snippet do
- author
- title
- content
- file_name
- end
-
- factory :snippet do
- author
- title
- content
- file_name
- end
-
- factory :protected_branch do
- name
- project
- end
-
- factory :service do
- type ""
- title "GitLab CI"
- project
- end
-
- factory :service_hook do
- url
- service
- end
-
- factory :deploy_keys_project do
- deploy_key
- project
- end
-
- factory :identity do
- provider 'ldapmain'
- extern_uid 'my-ldap-id'
- end
-end
diff --git a/spec/factories/broadcast_messages.rb b/spec/factories/broadcast_messages.rb
deleted file mode 100644
index ea0039d39e6..00000000000
--- a/spec/factories/broadcast_messages.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# == Schema Information
-#
-# Table name: broadcast_messages
-#
-# id :integer not null, primary key
-# message :text not null
-# starts_at :datetime
-# ends_at :datetime
-# alert_type :integer
-# created_at :datetime
-# updated_at :datetime
-# color :string(255)
-# font :string(255)
-#
-
-# Read about factories at https://github.com/thoughtbot/factory_girl
-
-FactoryGirl.define do
- factory :broadcast_message do
- message "MyText"
- starts_at "2013-11-12 13:43:25"
- ends_at "2013-11-12 13:43:25"
- alert_type 1
- color "#555555"
- font "#BBBBBB"
- end
-end
diff --git a/spec/factories/forked_project_links.rb b/spec/factories/forked_project_links.rb
deleted file mode 100644
index 906e4106b32..00000000000
--- a/spec/factories/forked_project_links.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# == Schema Information
-#
-# Table name: forked_project_links
-#
-# id :integer not null, primary key
-# forked_to_project_id :integer not null
-# forked_from_project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-#
-
-# Read about factories at https://github.com/thoughtbot/factory_girl
-
-FactoryGirl.define do
- factory :forked_project_link do
- association :forked_to_project, factory: :project
- association :forked_from_project, factory: :project
- end
-end
diff --git a/spec/factories/group_members.rb b/spec/factories/group_members.rb
deleted file mode 100644
index debb86d997f..00000000000
--- a/spec/factories/group_members.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# == Schema Information
-#
-# Table name: group_members
-#
-# id :integer not null, primary key
-# group_access :integer not null
-# group_id :integer not null
-# user_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# notification_level :integer default(3), not null
-#
-
-FactoryGirl.define do
- factory :group_member do
- access_level { GroupMember::OWNER }
- group
- user
- end
-end
diff --git a/spec/factories/label_links.rb b/spec/factories/label_links.rb
deleted file mode 100644
index bd304b5db6b..00000000000
--- a/spec/factories/label_links.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# == Schema Information
-#
-# Table name: label_links
-#
-# id :integer not null, primary key
-# label_id :integer
-# target_id :integer
-# target_type :string(255)
-# created_at :datetime
-# updated_at :datetime
-#
-
-# Read about factories at https://github.com/thoughtbot/factory_girl
-
-FactoryGirl.define do
- factory :label_link do
- label
- target factory: :issue
- end
-end
diff --git a/spec/factories/labels.rb b/spec/factories/labels.rb
deleted file mode 100644
index 6829387c660..00000000000
--- a/spec/factories/labels.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# == Schema Information
-#
-# Table name: labels
-#
-# id :integer not null, primary key
-# title :string(255)
-# color :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-#
-
-# Read about factories at https://github.com/thoughtbot/factory_girl
-
-FactoryGirl.define do
- factory :label do
- title "Bug"
- color "#990000"
- project
- end
-end
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
deleted file mode 100644
index 77cd37c22d9..00000000000
--- a/spec/factories/merge_requests.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# == Schema Information
-#
-# Table name: merge_requests
-#
-# id :integer not null, primary key
-# target_branch :string(255) not null
-# source_branch :string(255) not null
-# source_project_id :integer not null
-# author_id :integer
-# assignee_id :integer
-# title :string(255)
-# created_at :datetime
-# updated_at :datetime
-# milestone_id :integer
-# state :string(255)
-# merge_status :string(255)
-# target_project_id :integer not null
-# iid :integer
-# description :text
-# position :integer default(0)
-# locked_at :datetime
-#
-
-FactoryGirl.define do
- factory :merge_request do
- title
- author
- source_project factory: :project
- target_project { source_project }
-
- # → git log --pretty=oneline feature..master
- # 5937ac0a7beb003549fc5fd26fc247adbce4a52e Add submodule from gitlab.com
- # 570e7b2abdd848b95f2f578043fc23bd6f6fd24d Change some files
- # 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 More submodules
- # d14d6c0abdd253381df51a723d58691b2ee1ab08 Remove ds_store files
- # c1acaa58bbcbc3eafe538cb8274ba387047b69f8 Ignore DS files
- #
- # See also RepoHelpers.sample_compare
- #
- source_branch "master"
- target_branch "feature"
-
- merge_status "can_be_merged"
-
- trait :with_diffs do
- end
-
- trait :conflict do
- source_branch "feature_conflict"
- target_branch "feature"
- end
-
- trait :closed do
- state :closed
- end
-
- trait :reopened do
- state :reopened
- end
-
- trait :simple do
- source_branch "feature"
- target_branch "master"
- end
-
- factory :closed_merge_request, traits: [:closed]
- factory :reopened_merge_request, traits: [:reopened]
- factory :merge_request_with_diffs, traits: [:with_diffs]
- end
-end
diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb
deleted file mode 100644
index f1c33461b55..00000000000
--- a/spec/factories/notes.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-# == Schema Information
-#
-# Table name: notes
-#
-# id :integer not null, primary key
-# note :text
-# noteable_type :string(255)
-# author_id :integer
-# created_at :datetime
-# updated_at :datetime
-# project_id :integer
-# attachment :string(255)
-# line_code :string(255)
-# commit_id :string(255)
-# noteable_id :integer
-# system :boolean default(FALSE), not null
-# st_diff :text
-#
-
-require_relative '../support/repo_helpers'
-
-FactoryGirl.define do
- factory :note do
- project
- note "Note"
- author
-
- factory :note_on_commit, traits: [:on_commit]
- factory :note_on_commit_diff, traits: [:on_commit, :on_diff]
- factory :note_on_issue, traits: [:on_issue], aliases: [:votable_note]
- factory :note_on_merge_request, traits: [:on_merge_request]
- factory :note_on_merge_request_diff, traits: [:on_merge_request, :on_diff]
- factory :note_on_project_snippet, traits: [:on_project_snippet]
-
- trait :on_commit do
- project factory: :project
- commit_id RepoHelpers.sample_commit.id
- noteable_type "Commit"
- end
-
- trait :on_diff do
- line_code "0_184_184"
- end
-
- trait :on_merge_request do
- project factory: :project
- noteable_id 1
- noteable_type "MergeRequest"
- end
-
- trait :on_issue do
- noteable_id 1
- noteable_type "Issue"
- end
-
- trait :on_project_snippet do
- noteable_id 1
- noteable_type "Snippet"
- end
-
- trait :with_attachment do
- attachment { fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "`/png") }
- end
- end
-end
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
deleted file mode 100644
index 0899a7603fc..00000000000
--- a/spec/factories/projects.rb
+++ /dev/null
@@ -1,95 +0,0 @@
-# == Schema Information
-#
-# Table name: projects
-#
-# id :integer not null, primary key
-# name :string(255)
-# path :string(255)
-# description :text
-# created_at :datetime
-# updated_at :datetime
-# creator_id :integer
-# issues_enabled :boolean default(TRUE), not null
-# wall_enabled :boolean default(TRUE), not null
-# merge_requests_enabled :boolean default(TRUE), not null
-# wiki_enabled :boolean default(TRUE), not null
-# namespace_id :integer
-# issues_tracker :string(255) default("gitlab"), not null
-# issues_tracker_id :string(255)
-# snippets_enabled :boolean default(TRUE), not null
-# last_activity_at :datetime
-# import_url :string(255)
-# visibility_level :integer default(0), not null
-# archived :boolean default(FALSE), not null
-# import_status :string(255)
-# repository_size :float default(0.0)
-# star_count :integer default(0), not null
-# import_type :string(255)
-# import_source :string(255)
-# avatar :string(255)
-#
-
-FactoryGirl.define do
- # Project without repository
- #
- # Project does not have bare repository.
- # Use this factory if you dont need repository in tests
- factory :empty_project, class: 'Project' do
- sequence(:name) { |n| "project#{n}" }
- path { name.downcase.gsub(/\s/, '_') }
- namespace
- creator
- snippets_enabled true
-
- trait :public do
- visibility_level Gitlab::VisibilityLevel::PUBLIC
- end
-
- trait :internal do
- visibility_level Gitlab::VisibilityLevel::INTERNAL
- end
-
- trait :private do
- visibility_level Gitlab::VisibilityLevel::PRIVATE
- end
- end
-
- # Project with empty repository
- #
- # This is a case when you just created a project
- # but not pushed any code there yet
- factory :project_empty_repo, parent: :empty_project do
- after :create do |project|
- project.create_repository
- end
- end
-
- # Project with test repository
- #
- # Test repository source can be found at
- # https://gitlab.com/gitlab-org/gitlab-test
- factory :project, parent: :empty_project do
- path { 'gitlabhq' }
-
- after :create do |project|
- TestEnv.copy_repo(project)
- end
- end
-
- factory :redmine_project, parent: :project do
- after :create do |project|
- project.create_redmine_service(
- active: true,
- properties: {
- 'project_url' => 'http://redmine/projects/project_name_in_redmine',
- 'issues_url' => "http://redmine/#{project.id}/project_name_in_redmine/:id",
- 'new_issue_url' => 'http://redmine/projects/project_name_in_redmine/issues/new'
- }
- )
- end
- after :create do |project|
- project.issues_tracker = 'redmine'
- project.issues_tracker_id = 'project_name_in_redmine'
- end
- end
-end
diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb
deleted file mode 100644
index 457859dedaf..00000000000
--- a/spec/factories_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-require 'spec_helper'
-
-FactoryGirl.factories.map(&:name).each do |factory_name|
- describe "#{factory_name} factory" do
- it 'should be valid' do
- expect(build(factory_name)).to be_valid
- end
- end
-end
diff --git a/spec/features/admin/admin_hooks_spec.rb b/spec/features/admin/admin_hooks_spec.rb
deleted file mode 100644
index 25862614d28..00000000000
--- a/spec/features/admin/admin_hooks_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-require 'spec_helper'
-
-describe "Admin::Hooks", feature: true do
- before do
- @project = create(:project)
- login_as :admin
-
- @system_hook = create(:system_hook)
-
- end
-
- describe "GET /admin/hooks" do
- it "should be ok" do
- visit admin_root_path
- within ".sidebar-wrapper" do
- click_on "Hooks"
- end
- expect(current_path).to eq(admin_hooks_path)
- end
-
- it "should have hooks list" do
- visit admin_hooks_path
- expect(page).to have_content(@system_hook.url)
- end
- end
-
- describe "New Hook" do
- before do
- @url = Faker::Internet.uri("http")
- visit admin_hooks_path
- fill_in "hook_url", with: @url
- expect { click_button "Add System Hook" }.to change(SystemHook, :count).by(1)
- end
-
- it "should open new hook popup" do
- expect(current_path).to eq(admin_hooks_path)
- expect(page).to have_content(@url)
- end
- end
-
- describe "Test" do
- before do
- WebMock.stub_request(:post, @system_hook.url)
- visit admin_hooks_path
- click_link "Test Hook"
- end
-
- it { expect(current_path).to eq(admin_hooks_path) }
- end
-
-end
diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb
deleted file mode 100644
index 101d955d693..00000000000
--- a/spec/features/admin/admin_projects_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-require 'spec_helper'
-
-describe "Admin::Projects", feature: true do
- before do
- @project = create(:project)
- login_as :admin
- end
-
- describe "GET /admin/projects" do
- before do
- visit admin_namespaces_projects_path
- end
-
- it "should be ok" do
- expect(current_path).to eq(admin_namespaces_projects_path)
- end
-
- it "should have projects list" do
- expect(page).to have_content(@project.name)
- end
- end
-
- describe "GET /admin/projects/:id" do
- before do
- visit admin_namespaces_projects_path
- click_link "#{@project.name}"
- end
-
- it "should have project info" do
- expect(page).to have_content(@project.path)
- expect(page).to have_content(@project.name)
- end
- end
-end
diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb
deleted file mode 100644
index f97b69713ce..00000000000
--- a/spec/features/admin/admin_users_spec.rb
+++ /dev/null
@@ -1,109 +0,0 @@
-require 'spec_helper'
-
-describe "Admin::Users", feature: true do
- before { login_as :admin }
-
- describe "GET /admin/users" do
- before do
- visit admin_users_path
- end
-
- it "should be ok" do
- expect(current_path).to eq(admin_users_path)
- end
-
- it "should have users list" do
- expect(page).to have_content(@user.email)
- expect(page).to have_content(@user.name)
- end
- end
-
- describe "GET /admin/users/new" do
- before do
- visit new_admin_user_path
- fill_in "user_name", with: "Big Bang"
- fill_in "user_username", with: "bang"
- fill_in "user_email", with: "bigbang@mail.com"
- end
-
- it "should create new user" do
- expect { click_button "Create user" }.to change {User.count}.by(1)
- end
-
- it "should apply defaults to user" do
- click_button "Create user"
- user = User.find_by(username: 'bang')
- expect(user.projects_limit).
- to eq(Gitlab.config.gitlab.default_projects_limit)
- expect(user.can_create_group).
- to eq(Gitlab.config.gitlab.default_can_create_group)
- end
-
- it "should create user with valid data" do
- click_button "Create user"
- user = User.find_by(username: 'bang')
- expect(user.name).to eq('Big Bang')
- expect(user.email).to eq('bigbang@mail.com')
- end
-
- it "should call send mail" do
- expect(Notify).to receive(:new_user_email)
-
- click_button "Create user"
- end
-
- it "should send valid email to user with email & password" do
- click_button "Create user"
- user = User.find_by(username: 'bang')
- email = ActionMailer::Base.deliveries.last
- expect(email.subject).to have_content('Account was created')
- expect(email.text_part.body).to have_content(user.email)
- expect(email.text_part.body).to have_content('password')
- end
- end
-
- describe "GET /admin/users/:id" do
- before do
- visit admin_users_path
- click_link "#{@user.name}"
- end
-
- it "should have user info" do
- expect(page).to have_content(@user.email)
- expect(page).to have_content(@user.name)
- end
- end
-
- describe "GET /admin/users/:id/edit" do
- before do
- @simple_user = create(:user)
- visit admin_users_path
- click_link "edit_user_#{@simple_user.id}"
- end
-
- it "should have user edit page" do
- expect(page).to have_content('Name')
- expect(page).to have_content('Password')
- end
-
- describe "Update user" do
- before do
- fill_in "user_name", with: "Big Bang"
- fill_in "user_email", with: "bigbang@mail.com"
- check "user_admin"
- click_button "Save changes"
- end
-
- it "should show page with new data" do
- expect(page).to have_content('bigbang@mail.com')
- expect(page).to have_content('Big Bang')
- end
-
- it "should change user entry" do
- @simple_user.reload
- expect(@simple_user.name).to eq('Big Bang')
- expect(@simple_user.is_admin?).to be_truthy
- end
- end
- end
-end
diff --git a/spec/features/admin/security_spec.rb b/spec/features/admin/security_spec.rb
deleted file mode 100644
index 175fa9d4647..00000000000
--- a/spec/features/admin/security_spec.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-require 'spec_helper'
-
-describe "Admin::Projects", feature: true do
- describe "GET /admin/projects" do
- subject { admin_namespaces_projects_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /admin/users" do
- subject { admin_users_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /admin/hooks" do
- subject { admin_hooks_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-end
diff --git a/spec/features/atom/dashboard_issues_spec.rb b/spec/features/atom/dashboard_issues_spec.rb
deleted file mode 100644
index b710cb3c72f..00000000000
--- a/spec/features/atom/dashboard_issues_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-require 'spec_helper'
-
-describe "Dashboard Issues Feed", feature: true do
- describe "GET /issues" do
- let!(:user) { create(:user) }
- let!(:project1) { create(:project) }
- let!(:project2) { create(:project) }
- let!(:issue1) { create(:issue, author: user, assignee: user, project: project1) }
- let!(:issue2) { create(:issue, author: user, assignee: user, project: project2) }
-
- before do
- project1.team << [user, :master]
- project2.team << [user, :master]
- end
-
- describe "atom feed" do
- it "should render atom feed via private token" do
- visit issues_dashboard_path(:atom, private_token: user.private_token)
-
- expect(response_headers['Content-Type']).
- to have_content('application/atom+xml')
- expect(body).to have_selector('title', text: "#{user.name} issues")
- expect(body).to have_selector('author email', text: issue1.author_email)
- expect(body).to have_selector('entry summary', text: issue1.title)
- expect(body).to have_selector('author email', text: issue2.author_email)
- expect(body).to have_selector('entry summary', text: issue2.title)
- end
- end
- end
-end
diff --git a/spec/features/atom/dashboard_spec.rb b/spec/features/atom/dashboard_spec.rb
deleted file mode 100644
index ad157d742ff..00000000000
--- a/spec/features/atom/dashboard_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-require 'spec_helper'
-
-describe "Dashboard Feed", feature: true do
- describe "GET /" do
- let!(:user) { create(:user, name: "Jonh") }
-
- context "projects atom feed via private token" do
- it "should render projects atom feed" do
- visit dashboard_path(:atom, private_token: user.private_token)
- expect(body).to have_selector('feed title')
- end
- end
-
- context 'feed content' do
- let(:project) { create(:project) }
- let(:issue) { create(:issue, project: project, author: user, description: '') }
- let(:note) { create(:note, noteable: issue, author: user, note: 'Bug confirmed', project: project) }
-
- before do
- project.team << [user, :master]
- issue_event(issue, user)
- note_event(note, user)
- visit dashboard_path(:atom, private_token: user.private_token)
- end
-
- it "should have issue opened event" do
- expect(body).to have_content("#{user.name} opened issue ##{issue.iid}")
- end
-
- it "should have issue comment event" do
- expect(body).
- to have_content("#{user.name} commented on issue ##{issue.iid}")
- end
- end
- end
-
- def issue_event(issue, user)
- EventCreateService.new.open_issue(issue, user)
- end
-
- def note_event(note, user)
- EventCreateService.new.leave_note(note, user)
- end
-end
diff --git a/spec/features/atom/issues_spec.rb b/spec/features/atom/issues_spec.rb
deleted file mode 100644
index baa7814e96a..00000000000
--- a/spec/features/atom/issues_spec.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-require 'spec_helper'
-
-describe 'Issues Feed', feature: true do
- describe 'GET /issues' do
- let!(:user) { create(:user) }
- let!(:project) { create(:project) }
- let!(:issue) { create(:issue, author: user, project: project) }
-
- before { project.team << [user, :developer] }
-
- context 'when authenticated' do
- it 'should render atom feed' do
- login_with user
- visit namespace_project_issues_path(project.namespace, project, :atom)
-
- expect(response_headers['Content-Type']).
- to have_content('application/atom+xml')
- expect(body).to have_selector('title', text: "#{project.name} issues")
- expect(body).to have_selector('author email', text: issue.author_email)
- expect(body).to have_selector('entry summary', text: issue.title)
- end
- end
-
- context 'when authenticated via private token' do
- it 'should render atom feed' do
- visit namespace_project_issues_path(project.namespace, project, :atom,
- private_token: user.private_token)
-
- expect(response_headers['Content-Type']).
- to have_content('application/atom+xml')
- expect(body).to have_selector('title', text: "#{project.name} issues")
- expect(body).to have_selector('author email', text: issue.author_email)
- expect(body).to have_selector('entry summary', text: issue.title)
- end
- end
- end
-end
diff --git a/spec/features/atom/users_spec.rb b/spec/features/atom/users_spec.rb
deleted file mode 100644
index 770ac04c2c5..00000000000
--- a/spec/features/atom/users_spec.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-require 'spec_helper'
-
-describe "User Feed", feature: true do
- describe "GET /" do
- let!(:user) { create(:user) }
-
- context 'user atom feed via private token' do
- it "should render user atom feed" do
- visit user_path(user, :atom, private_token: user.private_token)
- expect(body).to have_selector('feed title')
- end
- end
-
- context 'feed content' do
- let(:project) { create(:project) }
- let(:issue) do
- create(:issue, project: project,
- author: user, description: "Houston, we have a bug!\n\n***\n\nI guess.")
- end
- let(:note) do
- create(:note, noteable: issue, author: user,
- note: 'Bug confirmed :+1:', project: project)
- end
- let(:merge_request) do
- create(:merge_request,
- title: 'Fix bug', author: user,
- source_project: project, target_project: project,
- description: "Here is the fix: ![an image](image.png)")
- end
-
- before do
- project.team << [user, :master]
- issue_event(issue, user)
- note_event(note, user)
- merge_request_event(merge_request, user)
- visit user_path(user, :atom, private_token: user.private_token)
- end
-
- it 'should have issue opened event' do
- expect(body).to have_content("#{safe_name} opened issue ##{issue.iid}")
- end
-
- it 'should have issue comment event' do
- expect(body).
- to have_content("#{safe_name} commented on issue ##{issue.iid}")
- end
-
- it 'should have XHTML summaries in issue descriptions' do
- expect(body).to match /we have a bug!<\/p>\n\n<hr ?\/>\n\n<p>I guess/
- end
-
- it 'should have XHTML summaries in notes' do
- expect(body).to match /Bug confirmed <img[^>]*\/>/
- end
-
- it 'should have XHTML summaries in merge request descriptions' do
- expect(body).to match /Here is the fix: <img[^>]*\/>/
- end
- end
- end
-
- def issue_event(issue, user)
- EventCreateService.new.open_issue(issue, user)
- end
-
- def note_event(note, user)
- EventCreateService.new.leave_note(note, user)
- end
-
- def merge_request_event(request, user)
- EventCreateService.new.open_mr(request, user)
- end
-
- def safe_name
- html_escape(user.name)
- end
-end
diff --git a/spec/features/gitlab_flavored_markdown_spec.rb b/spec/features/gitlab_flavored_markdown_spec.rb
deleted file mode 100644
index fca1a06eb88..00000000000
--- a/spec/features/gitlab_flavored_markdown_spec.rb
+++ /dev/null
@@ -1,129 +0,0 @@
-require 'spec_helper'
-
-describe "GitLab Flavored Markdown", feature: true do
- let(:project) { create(:project) }
- let(:issue) { create(:issue, project: project) }
- let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
- let(:fred) do
- u = create(:user, name: "fred")
- project.team << [u, :master]
- u
- end
-
- before do
- Commit.any_instance.stub(title: "fix ##{issue.iid}\n\nask @#{fred.username} for details")
- end
-
- let(:commit) { project.repository.commit }
-
- before do
- login_as :user
- project.team << [@user, :developer]
- end
-
- describe "for commits" do
- it "should render title in commits#index" do
- visit namespace_project_commits_path(project.namespace, project, 'master', limit: 1)
-
- expect(page).to have_link("##{issue.iid}")
- end
-
- it "should render title in commits#show" do
- visit namespace_project_commit_path(project.namespace, project, commit)
-
- expect(page).to have_link("##{issue.iid}")
- end
-
- it "should render description in commits#show" do
- visit namespace_project_commit_path(project.namespace, project, commit)
-
- expect(page).to have_link("@#{fred.username}")
- end
-
- it "should render title in repositories#branches" do
- visit namespace_project_branches_path(project.namespace, project)
-
- expect(page).to have_link("##{issue.iid}")
- end
- end
-
- describe "for issues" do
- before do
- @other_issue = create(:issue,
- author: @user,
- assignee: @user,
- project: project)
- @issue = create(:issue,
- author: @user,
- assignee: @user,
- project: project,
- title: "fix ##{@other_issue.iid}",
- description: "ask @#{fred.username} for details")
- end
-
- it "should render subject in issues#index" do
- visit namespace_project_issues_path(project.namespace, project)
-
- expect(page).to have_link("##{@other_issue.iid}")
- end
-
- it "should render subject in issues#show" do
- visit namespace_project_issue_path(project.namespace, project, @issue)
-
- expect(page).to have_link("##{@other_issue.iid}")
- end
-
- it "should render details in issues#show" do
- visit namespace_project_issue_path(project.namespace, project, @issue)
-
- expect(page).to have_link("@#{fred.username}")
- end
- end
-
-
- describe "for merge requests" do
- before do
- @merge_request = create(:merge_request, source_project: project, target_project: project, title: "fix ##{issue.iid}")
- end
-
- it "should render title in merge_requests#index" do
- visit namespace_project_merge_requests_path(project.namespace, project)
-
- expect(page).to have_link("##{issue.iid}")
- end
-
- it "should render title in merge_requests#show" do
- visit namespace_project_merge_request_path(project.namespace, project, @merge_request)
-
- expect(page).to have_link("##{issue.iid}")
- end
- end
-
-
- describe "for milestones" do
- before do
- @milestone = create(:milestone,
- project: project,
- title: "fix ##{issue.iid}",
- description: "ask @#{fred.username} for details")
- end
-
- it "should render title in milestones#index" do
- visit namespace_project_milestones_path(project.namespace, project)
-
- expect(page).to have_link("##{issue.iid}")
- end
-
- it "should render title in milestones#show" do
- visit namespace_project_milestone_path(project.namespace, project, @milestone)
-
- expect(page).to have_link("##{issue.iid}")
- end
-
- it "should render description in milestones#show" do
- visit namespace_project_milestone_path(project.namespace, project, @milestone)
-
- expect(page).to have_link("@#{fred.username}")
- end
- end
-end
diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb
deleted file mode 100644
index e5f33d5a25a..00000000000
--- a/spec/features/issues_spec.rb
+++ /dev/null
@@ -1,320 +0,0 @@
-require 'spec_helper'
-
-describe 'Issues', feature: true do
- include SortingHelper
-
- let(:project) { create(:project) }
-
- before do
- login_as :user
- user2 = create(:user)
-
- project.team << [[@user, user2], :developer]
- end
-
- describe 'Edit issue' do
- let!(:issue) do
- create(:issue,
- author: @user,
- assignee: @user,
- project: project)
- end
-
- before do
- visit namespace_project_issues_path(project.namespace, project)
- click_link "Edit"
- end
-
- it 'should open new issue popup' do
- expect(page).to have_content("Issue ##{issue.iid}")
- end
-
- describe 'fill in' do
- before do
- fill_in 'issue_title', with: 'bug 345'
- fill_in 'issue_description', with: 'bug description'
- end
-
- it 'does not change issue count' do
- expect {
- click_button 'Save changes'
- }.to_not change { Issue.count }
- end
-
- it 'should update issue fields' do
- click_button 'Save changes'
-
- expect(page).to have_content @user.name
- expect(page).to have_content 'bug 345'
- expect(page).to have_content project.name
- end
- end
-
- end
-
- describe 'Editing issue assignee' do
- let!(:issue) do
- create(:issue,
- author: @user,
- assignee: @user,
- project: project)
- end
-
- it 'allows user to select unasigned', js: true do
- visit edit_namespace_project_issue_path(project.namespace, project, issue)
-
- expect(page).to have_content "Assign to #{@user.name}"
-
- first('#s2id_issue_assignee_id').click
- sleep 2 # wait for ajax stuff to complete
- first('.user-result').click
-
- click_button 'Save changes'
-
- expect(page).to have_content 'Assignee: none'
- expect(issue.reload.assignee).to be_nil
- end
- end
-
- describe 'Filter issue' do
- before do
- ['foobar', 'barbaz', 'gitlab'].each do |title|
- create(:issue,
- author: @user,
- assignee: @user,
- project: project,
- title: title)
- end
-
- @issue = Issue.find_by(title: 'foobar')
- @issue.milestone = create(:milestone, project: project)
- @issue.assignee = nil
- @issue.save
- end
-
- let(:issue) { @issue }
-
- it 'should allow filtering by issues with no specified milestone' do
- visit namespace_project_issues_path(project.namespace, project, milestone_id: IssuableFinder::NONE)
-
- expect(page).not_to have_content 'foobar'
- expect(page).to have_content 'barbaz'
- expect(page).to have_content 'gitlab'
- end
-
- it 'should allow filtering by a specified milestone' do
- visit namespace_project_issues_path(project.namespace, project, milestone_id: issue.milestone.id)
-
- expect(page).to have_content 'foobar'
- expect(page).not_to have_content 'barbaz'
- expect(page).not_to have_content 'gitlab'
- end
-
- it 'should allow filtering by issues with no specified assignee' do
- visit namespace_project_issues_path(project.namespace, project, assignee_id: IssuableFinder::NONE)
-
- expect(page).to have_content 'foobar'
- expect(page).not_to have_content 'barbaz'
- expect(page).not_to have_content 'gitlab'
- end
-
- it 'should allow filtering by a specified assignee' do
- visit namespace_project_issues_path(project.namespace, project, assignee_id: @user.id)
-
- expect(page).not_to have_content 'foobar'
- expect(page).to have_content 'barbaz'
- expect(page).to have_content 'gitlab'
- end
- end
-
- describe 'filter issue' do
- titles = ['foo','bar','baz']
- titles.each_with_index do |title, index|
- let!(title.to_sym) do
- create(:issue, title: title,
- project: project,
- created_at: Time.now - (index * 60))
- end
- end
- let(:newer_due_milestone) { create(:milestone, due_date: '2013-12-11') }
- let(:later_due_milestone) { create(:milestone, due_date: '2013-12-12') }
-
- it 'sorts by newest' do
- visit namespace_project_issues_path(project.namespace, project, sort: sort_value_recently_created)
-
- expect(first_issue).to include('foo')
- expect(last_issue).to include('baz')
- end
-
- it 'sorts by oldest' do
- visit namespace_project_issues_path(project.namespace, project, sort: sort_value_oldest_created)
-
- expect(first_issue).to include('baz')
- expect(last_issue).to include('foo')
- end
-
- it 'sorts by most recently updated' do
- baz.updated_at = Time.now + 100
- baz.save
- visit namespace_project_issues_path(project.namespace, project, sort: sort_value_recently_updated)
-
- expect(first_issue).to include('baz')
- end
-
- it 'sorts by least recently updated' do
- baz.updated_at = Time.now - 100
- baz.save
- visit namespace_project_issues_path(project.namespace, project, sort: sort_value_oldest_updated)
-
- expect(first_issue).to include('baz')
- end
-
- describe 'sorting by milestone' do
- before :each do
- foo.milestone = newer_due_milestone
- foo.save
- bar.milestone = later_due_milestone
- bar.save
- end
-
- it 'sorts by recently due milestone' do
- visit namespace_project_issues_path(project.namespace, project, sort: sort_value_milestone_soon)
-
- expect(first_issue).to include('foo')
- end
-
- it 'sorts by least recently due milestone' do
- visit namespace_project_issues_path(project.namespace, project, sort: sort_value_milestone_later)
-
- expect(first_issue).to include('bar')
- end
- end
-
- describe 'combine filter and sort' do
- let(:user2) { create(:user) }
-
- before :each do
- foo.assignee = user2
- foo.save
- bar.assignee = user2
- bar.save
- end
-
- it 'sorts with a filter applied' do
- visit namespace_project_issues_path(project.namespace, project,
- sort: sort_value_oldest_created,
- assignee_id: user2.id)
-
- expect(first_issue).to include('bar')
- expect(last_issue).to include('foo')
- expect(page).not_to have_content 'baz'
- end
- end
- end
-
- describe 'update assignee from issue#show' do
- let(:issue) { create(:issue, project: project, author: @user) }
-
- context 'by autorized user' do
-
- it 'with dropdown menu' do
- visit namespace_project_issue_path(project.namespace, project, issue)
-
- find('.edit-issue.inline-update #issue_assignee_id').
- set project.team.members.first.id
- click_button 'Update Issue'
-
- expect(page).to have_content 'Assignee:'
- has_select?('issue_assignee_id',
- selected: project.team.members.first.name)
- end
- end
-
- context 'by unauthorized user' do
-
- let(:guest) { create(:user) }
-
- before :each do
- project.team << [[guest], :guest]
- issue.assignee = @user
- issue.save
- end
-
- it 'shows assignee text', js: true do
- logout
- login_with guest
-
- visit namespace_project_issue_path(project.namespace, project, issue)
- expect(page).to have_content issue.assignee.name
- end
- end
- end
-
- describe 'update milestone from issue#show' do
- let!(:issue) { create(:issue, project: project, author: @user) }
- let!(:milestone) { create(:milestone, project: project) }
-
- context 'by authorized user' do
-
- it 'with dropdown menu' do
- visit namespace_project_issue_path(project.namespace, project, issue)
-
- find('.edit-issue.inline-update').
- select(milestone.title, from: 'issue_milestone_id')
- click_button 'Update Issue'
-
- expect(page).to have_content "Milestone changed to #{milestone.title}"
- expect(page).to have_content "Milestone: #{milestone.title}"
- has_select?('issue_assignee_id', selected: milestone.title)
- end
- end
-
- context 'by unauthorized user' do
- let(:guest) { create(:user) }
-
- before :each do
- project.team << [guest, :guest]
- issue.milestone = milestone
- issue.save
- end
-
- it 'shows milestone text', js: true do
- logout
- login_with guest
-
- visit namespace_project_issue_path(project.namespace, project, issue)
- expect(page).to have_content milestone.title
- end
- end
-
- describe 'removing assignee' do
- let(:user2) { create(:user) }
-
- before :each do
- issue.assignee = user2
- issue.save
- end
-
- it 'allows user to remove assignee', :js => true do
- visit namespace_project_issue_path(project.namespace, project, issue)
- expect(page).to have_content "Assignee: #{user2.name}"
-
- first('#s2id_issue_assignee_id').click
- sleep 2 # wait for ajax stuff to complete
- first('.user-result').click
-
- expect(page).to have_content 'Assignee: none'
- sleep 2 # wait for ajax stuff to complete
- expect(issue.reload.assignee).to be_nil
- end
- end
- end
-
- def first_issue
- all('ul.issues-list li').first.text
- end
-
- def last_issue
- all('ul.issues-list li').last.text
- end
-end
diff --git a/spec/features/notes_on_merge_requests_spec.rb b/spec/features/notes_on_merge_requests_spec.rb
deleted file mode 100644
index c47368b1fda..00000000000
--- a/spec/features/notes_on_merge_requests_spec.rb
+++ /dev/null
@@ -1,230 +0,0 @@
-require 'spec_helper'
-
-describe 'Comments' do
- include RepoHelpers
-
- describe 'On a merge request', js: true, feature: true do
- let!(:merge_request) { create(:merge_request) }
- let!(:project) { merge_request.source_project }
- let!(:note) do
- create(:note_on_merge_request, :with_attachment, project: project)
- end
-
- before do
- login_as :admin
- visit namespace_project_merge_request_path(project.namespace, project, merge_request)
- end
-
- subject { page }
-
- describe 'the note form' do
- it 'should be valid' do
- is_expected.to have_css('.js-main-target-form', visible: true, count: 1)
- expect(find('.js-main-target-form input[type=submit]').value).
- to eq('Add Comment')
- within('.js-main-target-form') do
- expect(page).not_to have_link('Cancel')
- end
- end
-
- describe 'with text' do
- before do
- within('.js-main-target-form') do
- fill_in 'note[note]', with: 'This is awesome'
- end
- end
-
- it 'should have enable submit button and preview button' do
- within('.js-main-target-form') do
- expect(page).not_to have_css('.js-comment-button[disabled]')
- expect(page).to have_css('.js-md-preview-button', visible: true)
- end
- end
- end
- end
-
- describe 'when posting a note' do
- before do
- within('.js-main-target-form') do
- fill_in 'note[note]', with: 'This is awsome!'
- find('.js-md-preview-button').click
- click_button 'Add Comment'
- end
- end
-
- it 'should be added and form reset' do
- is_expected.to have_content('This is awsome!')
- within('.js-main-target-form') do
- expect(page).to have_no_field('note[note]', with: 'This is awesome!')
- expect(page).to have_css('.js-md-preview', visible: :hidden)
- end
- within('.js-main-target-form') do
- is_expected.to have_css('.js-note-text', visible: true)
- end
- end
- end
-
- describe 'when editing a note', js: true do
- it 'should contain the hidden edit form' do
- within("#note_#{note.id}") do
- is_expected.to have_css('.note-edit-form', visible: false)
- end
- end
-
- describe 'editing the note' do
- before do
- find('.note').hover
- find(".js-note-edit").click
- end
-
- it 'should show the note edit form and hide the note body' do
- within("#note_#{note.id}") do
- expect(find('.current-note-edit-form', visible: true)).to be_visible
- expect(find('.note-edit-form', visible: true)).to be_visible
- expect(find(:css, '.note-body > .note-text', visible: false)).not_to be_visible
- end
- end
-
- # TODO: fix after 7.7 release
- #it "should reset the edit note form textarea with the original content of the note if cancelled" do
- #within(".current-note-edit-form") do
- #fill_in "note[note]", with: "Some new content"
- #find(".btn-cancel").click
- #find(".js-note-text", visible: false).text.should == note.note
- #end
- #end
-
- it 'appends the edited at time to the note' do
- within('.current-note-edit-form') do
- fill_in 'note[note]', with: 'Some new content'
- find('.btn-save').click
- end
-
- within("#note_#{note.id}") do
- is_expected.to have_css('.note_edited_ago')
- expect(find('.note_edited_ago').text).
- to match(/less than a minute ago/)
- end
- end
- end
-
- describe 'deleting an attachment' do
- before do
- find('.note').hover
- find('.js-note-edit').click
- end
-
- it 'shows the delete link' do
- within('.note-attachment') do
- is_expected.to have_css('.js-note-attachment-delete')
- end
- end
-
- it 'removes the attachment div and resets the edit form' do
- find('.js-note-attachment-delete').click
- is_expected.not_to have_css('.note-attachment')
- expect(find('.current-note-edit-form', visible: false)).
- not_to be_visible
- end
- end
- end
- end
-
- describe 'On a merge request diff', js: true, feature: true do
- let(:merge_request) { create(:merge_request) }
- let(:project) { merge_request.source_project }
-
- before do
- login_as :admin
- visit diffs_namespace_project_merge_request_path(project.namespace, project, merge_request)
- end
-
- subject { page }
-
- describe 'when adding a note' do
- before do
- click_diff_line
- end
-
- describe 'the notes holder' do
- it { is_expected.to have_css('.js-temp-notes-holder') }
-
- it 'has .new_note css class' do
- within('.js-temp-notes-holder') do
- expect(subject).to have_css('.new_note')
- end
- end
- end
-
- describe 'the note form' do
- it "shouldn't add a second form for same row" do
- click_diff_line
-
- is_expected.
- to have_css("tr[id='#{line_code}'] + .js-temp-notes-holder form",
- count: 1)
- end
-
- it 'should be removed when canceled' do
- within(".diff-file form[rel$='#{line_code}']") do
- find('.js-close-discussion-note-form').trigger('click')
- end
-
- is_expected.to have_no_css('.js-temp-notes-holder')
- end
- end
- end
-
- describe 'with muliple note forms' do
- before do
- click_diff_line
- click_diff_line(line_code_2)
- end
-
- it { is_expected.to have_css('.js-temp-notes-holder', count: 2) }
-
- describe 'previewing them separately' do
- before do
- # add two separate texts and trigger previews on both
- within("tr[id='#{line_code}'] + .js-temp-notes-holder") do
- fill_in 'note[note]', with: 'One comment on line 7'
- find('.js-md-preview-button').click
- end
- within("tr[id='#{line_code_2}'] + .js-temp-notes-holder") do
- fill_in 'note[note]', with: 'Another comment on line 10'
- find('.js-md-preview-button').click
- end
- end
- end
-
- describe 'posting a note' do
- before do
- within("tr[id='#{line_code_2}'] + .js-temp-notes-holder") do
- fill_in 'note[note]', with: 'Another comment on line 10'
- click_button('Add Comment')
- end
- end
-
- it 'should be added as discussion' do
- is_expected.to have_content('Another comment on line 10')
- is_expected.to have_css('.notes_holder')
- is_expected.to have_css('.notes_holder .note', count: 1)
- is_expected.to have_button('Reply')
- end
- end
- end
- end
-
- def line_code
- sample_compare.changes.first[:line_code]
- end
-
- def line_code_2
- sample_compare.changes.last[:line_code]
- end
-
- def click_diff_line(data = nil)
- data ||= line_code
- find("button[data-line-code=\"#{data}\"]").click
- end
-end
diff --git a/spec/features/profile_spec.rb b/spec/features/profile_spec.rb
deleted file mode 100644
index 3d36a3c02d0..00000000000
--- a/spec/features/profile_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-require 'spec_helper'
-
-describe 'Profile account page', feature: true do
- let(:user) { create(:user) }
-
- before do
- login_as :user
- end
-
- describe 'when signup is enabled' do
- before do
- ApplicationSetting.any_instance.stub(signup_enabled?: true)
- visit profile_account_path
- end
-
- it { expect(page).to have_content('Remove account') }
-
- it 'should delete the account' do
- expect { click_link 'Delete account' }.to change { User.count }.by(-1)
- expect(current_path).to eq(new_user_session_path)
- end
- end
-
- describe 'when signup is disabled' do
- before do
- ApplicationSetting.any_instance.stub(signup_enabled?: false)
- visit profile_account_path
- end
-
- it 'should not have option to remove account' do
- expect(page).not_to have_content('Remove account')
- expect(current_path).to eq(profile_account_path)
- end
- end
-end
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
deleted file mode 100644
index cae11be7cdd..00000000000
--- a/spec/features/projects_spec.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-require 'spec_helper'
-
-describe "Projects", feature: true, js: true do
- before { login_as :user }
-
- describe "DELETE /projects/:id" do
- before do
- @project = create(:project, namespace: @user.namespace)
- @project.team << [@user, :master]
- visit edit_namespace_project_path(@project.namespace, @project)
- end
-
- it "should remove project" do
- expect { remove_project }.to change {Project.count}.by(-1)
- end
-
- it 'should delete the project from disk' do
- expect(GitlabShellWorker).to(
- receive(:perform_async).with(:remove_repository,
- /#{@project.path_with_namespace}/)
- ).twice
-
- remove_project
- end
- end
-
- def remove_project
- click_link "Remove project"
- fill_in 'confirm_name_input', with: @project.path
- click_button 'Confirm'
- end
-end
diff --git a/spec/features/search_spec.rb b/spec/features/search_spec.rb
deleted file mode 100644
index 73987739a7a..00000000000
--- a/spec/features/search_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require 'spec_helper'
-
-describe "Search", feature: true do
- before do
- login_as :user
- @project = create(:project, namespace: @user.namespace)
- @project.team << [@user, :reporter]
- visit search_path
-
- within '.search-holder' do
- fill_in "search", with: @project.name[0..3]
- click_button "Search"
- end
- end
-
- it "should show project in search results" do
- expect(page).to have_content @project.name
- end
-end
-
diff --git a/spec/features/security/dashboard_access_spec.rb b/spec/features/security/dashboard_access_spec.rb
deleted file mode 100644
index 67238e3ab76..00000000000
--- a/spec/features/security/dashboard_access_spec.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-require 'spec_helper'
-
-describe "Dashboard access", feature: true do
- describe "GET /dashboard" do
- subject { dashboard_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /dashboard/issues" do
- subject { issues_dashboard_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /dashboard/merge_requests" do
- subject { merge_requests_dashboard_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /dashboard/projects/starred" do
- subject { starred_dashboard_projects_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /help" do
- subject { help_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /projects/new" do
- it { expect(new_project_path).to be_allowed_for :admin }
- it { expect(new_project_path).to be_allowed_for :user }
- it { expect(new_project_path).to be_denied_for :visitor }
- end
-
- describe "GET /groups/new" do
- it { expect(new_group_path).to be_allowed_for :admin }
- it { expect(new_group_path).to be_allowed_for :user }
- it { expect(new_group_path).to be_denied_for :visitor }
- end
-
- describe "GET /profile/groups" do
- subject { dashboard_groups_path }
-
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-end
diff --git a/spec/features/security/group/group_access_spec.rb b/spec/features/security/group/group_access_spec.rb
deleted file mode 100644
index 63793149459..00000000000
--- a/spec/features/security/group/group_access_spec.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-require 'spec_helper'
-
-describe "Group access", feature: true do
- describe "GET /projects/new" do
- it { expect(new_group_path).to be_allowed_for :admin }
- it { expect(new_group_path).to be_allowed_for :user }
- it { expect(new_group_path).to be_denied_for :visitor }
- end
-
- describe "Group" do
- let(:group) { create(:group) }
-
- let(:owner) { create(:owner) }
- let(:master) { create(:user) }
- let(:reporter) { create(:user) }
- let(:guest) { create(:user) }
- let(:nonmember) { create(:user) }
-
- before do
- group.add_user(owner, Gitlab::Access::OWNER)
- group.add_user(master, Gitlab::Access::MASTER)
- group.add_user(reporter, Gitlab::Access::REPORTER)
- group.add_user(guest, Gitlab::Access::GUEST)
- end
-
- describe "GET /groups/:path" do
- subject { group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/issues" do
- subject { issues_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/merge_requests" do
- subject { merge_requests_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/group_members" do
- subject { group_group_members_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/edit" do
- subject { edit_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_denied_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/projects" do
- subject { projects_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_denied_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
- end
-end
diff --git a/spec/features/security/group/internal_group_access_spec.rb b/spec/features/security/group/internal_group_access_spec.rb
deleted file mode 100644
index d17a7412e43..00000000000
--- a/spec/features/security/group/internal_group_access_spec.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-require 'spec_helper'
-
-describe "Group with internal project access", feature: true do
- describe "Group" do
- let(:group) { create(:group) }
-
- let(:owner) { create(:owner) }
- let(:master) { create(:user) }
- let(:reporter) { create(:user) }
- let(:guest) { create(:user) }
- let(:nonmember) { create(:user) }
-
- before do
- group.add_user(owner, Gitlab::Access::OWNER)
- group.add_user(master, Gitlab::Access::MASTER)
- group.add_user(reporter, Gitlab::Access::REPORTER)
- group.add_user(guest, Gitlab::Access::GUEST)
-
- create(:project, :internal, group: group)
- end
-
- describe "GET /groups/:path" do
- subject { group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/issues" do
- subject { issues_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/merge_requests" do
- subject { merge_requests_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/group_members" do
- subject { group_group_members_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /groups/:path/edit" do
- subject { edit_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_denied_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
- end
-end
diff --git a/spec/features/security/group/mixed_group_access_spec.rb b/spec/features/security/group/mixed_group_access_spec.rb
deleted file mode 100644
index b3db7b5dea4..00000000000
--- a/spec/features/security/group/mixed_group_access_spec.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-require 'spec_helper'
-
-describe "Group access", feature: true do
- describe "Group" do
- let(:group) { create(:group) }
-
- let(:owner) { create(:owner) }
- let(:master) { create(:user) }
- let(:reporter) { create(:user) }
- let(:guest) { create(:user) }
- let(:nonmember) { create(:user) }
-
- before do
- group.add_user(owner, Gitlab::Access::OWNER)
- group.add_user(master, Gitlab::Access::MASTER)
- group.add_user(reporter, Gitlab::Access::REPORTER)
- group.add_user(guest, Gitlab::Access::GUEST)
-
- create(:project, :internal, path: "internal_project", group: group)
- create(:project, :public, path: "public_project", group: group)
- end
-
- describe "GET /groups/:path" do
- subject { group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /groups/:path/issues" do
- subject { issues_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /groups/:path/merge_requests" do
- subject { merge_requests_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /groups/:path/group_members" do
- subject { group_group_members_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /groups/:path/edit" do
- subject { edit_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_denied_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
- end
-end
diff --git a/spec/features/security/group/public_group_access_spec.rb b/spec/features/security/group/public_group_access_spec.rb
deleted file mode 100644
index c16f0c0d1e1..00000000000
--- a/spec/features/security/group/public_group_access_spec.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-require 'spec_helper'
-
-describe "Group with public project access", feature: true do
- describe "Group" do
- let(:group) { create(:group) }
-
- let(:owner) { create(:owner) }
- let(:master) { create(:user) }
- let(:reporter) { create(:user) }
- let(:guest) { create(:user) }
- let(:nonmember) { create(:user) }
-
- before do
- group.add_user(owner, Gitlab::Access::OWNER)
- group.add_user(master, Gitlab::Access::MASTER)
- group.add_user(reporter, Gitlab::Access::REPORTER)
- group.add_user(guest, Gitlab::Access::GUEST)
-
- create(:project, :public, group: group)
- end
-
- describe "GET /groups/:path" do
- subject { group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /groups/:path/issues" do
- subject { issues_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /groups/:path/merge_requests" do
- subject { merge_requests_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /groups/:path/group_members" do
- subject { group_group_members_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /groups/:path/edit" do
- subject { edit_group_path(group) }
-
- it { is_expected.to be_allowed_for owner }
- it { is_expected.to be_denied_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
- end
-end
diff --git a/spec/features/security/profile_access_spec.rb b/spec/features/security/profile_access_spec.rb
deleted file mode 100644
index 2512a9c0e3d..00000000000
--- a/spec/features/security/profile_access_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-require 'spec_helper'
-
-describe "Profile access", feature: true do
- before do
- @u1 = create(:user)
- end
-
- describe "GET /login" do
- it { expect(new_user_session_path).not_to be_404_for :visitor }
- end
-
- describe "GET /profile/keys" do
- subject { profile_keys_path }
-
- it { is_expected.to be_allowed_for @u1 }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /profile" do
- subject { profile_path }
-
- it { is_expected.to be_allowed_for @u1 }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /profile/account" do
- subject { profile_account_path }
-
- it { is_expected.to be_allowed_for @u1 }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /profile/design" do
- subject { design_profile_path }
-
- it { is_expected.to be_allowed_for @u1 }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /profile/history" do
- subject { history_profile_path }
-
- it { is_expected.to be_allowed_for @u1 }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /profile/notifications" do
- subject { profile_notifications_path }
-
- it { is_expected.to be_allowed_for @u1 }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-end
diff --git a/spec/features/security/project/internal_access_spec.rb b/spec/features/security/project/internal_access_spec.rb
deleted file mode 100644
index 8d1bfd25223..00000000000
--- a/spec/features/security/project/internal_access_spec.rb
+++ /dev/null
@@ -1,227 +0,0 @@
-require 'spec_helper'
-
-describe "Internal Project Access", feature: true do
- let(:project) { create(:project, :internal) }
-
- let(:master) { create(:user) }
- let(:guest) { create(:user) }
- let(:reporter) { create(:user) }
-
- before do
- # full access
- project.team << [master, :master]
-
- # readonly
- project.team << [reporter, :reporter]
- end
-
- describe "Project should be internal" do
- subject { project }
-
- describe '#internal?' do
- subject { super().internal? }
- it { is_expected.to be_truthy }
- end
- end
-
- describe "GET /:project_path" do
- subject { namespace_project_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/tree/master" do
- subject { namespace_project_tree_path(project.namespace, project, project.repository.root_ref) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/commits/master" do
- subject { namespace_project_commits_path(project.namespace, project, project.repository.root_ref, limit: 1) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/commit/:sha" do
- subject { namespace_project_commit_path(project.namespace, project, project.repository.commit) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/compare" do
- subject { namespace_project_compare_index_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/project_members" do
- subject { namespace_project_project_members_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/blob" do
- before do
- commit = project.repository.commit
- path = '.gitignore'
- @blob_path = namespace_project_blob_path(project.namespace, project, File.join(commit.id, path))
- end
-
- it { expect(@blob_path).to be_allowed_for master }
- it { expect(@blob_path).to be_allowed_for reporter }
- it { expect(@blob_path).to be_allowed_for :admin }
- it { expect(@blob_path).to be_allowed_for guest }
- it { expect(@blob_path).to be_allowed_for :user }
- it { expect(@blob_path).to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/edit" do
- subject { edit_namespace_project_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/deploy_keys" do
- subject { namespace_project_deploy_keys_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/issues" do
- subject { namespace_project_issues_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/snippets" do
- subject { namespace_project_snippets_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/snippets/new" do
- subject { new_namespace_project_snippet_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/merge_requests" do
- subject { namespace_project_merge_requests_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/merge_requests/new" do
- subject { new_namespace_project_merge_request_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/branches" do
- subject { namespace_project_branches_path(project.namespace, project) }
-
- before do
- # Speed increase
- allow_any_instance_of(Project).to receive(:branches).and_return([])
- end
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/tags" do
- subject { namespace_project_tags_path(project.namespace, project) }
-
- before do
- # Speed increase
- allow_any_instance_of(Project).to receive(:tags).and_return([])
- end
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/hooks" do
- subject { namespace_project_hooks_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-end
diff --git a/spec/features/security/project/private_access_spec.rb b/spec/features/security/project/private_access_spec.rb
deleted file mode 100644
index 9021ff33186..00000000000
--- a/spec/features/security/project/private_access_spec.rb
+++ /dev/null
@@ -1,205 +0,0 @@
-require 'spec_helper'
-
-describe "Private Project Access", feature: true do
- let(:project) { create(:project) }
-
- let(:master) { create(:user) }
- let(:guest) { create(:user) }
- let(:reporter) { create(:user) }
-
- before do
- # full access
- project.team << [master, :master]
-
- # readonly
- project.team << [reporter, :reporter]
- end
-
- describe "Project should be private" do
- subject { project }
-
- describe '#private?' do
- subject { super().private? }
- it { is_expected.to be_truthy }
- end
- end
-
- describe "GET /:project_path" do
- subject { namespace_project_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/tree/master" do
- subject { namespace_project_tree_path(project.namespace, project, project.repository.root_ref) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/commits/master" do
- subject { namespace_project_commits_path(project.namespace, project, project.repository.root_ref, limit: 1) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/commit/:sha" do
- subject { namespace_project_commit_path(project.namespace, project, project.repository.commit) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/compare" do
- subject { namespace_project_compare_index_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/project_members" do
- subject { namespace_project_project_members_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/blob" do
- before do
- commit = project.repository.commit
- path = '.gitignore'
- @blob_path = namespace_project_blob_path(project.namespace, project, File.join(commit.id, path))
- end
-
- it { expect(@blob_path).to be_allowed_for master }
- it { expect(@blob_path).to be_allowed_for reporter }
- it { expect(@blob_path).to be_allowed_for :admin }
- it { expect(@blob_path).to be_denied_for guest }
- it { expect(@blob_path).to be_denied_for :user }
- it { expect(@blob_path).to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/edit" do
- subject { edit_namespace_project_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/deploy_keys" do
- subject { namespace_project_deploy_keys_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/issues" do
- subject { namespace_project_issues_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/snippets" do
- subject { namespace_project_snippets_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/merge_requests" do
- subject { namespace_project_merge_requests_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/branches" do
- subject { namespace_project_branches_path(project.namespace, project) }
-
- before do
- # Speed increase
- allow_any_instance_of(Project).to receive(:branches).and_return([])
- end
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/tags" do
- subject { namespace_project_tags_path(project.namespace, project) }
-
- before do
- # Speed increase
- allow_any_instance_of(Project).to receive(:tags).and_return([])
- end
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/hooks" do
- subject { namespace_project_hooks_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-end
diff --git a/spec/features/security/project/public_access_spec.rb b/spec/features/security/project/public_access_spec.rb
deleted file mode 100644
index 6ec190ed777..00000000000
--- a/spec/features/security/project/public_access_spec.rb
+++ /dev/null
@@ -1,232 +0,0 @@
-require 'spec_helper'
-
-describe "Public Project Access", feature: true do
- let(:project) { create(:project) }
-
- let(:master) { create(:user) }
- let(:guest) { create(:user) }
- let(:reporter) { create(:user) }
-
- before do
- # public project
- project.visibility_level = Gitlab::VisibilityLevel::PUBLIC
- project.save!
-
- # full access
- project.team << [master, :master]
-
- # readonly
- project.team << [reporter, :reporter]
-
- end
-
- describe "Project should be public" do
- subject { project }
-
- describe '#public?' do
- subject { super().public? }
- it { is_expected.to be_truthy }
- end
- end
-
- describe "GET /:project_path" do
- subject { namespace_project_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/tree/master" do
- subject { namespace_project_tree_path(project.namespace, project, project.repository.root_ref) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/commits/master" do
- subject { namespace_project_commits_path(project.namespace, project, project.repository.root_ref, limit: 1) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/commit/:sha" do
- subject { namespace_project_commit_path(project.namespace, project, project.repository.commit) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/compare" do
- subject { namespace_project_compare_index_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/project_members" do
- subject { namespace_project_project_members_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/blob" do
- before do
- commit = project.repository.commit
- path = '.gitignore'
- @blob_path = namespace_project_blob_path(project.namespace, project, File.join(commit.id, path))
- end
-
- it { expect(@blob_path).to be_allowed_for master }
- it { expect(@blob_path).to be_allowed_for reporter }
- it { expect(@blob_path).to be_allowed_for :admin }
- it { expect(@blob_path).to be_allowed_for guest }
- it { expect(@blob_path).to be_allowed_for :user }
- it { expect(@blob_path).to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/edit" do
- subject { edit_namespace_project_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/deploy_keys" do
- subject { namespace_project_deploy_keys_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/issues" do
- subject { namespace_project_issues_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/snippets" do
- subject { namespace_project_snippets_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/snippets/new" do
- subject { new_namespace_project_snippet_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/merge_requests" do
- subject { namespace_project_merge_requests_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/merge_requests/new" do
- subject { new_namespace_project_merge_request_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-
- describe "GET /:project_path/branches" do
- subject { namespace_project_branches_path(project.namespace, project) }
-
- before do
- # Speed increase
- allow_any_instance_of(Project).to receive(:branches).and_return([])
- end
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/tags" do
- subject { namespace_project_tags_path(project.namespace, project) }
-
- before do
- # Speed increase
- allow_any_instance_of(Project).to receive(:tags).and_return([])
- end
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_allowed_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_allowed_for guest }
- it { is_expected.to be_allowed_for :user }
- it { is_expected.to be_allowed_for :visitor }
- end
-
- describe "GET /:project_path/hooks" do
- subject { namespace_project_hooks_path(project.namespace, project) }
-
- it { is_expected.to be_allowed_for master }
- it { is_expected.to be_denied_for reporter }
- it { is_expected.to be_allowed_for :admin }
- it { is_expected.to be_denied_for guest }
- it { is_expected.to be_denied_for :user }
- it { is_expected.to be_denied_for :visitor }
- end
-end
diff --git a/spec/features/users_spec.rb b/spec/features/users_spec.rb
deleted file mode 100644
index 4cfaab03caf..00000000000
--- a/spec/features/users_spec.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-require 'spec_helper'
-
-feature 'Users' do
- around do |ex|
- old_url_options = Rails.application.routes.default_url_options
- Rails.application.routes.default_url_options = { host: 'example.foo' }
- ex.run
- Rails.application.routes.default_url_options = old_url_options
- end
-
- scenario 'GET /users/sign_in creates a new user account' do
- visit new_user_session_path
- fill_in 'user_name', with: 'Name Surname'
- fill_in 'user_username', with: 'Great'
- fill_in 'user_email', with: 'name@mail.com'
- fill_in 'user_password_sign_up', with: 'password1234'
- expect { click_button 'Sign up' }.to change { User.count }.by(1)
- end
-
- scenario 'Successful user signin invalidates password reset token' do
- user = create(:user)
- expect(user.reset_password_token).to be_nil
-
- visit new_user_password_path
- fill_in 'user_email', with: user.email
- click_button 'Reset password'
-
- user.reload
- expect(user.reset_password_token).not_to be_nil
-
- login_with(user)
- expect(current_path).to eq root_path
-
- user.reload
- expect(user.reset_password_token).to be_nil
- end
-end
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
deleted file mode 100644
index 479fa950387..00000000000
--- a/spec/finders/issues_finder_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-require 'spec_helper'
-
-describe IssuesFinder do
- let(:user) { create :user }
- let(:user2) { create :user }
- let(:project1) { create(:project) }
- let(:project2) { create(:project) }
- let(:milestone) { create(:milestone, project: project1) }
- let(:issue1) { create(:issue, author: user, assignee: user, project: project1, milestone: milestone) }
- let(:issue2) { create(:issue, author: user, assignee: user, project: project2) }
- let(:issue3) { create(:issue, author: user2, assignee: user2, project: project2) }
-
- before do
- project1.team << [user, :master]
- project2.team << [user, :developer]
- project2.team << [user2, :developer]
- end
-
- describe :execute do
- before :each do
- issue1
- issue2
- issue3
- end
-
- context 'scope: all' do
- it 'should filter by all' do
- params = { scope: "all", state: 'opened' }
- issues = IssuesFinder.new.execute(user, params)
- expect(issues.size).to eq(3)
- end
-
- it 'should filter by assignee id' do
- params = { scope: "all", assignee_id: user.id, state: 'opened' }
- issues = IssuesFinder.new.execute(user, params)
- expect(issues.size).to eq(2)
- end
-
- it 'should filter by author id' do
- params = { scope: "all", author_id: user2.id, state: 'opened' }
- issues = IssuesFinder.new.execute(user, params)
- expect(issues).to eq([issue3])
- end
-
- it 'should filter by milestone id' do
- params = { scope: "all", milestone_id: milestone.id, state: 'opened' }
- issues = IssuesFinder.new.execute(user, params)
- expect(issues).to eq([issue1])
- end
-
- it 'should be empty for unauthorized user' do
- params = { scope: "all", state: 'opened' }
- issues = IssuesFinder.new.execute(nil, params)
- expect(issues.size).to be_zero
- end
-
- it 'should not include unauthorized issues' do
- params = { scope: "all", state: 'opened' }
- issues = IssuesFinder.new.execute(user2, params)
- expect(issues.size).to eq(2)
- expect(issues).not_to include(issue1)
- expect(issues).to include(issue2)
- expect(issues).to include(issue3)
- end
- end
-
- context 'personal scope' do
- it 'should filter by assignee' do
- params = { scope: "assigned-to-me", state: 'opened' }
- issues = IssuesFinder.new.execute(user, params)
- expect(issues.size).to eq(2)
- end
-
- it 'should filter by project' do
- params = { scope: "assigned-to-me", state: 'opened', project_id: project1.id }
- issues = IssuesFinder.new.execute(user, params)
- expect(issues.size).to eq(1)
- end
- end
- end
-end
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
deleted file mode 100644
index 8536377a7f0..00000000000
--- a/spec/finders/merge_requests_finder_spec.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-require 'spec_helper'
-
-describe MergeRequestsFinder do
- let(:user) { create :user }
- let(:user2) { create :user }
-
- let(:project1) { create(:project) }
- let(:project2) { create(:project, forked_from_project: project1) }
-
- let!(:merge_request1) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1) }
- let!(:merge_request2) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1, state: 'closed') }
- let!(:merge_request3) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project2) }
-
- before do
- project1.team << [user, :master]
- project2.team << [user, :developer]
- project2.team << [user2, :developer]
- end
-
- describe "#execute" do
- it 'should filter by scope' do
- params = { scope: 'authored', state: 'opened' }
- merge_requests = MergeRequestsFinder.new.execute(user, params)
- expect(merge_requests.size).to eq(2)
- end
-
- it 'should filter by project' do
- params = { project_id: project1.id, scope: 'authored', state: 'opened' }
- merge_requests = MergeRequestsFinder.new.execute(user, params)
- expect(merge_requests.size).to eq(1)
- end
- end
-end
diff --git a/spec/finders/notes_finder_spec.rb b/spec/finders/notes_finder_spec.rb
deleted file mode 100644
index c83824b900d..00000000000
--- a/spec/finders/notes_finder_spec.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-require 'spec_helper'
-
-describe NotesFinder do
- let(:user) { create :user }
- let(:project) { create :project }
- let(:note1) { create :note_on_commit, project: project }
- let(:note2) { create :note_on_commit, project: project }
- let(:commit) { note1.noteable }
-
- before do
- project.team << [user, :master]
- end
-
- describe :execute do
- let(:params) { { target_id: commit.id, target_type: 'commit', last_fetched_at: 1.hour.ago.to_i } }
-
- before do
- note1
- note2
- end
-
- it 'should find all notes' do
- notes = NotesFinder.new.execute(project, user, params)
- expect(notes.size).to eq(2)
- end
-
- it 'should raise an exception for an invalid target_type' do
- params.merge!(target_type: 'invalid')
- expect { NotesFinder.new.execute(project, user, params) }.to raise_error('invalid target_type')
- end
-
- it 'filters out old notes' do
- note2.update_attribute(:updated_at, 2.hours.ago)
- notes = NotesFinder.new.execute(project, user, params)
- expect(notes).to eq([note1])
- end
- end
-end
diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb
deleted file mode 100644
index 2ab71b05968..00000000000
--- a/spec/finders/projects_finder_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-require 'spec_helper'
-
-describe ProjectsFinder do
- let(:user) { create :user }
- let(:group) { create :group }
-
- let(:project1) { create(:empty_project, :public, group: group) }
- let(:project2) { create(:empty_project, :internal, group: group) }
- let(:project3) { create(:empty_project, :private, group: group) }
- let(:project4) { create(:empty_project, :private, group: group) }
-
- context 'non authenticated' do
- subject { ProjectsFinder.new.execute(nil, group: group) }
-
- it { is_expected.to include(project1) }
- it { is_expected.not_to include(project2) }
- it { is_expected.not_to include(project3) }
- it { is_expected.not_to include(project4) }
- end
-
- context 'authenticated' do
- subject { ProjectsFinder.new.execute(user, group: group) }
-
- it { is_expected.to include(project1) }
- it { is_expected.to include(project2) }
- it { is_expected.not_to include(project3) }
- it { is_expected.not_to include(project4) }
- end
-
- context 'authenticated, project member' do
- before { project3.team << [user, :developer] }
-
- subject { ProjectsFinder.new.execute(user, group: group) }
-
- it { is_expected.to include(project1) }
- it { is_expected.to include(project2) }
- it { is_expected.to include(project3) }
- it { is_expected.not_to include(project4) }
- end
-
- context 'authenticated, group member' do
- before { group.add_user(user, Gitlab::Access::DEVELOPER) }
-
- subject { ProjectsFinder.new.execute(user, group: group) }
-
- it { is_expected.to include(project1) }
- it { is_expected.to include(project2) }
- it { is_expected.to include(project3) }
- it { is_expected.to include(project4) }
- end
-end
diff --git a/spec/finders/snippets_finder_spec.rb b/spec/finders/snippets_finder_spec.rb
deleted file mode 100644
index 1b4ffc2d717..00000000000
--- a/spec/finders/snippets_finder_spec.rb
+++ /dev/null
@@ -1,101 +0,0 @@
-require 'spec_helper'
-
-describe SnippetsFinder do
- let(:user) { create :user }
- let(:user1) { create :user }
- let(:group) { create :group }
-
- let(:project1) { create(:empty_project, :public, group: group) }
- let(:project2) { create(:empty_project, :private, group: group) }
-
-
- context ':all filter' do
- before do
- @snippet1 = create(:personal_snippet, visibility_level: Snippet::PRIVATE)
- @snippet2 = create(:personal_snippet, visibility_level: Snippet::INTERNAL)
- @snippet3 = create(:personal_snippet, visibility_level: Snippet::PUBLIC)
- end
-
- it "returns all private and internal snippets" do
- snippets = SnippetsFinder.new.execute(user, filter: :all)
- expect(snippets).to include(@snippet2, @snippet3)
- expect(snippets).not_to include(@snippet1)
- end
-
- it "returns all public snippets" do
- snippets = SnippetsFinder.new.execute(nil, filter: :all)
- expect(snippets).to include(@snippet3)
- expect(snippets).not_to include(@snippet1, @snippet2)
- end
- end
-
- context ':by_user filter' do
- before do
- @snippet1 = create(:personal_snippet, visibility_level: Snippet::PRIVATE, author: user)
- @snippet2 = create(:personal_snippet, visibility_level: Snippet::INTERNAL, author: user)
- @snippet3 = create(:personal_snippet, visibility_level: Snippet::PUBLIC, author: user)
- end
-
- it "returns all public and internal snippets" do
- snippets = SnippetsFinder.new.execute(user1, filter: :by_user, user: user)
- expect(snippets).to include(@snippet2, @snippet3)
- expect(snippets).not_to include(@snippet1)
- end
-
- it "returns internal snippets" do
- snippets = SnippetsFinder.new.execute(user, filter: :by_user, user: user, scope: "are_internal")
- expect(snippets).to include(@snippet2)
- expect(snippets).not_to include(@snippet1, @snippet3)
- end
-
- it "returns private snippets" do
- snippets = SnippetsFinder.new.execute(user, filter: :by_user, user: user, scope: "are_private")
- expect(snippets).to include(@snippet1)
- expect(snippets).not_to include(@snippet2, @snippet3)
- end
-
- it "returns public snippets" do
- snippets = SnippetsFinder.new.execute(user, filter: :by_user, user: user, scope: "are_public")
- expect(snippets).to include(@snippet3)
- expect(snippets).not_to include(@snippet1, @snippet2)
- end
-
- it "returns all snippets" do
- snippets = SnippetsFinder.new.execute(user, filter: :by_user, user: user)
- expect(snippets).to include(@snippet1, @snippet2, @snippet3)
- end
-
- it "returns only public snippets if unauthenticated user" do
- snippets = SnippetsFinder.new.execute(nil, filter: :by_user, user: user)
- expect(snippets).to include(@snippet3)
- expect(snippets).not_to include(@snippet2, @snippet1)
- end
-
- end
-
- context 'by_project filter' do
- before do
- @snippet1 = create(:project_snippet, visibility_level: Snippet::PRIVATE, project: project1)
- @snippet2 = create(:project_snippet, visibility_level: Snippet::INTERNAL, project: project1)
- @snippet3 = create(:project_snippet, visibility_level: Snippet::PUBLIC, project: project1)
- end
-
- it "returns public snippets for unauthorized user" do
- snippets = SnippetsFinder.new.execute(nil, filter: :by_project, project: project1)
- expect(snippets).to include(@snippet3)
- expect(snippets).not_to include(@snippet1, @snippet2)
- end
-
- it "returns public and internal snippets for none project members" do
- snippets = SnippetsFinder.new.execute(user, filter: :by_project, project: project1)
- expect(snippets).to include(@snippet2, @snippet3)
- expect(snippets).not_to include(@snippet1)
- end
-
- it "returns all snippets for project members" do
- project1.team << [user, :developer]
- snippets = SnippetsFinder.new.execute(user, filter: :by_project, project: project1)
- expect(snippets).to include(@snippet1, @snippet2, @snippet3)
- end
- end
-end
diff --git a/spec/fixtures/GoogleCodeProjectHosting.json b/spec/fixtures/GoogleCodeProjectHosting.json
deleted file mode 100644
index d05e77271ae..00000000000
--- a/spec/fixtures/GoogleCodeProjectHosting.json
+++ /dev/null
@@ -1,407 +0,0 @@
-{
- "kind" : "projecthosting#user",
- "id" : "@WRRVSlFXARlCVgB6",
- "projects" : [ {
- "kind" : "projecthosting#project",
- "name" : "pmn",
- "externalId" : "pmn",
- "htmlLink" : "/p/pmn/",
- "summary" : "Shows an icon in the system tray when you have new emails",
- "description" : "IMAP client that shows an icon in the system tray when you have new emails.",
- "labels" : [ "Mail" ],
- "versionControlSystem" : "svn",
- "repositoryUrls" : [ "https://pmn.googlecode.com/svn/" ],
- "issuesConfig" : {
- "kind" : "projecthosting#projectIssueConfig",
- "statuses" : [ {
- "status" : "New",
- "meansOpen" : true,
- "description" : "Issue has not had initial review yet"
- }, {
- "status" : "Accepted",
- "meansOpen" : true,
- "description" : "Problem reproduced / Need acknowledged"
- }, {
- "status" : "Started",
- "meansOpen" : true,
- "description" : "Work on this issue has begun"
- }, {
- "status" : "Fixed",
- "meansOpen" : false,
- "description" : "Developer made source code changes, QA should verify"
- }, {
- "status" : "Verified",
- "meansOpen" : false,
- "description" : "QA has verified that the fix worked"
- }, {
- "status" : "Invalid",
- "meansOpen" : false,
- "description" : "This was not a valid issue report"
- }, {
- "status" : "Duplicate",
- "meansOpen" : false,
- "description" : "This report duplicates an existing issue"
- }, {
- "status" : "WontFix",
- "meansOpen" : false,
- "description" : "We decided to not take action on this issue"
- }, {
- "status" : "Done",
- "meansOpen" : false,
- "description" : "The requested non-coding task was completed"
- } ],
- "labels" : [ {
- "label" : "Type-Defect",
- "description" : "Report of a software defect"
- }, {
- "label" : "Type-Enhancement",
- "description" : "Request for enhancement"
- }, {
- "label" : "Type-Task",
- "description" : "Work item that doesn't change the code or docs"
- }, {
- "label" : "Type-Review",
- "description" : "Request for a source code review"
- }, {
- "label" : "Type-Other",
- "description" : "Some other kind of issue"
- }, {
- "label" : "Priority-Critical",
- "description" : "Must resolve in the specified milestone"
- }, {
- "label" : "Priority-High",
- "description" : "Strongly want to resolve in the specified milestone"
- }, {
- "label" : "Priority-Medium",
- "description" : "Normal priority"
- }, {
- "label" : "Priority-Low",
- "description" : "Might slip to later milestone"
- }, {
- "label" : "OpSys-All",
- "description" : "Affects all operating systems"
- }, {
- "label" : "OpSys-Windows",
- "description" : "Affects Windows users"
- }, {
- "label" : "OpSys-Linux",
- "description" : "Affects Linux users"
- }, {
- "label" : "OpSys-OSX",
- "description" : "Affects Mac OS X users"
- }, {
- "label" : "Milestone-Release1.0",
- "description" : "All essential functionality working"
- }, {
- "label" : "Component-UI",
- "description" : "Issue relates to program UI"
- }, {
- "label" : "Component-Logic",
- "description" : "Issue relates to application logic"
- }, {
- "label" : "Component-Persistence",
- "description" : "Issue relates to data storage components"
- }, {
- "label" : "Component-Scripts",
- "description" : "Utility and installation scripts"
- }, {
- "label" : "Component-Docs",
- "description" : "Issue relates to end-user documentation"
- }, {
- "label" : "Security",
- "description" : "Security risk to users"
- }, {
- "label" : "Performance",
- "description" : "Performance issue"
- }, {
- "label" : "Usability",
- "description" : "Affects program usability"
- }, {
- "label" : "Maintainability",
- "description" : "Hinders future changes"
- } ],
- "prompts" : [ {
- "name" : "Defect report from user",
- "title" : "Enter one-line summary",
- "description" : "What steps will reproduce the problem?\n1. \n2. \n3. \n\nWhat is the expected output? What do you see instead?\n\n\nWhat version of the product are you using? On what operating system?\n\n\nPlease provide any additional information below.\n",
- "titleMustBeEdited" : true,
- "status" : "New",
- "labels" : [ "Type-Defect", "Priority-Medium" ]
- }, {
- "name" : "Defect report from developer",
- "title" : "Enter one-line summary",
- "description" : "What steps will reproduce the problem?\n1. \n2. \n3. \n\nWhat is the expected output? What do you see instead?\n\n\nPlease use labels and text to provide additional information.\n",
- "titleMustBeEdited" : true,
- "status" : "Accepted",
- "labels" : [ "Type-Defect", "Priority-Medium" ],
- "membersOnly" : true
- }, {
- "name" : "Review request",
- "title" : "Code review request",
- "description" : "Branch name:\n\nPurpose of code changes on this branch:\n\n\nWhen reviewing my code changes, please focus on:\n\n\nAfter the review, I'll merge this branch into:\n/trunk\n",
- "status" : "New",
- "labels" : [ "Type-Review", "Priority-Medium" ],
- "membersOnly" : true,
- "defaultToMember" : false
- } ],
- "defaultPromptForMembers" : 1,
- "defaultPromptForNonMembers" : 0
- },
- "role" : "owner",
- "members" : [ {
- "kind" : "projecthosting#issuePerson",
- "name" : "mrovi9000",
- "htmlLink" : "https://code.google.com/u/106736353629303906862/"
- } ],
- "issues" : {
- "kind" : "projecthosting#issueList",
- "totalResults" : 0,
- "items" : [ ]
- }
- }, {
- "kind" : "projecthosting#project",
- "name" : "tint2",
- "externalId" : "tint2",
- "htmlLink" : "/p/tint2/",
- "summary" : "tint2 is a lightweight panel/taskbar.",
- "description" : "tint2 is a simple _*panel/taskbar*_ unintrusive and light (memory / cpu / aestetic). <br>We follow freedesktop specifications.\r\n \r\n=== 0.11 features ===\r\n * panel with taskbar, systray, clock and battery status\r\n * easy to customize : color/transparency on font, icon, border and background\r\n * pager like capability : send task from one workspace to another, switch workspace\r\n * multi-monitor capability : one panel per monitor, show task from current monitor\r\n * customize mouse event\r\n * window manager's menu\r\n * tooltip\r\n * autohide\r\n * clock timezones\r\n * real & fake transparency with autodetection of composite manager\r\n * panel's theme switcher 'tint2conf' \r\n\r\n=== Other project ===\r\n * Lightweight volume control http://softwarebakery.com/maato/volumeicon.html\r\n * Lightweight calendar http://code.google.com/p/gsimplecal/\r\n * Graphical config tool http://code.google.com/p/tintwizard/\r\n * Command line theme switcher http://github.com/dbbolton/scripts/blob/master/tint2theme\r\n\r\n\r\n=== Snapshot SVN ===\r\n\r\nhttp://img252.imageshack.us/img252/1433/wallpaper2td.jpg\r\n\r\n\r\n",
- "labels" : [ "taskbar", "panel", "lightweight", "desktop", "openbox", "pager", "tint2" ],
- "versionControlSystem" : "git",
- "repositoryUrls" : [ "https://tint2.googlecode.com/git/" ],
- "issuesConfig" : {
- "kind" : "projecthosting#projectIssueConfig",
- "defaultColumns" : [ "ID", "Status", "Type", "Milestone", "Priority", "Component", "Owner", "Summary", "Modified", "Stars" ],
- "defaultSorting" : [ "-ID" ],
- "statuses" : [ {
- "status" : "New",
- "meansOpen" : true,
- "description" : "Issue has not had initial review yet"
- }, {
- "status" : "NeedInfo",
- "meansOpen" : true,
- "description" : "More information is needed before deciding what action should be taken"
- }, {
- "status" : "Accepted",
- "meansOpen" : true,
- "description" : "A Defect that a developer has reproduced or an Enhancement that a developer has committed to addressing"
- }, {
- "status" : "Wishlist",
- "meansOpen" : true,
- "description" : "An Enhancement which is valid, but no developers have committed to addressing"
- }, {
- "status" : "Started",
- "meansOpen" : true,
- "description" : "Work on this issue has begun"
- }, {
- "status" : "Fixed",
- "meansOpen" : false,
- "description" : "Work has completed"
- }, {
- "status" : "Invalid",
- "meansOpen" : false,
- "description" : "This was not a valid issue report"
- }, {
- "status" : "Duplicate",
- "meansOpen" : false,
- "description" : "This report duplicates an existing issue"
- }, {
- "status" : "WontFix",
- "meansOpen" : false,
- "description" : "We decided to not take action on this issue"
- }, {
- "status" : "Incomplete",
- "meansOpen" : false,
- "description" : "Not enough information and no activity for a long period of time"
- } ],
- "labels" : [ {
- "label" : "Type-Defect",
- "description" : "Report of a software defect"
- }, {
- "label" : "Type-Enhancement",
- "description" : "Request for enhancement"
- }, {
- "label" : "Type-Task",
- "description" : "Work item that does not change the code"
- }, {
- "label" : "Type-Review",
- "description" : "Request for a source code review"
- }, {
- "label" : "Type-Other",
- "description" : "Some other kind of issue"
- }, {
- "label" : "Milestone-0.12",
- "description" : "Fix should be included in release 0.12"
- }, {
- "label" : "Priority-Critical",
- "description" : "Must resolve in the specified milestone"
- }, {
- "label" : "Priority-High",
- "description" : "Strongly want to resolve in the specified milestone"
- }, {
- "label" : "Priority-Medium",
- "description" : "Normal priority"
- }, {
- "label" : "Priority-Low",
- "description" : "Might slip to later milestone"
- }, {
- "label" : "OpSys-All",
- "description" : "Affects all operating systems"
- }, {
- "label" : "OpSys-Windows",
- "description" : "Affects Windows users"
- }, {
- "label" : "OpSys-Linux",
- "description" : "Affects Linux users"
- }, {
- "label" : "OpSys-OSX",
- "description" : "Affects Mac OS X users"
- }, {
- "label" : "Security",
- "description" : "Security risk to users"
- }, {
- "label" : "Performance",
- "description" : "Performance issue"
- }, {
- "label" : "Usability",
- "description" : "Affects program usability"
- }, {
- "label" : "Maintainability",
- "description" : "Hinders future changes"
- }, {
- "label" : "Component-Panel",
- "description" : "Issue relates to the panel (e.g. positioning, hiding, transparency)"
- }, {
- "label" : "Component-Taskbar",
- "description" : "Issue relates to the taskbar (e.g. tasks, multiple desktops)"
- }, {
- "label" : "Component-Battery",
- "description" : "Issue relates to the battery"
- }, {
- "label" : "Component-Systray",
- "description" : "Issue relates to the system tray"
- }, {
- "label" : "Component-Clock",
- "description" : "Issue relates to the clock"
- }, {
- "label" : "Component-Launcher",
- "description" : "Issue relates to the launcher"
- }, {
- "label" : "Component-Tint2conf",
- "description" : "Issue relates to the configuration GUI (tint2conf)"
- }, {
- "label" : "Component-Docs",
- "description" : "Issue relates to end-user documentation"
- }, {
- "label" : "Component-New",
- "description" : "Issue describes a new component proposal"
- } ],
- "prompts" : [ {
- "name" : "Defect report from user",
- "title" : "Enter one-line summary",
- "description" : "What steps will reproduce the problem?\n1.\n2.\n3.\n\nWhat is the expected output? What do you see instead?\n\n\nWhat version of the product are you using? On what operating system?\n\n\nWhich window manager (e.g. openbox, xfwm, metacity, mutter, kwin) or\nwhich desktop environment (e.g. Gnome 2, Gnome 3, LXDE, XFCE, KDE)\nare you using?\n\n\nPlease provide any additional information below. It might be helpful\nto attach your tint2rc file (usually located at ~/.config/tint2/tint2rc).",
- "titleMustBeEdited" : true,
- "status" : "New",
- "labels" : [ "Priority-Medium" ],
- "defaultToMember" : true
- }, {
- "name" : "Defect report from developer",
- "title" : "Enter one-line summary",
- "description" : "What steps will reproduce the problem?\n1.\n2.\n3.\n\nWhat is the expected output? What do you see instead?\n\n\nPlease use labels and text to provide additional information.",
- "titleMustBeEdited" : true,
- "status" : "Accepted",
- "labels" : [ "Type-Defect", "Priority-Medium" ],
- "membersOnly" : true,
- "defaultToMember" : true
- }, {
- "name" : "Review request",
- "title" : "Code review request",
- "description" : "Purpose of code changes on this branch:\n\n\nWhen reviewing my code changes, please focus on:\n\n\nAfter the review, I'll merge this branch into:\n/trunk",
- "status" : "New",
- "labels" : [ "Type-Review", "Priority-Medium" ],
- "membersOnly" : true,
- "defaultToMember" : true
- } ],
- "defaultPromptForMembers" : 1,
- "defaultPromptForNonMembers" : 0,
- "usersCanSetLabels" : false
- },
- "role" : "owner",
- "issues" : {
- "kind" : "projecthosting#issueList",
- "totalResults" : 473,
- "items" : [ {
- "kind" : "projecthosting#issue",
- "id" : 169,
- "title" : "Scrolling through tasks",
- "summary" : "Scrolling through tasks",
- "stars" : 1,
- "starred" : false,
- "status" : "Fixed",
- "state" : "closed",
- "labels" : [ "Type-Enhancement", "Priority-Medium" ],
- "author" : {
- "kind" : "projecthosting#issuePerson",
- "name" : "schattenpr...",
- "htmlLink" : "https://code.google.com/u/106498139506637530000/"
- },
- "owner" : {
- "kind" : "projecthosting#issuePerson",
- "name" : "thilo...",
- "htmlLink" : "https://code.google.com/u/104224918623172014000/"
- },
- "updated" : "2009-11-18T05:14:58.000Z",
- "published" : "2009-11-18T00:20:19.000Z",
- "closed" : "2009-11-18T05:14:58.000Z",
- "projectId" : "tint2",
- "canComment" : true,
- "canEdit" : true,
- "comments" : {
- "kind" : "projecthosting#issueCommentList",
- "totalResults" : 2,
- "items" : [ {
- "id" : 0,
- "kind" : "projecthosting#issueComment",
- "author" : {
- "kind" : "projecthosting#issuePerson",
- "name" : "schattenpr...",
- "htmlLink" : "https://code.google.com/u/10649813950663753000/"
- },
- "content" : "I like to scroll through the tasks with my scrollwheel (like in fluxbox). \r\n\r\nPatch is attached that adds two new mouse-actions (next_task+prev_task) \r\nthat can be used for exactly that purpose. \r\n\r\nall the best!",
- "published" : "2009-11-18T00:20:19.000Z",
- "updates" : {
- "kind" : "projecthosting#issueCommentUpdate"
- },
- "canDelete" : true,
- "attachments" : [ {
- "attachmentId" : "8901002890399325565",
- "fileName" : "tint2_task_scrolling.diff",
- "fileSize" : 3059,
- "mimetype" : "text/x-c++; charset=us-ascii"
- }, {
- "attachmentId" : "000",
- "fileName" : "screenshot.png",
- "fileSize" : 0,
- "mimetype" : "image/png"
- } ]
- }, {
- "id" : 1,
- "kind" : "projecthosting#issueComment",
- "author" : {
- "kind" : "projecthosting#issuePerson",
- "name" : "thilo...",
- "htmlLink" : "https://code.google.com/u/104224918623172014000/"
- },
- "content" : "applied, thanks.\r\n",
- "published" : "2009-11-18T05:14:58.000Z",
- "updates" : {
- "kind" : "projecthosting#issueCommentUpdate",
- "status" : "Fixed",
- "labels" : [ "-Type-Defect", "Type-Enhancement" ]
- },
- "canDelete" : true
- } ]
- }
- } ]
- }
- } ]
-}
diff --git a/spec/fixtures/banana_sample.gif b/spec/fixtures/banana_sample.gif
deleted file mode 100644
index 1322ac92d14..00000000000
--- a/spec/fixtures/banana_sample.gif
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/dk.png b/spec/fixtures/dk.png
deleted file mode 100644
index 87ce25e877a..00000000000
--- a/spec/fixtures/dk.png
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/doc_sample.txt b/spec/fixtures/doc_sample.txt
deleted file mode 100644
index 600477e9421..00000000000
--- a/spec/fixtures/doc_sample.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
diff --git a/spec/fixtures/rails_sample.jpg b/spec/fixtures/rails_sample.jpg
deleted file mode 100644
index a847b193325..00000000000
--- a/spec/fixtures/rails_sample.jpg
+++ /dev/null
Binary files differ
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
deleted file mode 100644
index 015a66f7fa0..00000000000
--- a/spec/helpers/application_helper_spec.rb
+++ /dev/null
@@ -1,262 +0,0 @@
-require 'spec_helper'
-
-describe ApplicationHelper do
- describe 'current_controller?' do
- before do
- allow(controller).to receive(:controller_name).and_return('foo')
- end
-
- it 'returns true when controller matches argument' do
- expect(current_controller?(:foo)).to be_truthy
- end
-
- it 'returns false when controller does not match argument' do
- expect(current_controller?(:bar)).not_to be_truthy
- end
-
- it 'should take any number of arguments' do
- expect(current_controller?(:baz, :bar)).not_to be_truthy
- expect(current_controller?(:baz, :bar, :foo)).to be_truthy
- end
- end
-
- describe 'current_action?' do
- before do
- allow(self).to receive(:action_name).and_return('foo')
- end
-
- it 'returns true when action matches argument' do
- expect(current_action?(:foo)).to be_truthy
- end
-
- it 'returns false when action does not match argument' do
- expect(current_action?(:bar)).not_to be_truthy
- end
-
- it 'should take any number of arguments' do
- expect(current_action?(:baz, :bar)).not_to be_truthy
- expect(current_action?(:baz, :bar, :foo)).to be_truthy
- end
- end
-
- describe 'project_icon' do
- avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')
-
- it 'should return an url for the avatar' do
- project = create(:project)
- project.avatar = File.open(avatar_file_path)
- project.save!
- avatar_url = "http://localhost/uploads/project/avatar/#{ project.id }/gitlab_logo.png"
- expect(project_icon("#{project.namespace.to_param}/#{project.to_param}").to_s).to eq(
- "<img alt=\"Gitlab logo\" src=\"#{avatar_url}\" />"
- )
- end
-
- it 'should give uploaded icon when present' do
- project = create(:project)
- project.save!
-
- allow_any_instance_of(Project).to receive(:avatar_in_git).and_return(true)
-
- avatar_url = 'http://localhost' + namespace_project_avatar_path(project.namespace, project)
- expect(project_icon("#{project.namespace.to_param}/#{project.to_param}").to_s).to match(
- image_tag(avatar_url))
- end
- end
-
- describe 'avatar_icon' do
- avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')
-
- it 'should return an url for the avatar' do
- user = create(:user)
- user.avatar = File.open(avatar_file_path)
- user.save!
- expect(avatar_icon(user.email).to_s).
- to match("/uploads/user/avatar/#{ user.id }/gitlab_logo.png")
- end
-
- it 'should return an url for the avatar with relative url' do
- Gitlab.config.gitlab.stub(relative_url_root: '/gitlab')
- Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
-
- user = create(:user)
- user.avatar = File.open(avatar_file_path)
- user.save!
- expect(avatar_icon(user.email).to_s).
- to match("/gitlab/uploads/user/avatar/#{ user.id }/gitlab_logo.png")
- end
-
- it 'should call gravatar_icon when no avatar is present' do
- user = create(:user, email: 'test@example.com')
- user.save!
- expect(avatar_icon(user.email).to_s).to eq('http://www.gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?s=40&d=identicon')
- end
- end
-
- describe 'gravatar_icon' do
- let(:user_email) { 'user@email.com' }
-
- it 'should return a generic avatar path when Gravatar is disabled' do
- ApplicationSetting.any_instance.stub(gravatar_enabled?: false)
- expect(gravatar_icon(user_email)).to match('no_avatar.png')
- end
-
- it 'should return a generic avatar path when email is blank' do
- expect(gravatar_icon('')).to match('no_avatar.png')
- end
-
- it 'should return default gravatar url' do
- Gitlab.config.gitlab.stub(https: false)
- url = 'http://www.gravatar.com/avatar/b58c6f14d292556214bd64909bcdb118'
- expect(gravatar_icon(user_email)).to match(url)
- end
-
- it 'should use SSL when appropriate' do
- Gitlab.config.gitlab.stub(https: true)
- expect(gravatar_icon(user_email)).to match('https://secure.gravatar.com')
- end
-
- it 'should return custom gravatar path when gravatar_url is set' do
- allow(self).to receive(:request).and_return(double(:ssl? => false))
- allow(Gitlab.config.gravatar).
- to receive(:plain_url).
- and_return('http://example.local/?s=%{size}&hash=%{hash}')
- url = 'http://example.local/?s=20&hash=b58c6f14d292556214bd64909bcdb118'
- expect(gravatar_icon(user_email, 20)).to eq(url)
- end
-
- it 'should accept a custom size' do
- allow(self).to receive(:request).and_return(double(:ssl? => false))
- expect(gravatar_icon(user_email, 64)).to match(/\?s=64/)
- end
-
- it 'should use default size when size is wrong' do
- allow(self).to receive(:request).and_return(double(:ssl? => false))
- expect(gravatar_icon(user_email, nil)).to match(/\?s=40/)
- end
-
- it 'should be case insensitive' do
- allow(self).to receive(:request).and_return(double(:ssl? => false))
- expect(gravatar_icon(user_email)).
- to eq(gravatar_icon(user_email.upcase + ' '))
- end
- end
-
- describe 'grouped_options_refs' do
- # Override Rails' grouped_options_for_select helper since HTML is harder to work with
- def grouped_options_for_select(options, *args)
- options
- end
-
- let(:options) { grouped_options_refs }
-
- before do
- # Must be an instance variable
- @project = create(:project)
- end
-
- it 'includes a list of branch names' do
- expect(options[0][0]).to eq('Branches')
- expect(options[0][1]).to include('master', 'feature')
- end
-
- it 'includes a list of tag names' do
- expect(options[1][0]).to eq('Tags')
- expect(options[1][1]).to include('v1.0.0', 'v1.1.0')
- end
-
- it 'includes a specific commit ref if defined' do
- # Must be an instance variable
- @ref = '2ed06dc41dbb5936af845b87d79e05bbf24c73b8'
-
- expect(options[2][0]).to eq('Commit')
- expect(options[2][1]).to eq([@ref])
- end
-
- it 'sorts tags in a natural order' do
- # Stub repository.tag_names to make sure we get some valid testing data
- expect(@project.repository).to receive(:tag_names).
- and_return(['v1.0.9', 'v1.0.10', 'v2.0', 'v3.1.4.2', 'v2.0rc1¿',
- 'v1.0.9a', 'v2.0-rc1', 'v2.0rc2'])
-
- expect(options[1][1]).
- to eq(['v3.1.4.2', 'v2.0', 'v2.0rc2', 'v2.0rc1¿', 'v2.0-rc1', 'v1.0.10',
- 'v1.0.9', 'v1.0.9a'])
- end
- end
-
- describe 'user_color_scheme_class' do
- context 'with current_user is nil' do
- it 'should return a string' do
- allow(self).to receive(:current_user).and_return(nil)
- expect(user_color_scheme_class).to be_kind_of(String)
- end
- end
-
- context 'with a current_user' do
- (1..5).each do |color_scheme_id|
- context "with color_scheme_id == #{color_scheme_id}" do
- it 'should return a string' do
- current_user = double(:color_scheme_id => color_scheme_id)
- allow(self).to receive(:current_user).and_return(current_user)
- expect(user_color_scheme_class).to be_kind_of(String)
- end
- end
- end
- end
- end
-
- describe 'simple_sanitize' do
- let(:a_tag) { '<a href="#">Foo</a>' }
-
- it 'allows the a tag' do
- expect(simple_sanitize(a_tag)).to eq(a_tag)
- end
-
- it 'allows the span tag' do
- input = '<span class="foo">Bar</span>'
- expect(simple_sanitize(input)).to eq(input)
- end
-
- it 'disallows other tags' do
- input = "<strike><b>#{a_tag}</b></strike>"
- expect(simple_sanitize(input)).to eq(a_tag)
- end
- end
-
- describe 'link_to' do
- it 'should not include rel=nofollow for internal links' do
- expect(link_to('Home', root_path)).to eq('<a href="/">Home</a>')
- end
-
- it 'should include rel=nofollow for external links' do
- expect(link_to('Example', 'http://www.example.com')).
- to eq '<a href="http://www.example.com" rel="nofollow">Example</a>'
- end
-
- it 'should include rel=nofollow for external links and honor existing html_options' do
- expect(link_to('Example', 'http://www.example.com', class: 'toggle', data: {toggle: 'dropdown'}))
- .to eq '<a class="toggle" data-toggle="dropdown" href="http://www.example.com" rel="nofollow">Example</a>'
- end
-
- it 'should include rel=nofollow for external links and preserve other rel values' do
- expect(link_to('Example', 'http://www.example.com', rel: 'noreferrer'))
- .to eq '<a href="http://www.example.com" rel="noreferrer nofollow">Example</a>'
- end
-
- it 'should not include rel=nofollow for external links on the same host as GitLab' do
- expect(Gitlab.config.gitlab).to receive(:host).and_return('example.foo')
- expect(link_to('Example', 'http://example.foo/bar')).
- to eq '<a href="http://example.foo/bar">Example</a>'
- end
- end
-
- describe 'markup_render' do
- let(:content) { 'Noël' }
-
- it 'should preserve encoding' do
- expect(content.encoding.name).to eq('UTF-8')
- expect(render_markup('foo.rst', content).encoding.name).to eq('UTF-8')
- end
- end
-end
diff --git a/spec/helpers/broadcast_messages_helper_spec.rb b/spec/helpers/broadcast_messages_helper_spec.rb
deleted file mode 100644
index f6df12662bb..00000000000
--- a/spec/helpers/broadcast_messages_helper_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require 'spec_helper'
-
-describe BroadcastMessagesHelper do
- describe 'broadcast_styling' do
- let(:broadcast_message) { double(color: "", font: "") }
-
- context "default style" do
- it "should have no style" do
- expect(broadcast_styling(broadcast_message)).to match('')
- end
- end
-
- context "customiezd style" do
- before { broadcast_message.stub(color: "#f2dede", font: "#b94a48") }
-
- it "should have a customized style" do
- expect(broadcast_styling(broadcast_message)).
- to match('background-color:#f2dede;color:#b94a48')
- end
- end
- end
-end
diff --git a/spec/helpers/diff_helper_spec.rb b/spec/helpers/diff_helper_spec.rb
deleted file mode 100644
index 5bd09793b11..00000000000
--- a/spec/helpers/diff_helper_spec.rb
+++ /dev/null
@@ -1,102 +0,0 @@
-require 'spec_helper'
-
-describe DiffHelper do
- include RepoHelpers
-
- let(:project) { create(:project) }
- let(:commit) { project.repository.commit(sample_commit.id) }
- let(:diff) { commit.diffs.first }
- let(:diff_file) { Gitlab::Diff::File.new(diff) }
-
- describe 'diff_hard_limit_enabled?' do
- it 'should return true if param is provided' do
- allow(controller).to receive(:params) { { force_show_diff: true } }
- expect(diff_hard_limit_enabled?).to be_truthy
- end
-
- it 'should return false if param is not provided' do
- expect(diff_hard_limit_enabled?).to be_falsey
- end
- end
-
- describe 'allowed_diff_size' do
- it 'should return hard limit for a diff if force diff is true' do
- allow(controller).to receive(:params) { { force_show_diff: true } }
- expect(allowed_diff_size).to eq(1000)
- end
-
- it 'should return safe limit for a diff if force diff is false' do
- expect(allowed_diff_size).to eq(100)
- end
- end
-
- describe 'parallel_diff' do
- it 'should return an array of arrays containing the parsed diff' do
- expect(parallel_diff(diff_file, 0)).
- to match_array(parallel_diff_result_array)
- end
- end
-
- describe 'generate_line_code' do
- it 'should generate correct line code' do
- expect(generate_line_code(diff_file.file_path, diff_file.diff_lines.first)).
- to eq('2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6')
- end
- end
-
- describe 'unfold_bottom_class' do
- it 'should return empty string when bottom line shouldnt be unfolded' do
- expect(unfold_bottom_class(false)).to eq('')
- end
-
- it 'should return js class when bottom lines should be unfolded' do
- expect(unfold_bottom_class(true)).to eq('js-unfold-bottom')
- end
- end
-
- describe 'diff_line_content' do
-
- it 'should return non breaking space when line is empty' do
- expect(diff_line_content(nil)).to eq(' &nbsp;')
- end
-
- it 'should return the line itself' do
- expect(diff_line_content(diff_file.diff_lines.first.text)).
- to eq('@@ -6,12 +6,18 @@ module Popen')
- expect(diff_line_content(diff_file.diff_lines.first.type)).to eq('match')
- expect(diff_line_content(diff_file.diff_lines.first.new_pos)).to eq(6)
- end
- end
-
- def parallel_diff_result_array
- [
- ["match", 6, "@@ -6,12 +6,18 @@ module Popen", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6", "match", 6, "@@ -6,12 +6,18 @@ module Popen", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6"],
- [nil, 6, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6", nil, 6, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6"], [nil, 7, " def popen(cmd, path=nil)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_7_7", nil, 7, " def popen(cmd, path=nil)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_7_7"],
- [nil, 8, " unless cmd.is_a?(Array)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_8_8", nil, 8, " unless cmd.is_a?(Array)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_8_8"],
- ["old", 9, "- raise <span class='idiff'></span>&quot;System commands must be given as an array of strings&quot;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_9_9", "new", 9, "+ raise <span class='idiff'>RuntimeError, </span>&quot;System commands must be given as an array of strings&quot;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"],
- [nil, 10, " end", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_10", nil, 10, " end", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_10"],
- [nil, 11, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_11_11", nil, 11, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_11_11"],
- [nil, 12, " path ||= Dir.pwd", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_12_12", nil, 12, " path ||= Dir.pwd", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_12_12"],
- ["old", 13, "- vars = { &quot;PWD&quot; =&gt; path }", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_13_13", "old", nil, "&nbsp;", nil],
- ["old", 14, "- options = { chdir: path }", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_14_13", "new", 13, "+", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_13"],
- [nil, nil, "&nbsp;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14", "new", 14, "+ vars = {", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14"],
- [nil, nil, "&nbsp;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_15", "new", 15, "+ &quot;PWD&quot; =&gt; path", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_15"],
- [nil, nil, "&nbsp;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_16", "new", 16, "+ }", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_16"],
- [nil, nil, "&nbsp;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_17", "new", 17, "+", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_17"],
- [nil, nil, "&nbsp;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_18", "new", 18, "+ options = {", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_18"],
- [nil, nil, "&nbsp;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_19", "new", 19, "+ chdir: path", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_19"],
- [nil, nil, "&nbsp;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_20", "new", 20, "+ }", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_20"],
- [nil, 15, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_21", nil, 21, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_21"],
- [nil, 16, " unless File.directory?(path)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_16_22", nil, 22, " unless File.directory?(path)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_16_22"],
- [nil, 17, " FileUtils.mkdir_p(path)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_17_23", nil, 23, " FileUtils.mkdir_p(path)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_17_23"],
- ["match", 19, "@@ -19,6 +25,7 @@ module Popen", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_19_25", "match", 25, "@@ -19,6 +25,7 @@ module Popen", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_19_25"],
- [nil, 19, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_19_25", nil, 25, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_19_25"],
- [nil, 20, " @cmd_output = &quot;&quot;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_20_26", nil, 26, " @cmd_output = &quot;&quot;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_20_26"],
- [nil, 21, " @cmd_status = 0", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_21_27", nil, 27, " @cmd_status = 0", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_21_27"],
- [nil, nil, "&nbsp;", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_22_28", "new", 28, "+", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_22_28"],
- [nil, 22, " Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_22_29", nil, 29, " Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_22_29"],
- [nil, 23, " @cmd_output &lt;&lt; stdout.read", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_23_30", nil, 30, " @cmd_output &lt;&lt; stdout.read", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_23_30"],
- [nil, 24, " @cmd_output &lt;&lt; stderr.read", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_24_31", nil, 31, " @cmd_output &lt;&lt; stderr.read", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_24_31"]
- ]
- end
-end
diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb
deleted file mode 100644
index b392371deb4..00000000000
--- a/spec/helpers/events_helper_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-require 'spec_helper'
-
-describe EventsHelper do
- include ApplicationHelper
- include GitlabMarkdownHelper
-
- let(:current_user) { create(:user, email: "current@email.com") }
-
- it 'should display one line of plain text without alteration' do
- input = 'A short, plain note'
- expect(event_note(input)).to match(input)
- expect(event_note(input)).not_to match(/\.\.\.\z/)
- end
-
- it 'should display inline code' do
- input = 'A note with `inline code`'
- expected = 'A note with <code>inline code</code>'
-
- expect(event_note(input)).to match(expected)
- end
-
- it 'should truncate a note with multiple paragraphs' do
- input = "Paragraph 1\n\nParagraph 2"
- expected = 'Paragraph 1...'
-
- expect(event_note(input)).to match(expected)
- end
-
- it 'should display the first line of a code block' do
- input = "```\nCode block\nwith two lines\n```"
- expected = '<pre class="code highlight white plaintext"><code>' \
- 'Code block...</code></pre>'
-
- expect(event_note(input)).to match(expected)
- end
-
- it 'should truncate a single long line of text' do
- text = 'The quick brown fox jumped over the lazy dog twice' # 50 chars
- input = "#{text}#{text}#{text}#{text}" # 200 chars
- expected = "#{text}#{text}".sub(/.{3}/, '...')
-
- expect(event_note(input)).to match(expected)
- end
-
- it 'should preserve a link href when link text is truncated' do
- text = 'The quick brown fox jumped over the lazy dog' # 44 chars
- input = "#{text}#{text}#{text} " # 133 chars
- link_url = 'http://example.com/foo/bar/baz' # 30 chars
- input << link_url
- expected_link_text = 'http://example...</a>'
-
- expect(event_note(input)).to match(link_url)
- expect(event_note(input)).to match(expected_link_text)
- end
-
- it 'should preserve code color scheme' do
- input = "```ruby\ndef test\n 'hello world'\nend\n```"
- expected = '<pre class="code highlight white ruby">' \
- "<code><span class=\"k\">def</span> <span class=\"nf\">test</span>\n" \
- " <span class=\"s1\">\'hello world\'</span>\n" \
- "<span class=\"k\">end</span>\n" \
- '</code></pre>'
- expect(event_note(input)).to eq(expected)
- end
-end
diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb
deleted file mode 100644
index 944e743675c..00000000000
--- a/spec/helpers/gitlab_markdown_helper_spec.rb
+++ /dev/null
@@ -1,916 +0,0 @@
-require 'spec_helper'
-
-describe GitlabMarkdownHelper do
- include ApplicationHelper
- include IssuesHelper
-
- # TODO: Properly test this
- def can?(*)
- true
- end
-
- let!(:project) { create(:project) }
- let(:empty_project) { create(:empty_project) }
-
- let(:user) { create(:user, username: 'gfm') }
- let(:commit) { project.repository.commit }
- let(:earlier_commit){ project.repository.commit("HEAD~2") }
- let(:issue) { create(:issue, project: project) }
- let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
- let(:snippet) { create(:project_snippet, project: project) }
- let(:member) { project.project_members.where(user_id: user).first }
-
- # Helper expects a current_user method.
- let(:current_user) { user }
-
- def url_helper(image_name)
- File.join(root_url, 'assets', image_name)
- end
-
- before do
- # Helper expects a @project instance variable
- @project = project
- @ref = 'markdown'
- @repository = project.repository
- @request.host = Gitlab.config.gitlab.host
- end
-
- describe "#gfm" do
- it "should return unaltered text if project is nil" do
- actual = "Testing references: ##{issue.iid}"
-
- expect(gfm(actual)).not_to eq(actual)
-
- @project = nil
- expect(gfm(actual)).to eq(actual)
- end
-
- it "should not alter non-references" do
- actual = expected = "_Please_ *stop* 'helping' and all the other b*$#%' you do."
- expect(gfm(actual)).to eq(expected)
- end
-
- it "should not touch HTML entities" do
- allow(@project.issues).to receive(:where).
- with(id: '39').and_return([issue])
- actual = 'We&#39;ll accept good pull requests.'
- expect(gfm(actual)).to eq("We'll accept good pull requests.")
- end
-
- it "should forward HTML options to links" do
- expect(gfm("Fixed in #{commit.id}", @project, class: 'foo')).
- to have_selector('a.gfm.foo')
- end
-
- describe "referencing a commit range" do
- let(:expected) { namespace_project_compare_path(project.namespace, project, from: earlier_commit.id, to: commit.id) }
-
- it "should link using a full id" do
- actual = "What happened in #{earlier_commit.id}...#{commit.id}"
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link using a short id" do
- actual = "What happened in #{earlier_commit.short_id}...#{commit.short_id}"
- expected = namespace_project_compare_path(project.namespace, project, from: earlier_commit.short_id, to: commit.short_id)
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link inclusively" do
- actual = "What happened in #{earlier_commit.id}..#{commit.id}"
- expected = namespace_project_compare_path(project.namespace, project, from: "#{earlier_commit.id}^", to: commit.id)
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link with adjacent text" do
- actual = "(see #{earlier_commit.id}...#{commit.id})"
- expect(gfm(actual)).to match(expected)
- end
-
- it "should keep whitespace intact" do
- actual = "Changes #{earlier_commit.id}...#{commit.id} dramatically"
- expected = /Changes <a.+>#{earlier_commit.id}...#{commit.id}<\/a> dramatically/
- expect(gfm(actual)).to match(expected)
- end
-
- it "should not link with an invalid id" do
- actual = expected = "What happened in #{earlier_commit.id.reverse}...#{commit.id.reverse}"
- expect(gfm(actual)).to eq(expected)
- end
-
- it "should include a title attribute" do
- actual = "What happened in #{earlier_commit.id}...#{commit.id}"
- expect(gfm(actual)).to match(/title="Commits #{earlier_commit.id} through #{commit.id}"/)
- end
-
- it "should include standard gfm classes" do
- actual = "What happened in #{earlier_commit.id}...#{commit.id}"
- expect(gfm(actual)).to match(/class="\s?gfm gfm-commit_range\s?"/)
- end
- end
-
- describe "referencing a commit" do
- let(:expected) { namespace_project_commit_path(project.namespace, project, commit) }
-
- it "should link using a full id" do
- actual = "Reverts #{commit.id}"
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link using a short id" do
- actual = "Backported from #{commit.short_id}"
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link with adjacent text" do
- actual = "Reverted (see #{commit.id})"
- expect(gfm(actual)).to match(expected)
- end
-
- it "should keep whitespace intact" do
- actual = "Changes #{commit.id} dramatically"
- expected = /Changes <a.+>#{commit.id}<\/a> dramatically/
- expect(gfm(actual)).to match(expected)
- end
-
- it "should not link with an invalid id" do
- actual = expected = "What happened in #{commit.id.reverse}"
- expect(gfm(actual)).to eq(expected)
- end
-
- it "should include a title attribute" do
- actual = "Reverts #{commit.id}"
- expect(gfm(actual)).to match(/title="#{commit.link_title}"/)
- end
-
- it "should include standard gfm classes" do
- actual = "Reverts #{commit.id}"
- expect(gfm(actual)).to match(/class="\s?gfm gfm-commit\s?"/)
- end
- end
-
- describe "referencing a team member" do
- let(:actual) { "@#{user.username} you are right." }
- let(:expected) { user_path(user) }
-
- before do
- project.team << [user, :master]
- end
-
- it "should link using a simple name" do
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link using a name with dots" do
- user.update_attributes(name: "alphA.Beta")
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link using name with underscores" do
- user.update_attributes(name: "ping_pong_king")
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link with adjacent text" do
- actual = "Mail the admin (@#{user.username})"
- expect(gfm(actual)).to match(expected)
- end
-
- it "should keep whitespace intact" do
- actual = "Yes, @#{user.username} is right."
- expected = /Yes, <a.+>@#{user.username}<\/a> is right/
- expect(gfm(actual)).to match(expected)
- end
-
- it "should not link with an invalid id" do
- actual = expected = "@#{user.username.reverse} you are right."
- expect(gfm(actual)).to eq(expected)
- end
-
- it "should include standard gfm classes" do
- expect(gfm(actual)).to match(/class="\s?gfm gfm-project_member\s?"/)
- end
- end
-
- # Shared examples for referencing an object
- #
- # Expects the following attributes to be available in the example group:
- #
- # - object - The object itself
- # - reference - The object reference string (e.g., #1234, $1234, !1234)
- #
- # Currently limited to Snippets, Issues and MergeRequests
- shared_examples 'referenced object' do
- let(:actual) { "Reference to #{reference}" }
- let(:expected) { polymorphic_path([project.namespace, project, object]) }
-
- it "should link using a valid id" do
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link with adjacent text" do
- # Wrap the reference in parenthesis
- expect(gfm(actual.gsub(reference, "(#{reference})"))).to match(expected)
-
- # Append some text to the end of the reference
- expect(gfm(actual.gsub(reference, "#{reference}, right?"))).
- to match(expected)
- end
-
- it "should keep whitespace intact" do
- actual = "Referenced #{reference} already."
- expected = /Referenced <a.+>[^\s]+<\/a> already/
- expect(gfm(actual)).to match(expected)
- end
-
- it "should not link with an invalid id" do
- # Modify the reference string so it's still parsed, but is invalid
- reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2))
- expect(gfm(actual)).to eq(actual)
- end
-
- it "should include a title attribute" do
- title = "#{object.class.to_s.titlecase}: #{object.title}"
- expect(gfm(actual)).to match(/title="#{title}"/)
- end
-
- it "should include standard gfm classes" do
- css = object.class.to_s.underscore
- expect(gfm(actual)).to match(/class="\s?gfm gfm-#{css}\s?"/)
- end
- end
-
- # Shared examples for referencing an object in a different project
- #
- # Expects the following attributes to be available in the example group:
- #
- # - object - The object itself
- # - reference - The object reference string (e.g., #1234, $1234, !1234)
- # - other_project - The project that owns the target object
- #
- # Currently limited to Snippets, Issues and MergeRequests
- shared_examples 'cross-project referenced object' do
- let(:project_path) { @other_project.path_with_namespace }
- let(:full_reference) { "#{project_path}#{reference}" }
- let(:actual) { "Reference to #{full_reference}" }
- let(:expected) do
- if object.is_a?(Commit)
- namespace_project_commit_path(@other_project.namespace, @other_project, object)
- else
- polymorphic_path([@other_project.namespace, @other_project, object])
- end
- end
-
- it 'should link using a valid id' do
- expect(gfm(actual)).to match(
- /#{expected}.*#{Regexp.escape(full_reference)}/
- )
- end
-
- it 'should link with adjacent text' do
- # Wrap the reference in parenthesis
- expect(gfm(actual.gsub(full_reference, "(#{full_reference})"))).to(
- match(expected)
- )
-
- # Append some text to the end of the reference
- expect(gfm(actual.gsub(full_reference, "#{full_reference}, right?"))).
- to(match(expected))
- end
-
- it 'should keep whitespace intact' do
- actual = "Referenced #{full_reference} already."
- expected = /Referenced <a.+>[^\s]+<\/a> already/
- expect(gfm(actual)).to match(expected)
- end
-
- it 'should not link with an invalid id' do
- # Modify the reference string so it's still parsed, but is invalid
- if object.is_a?(Commit)
- reference.gsub!(/^(.).+$/, '\1' + '12345abcd')
- else
- reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2))
- end
- expect(gfm(actual)).to eq(actual)
- end
-
- it 'should include a title attribute' do
- if object.is_a?(Commit)
- title = object.link_title
- else
- title = "#{object.class.to_s.titlecase}: #{object.title}"
- end
- expect(gfm(actual)).to match(/title="#{title}"/)
- end
-
- it 'should include standard gfm classes' do
- css = object.class.to_s.underscore
- expect(gfm(actual)).to match(/class="\s?gfm gfm-#{css}\s?"/)
- end
- end
-
- describe "referencing an issue" do
- let(:object) { issue }
- let(:reference) { "##{issue.iid}" }
-
- include_examples 'referenced object'
- end
-
- context 'cross-repo references' do
- before(:all) do
- @other_project = create(:project, :public)
- @commit2 = @other_project.repository.commit
- @issue2 = create(:issue, project: @other_project)
- @merge_request2 = create(:merge_request,
- source_project: @other_project,
- target_project: @other_project)
- end
-
- describe 'referencing an issue in another project' do
- let(:object) { @issue2 }
- let(:reference) { "##{@issue2.iid}" }
-
- include_examples 'cross-project referenced object'
- end
-
- describe 'referencing an merge request in another project' do
- let(:object) { @merge_request2 }
- let(:reference) { "!#{@merge_request2.iid}" }
-
- include_examples 'cross-project referenced object'
- end
-
- describe 'referencing a commit in another project' do
- let(:object) { @commit2 }
- let(:reference) { "@#{@commit2.id}" }
-
- include_examples 'cross-project referenced object'
- end
- end
-
- describe "referencing a Jira issue" do
- let(:actual) { "Reference to JIRA-#{issue.iid}" }
- let(:expected) { "http://jira.example/browse/JIRA-#{issue.iid}" }
- let(:reference) { "JIRA-#{issue.iid}" }
-
- before do
- jira = @project.create_jira_service if @project.jira_service.nil?
- properties = {"title"=>"JIRA tracker", "project_url"=>"http://jira.example/issues/?jql=project=A", "issues_url"=>"http://jira.example/browse/:id", "new_issue_url"=>"http://jira.example/secure/CreateIssue.jspa"}
- jira.update_attributes(properties: properties, active: true)
- end
-
- after do
- @project.jira_service.destroy! unless @project.jira_service.nil?
- end
-
- it "should link using a valid id" do
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link with adjacent text" do
- # Wrap the reference in parenthesis
- expect(gfm(actual.gsub(reference, "(#{reference})"))).to match(expected)
-
- # Append some text to the end of the reference
- expect(gfm(actual.gsub(reference, "#{reference}, right?"))).
- to match(expected)
- end
-
- it "should keep whitespace intact" do
- actual = "Referenced #{reference} already."
- expected = /Referenced <a.+>[^\s]+<\/a> already/
- expect(gfm(actual)).to match(expected)
- end
-
- it "should not link with an invalid id" do
- # Modify the reference string so it's still parsed, but is invalid
- invalid_reference = actual.gsub(/(\d+)$/, "r45")
- expect(gfm(invalid_reference)).to eq(invalid_reference)
- end
-
- it "should include a title attribute" do
- title = "Issue in JIRA tracker"
- expect(gfm(actual)).to match(/title="#{title}"/)
- end
-
- it "should include standard gfm classes" do
- expect(gfm(actual)).to match(/class="\s?gfm gfm-issue\s?"/)
- end
- end
-
- describe "referencing a merge request" do
- let(:object) { merge_request }
- let(:reference) { "!#{merge_request.iid}" }
-
- include_examples 'referenced object'
- end
-
- describe "referencing a snippet" do
- let(:object) { snippet }
- let(:reference) { "$#{snippet.id}" }
- let(:actual) { "Reference to #{reference}" }
- let(:expected) { namespace_project_snippet_path(project.namespace, project, object) }
-
- it "should link using a valid id" do
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link with adjacent text" do
- # Wrap the reference in parenthesis
- expect(gfm(actual.gsub(reference, "(#{reference})"))).to match(expected)
-
- # Append some text to the end of the reference
- expect(gfm(actual.gsub(reference, "#{reference}, right?"))).to match(expected)
- end
-
- it "should keep whitespace intact" do
- actual = "Referenced #{reference} already."
- expected = /Referenced <a.+>[^\s]+<\/a> already/
- expect(gfm(actual)).to match(expected)
- end
-
- it "should not link with an invalid id" do
- # Modify the reference string so it's still parsed, but is invalid
- reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2))
- expect(gfm(actual)).to eq(actual)
- end
-
- it "should include a title attribute" do
- title = "Snippet: #{object.title}"
- expect(gfm(actual)).to match(/title="#{title}"/)
- end
-
- it "should include standard gfm classes" do
- css = object.class.to_s.underscore
- expect(gfm(actual)).to match(/class="\s?gfm gfm-snippet\s?"/)
- end
-
- end
-
- describe "referencing multiple objects" do
- let(:actual) { "!#{merge_request.iid} -> #{commit.id} -> ##{issue.iid}" }
-
- it "should link to the merge request" do
- expected = namespace_project_merge_request_path(project.namespace, project, merge_request)
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link to the commit" do
- expected = namespace_project_commit_path(project.namespace, project, commit)
- expect(gfm(actual)).to match(expected)
- end
-
- it "should link to the issue" do
- expected = namespace_project_issue_path(project.namespace, project, issue)
- expect(gfm(actual)).to match(expected)
- end
- end
-
- describe "emoji" do
- it "matches at the start of a string" do
- expect(gfm(":+1:")).to match(/<img/)
- end
-
- it "matches at the end of a string" do
- expect(gfm("This gets a :-1:")).to match(/<img/)
- end
-
- it "matches with adjacent text" do
- expect(gfm("+1 (:+1:)")).to match(/<img/)
- end
-
- it "has a title attribute" do
- expect(gfm(":-1:")).to match(/title=":-1:"/)
- end
-
- it "has an alt attribute" do
- expect(gfm(":-1:")).to match(/alt=":-1:"/)
- end
-
- it "has an emoji class" do
- expect(gfm(":+1:")).to match('class="emoji"')
- end
-
- it "sets height and width" do
- actual = gfm(":+1:")
- expect(actual).to match(/width="20"/)
- expect(actual).to match(/height="20"/)
- end
-
- it "keeps whitespace intact" do
- expect(gfm('This deserves a :+1: big time.')).
- to match(/deserves a <img.+> big time/)
- end
-
- it "ignores invalid emoji" do
- expect(gfm(":invalid-emoji:")).not_to match(/<img/)
- end
-
- it "should work independent of reference links (i.e. without @project being set)" do
- @project = nil
- expect(gfm(":+1:")).to match(/<img/)
- end
- end
- end
-
- describe "#link_to_gfm" do
- let(:commit_path) { namespace_project_commit_path(project.namespace, project, commit) }
- let(:issues) { create_list(:issue, 2, project: project) }
-
- it "should handle references nested in links with all the text" do
- actual = link_to_gfm("This should finally fix ##{issues[0].iid} and ##{issues[1].iid} for real", commit_path)
-
- # Break the result into groups of links with their content, without
- # closing tags
- groups = actual.split("</a>")
-
- # Leading commit link
- expect(groups[0]).to match(/href="#{commit_path}"/)
- expect(groups[0]).to match(/This should finally fix $/)
-
- # First issue link
- expect(groups[1]).
- to match(/href="#{namespace_project_issue_path(project.namespace, project, issues[0])}"/)
- expect(groups[1]).to match(/##{issues[0].iid}$/)
-
- # Internal commit link
- expect(groups[2]).to match(/href="#{commit_path}"/)
- expect(groups[2]).to match(/ and /)
-
- # Second issue link
- expect(groups[3]).
- to match(/href="#{namespace_project_issue_path(project.namespace, project, issues[1])}"/)
- expect(groups[3]).to match(/##{issues[1].iid}$/)
-
- # Trailing commit link
- expect(groups[4]).to match(/href="#{commit_path}"/)
- expect(groups[4]).to match(/ for real$/)
- end
-
- it "should forward HTML options" do
- actual = link_to_gfm("Fixed in #{commit.id}", commit_path, class: 'foo')
- expect(actual).to have_selector 'a.gfm.gfm-commit.foo'
- end
-
- it "escapes HTML passed in as the body" do
- actual = "This is a <h1>test</h1> - see ##{issues[0].iid}"
- expect(link_to_gfm(actual, commit_path)).
- to match('&lt;h1&gt;test&lt;/h1&gt;')
- end
- end
-
- describe "#markdown" do
- it "should handle references in paragraphs" do
- actual = "\n\nLorem ipsum dolor sit amet. #{commit.id} Nam pulvinar sapien eget.\n"
- expected = namespace_project_commit_path(project.namespace, project, commit)
- expect(markdown(actual)).to match(expected)
- end
-
- it "should handle references in headers" do
- actual = "\n# Working around ##{issue.iid}\n## Apply !#{merge_request.iid}"
-
- expect(markdown(actual, no_header_anchors: true)).
- to match(%r{<h1[^<]*>Working around <a.+>##{issue.iid}</a></h1>})
- expect(markdown(actual, no_header_anchors: true)).
- to match(%r{<h2[^<]*>Apply <a.+>!#{merge_request.iid}</a></h2>})
- end
-
- it "should add ids and links to headers" do
- # Test every rule except nested tags.
- text = '..Ab_c-d. e..'
- id = 'ab_c-d-e'
- expect(markdown("# #{text}")).
- to match(%r{<h1 id="#{id}">#{text}<a href="[^"]*##{id}"></a></h1>})
- expect(markdown("# #{text}", {no_header_anchors:true})).
- to eq("<h1>#{text}</h1>")
-
- id = 'link-text'
- expect(markdown("# [link text](url) ![img alt](url)")).to match(
- %r{<h1 id="#{id}"><a href="[^"]*url">link text</a> <img[^>]*><a href="[^"]*##{id}"></a></h1>}
- )
- end
-
- it "should handle references in lists" do
- project.team << [user, :master]
-
- actual = "\n* dark: ##{issue.iid}\n* light by @#{member.user.username}"
-
- expect(markdown(actual)).
- to match(%r{<li>dark: <a.+>##{issue.iid}</a></li>})
- expect(markdown(actual)).
- to match(%r{<li>light by <a.+>@#{member.user.username}</a></li>})
- end
-
- it "should not link the apostrophe to issue 39" do
- project.team << [user, :master]
- allow(project.issues).
- to receive(:where).with(iid: '39').and_return([issue])
-
- actual = "Yes, it is @#{member.user.username}'s task."
- expected = /Yes, it is <a.+>@#{member.user.username}<\/a>'s task/
- expect(markdown(actual)).to match(expected)
- end
-
- it "should not link the apostrophe to issue 39 in code blocks" do
- project.team << [user, :master]
- allow(project.issues).
- to receive(:where).with(iid: '39').and_return([issue])
-
- actual = "Yes, `it is @#{member.user.username}'s task.`"
- expected = /Yes, <code>it is @gfm\'s task.<\/code>/
- expect(markdown(actual)).to match(expected)
- end
-
- it "should handle references in <em>" do
- actual = "Apply _!#{merge_request.iid}_ ASAP"
-
- expect(markdown(actual)).
- to match(%r{Apply <em><a.+>!#{merge_request.iid}</a></em>})
- end
-
- it "should handle tables" do
- actual = %Q{| header 1 | header 2 |
-| -------- | -------- |
-| cell 1 | cell 2 |
-| cell 3 | cell 4 |}
-
- expect(markdown(actual)).to match(/\A<table/)
- end
-
- it "should leave code blocks untouched" do
- allow(helper).to receive(:user_color_scheme_class).and_return(:white)
-
- target_html = "<pre class=\"code highlight white plaintext\"><code>some code from $#{snippet.id}\nhere too\n</code></pre>\n"
-
- expect(helper.markdown("\n some code from $#{snippet.id}\n here too\n")).
- to eq(target_html)
- expect(helper.markdown("\n```\nsome code from $#{snippet.id}\nhere too\n```\n")).
- to eq(target_html)
- end
-
- it "should leave inline code untouched" do
- expect(markdown("\nDon't use `$#{snippet.id}` here.\n")).to eq(
- "<p>Don't use <code>$#{snippet.id}</code> here.</p>\n"
- )
- end
-
- it "should leave ref-like autolinks untouched" do
- expect(markdown("look at http://example.tld/#!#{merge_request.iid}")).to eq("<p>look at <a href=\"http://example.tld/#!#{merge_request.iid}\">http://example.tld/#!#{merge_request.iid}</a></p>\n")
- end
-
- it "should leave ref-like href of 'manual' links untouched" do
- expect(markdown("why not [inspect !#{merge_request.iid}](http://example.tld/#!#{merge_request.iid})")).to eq("<p>why not <a href=\"http://example.tld/#!#{merge_request.iid}\">inspect </a><a class=\"gfm gfm-merge_request \" href=\"#{namespace_project_merge_request_path(project.namespace, project, merge_request)}\" title=\"Merge Request: #{merge_request.title}\">!#{merge_request.iid}</a><a href=\"http://example.tld/#!#{merge_request.iid}\"></a></p>\n")
- end
-
- it "should leave ref-like src of images untouched" do
- expect(markdown("screen shot: ![some image](http://example.tld/#!#{merge_request.iid})")).to eq("<p>screen shot: <img src=\"http://example.tld/#!#{merge_request.iid}\" alt=\"some image\"></p>\n")
- end
-
- it "should generate absolute urls for refs" do
- expect(markdown("##{issue.iid}")).to include(namespace_project_issue_path(project.namespace, project, issue))
- end
-
- it "should generate absolute urls for emoji" do
- expect(markdown(':smile:')).to(
- include(%(src="#{Gitlab.config.gitlab.url}/assets/emoji/#{Emoji.emoji_filename('smile')}.png))
- )
- end
-
- it "should generate absolute urls for emoji if relative url is present" do
- allow(Gitlab.config.gitlab).to receive(:url).and_return('http://localhost/gitlab/root')
- expect(markdown(":smile:")).to include("src=\"http://localhost/gitlab/root/assets/emoji/#{Emoji.emoji_filename('smile')}.png")
- end
-
- it "should generate absolute urls for emoji if asset_host is present" do
- allow(Gitlab::Application.config).to receive(:asset_host).and_return("https://cdn.example.com")
- ActionView::Base.any_instance.stub_chain(:config, :asset_host).and_return("https://cdn.example.com")
- expect(markdown(":smile:")).to include("src=\"https://cdn.example.com/assets/emoji/#{Emoji.emoji_filename('smile')}.png")
- end
-
-
- it "should handle relative urls for a file in master" do
- actual = "[GitLab API doc](doc/api/README.md)\n"
- expected = "<p><a href=\"/#{project.path_with_namespace}/blob/#{@ref}/doc/api/README.md\">GitLab API doc</a></p>\n"
- expect(markdown(actual)).to match(expected)
- end
-
- it "should handle relative urls for a file in master with an anchor" do
- actual = "[GitLab API doc](doc/api/README.md#section)\n"
- expected = "<p><a href=\"/#{project.path_with_namespace}/blob/#{@ref}/doc/api/README.md#section\">GitLab API doc</a></p>\n"
- expect(markdown(actual)).to match(expected)
- end
-
- it "should not handle relative urls for the current file with an anchor" do
- actual = "[GitLab API doc](#section)\n"
- expected = "<p><a href=\"#section\">GitLab API doc</a></p>\n"
- expect(markdown(actual)).to match(expected)
- end
-
- it "should handle relative urls for a directory in master" do
- actual = "[GitLab API doc](doc/api)\n"
- expected = "<p><a href=\"/#{project.path_with_namespace}/tree/#{@ref}/doc/api\">GitLab API doc</a></p>\n"
- expect(markdown(actual)).to match(expected)
- end
-
- it "should handle absolute urls" do
- actual = "[GitLab](https://www.gitlab.com)\n"
- expected = "<p><a href=\"https://www.gitlab.com\">GitLab</a></p>\n"
- expect(markdown(actual)).to match(expected)
- end
-
- it "should handle relative urls in reference links for a file in master" do
- actual = "[GitLab API doc][GitLab readme]\n [GitLab readme]: doc/api/README.md\n"
- expected = "<p><a href=\"/#{project.path_with_namespace}/blob/#{@ref}/doc/api/README.md\">GitLab API doc</a></p>\n"
- expect(markdown(actual)).to match(expected)
- end
-
- it "should handle relative urls in reference links for a directory in master" do
- actual = "[GitLab API doc directory][GitLab readmes]\n [GitLab readmes]: doc/api/\n"
- expected = "<p><a href=\"/#{project.path_with_namespace}/tree/#{@ref}/doc/api\">GitLab API doc directory</a></p>\n"
- expect(markdown(actual)).to match(expected)
- end
-
- it "should not handle malformed relative urls in reference links for a file in master" do
- actual = "[GitLab readme]: doc/api/README.md\n"
- expected = ""
- expect(markdown(actual)).to match(expected)
- end
-
- it 'should allow whitelisted HTML tags from the user' do
- actual = '<dl><dt>Term</dt><dd>Definition</dd></dl>'
- expect(markdown(actual)).to match(actual)
- end
-
- it 'should sanitize tags that are not whitelisted' do
- actual = '<textarea>no inputs allowed</textarea> <blink>no blinks</blink>'
- expected = 'no inputs allowed no blinks'
- expect(markdown(actual)).to match(expected)
- expect(markdown(actual)).not_to match('<.textarea>')
- expect(markdown(actual)).not_to match('<.blink>')
- end
-
- it 'should allow whitelisted tag attributes from the user' do
- actual = '<a class="custom">link text</a>'
- expect(markdown(actual)).to match(actual)
- end
-
- it 'should sanitize tag attributes that are not whitelisted' do
- actual = '<a href="http://example.com/bar.html" foo="bar">link text</a>'
- expected = '<a href="http://example.com/bar.html">link text</a>'
- expect(markdown(actual)).to match(expected)
- end
-
- it 'should sanitize javascript in attributes' do
- actual = %q(<a href="javascript:alert('foo')">link text</a>)
- expected = '<a>link text</a>'
- expect(markdown(actual)).to match(expected)
- end
- end
-
- describe 'markdown for empty repository' do
- before do
- @project = empty_project
- @repository = empty_project.repository
- end
-
- it "should not touch relative urls" do
- actual = "[GitLab API doc][GitLab readme]\n [GitLab readme]: doc/api/README.md\n"
- expected = "<p><a href=\"doc/api/README.md\">GitLab API doc</a></p>\n"
- expect(markdown(actual)).to match(expected)
- end
- end
-
- describe "#render_wiki_content" do
- before do
- @wiki = double('WikiPage')
- allow(@wiki).to receive(:content).and_return('wiki content')
- end
-
- it "should use GitLab Flavored Markdown for markdown files" do
- allow(@wiki).to receive(:format).and_return(:markdown)
-
- expect(helper).to receive(:markdown).with('wiki content')
-
- helper.render_wiki_content(@wiki)
- end
-
- it "should use the Gollum renderer for all other file types" do
- allow(@wiki).to receive(:format).and_return(:rdoc)
- formatted_content_stub = double('formatted_content')
- expect(formatted_content_stub).to receive(:html_safe)
- allow(@wiki).to receive(:formatted_content).and_return(formatted_content_stub)
-
- helper.render_wiki_content(@wiki)
- end
- end
-
- describe '#gfm_with_tasks' do
- before(:all) do
- @source_text_asterisk = <<EOT.gsub(/^\s{8}/, '')
- * [ ] valid unchecked task
- * [x] valid lowercase checked task
- * [X] valid uppercase checked task
- * [ ] valid unchecked nested task
- * [x] valid checked nested task
-
- [ ] not an unchecked task - no list item
- [x] not a checked task - no list item
-
- * [ ] not an unchecked task - too many spaces
- * [x ] not a checked task - too many spaces
- * [] not an unchecked task - no spaces
- * Not a task [ ] - not at beginning
-EOT
-
- @source_text_dash = <<EOT.gsub(/^\s{8}/, '')
- - [ ] valid unchecked task
- - [x] valid lowercase checked task
- - [X] valid uppercase checked task
- - [ ] valid unchecked nested task
- - [x] valid checked nested task
-EOT
- end
-
- it 'should render checkboxes at beginning of asterisk list items' do
- rendered_text = markdown(@source_text_asterisk, parse_tasks: true)
-
- expect(rendered_text).to match(/<input.*checkbox.*valid unchecked task/)
- expect(rendered_text).to match(
- /<input.*checkbox.*valid lowercase checked task/
- )
- expect(rendered_text).to match(
- /<input.*checkbox.*valid uppercase checked task/
- )
- end
-
- it 'should render checkboxes at beginning of dash list items' do
- rendered_text = markdown(@source_text_dash, parse_tasks: true)
-
- expect(rendered_text).to match(/<input.*checkbox.*valid unchecked task/)
- expect(rendered_text).to match(
- /<input.*checkbox.*valid lowercase checked task/
- )
- expect(rendered_text).to match(
- /<input.*checkbox.*valid uppercase checked task/
- )
- end
-
- it 'should render checkboxes for nested tasks' do
- rendered_text = markdown(@source_text_asterisk, parse_tasks: true)
-
- expect(rendered_text).to match(
- /<input.*checkbox.*valid unchecked nested task/
- )
- expect(rendered_text).to match(
- /<input.*checkbox.*valid checked nested task/
- )
- end
-
- it 'should not be confused by whitespace before bullets' do
- rendered_text_asterisk = markdown(@source_text_asterisk,
- parse_tasks: true)
- rendered_text_dash = markdown(@source_text_dash, parse_tasks: true)
-
- expect(rendered_text_asterisk).to match(
- /<input.*checkbox.*valid unchecked nested task/
- )
- expect(rendered_text_asterisk).to match(
- /<input.*checkbox.*valid checked nested task/
- )
- expect(rendered_text_dash).to match(
- /<input.*checkbox.*valid unchecked nested task/
- )
- expect(rendered_text_dash).to match(
- /<input.*checkbox.*valid checked nested task/
- )
- end
-
- it 'should not render checkboxes outside of list items' do
- rendered_text = markdown(@source_text_asterisk, parse_tasks: true)
-
- expect(rendered_text).not_to match(
- /<input.*checkbox.*not an unchecked task - no list item/
- )
- expect(rendered_text).not_to match(
- /<input.*checkbox.*not a checked task - no list item/
- )
- end
-
- it 'should not render checkboxes with invalid formatting' do
- rendered_text = markdown(@source_text_asterisk, parse_tasks: true)
-
- expect(rendered_text).not_to match(
- /<input.*checkbox.*not an unchecked task - too many spaces/
- )
- expect(rendered_text).not_to match(
- /<input.*checkbox.*not a checked task - too many spaces/
- )
- expect(rendered_text).not_to match(
- /<input.*checkbox.*not an unchecked task - no spaces/
- )
- expect(rendered_text).not_to match(
- /Not a task.*<input.*checkbox.*not at beginning/
- )
- end
- end
-end
diff --git a/spec/helpers/groups_helper.rb b/spec/helpers/groups_helper.rb
deleted file mode 100644
index 3e99ab84ec9..00000000000
--- a/spec/helpers/groups_helper.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-require 'spec_helper'
-
-describe GroupsHelper do
- describe 'group_icon' do
- avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')
-
- it 'should return an url for the avatar' do
- group = create(:group)
- group.avatar = File.open(avatar_file_path)
- group.save!
- expect(group_icon(group.path).to_s).
- to match("/uploads/group/avatar/#{ group.id }/gitlab_logo.png")
- end
-
- it 'should give default avatar_icon when no avatar is present' do
- group = create(:group)
- group.save!
- expect(group_icon(group.path)).to match('group_avatar.png')
- end
- end
-end
diff --git a/spec/helpers/icons_helper_spec.rb b/spec/helpers/icons_helper_spec.rb
deleted file mode 100644
index c052981fe73..00000000000
--- a/spec/helpers/icons_helper_spec.rb
+++ /dev/null
@@ -1,109 +0,0 @@
-require 'spec_helper'
-
-describe IconsHelper do
- describe 'file_type_icon_class' do
- it 'returns folder class' do
- expect(file_type_icon_class('folder', 0, 'folder_name')).to eq 'folder'
- end
-
- it 'returns share class' do
- expect(file_type_icon_class('file', '120000', 'link')).to eq 'share'
- end
-
- it 'returns file-pdf-o class with .pdf' do
- expect(file_type_icon_class('file', 0, 'filename.pdf')).to eq 'file-pdf-o'
- end
-
- it 'returns file-image-o class with .jpg' do
- expect(file_type_icon_class('file', 0, 'filename.jpg')).to eq 'file-image-o'
- end
-
- it 'returns file-image-o class with .JPG' do
- expect(file_type_icon_class('file', 0, 'filename.JPG')).to eq 'file-image-o'
- end
-
- it 'returns file-image-o class with .png' do
- expect(file_type_icon_class('file', 0, 'filename.png')).to eq 'file-image-o'
- end
-
- it 'returns file-archive-o class with .tar' do
- expect(file_type_icon_class('file', 0, 'filename.tar')).to eq 'file-archive-o'
- end
-
- it 'returns file-archive-o class with .TAR' do
- expect(file_type_icon_class('file', 0, 'filename.TAR')).to eq 'file-archive-o'
- end
-
- it 'returns file-archive-o class with .tar.gz' do
- expect(file_type_icon_class('file', 0, 'filename.tar.gz')).to eq 'file-archive-o'
- end
-
- it 'returns file-audio-o class with .mp3' do
- expect(file_type_icon_class('file', 0, 'filename.mp3')).to eq 'file-audio-o'
- end
-
- it 'returns file-audio-o class with .MP3' do
- expect(file_type_icon_class('file', 0, 'filename.MP3')).to eq 'file-audio-o'
- end
-
- it 'returns file-audio-o class with .wav' do
- expect(file_type_icon_class('file', 0, 'filename.wav')).to eq 'file-audio-o'
- end
-
- it 'returns file-video-o class with .avi' do
- expect(file_type_icon_class('file', 0, 'filename.avi')).to eq 'file-video-o'
- end
-
- it 'returns file-video-o class with .AVI' do
- expect(file_type_icon_class('file', 0, 'filename.AVI')).to eq 'file-video-o'
- end
-
- it 'returns file-video-o class with .mp4' do
- expect(file_type_icon_class('file', 0, 'filename.mp4')).to eq 'file-video-o'
- end
-
- it 'returns file-word-o class with .doc' do
- expect(file_type_icon_class('file', 0, 'filename.doc')).to eq 'file-word-o'
- end
-
- it 'returns file-word-o class with .DOC' do
- expect(file_type_icon_class('file', 0, 'filename.DOC')).to eq 'file-word-o'
- end
-
- it 'returns file-word-o class with .docx' do
- expect(file_type_icon_class('file', 0, 'filename.docx')).to eq 'file-word-o'
- end
-
- it 'returns file-excel-o class with .xls' do
- expect(file_type_icon_class('file', 0, 'filename.xls')).to eq 'file-excel-o'
- end
-
- it 'returns file-excel-o class with .XLS' do
- expect(file_type_icon_class('file', 0, 'filename.XLS')).to eq 'file-excel-o'
- end
-
- it 'returns file-excel-o class with .xlsx' do
- expect(file_type_icon_class('file', 0, 'filename.xlsx')).to eq 'file-excel-o'
- end
-
- it 'returns file-excel-o class with .ppt' do
- expect(file_type_icon_class('file', 0, 'filename.ppt')).to eq 'file-powerpoint-o'
- end
-
- it 'returns file-excel-o class with .PPT' do
- expect(file_type_icon_class('file', 0, 'filename.PPT')).to eq 'file-powerpoint-o'
- end
-
- it 'returns file-excel-o class with .pptx' do
- expect(file_type_icon_class('file', 0, 'filename.pptx')).to eq 'file-powerpoint-o'
- end
-
- it 'returns file-text-o class with .unknow' do
- expect(file_type_icon_class('file', 0, 'filename.unknow')).to eq 'file-text-o'
- end
-
- it 'returns file-text-o class with no extension' do
- expect(file_type_icon_class('file', 0, 'CHANGELOG')).to eq 'file-text-o'
- end
- end
-end
diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb
deleted file mode 100644
index 54dd8d4aa64..00000000000
--- a/spec/helpers/issues_helper_spec.rb
+++ /dev/null
@@ -1,138 +0,0 @@
-require "spec_helper"
-
-describe IssuesHelper do
- let(:project) { create :project }
- let(:issue) { create :issue, project: project }
- let(:ext_project) { create :redmine_project }
-
- describe "title_for_issue" do
- it "should return issue title if used internal tracker" do
- @project = project
- expect(title_for_issue(issue.iid)).to eq issue.title
- end
-
- it "should always return empty string if used external tracker" do
- @project = ext_project
- expect(title_for_issue(rand(100))).to eq ""
- end
-
- it "should always return empty string if project nil" do
- @project = nil
-
- expect(title_for_issue(rand(100))).to eq ""
- end
- end
-
- describe "url_for_project_issues" do
- let(:project_url) { ext_project.external_issue_tracker.project_url }
- let(:ext_expected) do
- project_url.gsub(':project_id', ext_project.id.to_s)
- .gsub(':issues_tracker_id', ext_project.issues_tracker_id.to_s)
- end
- let(:int_expected) { polymorphic_path([@project.namespace, project]) }
-
- it "should return internal path if used internal tracker" do
- @project = project
- expect(url_for_project_issues).to match(int_expected)
- end
-
- it "should return path to external tracker" do
- @project = ext_project
-
- expect(url_for_project_issues).to match(ext_expected)
- end
-
- it "should return empty string if project nil" do
- @project = nil
-
- expect(url_for_project_issues).to eq ""
- end
-
- describe "when external tracker was enabled and then config removed" do
- before do
- @project = ext_project
- allow(Gitlab.config).to receive(:issues_tracker).and_return(nil)
- end
-
- it "should return path to external tracker" do
- expect(url_for_project_issues).to match(ext_expected)
- end
- end
- end
-
- describe "url_for_issue" do
- let(:issues_url) { ext_project.external_issue_tracker.issues_url}
- let(:ext_expected) do
- issues_url.gsub(':id', issue.iid.to_s)
- .gsub(':project_id', ext_project.id.to_s)
- .gsub(':issues_tracker_id', ext_project.issues_tracker_id.to_s)
- end
- let(:int_expected) { polymorphic_path([@project.namespace, project, issue]) }
-
- it "should return internal path if used internal tracker" do
- @project = project
- expect(url_for_issue(issue.iid)).to match(int_expected)
- end
-
- it "should return path to external tracker" do
- @project = ext_project
-
- expect(url_for_issue(issue.iid)).to match(ext_expected)
- end
-
- it "should return empty string if project nil" do
- @project = nil
-
- expect(url_for_issue(issue.iid)).to eq ""
- end
-
- describe "when external tracker was enabled and then config removed" do
- before do
- @project = ext_project
- allow(Gitlab.config).to receive(:issues_tracker).and_return(nil)
- end
-
- it "should return external path" do
- expect(url_for_issue(issue.iid)).to match(ext_expected)
- end
- end
- end
-
- describe '#url_for_new_issue' do
- let(:issues_url) { ext_project.external_issue_tracker.new_issue_url }
- let(:ext_expected) do
- issues_url.gsub(':project_id', ext_project.id.to_s)
- .gsub(':issues_tracker_id', ext_project.issues_tracker_id.to_s)
- end
- let(:int_expected) { new_namespace_project_issue_path(project.namespace, project) }
-
- it "should return internal path if used internal tracker" do
- @project = project
- expect(url_for_new_issue).to match(int_expected)
- end
-
- it "should return path to external tracker" do
- @project = ext_project
-
- expect(url_for_new_issue).to match(ext_expected)
- end
-
- it "should return empty string if project nil" do
- @project = nil
-
- expect(url_for_new_issue).to eq ""
- end
-
- describe "when external tracker was enabled and then config removed" do
- before do
- @project = ext_project
- allow(Gitlab.config).to receive(:issues_tracker).and_return(nil)
- end
-
- it "should return internal path" do
- expect(url_for_new_issue).to match(ext_expected)
- end
- end
- end
-
-end
diff --git a/spec/helpers/labels_helper_spec.rb b/spec/helpers/labels_helper_spec.rb
deleted file mode 100644
index 1e64a201942..00000000000
--- a/spec/helpers/labels_helper_spec.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-require 'spec_helper'
-
-describe LabelsHelper do
- it { expect(text_color_for_bg('#EEEEEE')).to eq('#333') }
- it { expect(text_color_for_bg('#222E2E')).to eq('#FFF') }
-end
diff --git a/spec/helpers/merge_requests_helper.rb b/spec/helpers/merge_requests_helper.rb
deleted file mode 100644
index 5262d644048..00000000000
--- a/spec/helpers/merge_requests_helper.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-require 'spec_helper'
-
-describe MergeRequestsHelper do
- describe :issues_sentence do
- subject { issues_sentence(issues) }
- let(:issues) do
- [build(:issue, iid: 1), build(:issue, iid: 2), build(:issue, iid: 3)]
- end
-
- it { is_expected.to eq('#1, #2, and #3') }
- end
-end
diff --git a/spec/helpers/nav_helper_spec.rb b/spec/helpers/nav_helper_spec.rb
deleted file mode 100644
index e4d18d8bfc6..00000000000
--- a/spec/helpers/nav_helper_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-require 'spec_helper'
-
-# Specs in this file have access to a helper object that includes
-# the NavHelper. For example:
-#
-# describe NavHelper do
-# describe "string concat" do
-# it "concats two strings with spaces" do
-# expect(helper.concat_strings("this","that")).to eq("this that")
-# end
-# end
-# end
-describe NavHelper do
- describe '#nav_menu_collapsed?' do
- it 'returns true when the nav is collapsed in the cookie' do
- helper.request.cookies[:collapsed_nav] = 'true'
- expect(helper.nav_menu_collapsed?).to eq true
- end
-
- it 'returns false when the nav is not collapsed in the cookie' do
- helper.request.cookies[:collapsed_nav] = 'false'
- expect(helper.nav_menu_collapsed?).to eq false
- end
- end
-end
diff --git a/spec/helpers/notifications_helper_spec.rb b/spec/helpers/notifications_helper_spec.rb
deleted file mode 100644
index 482cb33e94f..00000000000
--- a/spec/helpers/notifications_helper_spec.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-require 'spec_helper'
-
-describe NotificationsHelper do
- include FontAwesome::Rails::IconHelper
- include IconsHelper
-
- describe 'notification_icon' do
- let(:notification) { double(disabled?: false, participating?: false, watch?: false) }
-
- context "disabled notification" do
- before { notification.stub(disabled?: true) }
-
- it "has a red icon" do
- expect(notification_icon(notification)).to match('class="fa fa-volume-off ns-mute"')
- end
- end
-
- context "participating notification" do
- before { notification.stub(participating?: true) }
-
- it "has a blue icon" do
- expect(notification_icon(notification)).to match('class="fa fa-volume-down ns-part"')
- end
- end
-
- context "watched notification" do
- before { notification.stub(watch?: true) }
-
- it "has a green icon" do
- expect(notification_icon(notification)).to match('class="fa fa-volume-up ns-watch"')
- end
- end
-
- it "has a blue icon" do
- expect(notification_icon(notification)).to match('class="fa fa-circle-o ns-default"')
- end
- end
-end
diff --git a/spec/helpers/oauth_helper_spec.rb b/spec/helpers/oauth_helper_spec.rb
deleted file mode 100644
index 088c342fa13..00000000000
--- a/spec/helpers/oauth_helper_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require "spec_helper"
-
-describe OauthHelper do
- describe "additional_providers" do
- it 'returns all enabled providers' do
- allow(helper).to receive(:enabled_oauth_providers) { [:twitter, :github] }
- expect(helper.additional_providers).to include(*[:twitter, :github])
- end
-
- it 'does not return ldap provider' do
- allow(helper).to receive(:enabled_oauth_providers) { [:twitter, :ldapmain] }
- expect(helper.additional_providers).to include(:twitter)
- end
-
- it 'returns empty array' do
- allow(helper).to receive(:enabled_oauth_providers) { [] }
- expect(helper.additional_providers).to eq([])
- end
- end
-end \ No newline at end of file
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
deleted file mode 100644
index 0f78725e3d9..00000000000
--- a/spec/helpers/projects_helper_spec.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-require 'spec_helper'
-
-describe ProjectsHelper do
- describe "#project_status_css_class" do
- it "returns appropriate class" do
- expect(project_status_css_class("started")).to eq("active")
- expect(project_status_css_class("failed")).to eq("danger")
- expect(project_status_css_class("finished")).to eq("success")
- end
- end
-end
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
deleted file mode 100644
index b327f4f911a..00000000000
--- a/spec/helpers/search_helper_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-require 'spec_helper'
-
-describe SearchHelper do
- # Override simple_sanitize for our testing purposes
- def simple_sanitize(str)
- str
- end
-
- describe 'search_autocomplete_source' do
- context "with no current user" do
- before do
- allow(self).to receive(:current_user).and_return(nil)
- end
-
- it "it returns nil" do
- expect(search_autocomplete_opts("q")).to be_nil
- end
- end
-
- context "with a user" do
- let(:user) { create(:user) }
-
- before do
- allow(self).to receive(:current_user).and_return(user)
- end
-
- it "includes Help sections" do
- expect(search_autocomplete_opts("hel").size).to eq(9)
- end
-
- it "includes default sections" do
- expect(search_autocomplete_opts("adm").size).to eq(1)
- end
-
- it "includes the user's groups" do
- create(:group).add_owner(user)
- expect(search_autocomplete_opts("gro").size).to eq(1)
- end
-
- it "includes the user's projects" do
- project = create(:project, namespace: create(:namespace, owner: user))
- expect(search_autocomplete_opts(project.name).size).to eq(1)
- end
-
- context "with a current project" do
- before { @project = create(:project) }
-
- it "includes project-specific sections" do
- expect(search_autocomplete_opts("Files").size).to eq(1)
- expect(search_autocomplete_opts("Commits").size).to eq(1)
- end
- end
- end
- end
-end
diff --git a/spec/helpers/submodule_helper_spec.rb b/spec/helpers/submodule_helper_spec.rb
deleted file mode 100644
index e99c3f5bc11..00000000000
--- a/spec/helpers/submodule_helper_spec.rb
+++ /dev/null
@@ -1,154 +0,0 @@
-require 'spec_helper'
-
-describe SubmoduleHelper do
- include RepoHelpers
-
- describe 'submodule links' do
- let(:submodule_item) { double(id: 'hash', path: 'rack') }
- let(:config) { Gitlab.config.gitlab }
- let(:repo) { double() }
-
- before do
- self.instance_variable_set(:@repository, repo)
- end
-
- context 'submodule on self' do
- before do
- Gitlab.config.gitlab.stub(protocol: 'http') # set this just to be sure
- end
-
- it 'should detect ssh on standard port' do
- Gitlab.config.gitlab_shell.stub(ssh_port: 22) # set this just to be sure
- Gitlab.config.gitlab_shell.stub(ssh_path_prefix: Settings.send(:build_gitlab_shell_ssh_path_prefix))
- stub_url([ config.user, '@', config.host, ':gitlab-org/gitlab-ce.git' ].join(''))
- expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
- end
-
- it 'should detect ssh on non-standard port' do
- Gitlab.config.gitlab_shell.stub(ssh_port: 2222)
- Gitlab.config.gitlab_shell.stub(ssh_path_prefix: Settings.send(:build_gitlab_shell_ssh_path_prefix))
- stub_url([ 'ssh://', config.user, '@', config.host, ':2222/gitlab-org/gitlab-ce.git' ].join(''))
- expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
- end
-
- it 'should detect http on standard port' do
- Gitlab.config.gitlab.stub(port: 80)
- Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
- stub_url([ 'http://', config.host, '/gitlab-org/gitlab-ce.git' ].join(''))
- expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
- end
-
- it 'should detect http on non-standard port' do
- Gitlab.config.gitlab.stub(port: 3000)
- Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
- stub_url([ 'http://', config.host, ':3000/gitlab-org/gitlab-ce.git' ].join(''))
- expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
- end
-
- it 'should work with relative_url_root' do
- Gitlab.config.gitlab.stub(port: 80) # set this just to be sure
- Gitlab.config.gitlab.stub(relative_url_root: '/gitlab/root')
- Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
- stub_url([ 'http://', config.host, '/gitlab/root/gitlab-org/gitlab-ce.git' ].join(''))
- expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
- end
- end
-
- context 'submodule on github.com' do
- it 'should detect ssh' do
- stub_url('git@github.com:gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ 'https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash' ])
- end
-
- it 'should detect http' do
- stub_url('http://github.com/gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ 'https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash' ])
- end
-
- it 'should detect https' do
- stub_url('https://github.com/gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ 'https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash' ])
- end
-
- it 'should return original with non-standard url' do
- stub_url('http://github.com/gitlab-org/gitlab-ce')
- expect(submodule_links(submodule_item)).to eq([ repo.submodule_url_for, nil ])
-
- stub_url('http://github.com/another/gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ repo.submodule_url_for, nil ])
- end
- end
-
- context 'submodule on gitlab.com' do
- it 'should detect ssh' do
- stub_url('git@gitlab.com:gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ 'https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash' ])
- end
-
- it 'should detect http' do
- stub_url('http://gitlab.com/gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ 'https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash' ])
- end
-
- it 'should detect https' do
- stub_url('https://gitlab.com/gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ 'https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash' ])
- end
-
- it 'should return original with non-standard url' do
- stub_url('http://gitlab.com/gitlab-org/gitlab-ce')
- expect(submodule_links(submodule_item)).to eq([ repo.submodule_url_for, nil ])
-
- stub_url('http://gitlab.com/another/gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ repo.submodule_url_for, nil ])
- end
- end
-
- context 'submodule on unsupported' do
- it 'should return original' do
- stub_url('http://mygitserver.com/gitlab-org/gitlab-ce')
- expect(submodule_links(submodule_item)).to eq([ repo.submodule_url_for, nil ])
-
- stub_url('http://mygitserver.com/gitlab-org/gitlab-ce.git')
- expect(submodule_links(submodule_item)).to eq([ repo.submodule_url_for, nil ])
- end
- end
-
- context 'submodules with relative links' do
- let(:group) { create(:group) }
- let(:project) { create(:project, group: group) }
-
- before do
- self.instance_variable_set(:@project, project)
- end
-
- it 'one level down' do
- commit_id = sample_commit[:id]
- result = relative_self_links('../test.git', commit_id)
- expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
- end
-
- it 'two levels down' do
- commit_id = sample_commit[:id]
- result = relative_self_links('../../test.git', commit_id)
- expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
- end
-
- it 'one level down with namespace and repo' do
- commit_id = sample_commit[:id]
- result = relative_self_links('../foobar/test.git', commit_id)
- expect(result).to eq(["/foobar/test", "/foobar/test/tree/#{commit_id}"])
- end
-
- it 'two levels down with namespace and repo' do
- commit_id = sample_commit[:id]
- result = relative_self_links('../foobar/baz/test.git', commit_id)
- expect(result).to eq(["/baz/test", "/baz/test/tree/#{commit_id}"])
- end
- end
- end
-
- def stub_url(url)
- repo.stub(submodule_url_for: url)
- end
-end
diff --git a/spec/helpers/tab_helper_spec.rb b/spec/helpers/tab_helper_spec.rb
deleted file mode 100644
index fc0ceecfbe7..00000000000
--- a/spec/helpers/tab_helper_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-require 'spec_helper'
-
-describe TabHelper do
- include ApplicationHelper
-
- describe 'nav_link' do
- before do
- allow(controller).to receive(:controller_name).and_return('foo')
- allow(self).to receive(:action_name).and_return('foo')
- end
-
- it "captures block output" do
- expect(nav_link { "Testing Blocks" }).to match(/Testing Blocks/)
- end
-
- it "performs checks on the current controller" do
- expect(nav_link(controller: :foo)).to match(/<li class="active">/)
- expect(nav_link(controller: :bar)).not_to match(/active/)
- expect(nav_link(controller: [:foo, :bar])).to match(/active/)
- end
-
- it "performs checks on the current action" do
- expect(nav_link(action: :foo)).to match(/<li class="active">/)
- expect(nav_link(action: :bar)).not_to match(/active/)
- expect(nav_link(action: [:foo, :bar])).to match(/active/)
- end
-
- it "performs checks on both controller and action when both are present" do
- expect(nav_link(controller: :bar, action: :foo)).not_to match(/active/)
- expect(nav_link(controller: :foo, action: :bar)).not_to match(/active/)
- expect(nav_link(controller: :foo, action: :foo)).to match(/active/)
- end
-
- it "accepts a path shorthand" do
- expect(nav_link(path: 'foo#bar')).not_to match(/active/)
- expect(nav_link(path: 'foo#foo')).to match(/active/)
- end
-
- it "passes extra html options to the list element" do
- expect(nav_link(action: :foo, html_options: {class: 'home'})).to match(/<li class="home active">/)
- expect(nav_link(html_options: {class: 'active'})).to match(/<li class="active">/)
- end
- end
-end
diff --git a/spec/helpers/tree_helper_spec.rb b/spec/helpers/tree_helper_spec.rb
deleted file mode 100644
index 8271e00f41b..00000000000
--- a/spec/helpers/tree_helper_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-require 'spec_helper'
-
-describe TreeHelper do
- describe 'flatten_tree' do
- let(:project) { create(:project) }
-
- before {
- @repository = project.repository
- @commit = project.repository.commit("e56497bb")
- }
-
- context "on a directory containing more than one file/directory" do
- let(:tree_item) { double(name: "files", path: "files") }
-
- it "should return the directory name" do
- expect(flatten_tree(tree_item)).to match('files')
- end
- end
-
- context "on a directory containing only one directory" do
- let(:tree_item) { double(name: "foo", path: "foo") }
-
- it "should return the flattened path" do
- expect(flatten_tree(tree_item)).to match('foo/bar')
- end
- end
- end
-end
diff --git a/spec/javascripts/helpers/.gitkeep b/spec/javascripts/helpers/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/spec/javascripts/helpers/.gitkeep
+++ /dev/null
diff --git a/spec/javascripts/stat_graph_contributors_graph_spec.js b/spec/javascripts/stat_graph_contributors_graph_spec.js
deleted file mode 100644
index 1090cb7f620..00000000000
--- a/spec/javascripts/stat_graph_contributors_graph_spec.js
+++ /dev/null
@@ -1,126 +0,0 @@
-describe("ContributorsGraph", function () {
- describe("#set_x_domain", function () {
- it("set the x_domain", function () {
- ContributorsGraph.set_x_domain(20)
- expect(ContributorsGraph.prototype.x_domain).toEqual(20)
- })
- })
-
- describe("#set_y_domain", function () {
- it("sets the y_domain", function () {
- ContributorsGraph.set_y_domain([{commits: 30}])
- expect(ContributorsGraph.prototype.y_domain).toEqual([0, 30])
- })
- })
-
- describe("#init_x_domain", function () {
- it("sets the initial x_domain", function () {
- ContributorsGraph.init_x_domain([{date: "2013-01-31"}, {date: "2012-01-31"}])
- expect(ContributorsGraph.prototype.x_domain).toEqual(["2012-01-31", "2013-01-31"])
- })
- })
-
- describe("#init_y_domain", function () {
- it("sets the initial y_domain", function () {
- ContributorsGraph.init_y_domain([{commits: 30}])
- expect(ContributorsGraph.prototype.y_domain).toEqual([0, 30])
- })
- })
-
- describe("#init_domain", function () {
- it("calls init_x_domain and init_y_domain", function () {
- spyOn(ContributorsGraph, "init_x_domain")
- spyOn(ContributorsGraph, "init_y_domain")
- ContributorsGraph.init_domain()
- expect(ContributorsGraph.init_x_domain).toHaveBeenCalled()
- expect(ContributorsGraph.init_y_domain).toHaveBeenCalled()
- })
- })
-
- describe("#set_dates", function () {
- it("sets the dates", function () {
- ContributorsGraph.set_dates("2013-12-01")
- expect(ContributorsGraph.prototype.dates).toEqual("2013-12-01")
- })
- })
-
- describe("#set_x_domain", function () {
- it("sets the instance's x domain using the prototype's x_domain", function () {
- ContributorsGraph.prototype.x_domain = 20
- var instance = new ContributorsGraph()
- instance.x = d3.time.scale().range([0, 100]).clamp(true)
- spyOn(instance.x, 'domain')
- instance.set_x_domain()
- expect(instance.x.domain).toHaveBeenCalledWith(20)
- })
- })
-
- describe("#set_y_domain", function () {
- it("sets the instance's y domain using the prototype's y_domain", function () {
- ContributorsGraph.prototype.y_domain = 30
- var instance = new ContributorsGraph()
- instance.y = d3.scale.linear().range([100, 0]).nice()
- spyOn(instance.y, 'domain')
- instance.set_y_domain()
- expect(instance.y.domain).toHaveBeenCalledWith(30)
- })
- })
-
- describe("#set_domain", function () {
- it("calls set_x_domain and set_y_domain", function () {
- var instance = new ContributorsGraph()
- spyOn(instance, 'set_x_domain')
- spyOn(instance, 'set_y_domain')
- instance.set_domain()
- expect(instance.set_x_domain).toHaveBeenCalled()
- expect(instance.set_y_domain).toHaveBeenCalled()
- })
- })
-
- describe("#set_data", function () {
- it("sets the data", function () {
- var instance = new ContributorsGraph()
- instance.set_data("20")
- expect(instance.data).toEqual("20")
- })
- })
-})
-
-describe("ContributorsMasterGraph", function () {
-
- // TODO: fix or remove
- //describe("#process_dates", function () {
- //it("gets and parses dates", function () {
- //var graph = new ContributorsMasterGraph()
- //var data = 'random data here'
- //spyOn(graph, 'parse_dates')
- //spyOn(graph, 'get_dates').andReturn("get")
- //spyOn(ContributorsGraph,'set_dates').andCallThrough()
- //graph.process_dates(data)
- //expect(graph.parse_dates).toHaveBeenCalledWith(data)
- //expect(graph.get_dates).toHaveBeenCalledWith(data)
- //expect(ContributorsGraph.set_dates).toHaveBeenCalledWith("get")
- //})
- //})
-
- describe("#get_dates", function () {
- it("plucks the date field from data collection", function () {
- var graph = new ContributorsMasterGraph()
- var data = [{date: "2013-01-01"}, {date: "2012-12-15"}]
- expect(graph.get_dates(data)).toEqual(["2013-01-01", "2012-12-15"])
- })
- })
-
- describe("#parse_dates", function () {
- it("parses the dates", function () {
- var graph = new ContributorsMasterGraph()
- var parseDate = d3.time.format("%Y-%m-%d").parse
- var data = [{date: "2013-01-01"}, {date: "2012-12-15"}]
- var correct = [{date: parseDate(data[0].date)}, {date: parseDate(data[1].date)}]
- graph.parse_dates(data)
- expect(data).toEqual(correct)
- })
- })
-
-
-})
diff --git a/spec/javascripts/stat_graph_contributors_util_spec.js b/spec/javascripts/stat_graph_contributors_util_spec.js
deleted file mode 100644
index 9c1b588861d..00000000000
--- a/spec/javascripts/stat_graph_contributors_util_spec.js
+++ /dev/null
@@ -1,208 +0,0 @@
-describe("ContributorsStatGraphUtil", function () {
-
- describe("#parse_log", function () {
- it("returns a correctly parsed log", function () {
- var fake_log = [
- {author_email: "karlo@email.com", author_name: "Karlo Soriano", date: "2013-05-09", additions: 471},
- {author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 6, deletions: 1},
- {author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 19, deletions: 3},
- {author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 29, deletions: 3}]
-
- var correct_parsed_log = {
- total: [
- {date: "2013-05-09", additions: 471, deletions: 0, commits: 1},
- {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}],
- by_author:
- [
- {
- author_name: "Karlo Soriano", author_email: "karlo@email.com",
- "2013-05-09": {date: "2013-05-09", additions: 471, deletions: 0, commits: 1}
- },
- {
- author_name: "Dmitriy Zaporozhets",author_email: "dzaporozhets@email.com",
- "2013-05-08": {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}
- }
- ]
- }
- expect(ContributorsStatGraphUtil.parse_log(fake_log)).toEqual(correct_parsed_log)
- })
- })
-
- describe("#store_data", function () {
-
- var fake_entry = {author: "Karlo Soriano", date: "2013-05-09", additions: 471}
- var fake_total = {}
- var fake_by_author = {}
-
- it("calls #store_commits", function () {
- spyOn(ContributorsStatGraphUtil, 'store_commits')
- ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author)
- expect(ContributorsStatGraphUtil.store_commits).toHaveBeenCalled()
- })
-
- it("calls #store_additions", function () {
- spyOn(ContributorsStatGraphUtil, 'store_additions')
- ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author)
- expect(ContributorsStatGraphUtil.store_additions).toHaveBeenCalled()
- })
-
- it("calls #store_deletions", function () {
- spyOn(ContributorsStatGraphUtil, 'store_deletions')
- ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author)
- expect(ContributorsStatGraphUtil.store_deletions).toHaveBeenCalled()
- })
-
- })
-
- // TODO: fix or remove
- //describe("#store_commits", function () {
- //var fake_total = "fake_total"
- //var fake_by_author = "fake_by_author"
-
- //it("calls #add twice with arguments fake_total and fake_by_author respectively", function () {
- //spyOn(ContributorsStatGraphUtil, 'add')
- //ContributorsStatGraphUtil.store_commits(fake_total, fake_by_author)
- //expect(ContributorsStatGraphUtil.add.argsForCall).toEqual([["fake_total", "commits", 1], ["fake_by_author", "commits", 1]])
- //})
- //})
-
- describe("#add", function () {
- it("adds 1 to current test_field in collection", function () {
- var fake_collection = {test_field: 10}
- ContributorsStatGraphUtil.add(fake_collection, "test_field", 1)
- expect(fake_collection.test_field).toEqual(11)
- })
-
- it("inits and adds 1 if test_field in collection is not defined", function () {
- var fake_collection = {}
- ContributorsStatGraphUtil.add(fake_collection, "test_field", 1)
- expect(fake_collection.test_field).toEqual(1)
- })
- })
-
- // TODO: fix or remove
- //describe("#store_additions", function () {
- //var fake_entry = {additions: 10}
- //var fake_total= "fake_total"
- //var fake_by_author = "fake_by_author"
- //it("calls #add twice with arguments fake_total and fake_by_author respectively", function () {
- //spyOn(ContributorsStatGraphUtil, 'add')
- //ContributorsStatGraphUtil.store_additions(fake_entry, fake_total, fake_by_author)
- //expect(ContributorsStatGraphUtil.add.argsForCall).toEqual([["fake_total", "additions", 10], ["fake_by_author", "additions", 10]])
- //})
- //})
-
- // TODO: fix or remove
- //describe("#store_deletions", function () {
- //var fake_entry = {deletions: 10}
- //var fake_total= "fake_total"
- //var fake_by_author = "fake_by_author"
- //it("calls #add twice with arguments fake_total and fake_by_author respectively", function () {
- //spyOn(ContributorsStatGraphUtil, 'add')
- //ContributorsStatGraphUtil.store_deletions(fake_entry, fake_total, fake_by_author)
- //expect(ContributorsStatGraphUtil.add.argsForCall).toEqual([["fake_total", "deletions", 10], ["fake_by_author", "deletions", 10]])
- //})
- //})
-
- describe("#add_date", function () {
- it("adds a date field to the collection", function () {
- var fake_date = "2013-10-02"
- var fake_collection = {}
- ContributorsStatGraphUtil.add_date(fake_date, fake_collection)
- expect(fake_collection[fake_date].date).toEqual("2013-10-02")
- })
- })
-
- describe("#add_author", function () {
- it("adds an author field to the collection", function () {
- var fake_author = { author_name: "Author", author_email: 'fake@email.com' }
- var fake_collection = {}
- ContributorsStatGraphUtil.add_author(fake_author, fake_collection)
- expect(fake_collection[fake_author.author_name].author_name).toEqual("Author")
- })
- })
-
- describe("#get_total_data", function () {
- it("returns the collection sorted via specified field", function () {
- var fake_parsed_log = {
- total: [{date: "2013-05-09", additions: 471, deletions: 0, commits: 1},
- {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}],
- by_author:[
- {
- author: "Karlo Soriano",
- "2013-05-09": {date: "2013-05-09", additions: 471, deletions: 0, commits: 1}
- },
- {
- author: "Dmitriy Zaporozhets",
- "2013-05-08": {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}
- }
- ]};
- var correct_total_data = [{date: "2013-05-08", commits: 3},
- {date: "2013-05-09", commits: 1}];
- expect(ContributorsStatGraphUtil.get_total_data(fake_parsed_log, "commits")).toEqual(correct_total_data)
- })
- })
-
- describe("#pick_field", function () {
- it("returns the collection with only the specified field and date", function () {
- var fake_parsed_log_total = [{date: "2013-05-09", additions: 471, deletions: 0, commits: 1},
- {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}];
- ContributorsStatGraphUtil.pick_field(fake_parsed_log_total, "commits")
- var correct_pick_field_data = [{date: "2013-05-09", commits: 1},{date: "2013-05-08", commits: 3}];
- expect(ContributorsStatGraphUtil.pick_field(fake_parsed_log_total, "commits")).toEqual(correct_pick_field_data)
- })
- })
-
- describe("#get_author_data", function () {
- it("returns the log by author sorted by specified field", function () {
- var fake_parsed_log = {
- total: [
- {date: "2013-05-09", additions: 471, deletions: 0, commits: 1},
- {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}
- ],
- by_author: [
- {
- author_name: "Karlo Soriano", author_email: "karlo@email.com",
- "2013-05-09": {date: "2013-05-09", additions: 471, deletions: 0, commits: 1}
- },
- {
- author_name: "Dmitriy Zaporozhets", author_email: "dzaporozhets@email.com",
- "2013-05-08": {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}
- }
- ]
- }
- var correct_author_data = [
- {author_name:"Dmitriy Zaporozhets",author_email:"dzaporozhets@email.com",dates:{"2013-05-08":3},deletions:7,additions:54,"commits":3},
- {author_name:"Karlo Soriano",author_email:"karlo@email.com",dates:{"2013-05-09":1},deletions:0,additions:471,commits:1}
- ]
- expect(ContributorsStatGraphUtil.get_author_data(fake_parsed_log, "commits")).toEqual(correct_author_data)
- })
- })
-
- describe("#parse_log_entry", function () {
- it("adds the corresponding info from the log entry to the author", function () {
- var fake_log_entry = { author_name: "Karlo Soriano", author_email: "karlo@email.com",
- "2013-05-09": {date: "2013-05-09", additions: 471, deletions: 0, commits: 1}
- }
- var correct_parsed_log = {author_name:"Karlo Soriano",author_email:"karlo@email.com",dates:{"2013-05-09":1},deletions:0,additions:471,commits:1}
- expect(ContributorsStatGraphUtil.parse_log_entry(fake_log_entry, 'commits', null)).toEqual(correct_parsed_log)
- })
- })
-
- describe("#in_range", function () {
- var date = "2013-05-09"
- it("returns true if date_range is null", function () {
- expect(ContributorsStatGraphUtil.in_range(date, null)).toEqual(true)
- })
- it("returns true if date is in range", function () {
- var date_range = [new Date("2013-01-01"), new Date("2013-12-12")]
- expect(ContributorsStatGraphUtil.in_range(date, date_range)).toEqual(true)
- })
- it("returns false if date is not in range", function () {
- var date_range = [new Date("1999-12-01"), new Date("2000-12-01")]
- expect(ContributorsStatGraphUtil.in_range(date, date_range)).toEqual(false)
- })
- })
-
-
-})
diff --git a/spec/javascripts/stat_graph_spec.js b/spec/javascripts/stat_graph_spec.js
deleted file mode 100644
index b589af34610..00000000000
--- a/spec/javascripts/stat_graph_spec.js
+++ /dev/null
@@ -1,17 +0,0 @@
-describe("StatGraph", function () {
-
- describe("#get_log", function () {
- it("returns log", function () {
- StatGraph.log = "test";
- expect(StatGraph.get_log()).toBe("test");
- });
- });
-
- describe("#set_log", function () {
- it("sets the log", function () {
- StatGraph.set_log("test");
- expect(StatGraph.log).toBe("test");
- })
- })
-
-});
diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml
deleted file mode 100644
index 9bfa261a356..00000000000
--- a/spec/javascripts/support/jasmine.yml
+++ /dev/null
@@ -1,76 +0,0 @@
-# src_files
-#
-# Return an array of filepaths relative to src_dir to include before jasmine specs.
-# Default: []
-#
-# EXAMPLE:
-#
-# src_files:
-# - lib/source1.js
-# - lib/source2.js
-# - dist/**/*.js
-#
-src_files:
- - assets/application.js
-
-# stylesheets
-#
-# Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
-# Default: []
-#
-# EXAMPLE:
-#
-# stylesheets:
-# - css/style.css
-# - stylesheets/*.css
-#
-stylesheets:
- - stylesheets/**/*.css
-
-# helpers
-#
-# Return an array of filepaths relative to spec_dir to include before jasmine specs.
-# Default: ["helpers/**/*.js"]
-#
-# EXAMPLE:
-#
-# helpers:
-# - helpers/**/*.js
-#
-helpers:
- - helpers/**/*.js
-
-# spec_files
-#
-# Return an array of filepaths relative to spec_dir to include.
-# Default: ["**/*[sS]pec.js"]
-#
-# EXAMPLE:
-#
-# spec_files:
-# - **/*[sS]pec.js
-#
-spec_files:
- - '**/*[sS]pec.js'
-
-# src_dir
-#
-# Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
-# Default: project root
-#
-# EXAMPLE:
-#
-# src_dir: public
-#
-src_dir:
-
-# spec_dir
-#
-# Spec directory path. Your spec_files must be returned relative to this path.
-# Default: spec/javascripts
-#
-# EXAMPLE:
-#
-# spec_dir: spec/javascripts
-#
-spec_dir: spec/javascripts
diff --git a/spec/javascripts/support/jasmine_helper.rb b/spec/javascripts/support/jasmine_helper.rb
deleted file mode 100644
index b4919802afe..00000000000
--- a/spec/javascripts/support/jasmine_helper.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-#Use this file to set/override Jasmine configuration options
-#You can remove it if you don't need it.
-#This file is loaded *after* jasmine.yml is interpreted.
-#
-#Example: using a different boot file.
-#Jasmine.configure do |config|
-# config.boot_dir = '/absolute/path/to/boot_dir'
-# config.boot_files = lambda { ['/absolute/path/to/boot_dir/file.js'] }
-#end
-#
-
diff --git a/spec/lib/disable_email_interceptor_spec.rb b/spec/lib/disable_email_interceptor_spec.rb
deleted file mode 100644
index 06d5450688b..00000000000
--- a/spec/lib/disable_email_interceptor_spec.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-require 'spec_helper'
-
-describe DisableEmailInterceptor do
- before do
- ActionMailer::Base.register_interceptor(DisableEmailInterceptor)
- end
-
- it 'should not send emails' do
- allow(Gitlab.config.gitlab).to receive(:email_enabled).and_return(false)
- expect {
- deliver_mail
- }.not_to change(ActionMailer::Base.deliveries, :count)
- end
-
- after do
- # Removing interceptor from the list because unregister_interceptor is
- # implemented in later version of mail gem
- # See: https://github.com/mikel/mail/pull/705
- Mail.class_variable_set(:@@delivery_interceptors, [])
- end
-
- def deliver_mail
- key = create :personal_key
- Notify.new_ssh_key_email(key.id)
- end
-end
diff --git a/spec/lib/extracts_path_spec.rb b/spec/lib/extracts_path_spec.rb
deleted file mode 100644
index ac602eac154..00000000000
--- a/spec/lib/extracts_path_spec.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-require 'spec_helper'
-
-describe ExtractsPath do
- include ExtractsPath
-
- let(:project) { double('project') }
-
- before do
- @project = project
- project.stub(repository: double(ref_names: ['master', 'foo/bar/baz', 'v1.0.0', 'v2.0.0']))
- project.stub(path_with_namespace: 'gitlab/gitlab-ci')
- end
-
- describe '#extract_ref' do
- it "returns an empty pair when no @project is set" do
- @project = nil
- expect(extract_ref('master/CHANGELOG')).to eq(['', ''])
- end
-
- context "without a path" do
- it "extracts a valid branch" do
- expect(extract_ref('master')).to eq(['master', ''])
- end
-
- it "extracts a valid tag" do
- expect(extract_ref('v2.0.0')).to eq(['v2.0.0', ''])
- end
-
- it "extracts a valid commit ref without a path" do
- expect(extract_ref('f4b14494ef6abf3d144c28e4af0c20143383e062')).to eq(
- ['f4b14494ef6abf3d144c28e4af0c20143383e062', '']
- )
- end
-
- it "falls back to a primitive split for an invalid ref" do
- expect(extract_ref('stable')).to eq(['stable', ''])
- end
- end
-
- context "with a path" do
- it "extracts a valid branch" do
- expect(extract_ref('foo/bar/baz/CHANGELOG')).to eq(['foo/bar/baz', 'CHANGELOG'])
- end
-
- it "extracts a valid tag" do
- expect(extract_ref('v2.0.0/CHANGELOG')).to eq(['v2.0.0', 'CHANGELOG'])
- end
-
- it "extracts a valid commit SHA" do
- expect(extract_ref('f4b14494ef6abf3d144c28e4af0c20143383e062/CHANGELOG')).to eq(
- ['f4b14494ef6abf3d144c28e4af0c20143383e062', 'CHANGELOG']
- )
- end
-
- it "falls back to a primitive split for an invalid ref" do
- expect(extract_ref('stable/CHANGELOG')).to eq(['stable', 'CHANGELOG'])
- end
- end
- end
-end
diff --git a/spec/lib/file_size_validator_spec.rb b/spec/lib/file_size_validator_spec.rb
deleted file mode 100644
index 5c89c854714..00000000000
--- a/spec/lib/file_size_validator_spec.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-require 'spec_helper'
-
-describe 'Gitlab::FileSizeValidatorSpec' do
- let(:validator) { FileSizeValidator.new(options) }
- let(:attachment) { AttachmentUploader.new }
- let(:note) { create(:note) }
-
- describe 'options uses an integer' do
- let(:options) { { maximum: 10, attributes: { attachment: attachment } } }
-
- it 'attachment exceeds maximum limit' do
- allow(attachment).to receive(:size) { 100 }
- validator.validate_each(note, :attachment, attachment)
- expect(note.errors).to have_key(:attachment)
- end
-
- it 'attachment under maximum limit' do
- allow(attachment).to receive(:size) { 1 }
- validator.validate_each(note, :attachment, attachment)
- expect(note.errors).not_to have_key(:attachment)
- end
- end
-
- describe 'options uses a symbol' do
- let(:options) { { maximum: :test,
- attributes: { attachment: attachment } } }
- before do
- allow(note).to receive(:test) { 10 }
- end
-
- it 'attachment exceeds maximum limit' do
- allow(attachment).to receive(:size) { 100 }
- validator.validate_each(note, :attachment, attachment)
- expect(note.errors).to have_key(:attachment)
- end
-
- it 'attachment under maximum limit' do
- allow(attachment).to receive(:size) { 1 }
- validator.validate_each(note, :attachment, attachment)
- expect(note.errors).not_to have_key(:attachment)
- end
- end
-end
diff --git a/spec/lib/git_ref_validator_spec.rb b/spec/lib/git_ref_validator_spec.rb
deleted file mode 100644
index 4633b6f3934..00000000000
--- a/spec/lib/git_ref_validator_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GitRefValidator do
- it { expect(Gitlab::GitRefValidator.validate('feature/new')).to be_truthy }
- it { expect(Gitlab::GitRefValidator.validate('implement_@all')).to be_truthy }
- it { expect(Gitlab::GitRefValidator.validate('my_new_feature')).to be_truthy }
- it { expect(Gitlab::GitRefValidator.validate('#1')).to be_truthy }
- it { expect(Gitlab::GitRefValidator.validate('feature/~new/')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature/^new/')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature/:new/')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature/?new/')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature/*new/')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature/[new/')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature/new/')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature/new.')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature\@{')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature\new')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature//new')).to be_falsey }
- it { expect(Gitlab::GitRefValidator.validate('feature new')).to be_falsey }
-end
diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb
deleted file mode 100644
index 95fc7e16a11..00000000000
--- a/spec/lib/gitlab/auth_spec.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Auth do
- let(:gl_auth) { Gitlab::Auth.new }
-
- describe :find do
- let!(:user) do
- create(:user,
- username: username,
- password: password,
- password_confirmation: password)
- end
- let(:username) { 'John' } # username isn't lowercase, test this
- let(:password) { 'my-secret' }
-
- it "should find user by valid login/password" do
- expect( gl_auth.find(username, password) ).to eql user
- end
-
- it 'should find user by valid email/password with case-insensitive email' do
- expect(gl_auth.find(user.email.upcase, password)).to eql user
- end
-
- it 'should find user by valid username/password with case-insensitive username' do
- expect(gl_auth.find(username.upcase, password)).to eql user
- end
-
- it "should not find user with invalid password" do
- password = 'wrong'
- expect( gl_auth.find(username, password) ).to_not eql user
- end
-
- it "should not find user with invalid login" do
- user = 'wrong'
- expect( gl_auth.find(username, password) ).to_not eql user
- end
-
- context "with ldap enabled" do
- before { Gitlab::LDAP::Config.stub(enabled?: true) }
-
- it "tries to autheticate with db before ldap" do
- expect(Gitlab::LDAP::Authentication).not_to receive(:login)
-
- gl_auth.find(username, password)
- end
-
- it "uses ldap as fallback to for authentication" do
- expect(Gitlab::LDAP::Authentication).to receive(:login)
-
- gl_auth.find('ldap_user', 'password')
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/backend/grack_auth_spec.rb b/spec/lib/gitlab/backend/grack_auth_spec.rb
deleted file mode 100644
index d0aad54f677..00000000000
--- a/spec/lib/gitlab/backend/grack_auth_spec.rb
+++ /dev/null
@@ -1,196 +0,0 @@
-require "spec_helper"
-
-describe Grack::Auth do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
-
- let(:app) { lambda { |env| [200, {}, "Success!"] } }
- let!(:auth) { Grack::Auth.new(app) }
- let(:env) {
- {
- "rack.input" => "",
- "REQUEST_METHOD" => "GET",
- "QUERY_STRING" => "service=git-upload-pack"
- }
- }
- let(:status) { auth.call(env).first }
-
- describe "#call" do
- context "when the project doesn't exist" do
- before do
- env["PATH_INFO"] = "doesnt/exist.git"
- end
-
- context "when no authentication is provided" do
- it "responds with status 401" do
- expect(status).to eq(401)
- end
- end
-
- context "when username and password are provided" do
- context "when authentication fails" do
- before do
- env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, "nope")
- end
-
- it "responds with status 401" do
- expect(status).to eq(401)
- end
- end
-
- context "when authentication succeeds" do
- before do
- env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, user.password)
- end
-
- it "responds with status 404" do
- expect(status).to eq(404)
- end
- end
- end
- end
-
- context "when the project exists" do
- before do
- env["PATH_INFO"] = project.path_with_namespace + ".git"
- end
-
- context "when the project is public" do
- before do
- project.update_attribute(:visibility_level, Project::PUBLIC)
- end
-
- it "responds with status 200" do
- expect(status).to eq(200)
- end
- end
-
- context "when the project is private" do
- before do
- project.update_attribute(:visibility_level, Project::PRIVATE)
- end
-
- context "when no authentication is provided" do
- it "responds with status 401" do
- expect(status).to eq(401)
- end
- end
-
- context "when username and password are provided" do
- context "when authentication fails" do
- before do
- env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, "nope")
- end
-
- it "responds with status 401" do
- expect(status).to eq(401)
- end
-
- context "when the user is IP banned" do
- before do
- expect(Rack::Attack::Allow2Ban).to receive(:filter).and_return(true)
- allow_any_instance_of(Rack::Request).to receive(:ip).and_return('1.2.3.4')
- end
-
- it "responds with status 401" do
- expect(status).to eq(401)
- end
- end
- end
-
- context "when authentication succeeds" do
- before do
- env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, user.password)
- 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 "responds with status 404" do
- expect(status).to eq(404)
- end
- end
-
- context "when the user isn't blocked" do
- before do
- expect(Rack::Attack::Allow2Ban).to receive(:reset)
- end
-
- it "responds with status 200" do
- expect(status).to eq(200)
- end
- end
-
- context "when blank password attempts follow a valid login" do
- let(:options) { Gitlab.config.rack_attack.git_basic_auth }
- let(:maxretry) { options[:maxretry] - 1 }
- let(:ip) { '1.2.3.4' }
-
- before do
- allow_any_instance_of(Rack::Request).to receive(:ip).and_return(ip)
- Rack::Attack::Allow2Ban.reset(ip, options)
- end
-
- after do
- Rack::Attack::Allow2Ban.reset(ip, options)
- end
-
- def attempt_login(include_password)
- password = include_password ? user.password : ""
- env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, password)
- Grack::Auth.new(app)
- auth.call(env).first
- end
-
- it "repeated attempts followed by successful attempt" do
- for n in 0..maxretry do
- expect(attempt_login(false)).to eq(401)
- end
-
- expect(attempt_login(true)).to eq(200)
- expect(Rack::Attack::Allow2Ban.send(:banned?, ip)).to eq(nil)
-
- for n in 0..maxretry do
- expect(attempt_login(false)).to eq(401)
- end
- end
- end
- end
-
- context "when the user doesn't have access to the project" do
- it "responds with status 404" do
- expect(status).to eq(404)
- end
- end
- end
- end
-
- context "when a gitlab ci token is provided" do
- let(:token) { "123" }
-
- before do
- gitlab_ci_service = project.build_gitlab_ci_service
- gitlab_ci_service.active = true
- gitlab_ci_service.token = token
- gitlab_ci_service.project_url = "http://google.com"
- gitlab_ci_service.save
-
- env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials("gitlab-ci-token", token)
- end
-
- it "responds with status 200" do
- expect(status).to eq(200)
- end
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/backend/rack_attack_helpers_spec.rb b/spec/lib/gitlab/backend/rack_attack_helpers_spec.rb
deleted file mode 100644
index 2ac496fd669..00000000000
--- a/spec/lib/gitlab/backend/rack_attack_helpers_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-require "spec_helper"
-
-describe 'RackAttackHelpers' do
- describe 'reset' do
- let(:discriminator) { 'test-key'}
- let(:maxretry) { 5 }
- let(:period) { 1.minute }
- let(:options) { { findtime: period, bantime: 60, maxretry: maxretry } }
-
- def do_filter
- for i in 1..maxretry - 1 do
- status = Rack::Attack::Allow2Ban.filter(discriminator, options) { true }
- expect(status).to eq(false)
- end
- end
-
- def do_reset
- Rack::Attack::Allow2Ban.reset(discriminator, options)
- end
-
- before do
- do_reset
- end
-
- after do
- do_reset
- end
-
- it 'user is not banned after n - 1 retries' do
- do_filter
- do_reset
- do_filter
- end
- end
-end
diff --git a/spec/lib/gitlab/backend/shell_spec.rb b/spec/lib/gitlab/backend/shell_spec.rb
deleted file mode 100644
index 27279465c1a..00000000000
--- a/spec/lib/gitlab/backend/shell_spec.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Shell do
- let(:project) { double('Project', id: 7, path: 'diaspora') }
- let(:gitlab_shell) { Gitlab::Shell.new }
-
- before do
- Project.stub(find: project)
- end
-
- it { is_expected.to respond_to :add_key }
- it { is_expected.to respond_to :remove_key }
- it { is_expected.to respond_to :add_repository }
- it { is_expected.to respond_to :remove_repository }
- it { is_expected.to respond_to :fork_repository }
-
- it { expect(gitlab_shell.url_to_repo('diaspora')).to eq(Gitlab.config.gitlab_shell.ssh_path_prefix + "diaspora.git") }
-end
diff --git a/spec/lib/gitlab/bitbucket_import/client_spec.rb b/spec/lib/gitlab/bitbucket_import/client_spec.rb
deleted file mode 100644
index dd450e9967b..00000000000
--- a/spec/lib/gitlab/bitbucket_import/client_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::BitbucketImport::Client do
- let(:token) { '123456' }
- let(:secret) { 'secret' }
- let(:client) { Gitlab::BitbucketImport::Client.new(token, secret) }
-
- before do
- Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "bitbucket")
- end
-
- it 'all OAuth client options are symbols' do
- client.consumer.options.keys.each do |key|
- expect(key).to be_kind_of(Symbol)
- end
- end
-end
diff --git a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb b/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb
deleted file mode 100644
index 0ec6a43f681..00000000000
--- a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::BitbucketImport::ProjectCreator do
- let(:user) { create(:user, bitbucket_access_token: "asdffg", bitbucket_access_token_secret: "sekret") }
- let(:repo) { {
- name: 'Vim',
- slug: 'vim',
- is_private: true,
- owner: "asd"}.with_indifferent_access
- }
- let(:namespace){ create(:group, owner: user) }
-
- before do
- namespace.add_owner(user)
- end
-
- it 'creates project' do
- allow_any_instance_of(Project).to receive(:add_import_job)
-
- project_creator = Gitlab::BitbucketImport::ProjectCreator.new(repo, namespace, user)
- project = project_creator.execute
-
- expect(project.import_url).to eq("ssh://git@bitbucket.org/asd/vim.git")
- expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
-end
diff --git a/spec/lib/gitlab/closing_issue_extractor_spec.rb b/spec/lib/gitlab/closing_issue_extractor_spec.rb
deleted file mode 100644
index cb7b0fbb890..00000000000
--- a/spec/lib/gitlab/closing_issue_extractor_spec.rb
+++ /dev/null
@@ -1,176 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::ClosingIssueExtractor do
- let(:project) { create(:project) }
- let(:issue) { create(:issue, project: project) }
- let(:iid1) { issue.iid }
-
- subject { described_class.new(project, project.creator) }
-
- describe "#closed_by_message" do
- context 'with a single reference' do
- it do
- message = "Awesome commit (Closes ##{iid1})"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Awesome commit (closes ##{iid1})"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Closed ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "closed ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Closing ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "closing ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Close ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "close ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Awesome commit (Fixes ##{iid1})"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Awesome commit (fixes ##{iid1})"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Fixed ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "fixed ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Fixing ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "fixing ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Fix ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "fix ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Awesome commit (Resolves ##{iid1})"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Awesome commit (resolves ##{iid1})"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Resolved ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "resolved ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Resolving ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "resolving ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "Resolve ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
-
- it do
- message = "resolve ##{iid1}"
- expect(subject.closed_by_message(message)).to eq([issue])
- end
- end
-
- context 'with multiple references' do
- let(:other_issue) { create(:issue, project: project) }
- let(:third_issue) { create(:issue, project: project) }
- let(:iid2) { other_issue.iid }
- let(:iid3) { third_issue.iid }
-
- it 'fetches issues in single line message' do
- message = "Closes ##{iid1} and fix ##{iid2}"
-
- expect(subject.closed_by_message(message)).
- to eq([issue, other_issue])
- end
-
- it 'fetches comma-separated issues references in single line message' do
- message = "Closes ##{iid1}, closes ##{iid2}"
-
- expect(subject.closed_by_message(message)).
- to eq([issue, other_issue])
- end
-
- it 'fetches comma-separated issues numbers in single line message' do
- message = "Closes ##{iid1}, ##{iid2} and ##{iid3}"
-
- expect(subject.closed_by_message(message)).
- to eq([issue, other_issue, third_issue])
- end
-
- it 'fetches issues in multi-line message' do
- message = "Awesome commit (closes ##{iid1})\nAlso fixes ##{iid2}"
-
- expect(subject.closed_by_message(message)).
- to eq([issue, other_issue])
- end
-
- it 'fetches issues in hybrid message' do
- message = "Awesome commit (closes ##{iid1})\n"\
- "Also fixing issues ##{iid2}, ##{iid3} and #4"
-
- expect(subject.closed_by_message(message)).
- to eq([issue, other_issue, third_issue])
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb
deleted file mode 100644
index 40eb45e37ca..00000000000
--- a/spec/lib/gitlab/diff/file_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Diff::File do
- include RepoHelpers
-
- let(:project) { create(:project) }
- let(:commit) { project.repository.commit(sample_commit.id) }
- let(:diff) { commit.diffs.first }
- let(:diff_file) { Gitlab::Diff::File.new(diff) }
-
- describe :diff_lines do
- let(:diff_lines) { diff_file.diff_lines }
-
- it { expect(diff_lines.size).to eq(30) }
- it { expect(diff_lines.first).to be_kind_of(Gitlab::Diff::Line) }
- end
-
- describe :mode_changed? do
- it { expect(diff_file.mode_changed?).to be_falsey }
- end
-end
diff --git a/spec/lib/gitlab/diff/parser_spec.rb b/spec/lib/gitlab/diff/parser_spec.rb
deleted file mode 100644
index 918f6d0ead4..00000000000
--- a/spec/lib/gitlab/diff/parser_spec.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Diff::Parser do
- include RepoHelpers
-
- let(:project) { create(:project) }
- let(:commit) { project.repository.commit(sample_commit.id) }
- let(:diff) { commit.diffs.first }
- let(:parser) { Gitlab::Diff::Parser.new }
-
- describe :parse do
- let(:diff) do
- <<eos
---- a/files/ruby/popen.rb
-+++ b/files/ruby/popen.rb
-@@ -6,12 +6,18 @@ module Popen
-
- def popen(cmd, path=nil)
- unless cmd.is_a?(Array)
-- raise "System commands must be given as an array of strings"
-+ raise RuntimeError, "System commands must be given as an array of strings"
- end
-
- path ||= Dir.pwd
-- vars = { "PWD" => path }
-- options = { chdir: path }
-+
-+ vars = {
-+ "PWD" => path
-+ }
-+
-+ options = {
-+ chdir: path
-+ }
-
- unless File.directory?(path)
- FileUtils.mkdir_p(path)
-@@ -19,6 +25,7 @@ module Popen
-
- @cmd_output = ""
- @cmd_status = 0
-+
- Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|
- @cmd_output << stdout.read
- @cmd_output << stderr.read
-eos
- end
-
- before do
- @lines = parser.parse(diff.lines)
- end
-
- it { expect(@lines.size).to eq(30) }
-
- describe 'lines' do
- describe 'first line' do
- let(:line) { @lines.first }
-
- it { expect(line.type).to eq('match') }
- it { expect(line.old_pos).to eq(6) }
- it { expect(line.new_pos).to eq(6) }
- it { expect(line.text).to eq('@@ -6,12 +6,18 @@ module Popen') }
- end
-
- describe 'removal line' do
- let(:line) { @lines[10] }
-
- it { expect(line.type).to eq('old') }
- it { expect(line.old_pos).to eq(14) }
- it { expect(line.new_pos).to eq(13) }
- it { expect(line.text).to eq('- options = { chdir: path }') }
- end
-
- describe 'addition line' do
- let(:line) { @lines[16] }
-
- it { expect(line.type).to eq('new') }
- it { expect(line.old_pos).to eq(15) }
- it { expect(line.new_pos).to eq(18) }
- it { expect(line.text).to eq('+ options = {') }
- end
-
- describe 'unchanged line' do
- let(:line) { @lines.last }
-
- it { expect(line.type).to eq(nil) }
- it { expect(line.old_pos).to eq(24) }
- it { expect(line.new_pos).to eq(31) }
- it { expect(line.text).to eq(' @cmd_output &lt;&lt; stderr.read') }
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb
deleted file mode 100644
index 39be9d64644..00000000000
--- a/spec/lib/gitlab/git_access_spec.rb
+++ /dev/null
@@ -1,235 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GitAccess do
- let(:access) { Gitlab::GitAccess.new(actor, project) }
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- let(:actor) { user }
-
- describe 'can_push_to_branch?' do
- describe 'push to none protected branch' do
- it "returns true if user is a master" do
- project.team << [user, :master]
- expect(access.can_push_to_branch?("random_branch")).to be_truthy
- end
-
- it "returns true if user is a developer" do
- project.team << [user, :developer]
- expect(access.can_push_to_branch?("random_branch")).to be_truthy
- end
-
- it "returns false if user is a reporter" do
- project.team << [user, :reporter]
- expect(access.can_push_to_branch?("random_branch")).to be_falsey
- end
- end
-
- describe 'push to protected branch' do
- before do
- @branch = create :protected_branch, project: project
- end
-
- it "returns true if user is a master" do
- project.team << [user, :master]
- expect(access.can_push_to_branch?(@branch.name)).to be_truthy
- end
-
- it "returns false if user is a developer" do
- project.team << [user, :developer]
- expect(access.can_push_to_branch?(@branch.name)).to be_falsey
- end
-
- it "returns false if user is a reporter" do
- project.team << [user, :reporter]
- expect(access.can_push_to_branch?(@branch.name)).to be_falsey
- end
- end
-
- describe 'push to protected branch if allowed for developers' do
- before do
- @branch = create :protected_branch, project: project, developers_can_push: true
- end
-
- it "returns true if user is a master" do
- project.team << [user, :master]
- expect(access.can_push_to_branch?(@branch.name)).to be_truthy
- end
-
- it "returns true if user is a developer" do
- project.team << [user, :developer]
- expect(access.can_push_to_branch?(@branch.name)).to be_truthy
- end
-
- it "returns false if user is a reporter" do
- project.team << [user, :reporter]
- expect(access.can_push_to_branch?(@branch.name)).to be_falsey
- end
- end
-
- end
-
- describe 'download_access_check' do
- describe 'master permissions' do
- before { project.team << [user, :master] }
-
- context 'pull code' do
- subject { access.download_access_check }
-
- it { expect(subject.allowed?).to be_truthy }
- end
- end
-
- describe 'guest permissions' do
- before { project.team << [user, :guest] }
-
- context 'pull code' do
- subject { access.download_access_check }
-
- it { expect(subject.allowed?).to be_falsey }
- end
- end
-
- describe 'blocked user' do
- before do
- project.team << [user, :master]
- user.block
- end
-
- context 'pull code' do
- subject { access.download_access_check }
-
- it { expect(subject.allowed?).to be_falsey }
- end
- end
-
- describe 'without acccess to project' do
- context 'pull code' do
- subject { access.download_access_check }
-
- it { expect(subject.allowed?).to be_falsey }
- end
- end
-
- describe 'deploy key permissions' do
- let(:key) { create(:deploy_key) }
- let(:actor) { key }
-
- context 'pull code' do
- context 'allowed' do
- before { key.projects << project }
- subject { access.download_access_check }
-
- it { expect(subject.allowed?).to be_truthy }
- end
-
- context 'denied' do
- subject { access.download_access_check }
-
- it { expect(subject.allowed?).to be_falsey }
- end
- end
- end
- end
-
- describe 'push_access_check' do
- def protect_feature_branch
- create(:protected_branch, name: 'feature', project: project)
- end
-
- def changes
- {
- push_new_branch: "#{Gitlab::Git::BLANK_SHA} 570e7b2ab refs/heads/wow",
- push_master: '6f6d7e7ed 570e7b2ab refs/heads/master',
- push_protected_branch: '6f6d7e7ed 570e7b2ab refs/heads/feature',
- push_remove_protected_branch: "570e7b2ab #{Gitlab::Git::BLANK_SHA} "\
- 'refs/heads/feature',
- push_tag: '6f6d7e7ed 570e7b2ab refs/tags/v1.0.0',
- push_new_tag: "#{Gitlab::Git::BLANK_SHA} 570e7b2ab refs/tags/v7.8.9",
- push_all: ['6f6d7e7ed 570e7b2ab refs/heads/master', '6f6d7e7ed 570e7b2ab refs/heads/feature']
- }
- end
-
- def self.permissions_matrix
- {
- master: {
- push_new_branch: true,
- push_master: true,
- push_protected_branch: true,
- push_remove_protected_branch: false,
- push_tag: true,
- push_new_tag: true,
- push_all: true,
- },
-
- developer: {
- push_new_branch: true,
- push_master: true,
- push_protected_branch: false,
- push_remove_protected_branch: false,
- push_tag: false,
- push_new_tag: true,
- push_all: false,
- },
-
- reporter: {
- push_new_branch: false,
- push_master: false,
- push_protected_branch: false,
- push_remove_protected_branch: false,
- push_tag: false,
- push_new_tag: false,
- push_all: false,
- },
-
- guest: {
- push_new_branch: false,
- push_master: false,
- push_protected_branch: false,
- push_remove_protected_branch: false,
- push_tag: false,
- push_new_tag: false,
- push_all: false,
- }
- }
- end
-
- def self.updated_permissions_matrix
- updated_permissions_matrix = permissions_matrix.dup
- updated_permissions_matrix[:developer][:push_protected_branch] = true
- updated_permissions_matrix[:developer][:push_all] = true
- updated_permissions_matrix
- end
-
- permissions_matrix.keys.each do |role|
- describe "#{role} access" do
- before { protect_feature_branch }
- before { project.team << [user, role] }
-
- permissions_matrix[role].each do |action, allowed|
- context action do
- subject { access.push_access_check(changes[action]) }
-
- it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey }
- end
- end
- end
- end
-
- context "with enabled developers push to protected branches " do
- updated_permissions_matrix.keys.each do |role|
- describe "#{role} access" do
- before { create(:protected_branch, name: 'feature', developers_can_push: true, project: project) }
- before { project.team << [user, role] }
-
- updated_permissions_matrix[role].each do |action, allowed|
- context action do
- subject { access.push_access_check(changes[action]) }
-
- it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey }
- end
- end
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/git_access_wiki_spec.rb b/spec/lib/gitlab/git_access_wiki_spec.rb
deleted file mode 100644
index 4cb91094cb3..00000000000
--- a/spec/lib/gitlab/git_access_wiki_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GitAccessWiki do
- let(:access) { Gitlab::GitAccessWiki.new(user, project) }
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- describe 'push_allowed?' do
- before do
- create(:protected_branch, name: 'master', project: project)
- project.team << [user, :developer]
- end
-
- subject { access.push_access_check(changes) }
-
- it { expect(subject.allowed?).to be_truthy }
- end
-
- def changes
- ['6f6d7e7ed 570e7b2ab refs/heads/master']
- end
-end
diff --git a/spec/lib/gitlab/github_import/client_spec.rb b/spec/lib/gitlab/github_import/client_spec.rb
deleted file mode 100644
index 26618120316..00000000000
--- a/spec/lib/gitlab/github_import/client_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GithubImport::Client do
- let(:token) { '123456' }
- let(:client) { Gitlab::GithubImport::Client.new(token) }
-
- before do
- Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "github")
- end
-
- it 'all OAuth2 client options are symbols' do
- client.client.options.keys.each do |key|
- expect(key).to be_kind_of(Symbol)
- end
- end
-end
diff --git a/spec/lib/gitlab/github_import/project_creator_spec.rb b/spec/lib/gitlab/github_import/project_creator_spec.rb
deleted file mode 100644
index 3bf52cb685e..00000000000
--- a/spec/lib/gitlab/github_import/project_creator_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GithubImport::ProjectCreator do
- let(:user) { create(:user, github_access_token: "asdffg") }
- let(:repo) { OpenStruct.new(
- login: 'vim',
- name: 'vim',
- private: true,
- full_name: 'asd/vim',
- clone_url: "https://gitlab.com/asd/vim.git",
- owner: OpenStruct.new(login: "john"))
- }
- let(:namespace){ create(:group, owner: user) }
-
- before do
- namespace.add_owner(user)
- end
-
- it 'creates project' do
- allow_any_instance_of(Project).to receive(:add_import_job)
-
- project_creator = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, user)
- project = project_creator.execute
-
- expect(project.import_url).to eq("https://asdffg@gitlab.com/asd/vim.git")
- expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
-end
diff --git a/spec/lib/gitlab/gitlab_import/client_spec.rb b/spec/lib/gitlab/gitlab_import/client_spec.rb
deleted file mode 100644
index c511c515474..00000000000
--- a/spec/lib/gitlab/gitlab_import/client_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GitlabImport::Client do
- let(:token) { '123456' }
- let(:client) { Gitlab::GitlabImport::Client.new(token) }
-
- before do
- Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "gitlab")
- end
-
- it 'all OAuth2 client options are symbols' do
- client.client.options.keys.each do |key|
- expect(key).to be_kind_of(Symbol)
- end
- end
-end
diff --git a/spec/lib/gitlab/gitlab_import/project_creator_spec.rb b/spec/lib/gitlab/gitlab_import/project_creator_spec.rb
deleted file mode 100644
index 3cefe4ea8e2..00000000000
--- a/spec/lib/gitlab/gitlab_import/project_creator_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GitlabImport::ProjectCreator do
- let(:user) { create(:user, gitlab_access_token: "asdffg") }
- let(:repo) { {
- name: 'vim',
- path: 'vim',
- visibility_level: Gitlab::VisibilityLevel::PRIVATE,
- path_with_namespace: 'asd/vim',
- http_url_to_repo: "https://gitlab.com/asd/vim.git",
- owner: {name: "john"}}.with_indifferent_access
- }
- let(:namespace){ create(:group, owner: user) }
-
- before do
- namespace.add_owner(user)
- end
-
- it 'creates project' do
- allow_any_instance_of(Project).to receive(:add_import_job)
-
- project_creator = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, user)
- project = project_creator.execute
-
- expect(project.import_url).to eq("https://oauth2:asdffg@gitlab.com/asd/vim.git")
- expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
-end
diff --git a/spec/lib/gitlab/gitlab_markdown_helper_spec.rb b/spec/lib/gitlab/gitlab_markdown_helper_spec.rb
deleted file mode 100644
index ab613193f41..00000000000
--- a/spec/lib/gitlab/gitlab_markdown_helper_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::MarkdownHelper do
- describe '#markup?' do
- %w(textile rdoc org creole wiki
- mediawiki rst adoc asciidoc asc).each do |type|
- it "returns true for #{type} files" do
- expect(Gitlab::MarkdownHelper.markup?("README.#{type}")).to be_truthy
- end
- end
-
- it 'returns false when given a non-markup filename' do
- expect(Gitlab::MarkdownHelper.markup?('README.rb')).not_to be_truthy
- end
- end
-
- describe '#gitlab_markdown?' do
- %w(mdown md markdown).each do |type|
- it "returns true for #{type} files" do
- expect(Gitlab::MarkdownHelper.gitlab_markdown?("README.#{type}")).to be_truthy
- end
- end
-
- it 'returns false when given a non-markdown filename' do
- expect(Gitlab::MarkdownHelper.gitlab_markdown?('README.rb')).not_to be_truthy
- end
- end
-end
diff --git a/spec/lib/gitlab/gitorious_import/project_creator_spec.rb b/spec/lib/gitlab/gitorious_import/project_creator_spec.rb
deleted file mode 100644
index c1125ca6357..00000000000
--- a/spec/lib/gitlab/gitorious_import/project_creator_spec.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GitoriousImport::ProjectCreator do
- let(:user) { create(:user) }
- let(:repo) { Gitlab::GitoriousImport::Repository.new('foo/bar-baz-qux') }
- let(:namespace){ create(:group, owner: user) }
-
- before do
- namespace.add_owner(user)
- end
-
- it 'creates project' do
- allow_any_instance_of(Project).to receive(:add_import_job)
-
- project_creator = Gitlab::GitoriousImport::ProjectCreator.new(repo, namespace, user)
- project = project_creator.execute
-
- expect(project.name).to eq("Bar Baz Qux")
- expect(project.path).to eq("bar-baz-qux")
- expect(project.namespace).to eq(namespace)
- expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC)
- expect(project.import_type).to eq("gitorious")
- expect(project.import_source).to eq("foo/bar-baz-qux")
- expect(project.import_url).to eq("https://gitorious.org/foo/bar-baz-qux.git")
- end
-end
diff --git a/spec/lib/gitlab/google_code_import/client_spec.rb b/spec/lib/gitlab/google_code_import/client_spec.rb
deleted file mode 100644
index d2bf871daa8..00000000000
--- a/spec/lib/gitlab/google_code_import/client_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-require "spec_helper"
-
-describe Gitlab::GoogleCodeImport::Client do
- let(:raw_data) { JSON.parse(File.read(Rails.root.join("spec/fixtures/GoogleCodeProjectHosting.json"))) }
- subject { described_class.new(raw_data) }
-
- describe "#valid?" do
- context "when the data is valid" do
- it "returns true" do
- expect(subject).to be_valid
- end
- end
-
- context "when the data is invalid" do
- let(:raw_data) { "No clue" }
-
- it "returns true" do
- expect(subject).to_not be_valid
- end
- end
- end
-
- describe "#repos" do
- it "returns only Git repositories" do
- expect(subject.repos.length).to eq(1)
- end
- end
-
- describe "#repo" do
- it "returns the referenced repository" do
- expect(subject.repo("tint2").name).to eq("tint2")
- end
- end
-end
diff --git a/spec/lib/gitlab/google_code_import/project_creator_spec.rb b/spec/lib/gitlab/google_code_import/project_creator_spec.rb
deleted file mode 100644
index 7a224538b8b..00000000000
--- a/spec/lib/gitlab/google_code_import/project_creator_spec.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::GoogleCodeImport::ProjectCreator do
- let(:user) { create(:user) }
- let(:repo) {
- Gitlab::GoogleCodeImport::Repository.new(
- "name" => 'vim',
- "summary" => 'VI Improved',
- "repositoryUrls" => [ "https://vim.googlecode.com/git/" ]
- )
- }
- let(:namespace){ create(:group, owner: user) }
-
- before do
- namespace.add_owner(user)
- end
-
- it 'creates project' do
- allow_any_instance_of(Project).to receive(:add_import_job)
-
- project_creator = Gitlab::GoogleCodeImport::ProjectCreator.new(repo, namespace, user)
- project = project_creator.execute
-
- expect(project.import_url).to eq("https://vim.googlecode.com/git/")
- expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC)
- end
-end
diff --git a/spec/lib/gitlab/key_fingerprint_spec.rb b/spec/lib/gitlab/key_fingerprint_spec.rb
deleted file mode 100644
index 266eab6e793..00000000000
--- a/spec/lib/gitlab/key_fingerprint_spec.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-require "spec_helper"
-
-describe Gitlab::KeyFingerprint do
- let(:key) { "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=" }
- let(:fingerprint) { "3f:a2:ee:de:b5:de:53:c3:aa:2f:9c:45:24:4c:47:7b" }
-
- describe "#fingerprint" do
- it "generates the key's fingerprint" do
- expect(Gitlab::KeyFingerprint.new(key).fingerprint).to eq(fingerprint)
- end
- end
-end
diff --git a/spec/lib/gitlab/ldap/access_spec.rb b/spec/lib/gitlab/ldap/access_spec.rb
deleted file mode 100644
index 707a0521ab3..00000000000
--- a/spec/lib/gitlab/ldap/access_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::LDAP::Access do
- let(:access) { Gitlab::LDAP::Access.new user }
- let(:user) { create(:omniauth_user) }
-
- describe :allowed? do
- subject { access.allowed? }
-
- context 'when the user cannot be found' do
- before { Gitlab::LDAP::Person.stub(find_by_dn: nil) }
-
- it { is_expected.to be_falsey }
- end
-
- context 'when the user is found' do
- before { Gitlab::LDAP::Person.stub(find_by_dn: :ldap_user) }
-
- context 'and the user is diabled via active directory' do
- before { Gitlab::LDAP::Person.stub(disabled_via_active_directory?: true) }
-
- it { is_expected.to be_falsey }
-
- it "should block user in GitLab" do
- access.allowed?
- user.should be_blocked
- end
- end
-
- context 'and has no disabled flag in active diretory' do
- before do
- user.block
-
- Gitlab::LDAP::Person.stub(disabled_via_active_directory?: false)
- end
-
- it { is_expected.to be_truthy }
-
- it "should unblock user in GitLab" do
- access.allowed?
- user.should_not be_blocked
- end
- end
-
- context 'without ActiveDirectory enabled' do
- before do
- Gitlab::LDAP::Config.stub(enabled?: true)
- Gitlab::LDAP::Config.any_instance.stub(active_directory: false)
- end
-
- it { is_expected.to be_truthy }
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/ldap/adapter_spec.rb b/spec/lib/gitlab/ldap/adapter_spec.rb
deleted file mode 100644
index b609e4b38f2..00000000000
--- a/spec/lib/gitlab/ldap/adapter_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::LDAP::Adapter do
- let(:adapter) { Gitlab::LDAP::Adapter.new 'ldapmain' }
-
- describe :dn_matches_filter? do
- let(:ldap) { double(:ldap) }
- subject { adapter.dn_matches_filter?(:dn, :filter) }
- before { adapter.stub(ldap: ldap) }
-
- context "when the search is successful" do
- context "and the result is non-empty" do
- before { ldap.stub(search: [:foo]) }
-
- it { is_expected.to be_truthy }
- end
-
- context "and the result is empty" do
- before { ldap.stub(search: []) }
-
- it { is_expected.to be_falsey }
- end
- end
-
- context "when the search encounters an error" do
- before { ldap.stub(search: nil, get_operation_result: double(code: 1, message: 'some error')) }
-
- it { is_expected.to be_falsey }
- end
- end
-end
diff --git a/spec/lib/gitlab/ldap/authentication_spec.rb b/spec/lib/gitlab/ldap/authentication_spec.rb
deleted file mode 100644
index 8afc2b21f46..00000000000
--- a/spec/lib/gitlab/ldap/authentication_spec.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::LDAP::Authentication do
- let(:klass) { Gitlab::LDAP::Authentication }
- let(:user) { create(:omniauth_user, extern_uid: dn) }
- let(:dn) { 'uid=john,ou=people,dc=example,dc=com' }
- let(:login) { 'john' }
- let(:password) { 'password' }
-
- describe :login do
- let(:adapter) { double :adapter }
- before do
- Gitlab::LDAP::Config.stub(enabled?: true)
- end
-
- it "finds the user if authentication is successful" do
- user
- # try only to fake the LDAP call
- klass.any_instance.stub(adapter: double(:adapter,
- bind_as: double(:ldap_user, dn: dn)
- ))
- expect(klass.login(login, password)).to be_truthy
- end
-
- it "is false if the user does not exist" do
- # try only to fake the LDAP call
- klass.any_instance.stub(adapter: double(:adapter,
- bind_as: double(:ldap_user, dn: dn)
- ))
- expect(klass.login(login, password)).to be_falsey
- end
-
- it "is false if authentication fails" do
- user
- # try only to fake the LDAP call
- klass.any_instance.stub(adapter: double(:adapter, bind_as: nil))
- expect(klass.login(login, password)).to be_falsey
- end
-
- it "fails if ldap is disabled" do
- Gitlab::LDAP::Config.stub(enabled?: false)
- expect(klass.login(login, password)).to be_falsey
- end
-
- it "fails if no login is supplied" do
- expect(klass.login('', password)).to be_falsey
- end
-
- it "fails if no password is supplied" do
- expect(klass.login(login, '')).to be_falsey
- end
- end
-end \ No newline at end of file
diff --git a/spec/lib/gitlab/ldap/config_spec.rb b/spec/lib/gitlab/ldap/config_spec.rb
deleted file mode 100644
index 00e9076c787..00000000000
--- a/spec/lib/gitlab/ldap/config_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::LDAP::Config do
- let(:config) { Gitlab::LDAP::Config.new provider }
- let(:provider) { 'ldapmain' }
-
- describe '#initalize' do
- it 'requires a provider' do
- expect{ Gitlab::LDAP::Config.new }.to raise_error ArgumentError
- end
-
- it "works" do
- expect(config).to be_a described_class
- end
-
- it "raises an error if a unknow provider is used" do
- expect{ Gitlab::LDAP::Config.new 'unknown' }.to raise_error
- end
- end
-end
diff --git a/spec/lib/gitlab/ldap/user_spec.rb b/spec/lib/gitlab/ldap/user_spec.rb
deleted file mode 100644
index 42015c28c81..00000000000
--- a/spec/lib/gitlab/ldap/user_spec.rb
+++ /dev/null
@@ -1,106 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::LDAP::User do
- let(:ldap_user) { Gitlab::LDAP::User.new(auth_hash) }
- let(:gl_user) { ldap_user.gl_user }
- let(:info) do
- {
- name: 'John',
- email: 'john@example.com',
- nickname: 'john'
- }
- end
- let(:auth_hash) do
- double(uid: 'my-uid', provider: 'ldapmain', info: double(info))
- end
-
- describe :changed? do
- it "marks existing ldap user as changed" do
- existing_user = create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain')
- expect(ldap_user.changed?).to be_truthy
- end
-
- it "marks existing non-ldap user if the email matches as changed" do
- existing_user = create(:user, email: 'john@example.com')
- expect(ldap_user.changed?).to be_truthy
- end
-
- it "dont marks existing ldap user as changed" do
- existing_user = create(:omniauth_user, email: 'john@example.com', extern_uid: 'my-uid', provider: 'ldapmain')
- expect(ldap_user.changed?).to be_falsey
- end
- end
-
- describe :find_or_create do
- it "finds the user if already existing" do
- existing_user = create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain')
-
- expect{ ldap_user.save }.to_not change{ User.count }
- end
-
- it "connects to existing non-ldap user if the email matches" do
- existing_user = create(:omniauth_user, email: 'john@example.com', provider: "twitter")
- expect{ ldap_user.save }.to_not change{ User.count }
-
- existing_user.reload
- expect(existing_user.ldap_identity.extern_uid).to eql 'my-uid'
- expect(existing_user.ldap_identity.provider).to eql 'ldapmain'
- end
-
- it "creates a new user if not found" do
- expect{ ldap_user.save }.to change{ User.count }.by(1)
- end
- end
-
-
- describe 'blocking' do
- context 'signup' do
- context 'dont block on create' do
- before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false }
-
- it do
- ldap_user.save
- expect(gl_user).to be_valid
- expect(gl_user).not_to be_blocked
- end
- end
-
- context 'block on create' do
- before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true }
-
- it do
- ldap_user.save
- expect(gl_user).to be_valid
- expect(gl_user).to be_blocked
- end
- end
- end
-
- context 'sign-in' do
- before do
- ldap_user.save
- ldap_user.gl_user.activate
- end
-
- context 'dont block on create' do
- before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false }
-
- it do
- ldap_user.save
- expect(gl_user).to be_valid
- expect(gl_user).not_to be_blocked
- end
- end
-
- context 'block on create' do
- before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true }
-
- it do
- ldap_user.save
- expect(gl_user).to be_valid
- expect(gl_user).not_to be_blocked
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/note_data_builder_spec.rb b/spec/lib/gitlab/note_data_builder_spec.rb
deleted file mode 100644
index 448cd0c6880..00000000000
--- a/spec/lib/gitlab/note_data_builder_spec.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-require 'spec_helper'
-
-describe 'Gitlab::NoteDataBuilder' do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- let(:data) { Gitlab::NoteDataBuilder.build(note, user) }
- let(:note_url) { Gitlab::UrlBuilder.new(:note).build(note.id) }
- let(:fixed_time) { Time.at(1425600000) } # Avoid time precision errors
-
- before(:each) do
- expect(data).to have_key(:object_attributes)
- expect(data[:object_attributes]).to have_key(:url)
- expect(data[:object_attributes][:url]).to eq(note_url)
- expect(data[:object_kind]).to eq('note')
- expect(data[:user]).to eq(user.hook_attrs)
- end
-
- describe 'When asking for a note on commit' do
- let(:note) { create(:note_on_commit) }
-
- it 'returns the note and commit-specific data' do
- expect(data).to have_key(:commit)
- end
- end
-
- describe 'When asking for a note on commit diff' do
- let(:note) { create(:note_on_commit_diff) }
-
- it 'returns the note and commit-specific data' do
- expect(data).to have_key(:commit)
- end
- end
-
- describe 'When asking for a note on issue' do
- let(:issue) { create(:issue, created_at: fixed_time, updated_at: fixed_time) }
- let(:note) { create(:note_on_issue, noteable_id: issue.id) }
-
- it 'returns the note and issue-specific data' do
- expect(data).to have_key(:issue)
- expect(data[:issue]).to eq(issue.hook_attrs)
- end
- end
-
- describe 'When asking for a note on merge request' do
- let(:merge_request) { create(:merge_request, created_at: fixed_time, updated_at: fixed_time) }
- let(:note) { create(:note_on_merge_request, noteable_id: merge_request.id) }
-
- it 'returns the note and merge request data' do
- expect(data).to have_key(:merge_request)
- expect(data[:merge_request]).to eq(merge_request.hook_attrs)
- end
- end
-
- describe 'When asking for a note on merge request diff' do
- let(:merge_request) { create(:merge_request, created_at: fixed_time, updated_at: fixed_time) }
- let(:note) { create(:note_on_merge_request_diff, noteable_id: merge_request.id) }
-
- it 'returns the note and merge request diff data' do
- expect(data).to have_key(:merge_request)
- expect(data[:merge_request]).to eq(merge_request.hook_attrs)
- end
- end
-
- describe 'When asking for a note on project snippet' do
- let!(:snippet) { create(:project_snippet, created_at: fixed_time, updated_at: fixed_time) }
- let!(:note) { create(:note_on_project_snippet, noteable_id: snippet.id) }
-
- it 'returns the note and project snippet data' do
- expect(data).to have_key(:snippet)
- expect(data[:snippet]).to eq(snippet.hook_attrs)
- end
- end
-end
diff --git a/spec/lib/gitlab/o_auth/auth_hash_spec.rb b/spec/lib/gitlab/o_auth/auth_hash_spec.rb
deleted file mode 100644
index 5eb77b492b2..00000000000
--- a/spec/lib/gitlab/o_auth/auth_hash_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::OAuth::AuthHash do
- let(:auth_hash) do
- Gitlab::OAuth::AuthHash.new(double({
- provider: 'twitter',
- uid: uid,
- info: double(info_hash)
- }))
- end
- let(:uid) { 'my-uid' }
- let(:email) { 'my-email@example.com' }
- let(:nickname) { 'my-nickname' }
- let(:info_hash) {
- {
- email: email,
- nickname: nickname,
- name: 'John',
- first_name: "John",
- last_name: "Who"
- }
- }
-
- context "defaults" do
- it { expect(auth_hash.provider).to eql 'twitter' }
- it { expect(auth_hash.uid).to eql uid }
- it { expect(auth_hash.email).to eql email }
- it { expect(auth_hash.username).to eql nickname }
- it { expect(auth_hash.name).to eql "John" }
- it { expect(auth_hash.password).to_not be_empty }
- end
-
- context "email not provided" do
- before { info_hash.delete(:email) }
- it "generates a temp email" do
- expect( auth_hash.email).to start_with('temp-email-for-oauth')
- end
- end
-
- context "username not provided" do
- before { info_hash.delete(:nickname) }
-
- it "takes the first part of the email as username" do
- expect( auth_hash.username ).to eql "my-email"
- end
- end
-
- context "name not provided" do
- before { info_hash.delete(:name) }
-
- it "concats first and lastname as the name" do
- expect( auth_hash.name ).to eql "John Who"
- end
- end
-end \ No newline at end of file
diff --git a/spec/lib/gitlab/o_auth/user_spec.rb b/spec/lib/gitlab/o_auth/user_spec.rb
deleted file mode 100644
index 44cdd1e4fab..00000000000
--- a/spec/lib/gitlab/o_auth/user_spec.rb
+++ /dev/null
@@ -1,109 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::OAuth::User do
- let(:oauth_user) { Gitlab::OAuth::User.new(auth_hash) }
- let(:gl_user) { oauth_user.gl_user }
- let(:uid) { 'my-uid' }
- let(:provider) { 'my-provider' }
- let(:auth_hash) { double(uid: uid, provider: provider, info: double(info_hash)) }
- let(:info_hash) do
- {
- nickname: '-john+gitlab-ETC%.git@gmail.com',
- name: 'John',
- email: 'john@mail.com'
- }
- end
-
- describe :persisted? do
- let!(:existing_user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'my-provider') }
-
- it "finds an existing user based on uid and provider (facebook)" do
- auth = double(info: double(name: 'John'), uid: 'my-uid', provider: 'my-provider')
- expect( oauth_user.persisted? ).to be_truthy
- end
-
- it "returns false if use is not found in database" do
- auth_hash.stub(uid: 'non-existing')
- expect( oauth_user.persisted? ).to be_falsey
- end
- end
-
- describe :save do
- let(:provider) { 'twitter' }
-
- describe 'signup' do
- context "with allow_single_sign_on enabled" do
- before { Gitlab.config.omniauth.stub allow_single_sign_on: true }
-
- it "creates a user from Omniauth" do
- oauth_user.save
-
- expect(gl_user).to be_valid
- identity = gl_user.identities.first
- expect(identity.extern_uid).to eql uid
- expect(identity.provider).to eql 'twitter'
- end
- end
-
- context "with allow_single_sign_on disabled (Default)" do
- it "throws an error" do
- expect{ oauth_user.save }.to raise_error StandardError
- end
- end
- end
-
- describe 'blocking' do
- let(:provider) { 'twitter' }
- before { Gitlab.config.omniauth.stub allow_single_sign_on: true }
-
- context 'signup' do
- context 'dont block on create' do
- before { Gitlab.config.omniauth.stub block_auto_created_users: false }
-
- it do
- oauth_user.save
- expect(gl_user).to be_valid
- expect(gl_user).not_to be_blocked
- end
- end
-
- context 'block on create' do
- before { Gitlab.config.omniauth.stub block_auto_created_users: true }
-
- it do
- oauth_user.save
- expect(gl_user).to be_valid
- expect(gl_user).to be_blocked
- end
- end
- end
-
- context 'sign-in' do
- before do
- oauth_user.save
- oauth_user.gl_user.activate
- end
-
- context 'dont block on create' do
- before { Gitlab.config.omniauth.stub block_auto_created_users: false }
-
- it do
- oauth_user.save
- expect(gl_user).to be_valid
- expect(gl_user).not_to be_blocked
- end
- end
-
- context 'block on create' do
- before { Gitlab.config.omniauth.stub block_auto_created_users: true }
-
- it do
- oauth_user.save
- expect(gl_user).to be_valid
- expect(gl_user).not_to be_blocked
- end
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/popen_spec.rb b/spec/lib/gitlab/popen_spec.rb
deleted file mode 100644
index cd9d0456b25..00000000000
--- a/spec/lib/gitlab/popen_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-require 'spec_helper'
-
-describe 'Gitlab::Popen', no_db: true do
- let (:path) { Rails.root.join('tmp').to_s }
-
- before do
- @klass = Class.new(Object)
- @klass.send(:include, Gitlab::Popen)
- end
-
- context 'zero status' do
- before do
- @output, @status = @klass.new.popen(%W(ls), path)
- end
-
- it { expect(@status).to be_zero }
- it { expect(@output).to include('cache') }
- end
-
- context 'non-zero status' do
- before do
- @output, @status = @klass.new.popen(%W(cat NOTHING), path)
- end
-
- it { expect(@status).to eq(1) }
- it { expect(@output).to include('No such file or directory') }
- end
-
- context 'unsafe string command' do
- it 'raises an error when it gets called with a string argument' do
- expect { @klass.new.popen('ls', path) }.to raise_error
- end
- end
-
- context 'without a directory argument' do
- before do
- @output, @status = @klass.new.popen(%W(ls))
- end
-
- it { expect(@status).to be_zero }
- it { expect(@output).to include('spec') }
- end
-
-end
-
diff --git a/spec/lib/gitlab/push_data_builder_spec.rb b/spec/lib/gitlab/push_data_builder_spec.rb
deleted file mode 100644
index 1b8ba7b4d43..00000000000
--- a/spec/lib/gitlab/push_data_builder_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-require 'spec_helper'
-
-describe 'Gitlab::PushDataBuilder' do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
-
- describe :build_sample do
- let(:data) { Gitlab::PushDataBuilder.build_sample(project, user) }
-
- it { expect(data).to be_a(Hash) }
- it { expect(data[:before]).to eq('6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9') }
- it { expect(data[:after]).to eq('5937ac0a7beb003549fc5fd26fc247adbce4a52e') }
- it { expect(data[:ref]).to eq('refs/heads/master') }
- it { expect(data[:commits].size).to eq(3) }
- it { expect(data[:repository][:git_http_url]).to eq(project.http_url_to_repo) }
- it { expect(data[:repository][:git_ssh_url]).to eq(project.ssh_url_to_repo) }
- it { expect(data[:repository][:visibility_level]).to eq(project.visibility_level) }
- it { expect(data[:total_commits_count]).to eq(3) }
- end
-
- describe :build do
- let(:data) do
- Gitlab::PushDataBuilder.build(project,
- user,
- Gitlab::Git::BLANK_SHA,
- '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b',
- 'refs/tags/v1.1.0')
- end
-
- it { expect(data).to be_a(Hash) }
- it { expect(data[:before]).to eq(Gitlab::Git::BLANK_SHA) }
- it { expect(data[:checkout_sha]).to eq('5937ac0a7beb003549fc5fd26fc247adbce4a52e') }
- it { expect(data[:after]).to eq('8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b') }
- it { expect(data[:ref]).to eq('refs/tags/v1.1.0') }
- it { expect(data[:commits]).to be_empty }
- it { expect(data[:total_commits_count]).to be_zero }
- end
-end
diff --git a/spec/lib/gitlab/reference_extractor_spec.rb b/spec/lib/gitlab/reference_extractor_spec.rb
deleted file mode 100644
index c9fb62b61ae..00000000000
--- a/spec/lib/gitlab/reference_extractor_spec.rb
+++ /dev/null
@@ -1,156 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::ReferenceExtractor do
- let(:project) { create(:project) }
- subject { Gitlab::ReferenceExtractor.new(project, project.creator) }
-
- it 'extracts username references' do
- subject.analyze('this contains a @user reference')
- expect(subject.references[:user]).to eq([[project, 'user']])
- end
-
- it 'extracts issue references' do
- subject.analyze('this one talks about issue #1234')
- expect(subject.references[:issue]).to eq([[project, '1234']])
- end
-
- it 'extracts JIRA issue references' do
- subject.analyze('this one talks about issue JIRA-1234')
- expect(subject.references[:issue]).to eq([[project, 'JIRA-1234']])
- end
-
- it 'extracts merge request references' do
- subject.analyze("and here's !43, a merge request")
- expect(subject.references[:merge_request]).to eq([[project, '43']])
- end
-
- it 'extracts snippet ids' do
- subject.analyze('snippets like $12 get extracted as well')
- expect(subject.references[:snippet]).to eq([[project, '12']])
- end
-
- it 'extracts commit shas' do
- subject.analyze('commit shas 98cf0ae3 are pulled out as Strings')
- expect(subject.references[:commit]).to eq([[project, '98cf0ae3']])
- end
-
- it 'extracts commit ranges' do
- subject.analyze('here you go, a commit range: 98cf0ae3...98cf0ae4')
- expect(subject.references[:commit_range]).to eq([[project, '98cf0ae3...98cf0ae4']])
- end
-
- it 'extracts multiple references and preserves their order' do
- subject.analyze('@me and @you both care about this')
- expect(subject.references[:user]).to eq([
- [project, 'me'],
- [project, 'you']
- ])
- end
-
- it 'leaves the original note unmodified' do
- text = 'issue #123 is just the worst, @user'
- subject.analyze(text)
- expect(text).to eq('issue #123 is just the worst, @user')
- end
-
- it 'extracts no references for <pre>..</pre> blocks' do
- subject.analyze("<pre>def puts '#1 issue'\nend\n</pre>```")
- expect(subject.issues).to be_blank
- end
-
- it 'extracts no references for <code>..</code> blocks' do
- subject.analyze("<code>def puts '!1 request'\nend\n</code>```")
- expect(subject.merge_requests).to be_blank
- end
-
- it 'extracts no references for code blocks with language' do
- subject.analyze("this code:\n```ruby\ndef puts '#1 issue'\nend\n```")
- expect(subject.issues).to be_blank
- end
-
- it 'extracts issue references for invalid code blocks' do
- subject.analyze('test: ```this one talks about issue #1234```')
- expect(subject.references[:issue]).to eq([[project, '1234']])
- end
-
- it 'handles all possible kinds of references' do
- accessors = Gitlab::Markdown::TYPES.map { |t| "#{t}s".to_sym }
- expect(subject).to respond_to(*accessors)
- end
-
- it 'accesses valid user objects' do
- @u_foo = create(:user, username: 'foo')
- @u_bar = create(:user, username: 'bar')
- @u_offteam = create(:user, username: 'offteam')
-
- project.team << [@u_foo, :reporter]
- project.team << [@u_bar, :guest]
-
- subject.analyze('@foo, @baduser, @bar, and @offteam')
- expect(subject.users).to eq([@u_foo, @u_bar, @u_offteam])
- end
-
- it 'accesses valid issue objects' do
- @i0 = create(:issue, project: project)
- @i1 = create(:issue, project: project)
-
- subject.analyze("##{@i0.iid}, ##{@i1.iid}, and #999.")
- expect(subject.issues).to eq([@i0, @i1])
- end
-
- it 'accesses valid merge requests' do
- @m0 = create(:merge_request, source_project: project, target_project: project, source_branch: 'aaa')
- @m1 = create(:merge_request, source_project: project, target_project: project, source_branch: 'bbb')
-
- subject.analyze("!999, !#{@m1.iid}, and !#{@m0.iid}.")
- expect(subject.merge_requests).to eq([@m1, @m0])
- end
-
- it 'accesses valid snippets' do
- @s0 = create(:project_snippet, project: project)
- @s1 = create(:project_snippet, project: project)
- @s2 = create(:project_snippet)
-
- subject.analyze("$#{@s0.id}, $999, $#{@s2.id}, $#{@s1.id}")
- expect(subject.snippets).to eq([@s0, @s1])
- end
-
- it 'accesses valid commits' do
- commit = project.repository.commit('master')
-
- subject.analyze("this references commits #{commit.sha[0..6]} and 012345")
- extracted = subject.commits
- expect(extracted.size).to eq(1)
- expect(extracted[0].sha).to eq(commit.sha)
- expect(extracted[0].message).to eq(commit.message)
- end
-
- it 'accesses valid commit ranges' do
- commit = project.repository.commit('master')
- earlier_commit = project.repository.commit('master~2')
-
- subject.analyze("this references commits #{earlier_commit.sha[0..6]}...#{commit.sha[0..6]}")
- extracted = subject.commit_ranges
- expect(extracted.size).to eq(1)
- expect(extracted[0][0].sha).to eq(earlier_commit.sha)
- expect(extracted[0][0].message).to eq(earlier_commit.message)
- expect(extracted[0][1].sha).to eq(commit.sha)
- expect(extracted[0][1].message).to eq(commit.message)
- end
-
- context 'with a project with an underscore' do
- let(:other_project) { create(:project, path: 'test_project') }
- let(:issue) { create(:issue, project: other_project) }
-
- before do
- other_project.team << [project.creator, :developer]
- end
-
- it 'handles project issue references' do
- subject.analyze("this refers issue #{other_project.path_with_namespace}##{issue.iid}")
- extracted = subject.issues
- expect(extracted.size).to eq(1)
- expect(extracted).to eq([issue])
- end
- end
-end
diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb
deleted file mode 100644
index 727884c41c5..00000000000
--- a/spec/lib/gitlab/regex_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Regex do
- describe 'project path regex' do
- it { expect('gitlab-ce').to match(Gitlab::Regex.project_path_regex) }
- it { expect('gitlab_git').to match(Gitlab::Regex.project_path_regex) }
- it { expect('_underscore.js').to match(Gitlab::Regex.project_path_regex) }
- it { expect('100px.com').to match(Gitlab::Regex.project_path_regex) }
- it { expect('?gitlab').not_to match(Gitlab::Regex.project_path_regex) }
- it { expect('git lab').not_to match(Gitlab::Regex.project_path_regex) }
- it { expect('gitlab.git').not_to match(Gitlab::Regex.project_path_regex) }
- end
-
- describe 'project name regex' do
- it { expect('gitlab-ce').to match(Gitlab::Regex.project_name_regex) }
- it { expect('GitLab CE').to match(Gitlab::Regex.project_name_regex) }
- it { expect('100 lines').to match(Gitlab::Regex.project_name_regex) }
- it { expect('gitlab.git').to match(Gitlab::Regex.project_name_regex) }
- it { expect('?gitlab').not_to match(Gitlab::Regex.project_name_regex) }
- end
-end
diff --git a/spec/lib/gitlab/satellite/action_spec.rb b/spec/lib/gitlab/satellite/action_spec.rb
deleted file mode 100644
index 28e3d64ee2b..00000000000
--- a/spec/lib/gitlab/satellite/action_spec.rb
+++ /dev/null
@@ -1,118 +0,0 @@
-require 'spec_helper'
-
-describe 'Gitlab::Satellite::Action' do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- describe '#prepare_satellite!' do
- it 'should be able to fetch timeout from conf' do
- expect(Gitlab::Satellite::Action::DEFAULT_OPTIONS[:git_timeout]).to eq(30.seconds)
- end
-
- it 'create a repository with a parking branch and one remote: origin' do
- repo = project.satellite.repo
-
- #now lets dirty it up
-
- starting_remote_count = repo.git.list_remotes.size
- expect(starting_remote_count).to be >= 1
- #kind of hookey way to add a second remote
- origin_uri = repo.git.remote({v: true}).split(" ")[1]
- begin
- repo.git.remote({raise: true}, 'add', 'another-remote', origin_uri)
- repo.git.branch({raise: true}, 'a-new-branch')
-
- expect(repo.heads.size).to be > (starting_remote_count)
- expect(repo.git.remote().split(" ").size).to be > (starting_remote_count)
- rescue
- end
-
- repo.git.config({}, "user.name", "#{user.name} -- foo")
- repo.git.config({}, "user.email", "#{user.email} -- foo")
- expect(repo.config['user.name']).to eq("#{user.name} -- foo")
- expect(repo.config['user.email']).to eq("#{user.email} -- foo")
-
-
- #These must happen in the context of the satellite directory...
- satellite_action = Gitlab::Satellite::Action.new(user, project)
- project.satellite.lock {
- #Now clean it up, use send to get around prepare_satellite! being protected
- satellite_action.send(:prepare_satellite!, repo)
- }
-
- #verify it's clean
- heads = repo.heads.map(&:name)
- expect(heads.size).to eq(1)
- expect(heads.include?(Gitlab::Satellite::Satellite::PARKING_BRANCH)).to eq(true)
- remotes = repo.git.remote().split(' ')
- expect(remotes.size).to eq(1)
- expect(remotes.include?('origin')).to eq(true)
- expect(repo.config['user.name']).to eq(user.name)
- expect(repo.config['user.email']).to eq(user.email)
- end
- end
-
- describe '#in_locked_and_timed_satellite' do
-
- it 'should make use of a lockfile' do
- repo = project.satellite.repo
- called = false
-
- #set assumptions
- FileUtils.rm_f(project.satellite.lock_file)
-
- expect(File.exists?(project.satellite.lock_file)).to be_falsey
-
- satellite_action = Gitlab::Satellite::Action.new(user, project)
- satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo|
- expect(repo).to eq(sat_repo)
- expect(File.exists? project.satellite.lock_file).to be_truthy
- called = true
- end
-
- expect(called).to be_truthy
-
- end
-
- it 'should be able to use the satellite after locking' do
- repo = project.satellite.repo
- called = false
-
- # Set base assumptions
- if File.exists? project.satellite.lock_file
- expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_falsey
- end
-
- satellite_action = Gitlab::Satellite::Action.new(user, project)
- satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo|
- called = true
- expect(repo).to eq(sat_repo)
- expect(File.exists? project.satellite.lock_file).to be_truthy
- expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_truthy
- end
-
- expect(called).to be_truthy
- expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_falsey
-
- end
-
- class FileLockStatusChecker < File
- def flocked?(&block)
- status = flock LOCK_EX|LOCK_NB
- case status
- when false
- return true
- when 0
- begin
- block ? block.call : false
- ensure
- flock LOCK_UN
- end
- else
- raise SystemCallError, status
- end
- end
- end
-
- end
-end
diff --git a/spec/lib/gitlab/satellite/merge_action_spec.rb b/spec/lib/gitlab/satellite/merge_action_spec.rb
deleted file mode 100644
index 915e3ff0e51..00000000000
--- a/spec/lib/gitlab/satellite/merge_action_spec.rb
+++ /dev/null
@@ -1,104 +0,0 @@
-require 'spec_helper'
-
-describe 'Gitlab::Satellite::MergeAction' do
- include RepoHelpers
-
- let(:project) { create(:project, namespace: create(:group)) }
- let(:fork_project) { create(:project, namespace: create(:group), forked_from_project: project) }
- let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
- let(:merge_request_fork) { create(:merge_request, source_project: fork_project, target_project: project) }
-
- let(:merge_request_with_conflict) { create(:merge_request, :conflict, source_project: project, target_project: project) }
- let(:merge_request_fork_with_conflict) { create(:merge_request, :conflict, source_project: project, target_project: project) }
-
- describe '#commits_between' do
- def verify_commits(commits, first_commit_sha, last_commit_sha)
- commits.each { |commit| expect(commit.class).to eq(Gitlab::Git::Commit) }
- expect(commits.first.id).to eq(first_commit_sha)
- expect(commits.last.id).to eq(last_commit_sha)
- end
-
- context 'on fork' do
- it 'should get proper commits between' do
- commits = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).commits_between
- verify_commits(commits, sample_compare.commits.first, sample_compare.commits.last)
- end
- end
-
- context 'between branches' do
- it 'should raise exception -- not expected to be used by non forks' do
- expect { Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between }.to raise_error
- end
- end
- end
-
- describe '#format_patch' do
- def verify_content(patch)
- sample_compare.commits.each do |commit|
- expect(patch.include?(commit)).to be_truthy
- end
- end
-
- context 'on fork' do
- it 'should build a format patch' do
- patch = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).format_patch
- verify_content(patch)
- end
- end
-
- context 'between branches' do
- it 'should build a format patch' do
- patch = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request).format_patch
- verify_content(patch)
- end
- end
- end
-
- describe '#diffs_between_satellite tested against diff_in_satellite' do
- def is_a_matching_diff(diff, diffs)
- diff_count = diff.scan('diff --git').size
- expect(diff_count).to be >= 1
- expect(diffs.size).to eq(diff_count)
- diffs.each do |a_diff|
- expect(a_diff.class).to eq(Gitlab::Git::Diff)
- expect(diff.include? a_diff.diff).to be_truthy
- end
- end
-
- context 'on fork' do
- it 'should get proper diffs' do
- diffs = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).diffs_between_satellite
- diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diff_in_satellite
- is_a_matching_diff(diff, diffs)
- end
- end
-
- context 'between branches' do
- it 'should get proper diffs' do
- expect{ Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite }.to raise_error
- end
- end
- end
-
- describe '#can_be_merged?' do
- context 'on fork' do
- it { expect(Gitlab::Satellite::MergeAction.new(
- merge_request_fork.author,
- merge_request_fork).can_be_merged?).to be_truthy }
-
- it { expect(Gitlab::Satellite::MergeAction.new(
- merge_request_fork_with_conflict.author,
- merge_request_fork_with_conflict).can_be_merged?).to be_falsey }
- end
-
- context 'between branches' do
- it { expect(Gitlab::Satellite::MergeAction.new(
- merge_request.author,
- merge_request).can_be_merged?).to be_truthy }
-
- it { expect(Gitlab::Satellite::MergeAction.new(
- merge_request_with_conflict.author,
- merge_request_with_conflict).can_be_merged?).to be_falsey }
- end
- end
-end
diff --git a/spec/lib/gitlab/upgrader_spec.rb b/spec/lib/gitlab/upgrader_spec.rb
deleted file mode 100644
index ce3ea6c260a..00000000000
--- a/spec/lib/gitlab/upgrader_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::Upgrader do
- let(:upgrader) { Gitlab::Upgrader.new }
- let(:current_version) { Gitlab::VERSION }
-
- describe 'current_version_raw' do
- it { expect(upgrader.current_version_raw).to eq(current_version) }
- end
-
- describe 'latest_version?' do
- it 'should be true if newest version' do
- upgrader.stub(latest_version_raw: current_version)
- expect(upgrader.latest_version?).to be_truthy
- end
- end
-
- describe 'latest_version_raw' do
- it 'should be latest version for GitLab 5' do
- upgrader.stub(current_version_raw: "5.3.0")
- expect(upgrader.latest_version_raw).to eq("v5.4.2")
- end
- end
-end
diff --git a/spec/lib/gitlab/url_builder_spec.rb b/spec/lib/gitlab/url_builder_spec.rb
deleted file mode 100644
index 5153ed15af3..00000000000
--- a/spec/lib/gitlab/url_builder_spec.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::UrlBuilder do
- describe 'When asking for an issue' do
- it 'returns the issue url' do
- issue = create(:issue)
- url = Gitlab::UrlBuilder.new(:issue).build(issue.id)
- expect(url).to eq "#{Settings.gitlab['url']}/#{issue.project.path_with_namespace}/issues/#{issue.iid}"
- end
- end
-
- describe 'When asking for an merge request' do
- it 'returns the merge request url' do
- merge_request = create(:merge_request)
- url = Gitlab::UrlBuilder.new(:merge_request).build(merge_request.id)
- expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}"
- end
- end
-
- describe 'When asking for a note on commit' do
- let(:note) { create(:note_on_commit) }
- let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) }
-
- it 'returns the note url' do
- expect(url).to eq "#{Settings.gitlab['url']}/#{note.project.path_with_namespace}/commit/#{note.commit_id}#note_#{note.id}"
- end
- end
-
- describe 'When asking for a note on commit diff' do
- let(:note) { create(:note_on_commit_diff) }
- let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) }
-
- it 'returns the note url' do
- expect(url).to eq "#{Settings.gitlab['url']}/#{note.project.path_with_namespace}/commit/#{note.commit_id}#note_#{note.id}"
- end
- end
-
- describe 'When asking for a note on issue' do
- let(:issue) { create(:issue) }
- let(:note) { create(:note_on_issue, noteable_id: issue.id) }
- let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) }
-
- it 'returns the note url' do
- expect(url).to eq "#{Settings.gitlab['url']}/#{issue.project.path_with_namespace}/issues/#{issue.iid}#note_#{note.id}"
- end
- end
-
- describe 'When asking for a note on merge request' do
- let(:merge_request) { create(:merge_request) }
- let(:note) { create(:note_on_merge_request, noteable_id: merge_request.id) }
- let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) }
-
- it 'returns the note url' do
- expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}#note_#{note.id}"
- end
- end
-
- describe 'When asking for a note on merge request diff' do
- let(:merge_request) { create(:merge_request) }
- let(:note) { create(:note_on_merge_request_diff, noteable_id: merge_request.id) }
- let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) }
-
- it 'returns the note url' do
- expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}#note_#{note.id}"
- end
- end
-
- describe 'When asking for a note on project snippet' do
- let(:snippet) { create(:project_snippet) }
- let(:note) { create(:note_on_project_snippet, noteable_id: snippet.id) }
- let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) }
-
- it 'returns the note url' do
- expect(url).to eq "#{Settings.gitlab['url']}/#{snippet.project.path_with_namespace}/snippets/#{note.noteable_id}#note_#{note.id}"
- end
- end
-end
diff --git a/spec/lib/gitlab/version_info_spec.rb b/spec/lib/gitlab/version_info_spec.rb
deleted file mode 100644
index 5afeb1c1ec3..00000000000
--- a/spec/lib/gitlab/version_info_spec.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-require 'spec_helper'
-
-describe 'Gitlab::VersionInfo', no_db: true do
- before do
- @unknown = Gitlab::VersionInfo.new
- @v0_0_1 = Gitlab::VersionInfo.new(0, 0, 1)
- @v0_1_0 = Gitlab::VersionInfo.new(0, 1, 0)
- @v1_0_0 = Gitlab::VersionInfo.new(1, 0, 0)
- @v1_0_1 = Gitlab::VersionInfo.new(1, 0, 1)
- @v1_1_0 = Gitlab::VersionInfo.new(1, 1, 0)
- @v2_0_0 = Gitlab::VersionInfo.new(2, 0, 0)
- end
-
- context '>' do
- it { expect(@v2_0_0).to be > @v1_1_0 }
- it { expect(@v1_1_0).to be > @v1_0_1 }
- it { expect(@v1_0_1).to be > @v1_0_0 }
- it { expect(@v1_0_0).to be > @v0_1_0 }
- it { expect(@v0_1_0).to be > @v0_0_1 }
- end
-
- context '>=' do
- it { expect(@v2_0_0).to be >= Gitlab::VersionInfo.new(2, 0, 0) }
- it { expect(@v2_0_0).to be >= @v1_1_0 }
- end
-
- context '<' do
- it { expect(@v0_0_1).to be < @v0_1_0 }
- it { expect(@v0_1_0).to be < @v1_0_0 }
- it { expect(@v1_0_0).to be < @v1_0_1 }
- it { expect(@v1_0_1).to be < @v1_1_0 }
- it { expect(@v1_1_0).to be < @v2_0_0 }
- end
-
- context '<=' do
- it { expect(@v0_0_1).to be <= Gitlab::VersionInfo.new(0, 0, 1) }
- it { expect(@v0_0_1).to be <= @v0_1_0 }
- end
-
- context '==' do
- it { expect(@v0_0_1).to eq(Gitlab::VersionInfo.new(0, 0, 1)) }
- it { expect(@v0_1_0).to eq(Gitlab::VersionInfo.new(0, 1, 0)) }
- it { expect(@v1_0_0).to eq(Gitlab::VersionInfo.new(1, 0, 0)) }
- end
-
- context '!=' do
- it { expect(@v0_0_1).not_to eq(@v0_1_0) }
- end
-
- context 'unknown' do
- it { expect(@unknown).not_to be @v0_0_1 }
- it { expect(@unknown).not_to be Gitlab::VersionInfo.new }
- it { expect{@unknown > @v0_0_1}.to raise_error(ArgumentError) }
- it { expect{@unknown < @v0_0_1}.to raise_error(ArgumentError) }
- end
-
- context 'parse' do
- it { expect(Gitlab::VersionInfo.parse("1.0.0")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("1.0.0.1")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("git 1.0.0b1")).to eq(@v1_0_0) }
- it { expect(Gitlab::VersionInfo.parse("git 1.0b1")).not_to be_valid }
- end
-
- context 'to_s' do
- it { expect(@v1_0_0.to_s).to eq("1.0.0") }
- it { expect(@unknown.to_s).to eq("Unknown") }
- end
-end
-
diff --git a/spec/lib/repository_cache_spec.rb b/spec/lib/repository_cache_spec.rb
deleted file mode 100644
index af399f3a731..00000000000
--- a/spec/lib/repository_cache_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-require 'rspec'
-require_relative '../../lib/repository_cache'
-
-describe RepositoryCache do
- let(:backend) { double('backend').as_null_object }
- let(:cache) { RepositoryCache.new('example', backend) }
-
- describe '#cache_key' do
- it 'includes the namespace' do
- expect(cache.cache_key(:foo)).to eq 'foo:example'
- end
- end
-
- describe '#expire' do
- it 'expires the given key from the cache' do
- cache.expire(:foo)
- expect(backend).to have_received(:delete).with('foo:example')
- end
- end
-
- describe '#fetch' do
- it 'fetches the given key from the cache' do
- cache.fetch(:bar)
- expect(backend).to have_received(:fetch).with('bar:example')
- end
-
- it 'accepts a block' do
- p = -> {}
-
- cache.fetch(:baz, &p)
- expect(backend).to have_received(:fetch).with('baz:example', &p)
- end
- end
-end
diff --git a/spec/lib/votes_spec.rb b/spec/lib/votes_spec.rb
deleted file mode 100644
index df243a26008..00000000000
--- a/spec/lib/votes_spec.rb
+++ /dev/null
@@ -1,185 +0,0 @@
-require 'spec_helper'
-
-describe Issue, 'Votes' do
- let(:issue) { create(:issue) }
-
- describe "#upvotes" do
- it "with no notes has a 0/0 score" do
- expect(issue.upvotes).to eq(0)
- end
-
- it "should recognize non-+1 notes" do
- add_note "No +1 here"
- expect(issue.notes.size).to eq(1)
- expect(issue.notes.first.upvote?).to be_falsey
- expect(issue.upvotes).to eq(0)
- end
-
- it "should recognize a single +1 note" do
- add_note "+1 This is awesome"
- expect(issue.upvotes).to eq(1)
- end
-
- it 'should recognize multiple +1 notes' do
- add_note '+1 This is awesome', create(:user)
- add_note '+1 I want this', create(:user)
- expect(issue.upvotes).to eq(2)
- end
-
- it 'should not count 2 +1 votes from the same user' do
- add_note '+1 This is awesome'
- add_note '+1 I want this'
- expect(issue.upvotes).to eq(1)
- end
- end
-
- describe "#downvotes" do
- it "with no notes has a 0/0 score" do
- expect(issue.downvotes).to eq(0)
- end
-
- it "should recognize non--1 notes" do
- add_note "Almost got a -1"
- expect(issue.notes.size).to eq(1)
- expect(issue.notes.first.downvote?).to be_falsey
- expect(issue.downvotes).to eq(0)
- end
-
- it "should recognize a single -1 note" do
- add_note "-1 This is bad"
- expect(issue.downvotes).to eq(1)
- end
-
- it "should recognize multiple -1 notes" do
- add_note('-1 This is bad', create(:user))
- add_note('-1 Away with this', create(:user))
- expect(issue.downvotes).to eq(2)
- end
- end
-
- describe "#votes_count" do
- it "with no notes has a 0/0 score" do
- expect(issue.votes_count).to eq(0)
- end
-
- it "should recognize non notes" do
- add_note "No +1 here"
- expect(issue.notes.size).to eq(1)
- expect(issue.votes_count).to eq(0)
- end
-
- it "should recognize a single +1 note" do
- add_note "+1 This is awesome"
- expect(issue.votes_count).to eq(1)
- end
-
- it "should recognize a single -1 note" do
- add_note "-1 This is bad"
- expect(issue.votes_count).to eq(1)
- end
-
- it "should recognize multiple notes" do
- add_note('+1 This is awesome', create(:user))
- add_note('-1 This is bad', create(:user))
- add_note('+1 I want this', create(:user))
- expect(issue.votes_count).to eq(3)
- end
-
- it 'should not count 2 -1 votes from the same user' do
- add_note '-1 This is suspicious'
- add_note '-1 This is bad'
- expect(issue.votes_count).to eq(1)
- end
- end
-
- describe "#upvotes_in_percent" do
- it "with no notes has a 0% score" do
- expect(issue.upvotes_in_percent).to eq(0)
- end
-
- it "should count a single 1 note as 100%" do
- add_note "+1 This is awesome"
- expect(issue.upvotes_in_percent).to eq(100)
- end
-
- it 'should count multiple +1 notes as 100%' do
- add_note('+1 This is awesome', create(:user))
- add_note('+1 I want this', create(:user))
- expect(issue.upvotes_in_percent).to eq(100)
- end
-
- it 'should count fractions for multiple +1 and -1 notes correctly' do
- add_note('+1 This is awesome', create(:user))
- add_note('+1 I want this', create(:user))
- add_note('-1 This is bad', create(:user))
- add_note('+1 me too', create(:user))
- expect(issue.upvotes_in_percent).to eq(75)
- end
- end
-
- describe "#downvotes_in_percent" do
- it "with no notes has a 0% score" do
- expect(issue.downvotes_in_percent).to eq(0)
- end
-
- it "should count a single -1 note as 100%" do
- add_note "-1 This is bad"
- expect(issue.downvotes_in_percent).to eq(100)
- end
-
- it 'should count multiple -1 notes as 100%' do
- add_note('-1 This is bad', create(:user))
- add_note('-1 Away with this', create(:user))
- expect(issue.downvotes_in_percent).to eq(100)
- end
-
- it 'should count fractions for multiple +1 and -1 notes correctly' do
- add_note('+1 This is awesome', create(:user))
- add_note('+1 I want this', create(:user))
- add_note('-1 This is bad', create(:user))
- add_note('+1 me too', create(:user))
- expect(issue.downvotes_in_percent).to eq(25)
- end
- end
-
- describe '#filter_superceded_votes' do
-
- it 'should count a users vote only once amongst multiple votes' do
- add_note('-1 This needs work before I will accept it')
- add_note('+1 I want this', create(:user))
- add_note('+1 This is is awesome', create(:user))
- add_note('+1 this looks good now')
- add_note('+1 This is awesome', create(:user))
- add_note('+1 me too', create(:user))
- expect(issue.downvotes).to eq(0)
- expect(issue.upvotes).to eq(5)
- end
-
- it 'should count each users vote only once' do
- add_note '-1 This needs work before it will be accepted'
- add_note '+1 I like this'
- add_note '+1 I still like this'
- add_note '+1 I really like this'
- add_note '+1 Give me this now!!!!'
- expect(issue.downvotes).to eq(0)
- expect(issue.upvotes).to eq(1)
- end
-
- it 'should count a users vote only once without caring about comments' do
- add_note '-1 This needs work before it will be accepted'
- add_note 'Comment 1'
- add_note 'Another comment'
- add_note '+1 vote'
- add_note 'final comment'
- expect(issue.downvotes).to eq(0)
- expect(issue.upvotes).to eq(1)
- end
-
- end
-
- def add_note(text, author = issue.author)
- created_at = Time.now - 1.hour + Note.count.seconds
- issue.notes << create(:note, note: text, project: issue.project,
- author_id: author.id, created_at: created_at)
- end
-end
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
deleted file mode 100644
index b297fbd5119..00000000000
--- a/spec/mailers/notify_spec.rb
+++ /dev/null
@@ -1,808 +0,0 @@
-require 'spec_helper'
-
-describe Notify do
- include EmailSpec::Helpers
- include EmailSpec::Matchers
- include RepoHelpers
-
- let(:gitlab_sender_display_name) { Gitlab.config.gitlab.email_display_name }
- let(:gitlab_sender) { Gitlab.config.gitlab.email_from }
- let(:gitlab_sender_reply_to) { Gitlab.config.gitlab.email_reply_to }
- let(:recipient) { create(:user, email: 'recipient@example.com') }
- let(:project) { create(:project) }
-
- around(:each) { ActionMailer::Base.deliveries.clear }
-
- before(:each) do
- email = recipient.emails.create(email: "notifications@example.com")
- recipient.update_attribute(:notification_email, email.email)
- end
-
- shared_examples 'a multiple recipients email' do
- it 'is sent to the given recipient' do
- is_expected.to deliver_to recipient.notification_email
- end
- end
-
- shared_examples 'an email sent from GitLab' do
- it 'is sent from GitLab' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(gitlab_sender_display_name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has a Reply-To address' do
- reply_to = subject.header[:reply_to].addresses
- expect(reply_to).to eq([gitlab_sender_reply_to])
- end
- end
-
- shared_examples 'an email starting a new thread' do |message_id_prefix|
- it 'has a discussion identifier' do
- is_expected.to have_header 'Message-ID', /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
- is_expected.to have_header 'X-GitLab-Project', /#{project.name}/
- end
- end
-
- shared_examples 'an answer to an existing thread' do |thread_id_prefix|
- it 'has a subject that begins with Re: ' do
- is_expected.to have_subject /^Re: /
- end
-
- it 'has headers that reference an existing thread' do
- is_expected.to have_header 'References', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
- is_expected.to have_header 'In-Reply-To', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
- is_expected.to have_header 'X-GitLab-Project', /#{project.name}/
- end
- end
-
- describe 'for new users, the email' do
- let(:example_site_path) { root_path }
- let(:new_user) { create(:user, email: 'newguy@example.com', created_by_id: 1) }
-
- token = 'kETLwRaayvigPq_x3SNM'
-
- subject { Notify.new_user_email(new_user.id, token) }
-
- it_behaves_like 'an email sent from GitLab'
-
- it 'is sent to the new user' do
- is_expected.to deliver_to new_user.email
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /^Account was created for you$/i
- end
-
- it 'contains the new user\'s login name' do
- is_expected.to have_body_text /#{new_user.email}/
- end
-
- it 'contains the password text' do
- is_expected.to have_body_text /Click here to set your password/
- end
-
- it 'includes a link for user to set password' do
- params = "reset_password_token=#{token}"
- is_expected.to have_body_text(
- %r{http://localhost(:\d+)?/users/password/edit\?#{params}}
- )
- end
-
- it 'includes a link to the site' do
- is_expected.to have_body_text /#{example_site_path}/
- end
- end
-
-
- describe 'for users that signed up, the email' do
- let(:example_site_path) { root_path }
- let(:new_user) { create(:user, email: 'newguy@example.com', password: "securePassword") }
-
- subject { Notify.new_user_email(new_user.id) }
-
- it_behaves_like 'an email sent from GitLab'
-
- it 'is sent to the new user' do
- is_expected.to deliver_to new_user.email
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /^Account was created for you$/i
- end
-
- it 'contains the new user\'s login name' do
- is_expected.to have_body_text /#{new_user.email}/
- end
-
- it 'should not contain the new user\'s password' do
- is_expected.not_to have_body_text /password/
- end
-
- it 'includes a link to the site' do
- is_expected.to have_body_text /#{example_site_path}/
- end
- end
-
- describe 'user added ssh key' do
- let(:key) { create(:personal_key) }
-
- subject { Notify.new_ssh_key_email(key.id) }
-
- it_behaves_like 'an email sent from GitLab'
-
- it 'is sent to the new user' do
- is_expected.to deliver_to key.user.email
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /^SSH key was added to your account$/i
- end
-
- it 'contains the new ssh key title' do
- is_expected.to have_body_text /#{key.title}/
- end
-
- it 'includes a link to ssh keys page' do
- is_expected.to have_body_text /#{profile_keys_path}/
- end
- end
-
- describe 'user added email' do
- let(:email) { create(:email) }
-
- subject { Notify.new_email_email(email.id) }
-
- it 'is sent to the new user' do
- is_expected.to deliver_to email.user.email
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /^Email was added to your account$/i
- end
-
- it 'contains the new email address' do
- is_expected.to have_body_text /#{email.email}/
- end
-
- it 'includes a link to emails page' do
- is_expected.to have_body_text /#{profile_emails_path}/
- end
- end
-
- context 'for a project' do
- describe 'items that are assignable, the email' do
- let(:current_user) { create(:user, email: "current@email.com") }
- let(:assignee) { create(:user, email: 'assignee@example.com') }
- let(:previous_assignee) { create(:user, name: 'Previous Assignee') }
-
- shared_examples 'an assignee email' do
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(current_user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'is sent to the assignee' do
- is_expected.to deliver_to assignee.email
- end
- end
-
- context 'for issues' do
- let(:issue) { create(:issue, author: current_user, assignee: assignee, project: project) }
- let(:issue_with_description) { create(:issue, author: current_user, assignee: assignee, project: project, description: Faker::Lorem.sentence) }
-
- describe 'that are new' do
- subject { Notify.new_issue_email(issue.assignee_id, issue.id) }
-
- it_behaves_like 'an assignee email'
- it_behaves_like 'an email starting a new thread', 'issue'
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{project.name} \| #{issue.title} \(##{issue.iid}\)/
- end
-
- it 'contains a link to the new issue' do
- is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
- end
- end
-
- describe 'that are new with a description' do
- subject { Notify.new_issue_email(issue_with_description.assignee_id, issue_with_description.id) }
-
- it 'contains the description' do
- is_expected.to have_body_text /#{issue_with_description.description}/
- end
- end
-
- describe 'that have been reassigned' do
- subject { Notify.reassigned_issue_email(recipient.id, issue.id, previous_assignee.id, current_user) }
-
- it_behaves_like 'a multiple recipients email'
- it_behaves_like 'an answer to an existing thread', 'issue'
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(current_user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/
- end
-
- it 'contains the name of the previous assignee' do
- is_expected.to have_body_text /#{previous_assignee.name}/
- end
-
- it 'contains the name of the new assignee' do
- is_expected.to have_body_text /#{assignee.name}/
- end
-
- it 'contains a link to the issue' do
- is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
- end
- end
-
- describe 'status changed' do
- let(:status) { 'closed' }
- subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) }
-
- it_behaves_like 'an answer to an existing thread', 'issue'
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(current_user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/i
- end
-
- it 'contains the new status' do
- is_expected.to have_body_text /#{status}/i
- end
-
- it 'contains the user name' do
- is_expected.to have_body_text /#{current_user.name}/i
- end
-
- it 'contains a link to the issue' do
- is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
- end
- end
-
- end
-
- context 'for merge requests' do
- let(:merge_author) { create(:user) }
- let(:merge_request) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project) }
- let(:merge_request_with_description) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project, description: Faker::Lorem.sentence) }
-
- describe 'that are new' do
- subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
-
- it_behaves_like 'an assignee email'
- it_behaves_like 'an email starting a new thread', 'merge_request'
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
- end
-
- it 'contains a link to the new merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path(project.namespace, project, merge_request)}/
- end
-
- it 'contains the source branch for the merge request' do
- is_expected.to have_body_text /#{merge_request.source_branch}/
- end
-
- it 'contains the target branch for the merge request' do
- is_expected.to have_body_text /#{merge_request.target_branch}/
- end
-
- it 'has the correct message-id set' do
- is_expected.to have_header 'Message-ID', "<merge_request_#{merge_request.id}@#{Gitlab.config.gitlab.host}>"
- end
- end
-
- describe 'that are new with a description' do
- subject { Notify.new_merge_request_email(merge_request_with_description.assignee_id, merge_request_with_description.id) }
-
- it 'contains the description' do
- is_expected.to have_body_text /#{merge_request_with_description.description}/
- end
- end
-
- describe 'that are reassigned' do
- subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id) }
-
- it_behaves_like 'a multiple recipients email'
- it_behaves_like 'an answer to an existing thread', 'merge_request'
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(current_user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
- end
-
- it 'contains the name of the previous assignee' do
- is_expected.to have_body_text /#{previous_assignee.name}/
- end
-
- it 'contains the name of the new assignee' do
- is_expected.to have_body_text /#{assignee.name}/
- end
-
- it 'contains a link to the merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
- end
- end
-
- describe 'status changed' do
- let(:status) { 'reopened' }
- subject { Notify.merge_request_status_email(recipient.id, merge_request.id, status, current_user) }
-
- it_behaves_like 'an answer to an existing thread', 'merge_request'
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(current_user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/i
- end
-
- it 'contains the new status' do
- is_expected.to have_body_text /#{status}/i
- end
-
- it 'contains the user name' do
- is_expected.to have_body_text /#{current_user.name}/i
- end
-
- it 'contains a link to the merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
- end
- end
-
- describe 'that are merged' do
- subject { Notify.merged_merge_request_email(recipient.id, merge_request.id, merge_author.id) }
-
- it_behaves_like 'a multiple recipients email'
- it_behaves_like 'an answer to an existing thread', 'merge_request'
-
- it 'is sent as the merge author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(merge_author.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
- end
-
- it 'contains the new status' do
- is_expected.to have_body_text /merged/i
- end
-
- it 'contains a link to the merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
- end
- end
- end
- end
-
- describe 'project was moved' do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- subject { Notify.project_was_moved_email(project.id, user.id) }
-
- it_behaves_like 'an email sent from GitLab'
-
- it 'has the correct subject' do
- is_expected.to have_subject /Project was moved/
- end
-
- it 'contains name of project' do
- is_expected.to have_body_text /#{project.name_with_namespace}/
- end
-
- it 'contains new user role' do
- is_expected.to have_body_text /#{project.ssh_url_to_repo}/
- end
- end
-
- describe 'project access changed' do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- let(:project_member) { create(:project_member,
- project: project,
- user: user) }
- subject { Notify.project_access_granted_email(project_member.id) }
-
- it_behaves_like 'an email sent from GitLab'
-
- it 'has the correct subject' do
- is_expected.to have_subject /Access to project was granted/
- end
- it 'contains name of project' do
- is_expected.to have_body_text /#{project.name}/
- end
- it 'contains new user role' do
- is_expected.to have_body_text /#{project_member.human_access}/
- end
- end
-
- context 'items that are noteable, the email for a note' do
- let(:note_author) { create(:user, name: 'author_name') }
- let(:note) { create(:note, project: project, author: note_author) }
-
- before :each do
- allow(Note).to receive(:find).with(note.id).and_return(note)
- end
-
- shared_examples 'a note email' do
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(note_author.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'is sent to the given recipient' do
- is_expected.to deliver_to recipient.notification_email
- end
-
- it 'contains the message from the note' do
- is_expected.to have_body_text /#{note.note}/
- end
- end
-
- describe 'on a commit' do
- let(:commit) { project.repository.commit }
-
- before(:each) { allow(note).to receive(:noteable).and_return(commit) }
-
- subject { Notify.note_commit_email(recipient.id, note.id) }
-
- it_behaves_like 'a note email'
- it_behaves_like 'an answer to an existing thread', 'commits'
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{commit.title} \(#{commit.short_id}\)/
- end
-
- it 'contains a link to the commit' do
- is_expected.to have_body_text commit.short_id
- end
- end
-
- describe 'on a merge request' do
- let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
- let(:note_on_merge_request_path) { namespace_project_merge_request_path(project.namespace, project, merge_request, anchor: "note_#{note.id}") }
- before(:each) { allow(note).to receive(:noteable).and_return(merge_request) }
-
- subject { Notify.note_merge_request_email(recipient.id, note.id) }
-
- it_behaves_like 'a note email'
- it_behaves_like 'an answer to an existing thread', 'merge_request'
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
- end
-
- it 'contains a link to the merge request note' do
- is_expected.to have_body_text /#{note_on_merge_request_path}/
- end
- end
-
- describe 'on an issue' do
- let(:issue) { create(:issue, project: project) }
- let(:note_on_issue_path) { namespace_project_issue_path(project.namespace, project, issue, anchor: "note_#{note.id}") }
- before(:each) { allow(note).to receive(:noteable).and_return(issue) }
-
- subject { Notify.note_issue_email(recipient.id, note.id) }
-
- it_behaves_like 'a note email'
- it_behaves_like 'an answer to an existing thread', 'issue'
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/
- end
-
- it 'contains a link to the issue note' do
- is_expected.to have_body_text /#{note_on_issue_path}/
- end
- end
- end
- end
-
- describe 'group access changed' do
- let(:group) { create(:group) }
- let(:user) { create(:user) }
- let(:membership) { create(:group_member, group: group, user: user) }
-
- subject { Notify.group_access_granted_email(membership.id) }
-
- it_behaves_like 'an email sent from GitLab'
-
- it 'has the correct subject' do
- is_expected.to have_subject /Access to group was granted/
- end
-
- it 'contains name of project' do
- is_expected.to have_body_text /#{group.name}/
- end
-
- it 'contains new user role' do
- is_expected.to have_body_text /#{membership.human_access}/
- end
- end
-
- describe 'confirmation if email changed' do
- let(:example_site_path) { root_path }
- let(:user) { create(:user, email: 'old-email@mail.com') }
-
- before do
- user.email = "new-email@mail.com"
- user.save
- end
-
- subject { ActionMailer::Base.deliveries.last }
-
- it_behaves_like 'an email sent from GitLab'
-
- it 'is sent to the new user' do
- is_expected.to deliver_to 'new-email@mail.com'
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject "Confirmation instructions"
- end
-
- it 'includes a link to the site' do
- is_expected.to have_body_text /#{example_site_path}/
- end
- end
-
- describe 'email on push for a created branch' do
- let(:example_site_path) { root_path }
- let(:user) { create(:user) }
- let(:tree_path) { namespace_project_tree_path(project.namespace, project, "master") }
-
- subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/heads/master', action: :create) }
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'is sent to recipient' do
- is_expected.to deliver_to 'devs@company.name'
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /Pushed new branch master/
- end
-
- it 'contains a link to the branch' do
- is_expected.to have_body_text /#{tree_path}/
- end
- end
-
- describe 'email on push for a created tag' do
- let(:example_site_path) { root_path }
- let(:user) { create(:user) }
- let(:tree_path) { namespace_project_tree_path(project.namespace, project, "v1.0") }
-
- subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/tags/v1.0', action: :create) }
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'is sent to recipient' do
- is_expected.to deliver_to 'devs@company.name'
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /Pushed new tag v1\.0/
- end
-
- it 'contains a link to the tag' do
- is_expected.to have_body_text /#{tree_path}/
- end
- end
-
- describe 'email on push for a deleted branch' do
- let(:example_site_path) { root_path }
- let(:user) { create(:user) }
-
- subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/heads/master', action: :delete) }
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'is sent to recipient' do
- is_expected.to deliver_to 'devs@company.name'
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /Deleted branch master/
- end
- end
-
- describe 'email on push for a deleted tag' do
- let(:example_site_path) { root_path }
- let(:user) { create(:user) }
-
- subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/tags/v1.0', action: :delete) }
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'is sent to recipient' do
- is_expected.to deliver_to 'devs@company.name'
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /Deleted tag v1\.0/
- end
- end
-
- describe 'email on push with multiple commits' do
- let(:example_site_path) { root_path }
- let(:user) { create(:user) }
- let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_image_commit.id, sample_commit.id) }
- let(:commits) { Commit.decorate(compare.commits) }
- let(:diff_path) { namespace_project_compare_path(project.namespace, project, from: Commit.new(compare.base), to: Commit.new(compare.head)) }
- let(:send_from_committer_email) { false }
-
- subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/heads/master', action: :push, compare: compare, reverse_compare: false, send_from_committer_email: send_from_committer_email) }
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'is sent to recipient' do
- is_expected.to deliver_to 'devs@company.name'
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /\[#{project.path_with_namespace}\]\[master\] #{commits.length} commits:/
- end
-
- it 'includes commits list' do
- is_expected.to have_body_text /Change some files/
- end
-
- it 'includes diffs' do
- is_expected.to have_body_text /def archive_formats_regex/
- end
-
- it 'contains a link to the diff' do
- is_expected.to have_body_text /#{diff_path}/
- end
-
- it 'doesn not contain the misleading footer' do
- is_expected.not_to have_body_text /you are a member of/
- end
-
- context "when set to send from committer email if domain matches" do
-
- let(:send_from_committer_email) { true }
-
- before do
- allow(Gitlab.config.gitlab).to receive(:host).and_return("gitlab.corp.company.com")
- end
-
- context "when the committer email domain is within the GitLab domain" do
-
- before do
- user.update_attribute(:email, "user@company.com")
- user.confirm!
- end
-
- it "is sent from the committer email" do
- sender = subject.header[:from].addrs[0]
- expect(sender.address).to eq(user.email)
- end
-
- it "is set to reply to the committer email" do
- sender = subject.header[:reply_to].addrs[0]
- expect(sender.address).to eq(user.email)
- end
- end
-
- context "when the committer email domain is not completely within the GitLab domain" do
-
- before do
- user.update_attribute(:email, "user@something.company.com")
- user.confirm!
- end
-
- it "is sent from the default email" do
- sender = subject.header[:from].addrs[0]
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it "is set to reply to the default email" do
- sender = subject.header[:reply_to].addrs[0]
- expect(sender.address).to eq(gitlab_sender_reply_to)
- end
- end
-
- context "when the committer email domain is outside the GitLab domain" do
-
- before do
- user.update_attribute(:email, "user@mpany.com")
- user.confirm!
- end
-
- it "is sent from the default email" do
- sender = subject.header[:from].addrs[0]
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it "is set to reply to the default email" do
- sender = subject.header[:reply_to].addrs[0]
- expect(sender.address).to eq(gitlab_sender_reply_to)
- end
- end
- end
- end
-
- describe 'email on push with a single commit' do
- let(:example_site_path) { root_path }
- let(:user) { create(:user) }
- let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_commit.parent_id, sample_commit.id) }
- let(:commits) { Commit.decorate(compare.commits) }
- let(:diff_path) { namespace_project_commit_path(project.namespace, project, commits.first) }
-
- subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/heads/master', action: :push, compare: compare) }
-
- it 'is sent as the author' do
- sender = subject.header[:from].addrs[0]
- expect(sender.display_name).to eq(user.name)
- expect(sender.address).to eq(gitlab_sender)
- end
-
- it 'is sent to recipient' do
- is_expected.to deliver_to 'devs@company.name'
- end
-
- it 'has the correct subject' do
- is_expected.to have_subject /#{commits.first.title}/
- end
-
- it 'includes commits list' do
- is_expected.to have_body_text /Change some files/
- end
-
- it 'includes diffs' do
- is_expected.to have_body_text /def archive_formats_regex/
- end
-
- it 'contains a link to the diff' do
- is_expected.to have_body_text /#{diff_path}/
- end
- end
-end
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
deleted file mode 100644
index b4f0b2c201a..00000000000
--- a/spec/models/application_setting_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# == Schema Information
-#
-# Table name: application_settings
-#
-# id :integer not null, primary key
-# default_projects_limit :integer
-# default_branch_protection :integer
-# signup_enabled :boolean
-# signin_enabled :boolean
-# gravatar_enabled :boolean
-# sign_in_text :text
-# created_at :datetime
-# updated_at :datetime
-# home_page_url :string(255)
-# default_branch_protection :integer default(2)
-# twitter_sharing_enabled :boolean default(TRUE)
-# restricted_visibility_levels :text
-#
-
-require 'spec_helper'
-
-describe ApplicationSetting, models: true do
- it { expect(ApplicationSetting.create_from_defaults).to be_valid }
-end
diff --git a/spec/models/broadcast_message_spec.rb b/spec/models/broadcast_message_spec.rb
deleted file mode 100644
index 8ab72151a69..00000000000
--- a/spec/models/broadcast_message_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# == Schema Information
-#
-# Table name: broadcast_messages
-#
-# id :integer not null, primary key
-# message :text not null
-# starts_at :datetime
-# ends_at :datetime
-# alert_type :integer
-# created_at :datetime
-# updated_at :datetime
-# color :string(255)
-# font :string(255)
-#
-
-require 'spec_helper'
-
-describe BroadcastMessage do
- subject { create(:broadcast_message) }
-
- it { is_expected.to be_valid }
-
- describe :current do
- it "should return last message if time match" do
- broadcast_message = create(:broadcast_message, starts_at: Time.now.yesterday, ends_at: Time.now.tomorrow)
- expect(BroadcastMessage.current).to eq(broadcast_message)
- end
-
- it "should return nil if time not come" do
- broadcast_message = create(:broadcast_message, starts_at: Time.now.tomorrow, ends_at: Time.now + 2.days)
- expect(BroadcastMessage.current).to be_nil
- end
-
- it "should return nil if time has passed" do
- broadcast_message = create(:broadcast_message, starts_at: Time.now - 2.days, ends_at: Time.now.yesterday)
- expect(BroadcastMessage.current).to be_nil
- end
- end
-end
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
deleted file mode 100644
index 11cc7762ce4..00000000000
--- a/spec/models/commit_spec.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-require 'spec_helper'
-
-describe Commit do
- let(:project) { create :project }
- let(:commit) { project.repository.commit }
-
- describe '#title' do
- it "returns no_commit_message when safe_message is blank" do
- allow(commit).to receive(:safe_message).and_return('')
- expect(commit.title).to eq("--no commit message")
- end
-
- it "truncates a message without a newline at 80 characters" do
- message = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sodales id felis id blandit. Vivamus egestas lacinia lacus, sed rutrum mauris.'
-
- allow(commit).to receive(:safe_message).and_return(message)
- expect(commit.title).to eq("#{message[0..79]}…")
- end
-
- it "truncates a message with a newline before 80 characters at the newline" do
- message = commit.safe_message.split(" ").first
-
- allow(commit).to receive(:safe_message).and_return(message + "\n" + message)
- expect(commit.title).to eq(message)
- end
-
- it "does not truncates a message with a newline after 80 but less 100 characters" do
- message =<<eos
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sodales id felis id blandit.
-Vivamus egestas lacinia lacus, sed rutrum mauris.
-eos
-
- allow(commit).to receive(:safe_message).and_return(message)
- expect(commit.title).to eq(message.split("\n").first)
- end
- end
-
- describe "delegation" do
- subject { commit }
-
- it { is_expected.to respond_to(:message) }
- it { is_expected.to respond_to(:authored_date) }
- it { is_expected.to respond_to(:committed_date) }
- it { is_expected.to respond_to(:committer_email) }
- it { is_expected.to respond_to(:author_email) }
- it { is_expected.to respond_to(:parents) }
- it { is_expected.to respond_to(:date) }
- it { is_expected.to respond_to(:diffs) }
- it { is_expected.to respond_to(:tree) }
- it { is_expected.to respond_to(:id) }
- it { is_expected.to respond_to(:to_patch) }
- end
-
- describe '#closes_issues' do
- let(:issue) { create :issue, project: project }
- let(:other_project) { create :project, :public }
- let(:other_issue) { create :issue, project: other_project }
-
- it 'detects issues that this commit is marked as closing' do
- commit.stub(safe_message: "Fixes ##{issue.iid}")
- expect(commit.closes_issues(project)).to eq([issue])
- end
-
- it 'does not detect issues from other projects' do
- ext_ref = "#{other_project.path_with_namespace}##{other_issue.iid}"
- commit.stub(safe_message: "Fixes #{ext_ref}")
- expect(commit.closes_issues(project)).to be_empty
- end
- end
-
- it_behaves_like 'a mentionable' do
- let(:subject) { commit }
- let(:mauthor) { create :user, email: commit.author_email }
- let(:backref_text) { "commit #{subject.id}" }
- let(:set_mentionable_text) { ->(txt){ subject.stub(safe_message: txt) } }
-
- # Include the subject in the repository stub.
- let(:extra_commits) { [subject] }
- end
-end
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
deleted file mode 100644
index 557c71b4d2c..00000000000
--- a/spec/models/concerns/issuable_spec.rb
+++ /dev/null
@@ -1,66 +0,0 @@
-require 'spec_helper'
-
-describe Issue, "Issuable" do
- let(:issue) { create(:issue) }
-
- describe "Associations" do
- it { is_expected.to belong_to(:project) }
- it { is_expected.to belong_to(:author) }
- it { is_expected.to belong_to(:assignee) }
- it { is_expected.to have_many(:notes).dependent(:destroy) }
- end
-
- describe "Validation" do
- before { subject.stub(set_iid: false) }
- it { is_expected.to validate_presence_of(:project) }
- it { is_expected.to validate_presence_of(:iid) }
- it { is_expected.to validate_presence_of(:author) }
- it { is_expected.to validate_presence_of(:title) }
- it { is_expected.to ensure_length_of(:title).is_at_least(0).is_at_most(255) }
- end
-
- describe "Scope" do
- it { expect(described_class).to respond_to(:opened) }
- it { expect(described_class).to respond_to(:closed) }
- it { expect(described_class).to respond_to(:assigned) }
- end
-
- describe ".search" do
- let!(:searchable_issue) { create(:issue, title: "Searchable issue") }
-
- it "matches by title" do
- expect(described_class.search('able')).to eq([searchable_issue])
- end
- end
-
- describe "#today?" do
- it "returns true when created today" do
- # Avoid timezone differences and just return exactly what we want
- allow(Date).to receive(:today).and_return(issue.created_at.to_date)
- expect(issue.today?).to be_truthy
- end
-
- it "returns false when not created today" do
- allow(Date).to receive(:today).and_return(Date.yesterday)
- expect(issue.today?).to be_falsey
- end
- end
-
- describe "#new?" do
- it "returns true when created today and record hasn't been updated" do
- allow(issue).to receive(:today?).and_return(true)
- expect(issue.new?).to be_truthy
- end
-
- it "returns false when not created today" do
- allow(issue).to receive(:today?).and_return(false)
- expect(issue.new?).to be_falsey
- end
-
- it "returns false when record has been updated" do
- allow(issue).to receive(:today?).and_return(true)
- issue.touch
- expect(issue.new?).to be_falsey
- end
- end
-end
diff --git a/spec/models/concerns/mentionable_spec.rb b/spec/models/concerns/mentionable_spec.rb
deleted file mode 100644
index eadb941a3fa..00000000000
--- a/spec/models/concerns/mentionable_spec.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-require 'spec_helper'
-
-describe Issue, "Mentionable" do
- describe :mentioned_users do
- let!(:user) { create(:user, username: 'stranger') }
- let!(:user2) { create(:user, username: 'john') }
- let!(:issue) { create(:issue, description: '@stranger mentioned') }
-
- subject { issue.mentioned_users }
-
- it { is_expected.to include(user) }
- it { is_expected.not_to include(user2) }
- end
-end
diff --git a/spec/models/deploy_key_spec.rb b/spec/models/deploy_key_spec.rb
deleted file mode 100644
index b32be8d7a7c..00000000000
--- a/spec/models/deploy_key_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# == Schema Information
-#
-# Table name: keys
-#
-# id :integer not null, primary key
-# user_id :integer
-# created_at :datetime
-# updated_at :datetime
-# key :text
-# title :string(255)
-# type :string(255)
-# fingerprint :string(255)
-#
-
-require 'spec_helper'
-
-describe DeployKey do
- let(:project) { create(:project) }
- let(:deploy_key) { create(:deploy_key, projects: [project]) }
-
- describe "Associations" do
- it { is_expected.to have_many(:deploy_keys_projects) }
- it { is_expected.to have_many(:projects) }
- end
-end
diff --git a/spec/models/deploy_keys_project_spec.rb b/spec/models/deploy_keys_project_spec.rb
deleted file mode 100644
index 7032b777144..00000000000
--- a/spec/models/deploy_keys_project_spec.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# == Schema Information
-#
-# Table name: deploy_keys_projects
-#
-# id :integer not null, primary key
-# deploy_key_id :integer not null
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-#
-
-require 'spec_helper'
-
-describe DeployKeysProject do
- describe "Associations" do
- it { is_expected.to belong_to(:deploy_key) }
- it { is_expected.to belong_to(:project) }
- end
-
- describe "Validation" do
- it { is_expected.to validate_presence_of(:project_id) }
- it { is_expected.to validate_presence_of(:deploy_key_id) }
- end
-
- describe "Destroying" do
- let(:project) { create(:project) }
- subject { create(:deploy_keys_project, project: project) }
- let(:deploy_key) { subject.deploy_key }
-
- context "when the deploy key is only used by this project" do
- context "when the deploy key is public" do
- before do
- deploy_key.update_attribute(:public, true)
- end
-
- it "doesn't destroy the deploy key" do
- subject.destroy
-
- expect {
- deploy_key.reload
- }.not_to raise_error(ActiveRecord::RecordNotFound)
- end
- end
-
- context "when the deploy key is private" do
- it "destroys the deploy key" do
- subject.destroy
-
- expect {
- deploy_key.reload
- }.to raise_error(ActiveRecord::RecordNotFound)
- end
- end
- end
-
- context "when the deploy key is used by more than one project" do
- let!(:other_project) { create(:project) }
-
- before do
- other_project.deploy_keys << deploy_key
- end
-
- it "doesn't destroy the deploy key" do
- subject.destroy
-
- expect {
- deploy_key.reload
- }.not_to raise_error(ActiveRecord::RecordNotFound)
- end
- end
- end
-end
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
deleted file mode 100644
index 0f32f162a10..00000000000
--- a/spec/models/event_spec.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-# == Schema Information
-#
-# Table name: events
-#
-# id :integer not null, primary key
-# target_type :string(255)
-# target_id :integer
-# title :string(255)
-# data :text
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# action :integer
-# author_id :integer
-#
-
-require 'spec_helper'
-
-describe Event do
- describe "Associations" do
- it { is_expected.to belong_to(:project) }
- it { is_expected.to belong_to(:target) }
- end
-
- describe "Respond to" do
- it { is_expected.to respond_to(:author_name) }
- it { is_expected.to respond_to(:author_email) }
- it { is_expected.to respond_to(:issue_title) }
- it { is_expected.to respond_to(:merge_request_title) }
- it { is_expected.to respond_to(:commits) }
- end
-
- describe "Push event" do
- before do
- project = create(:project)
- @user = project.owner
-
- data = {
- before: Gitlab::Git::BLANK_SHA,
- after: "0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e",
- ref: "refs/heads/master",
- user_id: @user.id,
- user_name: @user.name,
- repository: {
- name: project.name,
- url: "localhost/rubinius",
- description: "",
- homepage: "localhost/rubinius",
- private: true
- }
- }
-
- @event = Event.create(
- project: project,
- action: Event::PUSHED,
- data: data,
- author_id: @user.id
- )
- end
-
- it { expect(@event.push?).to be_truthy }
- it { expect(@event.proper?).to be_truthy }
- it { expect(@event.tag?).to be_falsey }
- it { expect(@event.branch_name).to eq("master") }
- it { expect(@event.author).to eq(@user) }
- end
-end
diff --git a/spec/models/external_wiki_service_spec.rb b/spec/models/external_wiki_service_spec.rb
deleted file mode 100644
index 78ef687d29c..00000000000
--- a/spec/models/external_wiki_service_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-require 'spec_helper'
-
-describe ExternalWikiService do
- include ExternalWikiHelper
- describe "Associations" do
- it { should belong_to :project }
- it { should have_one :service_hook }
- end
-
- describe "Validations" do
- context "active" do
- before do
- subject.active = true
- end
-
- it { should validate_presence_of :external_wiki_url }
- end
- end
-
- describe 'External wiki' do
- let(:project) { create(:project) }
-
- context 'when it is active' do
- before do
- properties = { 'external_wiki_url' => 'https://gitlab.com' }
- @service = project.create_external_wiki_service(active: true, properties: properties)
- end
-
- after do
- @service.destroy!
- end
-
- it 'should replace the wiki url' do
- wiki_path = get_project_wiki_path(project)
- wiki_path.should match('https://gitlab.com')
- end
- end
- end
-end
diff --git a/spec/models/forked_project_link_spec.rb b/spec/models/forked_project_link_spec.rb
deleted file mode 100644
index 7d0ad44a92c..00000000000
--- a/spec/models/forked_project_link_spec.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-# == Schema Information
-#
-# Table name: forked_project_links
-#
-# id :integer not null, primary key
-# forked_to_project_id :integer not null
-# forked_from_project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-#
-
-require 'spec_helper'
-
-describe ForkedProjectLink, "add link on fork" do
- let(:project_from) { create(:project) }
- let(:namespace) { create(:namespace) }
- let(:user) { create(:user, namespace: namespace) }
-
- before do
- @project_to = fork_project(project_from, user)
- end
-
- it "project_to should know it is forked" do
- expect(@project_to.forked?).to be_truthy
- end
-
- it "project should know who it is forked from" do
- expect(@project_to.forked_from_project).to eq(project_from)
- end
-end
-
-describe :forked_from_project do
- let(:forked_project_link) { build(:forked_project_link) }
- let(:project_from) { create(:project) }
- let(:project_to) { create(:project, forked_project_link: forked_project_link) }
-
-
- before :each do
- forked_project_link.forked_from_project = project_from
- forked_project_link.forked_to_project = project_to
- forked_project_link.save!
- end
-
-
- it "project_to should know it is forked" do
- expect(project_to.forked?).to be_truthy
- end
-
- it "project_from should not be forked" do
- expect(project_from.forked?).to be_falsey
- end
-
- it "project_to.destroy should destroy fork_link" do
- expect(forked_project_link).to receive(:destroy)
- project_to.destroy
- end
-
-end
-
-def fork_project(from_project, user)
- context = Projects::ForkService.new(from_project, user)
- shell = double("gitlab_shell")
- shell.stub(fork_repository: true)
- context.stub(gitlab_shell: shell)
- context.execute
-end
-
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
deleted file mode 100644
index 9428224a64f..00000000000
--- a/spec/models/group_spec.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-# == Schema Information
-#
-# Table name: namespaces
-#
-# id :integer not null, primary key
-# name :string(255) not null
-# path :string(255) not null
-# owner_id :integer
-# created_at :datetime
-# updated_at :datetime
-# type :string(255)
-# description :string(255) default(""), not null
-# avatar :string(255)
-#
-
-require 'spec_helper'
-
-describe Group do
- let!(:group) { create(:group) }
-
- describe "Associations" do
- it { is_expected.to have_many :projects }
- it { is_expected.to have_many :group_members }
- end
-
- it { is_expected.to validate_presence_of :name }
- it { is_expected.to validate_uniqueness_of(:name) }
- it { is_expected.to validate_presence_of :path }
- it { is_expected.to validate_uniqueness_of(:path) }
- it { is_expected.not_to validate_presence_of :owner }
-
- describe :users do
- it { expect(group.users).to eq(group.owners) }
- end
-
- describe :human_name do
- it { expect(group.human_name).to eq(group.name) }
- end
-
- describe :add_users do
- let(:user) { create(:user) }
- before { group.add_user(user, GroupMember::MASTER) }
-
- it { expect(group.group_members.masters.map(&:user)).to include(user) }
- end
-
- describe :add_users do
- let(:user) { create(:user) }
- before { group.add_users([user.id], GroupMember::GUEST) }
-
- it "should update the group permission" do
- expect(group.group_members.guests.map(&:user)).to include(user)
- group.add_users([user.id], GroupMember::DEVELOPER)
- expect(group.group_members.developers.map(&:user)).to include(user)
- expect(group.group_members.guests.map(&:user)).not_to include(user)
- end
- end
-
- describe :avatar_type do
- let(:user) { create(:user) }
- before { group.add_user(user, GroupMember::MASTER) }
-
- it "should be true if avatar is image" do
- group.update_attribute(:avatar, 'uploads/avatar.png')
- expect(group.avatar_type).to be_truthy
- end
-
- it "should be false if avatar is html page" do
- group.update_attribute(:avatar, 'uploads/avatar.html')
- expect(group.avatar_type).to eq(["only images allowed"])
- end
- end
-end
diff --git a/spec/models/hooks/project_hook_spec.rb b/spec/models/hooks/project_hook_spec.rb
deleted file mode 100644
index 4e0d50d7f3f..00000000000
--- a/spec/models/hooks/project_hook_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# == Schema Information
-#
-# Table name: web_hooks
-#
-# id :integer not null, primary key
-# url :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# type :string(255) default("ProjectHook")
-# service_id :integer
-# push_events :boolean default(TRUE), not null
-# issues_events :boolean default(FALSE), not null
-# merge_requests_events :boolean default(FALSE), not null
-# tag_push_events :boolean default(FALSE)
-#
-
-require 'spec_helper'
-
-describe ProjectHook do
- describe '.push_hooks' do
- it 'should return hooks for push events only' do
- hook = create(:project_hook, push_events: true)
- hook2 = create(:project_hook, push_events: false)
- expect(ProjectHook.push_hooks).to eq([hook])
- end
- end
-
- describe '.tag_push_hooks' do
- it 'should return hooks for tag push events only' do
- hook = create(:project_hook, tag_push_events: true)
- hook2 = create(:project_hook, tag_push_events: false)
- expect(ProjectHook.tag_push_hooks).to eq([hook])
- end
- end
-end
diff --git a/spec/models/hooks/service_hook_spec.rb b/spec/models/hooks/service_hook_spec.rb
deleted file mode 100644
index 96bf74d45da..00000000000
--- a/spec/models/hooks/service_hook_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# == Schema Information
-#
-# Table name: web_hooks
-#
-# id :integer not null, primary key
-# url :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# type :string(255) default("ProjectHook")
-# service_id :integer
-# push_events :boolean default(TRUE), not null
-# issues_events :boolean default(FALSE), not null
-# merge_requests_events :boolean default(FALSE), not null
-# tag_push_events :boolean default(FALSE)
-#
-
-require "spec_helper"
-
-describe ServiceHook do
- describe "Associations" do
- it { is_expected.to belong_to :service }
- end
-end
diff --git a/spec/models/hooks/system_hook_spec.rb b/spec/models/hooks/system_hook_spec.rb
deleted file mode 100644
index 810b311a40b..00000000000
--- a/spec/models/hooks/system_hook_spec.rb
+++ /dev/null
@@ -1,100 +0,0 @@
-# == Schema Information
-#
-# Table name: web_hooks
-#
-# id :integer not null, primary key
-# url :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# type :string(255) default("ProjectHook")
-# service_id :integer
-# push_events :boolean default(TRUE), not null
-# issues_events :boolean default(FALSE), not null
-# merge_requests_events :boolean default(FALSE), not null
-# tag_push_events :boolean default(FALSE)
-#
-
-require "spec_helper"
-
-describe SystemHook do
- describe "execute" do
- before(:each) do
- @system_hook = create(:system_hook)
- WebMock.stub_request(:post, @system_hook.url)
- end
-
- it "project_create hook" do
- Projects::CreateService.new(create(:user), name: 'empty').execute
- expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /project_create/).once
- end
-
- it "project_destroy hook" do
- user = create(:user)
- project = create(:empty_project, namespace: user.namespace)
- Projects::DestroyService.new(project, user, {}).execute
- expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /project_destroy/).once
- end
-
- it "user_create hook" do
- create(:user)
- expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /user_create/).once
- end
-
- it "user_destroy hook" do
- user = create(:user)
- user.destroy
- expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /user_destroy/).once
- end
-
- it "project_create hook" do
- user = create(:user)
- project = create(:project)
- project.team << [user, :master]
- expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /user_add_to_team/).once
- end
-
- it "project_destroy hook" do
- user = create(:user)
- project = create(:project)
- project.team << [user, :master]
- project.project_members.destroy_all
- expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /user_remove_from_team/).once
- end
-
- it 'group create hook' do
- create(:group)
- expect(WebMock).to have_requested(:post, @system_hook.url).with(
- body: /group_create/
- ).once
- end
-
- it 'group destroy hook' do
- group = create(:group)
- group.destroy
- expect(WebMock).to have_requested(:post, @system_hook.url).with(
- body: /group_destroy/
- ).once
- end
-
- it 'group member create hook' do
- group = create(:group)
- user = create(:user)
- group.add_user(user, Gitlab::Access::MASTER)
- expect(WebMock).to have_requested(:post, @system_hook.url).with(
- body: /user_add_to_group/
- ).once
- end
-
- it 'group member destroy hook' do
- group = create(:group)
- user = create(:user)
- group.add_user(user, Gitlab::Access::MASTER)
- group.group_members.destroy_all
- expect(WebMock).to have_requested(:post, @system_hook.url).with(
- body: /user_remove_from_group/
- ).once
- end
-
- end
-end
diff --git a/spec/models/hooks/web_hook_spec.rb b/spec/models/hooks/web_hook_spec.rb
deleted file mode 100644
index 67ec9193ad7..00000000000
--- a/spec/models/hooks/web_hook_spec.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-# == Schema Information
-#
-# Table name: web_hooks
-#
-# id :integer not null, primary key
-# url :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# type :string(255) default("ProjectHook")
-# service_id :integer
-# push_events :boolean default(TRUE), not null
-# issues_events :boolean default(FALSE), not null
-# merge_requests_events :boolean default(FALSE), not null
-# tag_push_events :boolean default(FALSE)
-#
-
-require 'spec_helper'
-
-describe ProjectHook do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- end
-
- describe "Mass assignment" do
- end
-
- describe "Validations" do
- it { is_expected.to validate_presence_of(:url) }
-
- context "url format" do
- it { is_expected.to allow_value("http://example.com").for(:url) }
- it { is_expected.to allow_value("https://excample.com").for(:url) }
- it { is_expected.to allow_value("http://test.com/api").for(:url) }
- it { is_expected.to allow_value("http://test.com/api?key=abc").for(:url) }
- it { is_expected.to allow_value("http://test.com/api?key=abc&type=def").for(:url) }
-
- it { is_expected.not_to allow_value("example.com").for(:url) }
- it { is_expected.not_to allow_value("ftp://example.com").for(:url) }
- it { is_expected.not_to allow_value("herp-and-derp").for(:url) }
- end
- end
-
- describe "execute" do
- before(:each) do
- @project_hook = create(:project_hook)
- @project = create(:project)
- @project.hooks << [@project_hook]
- @data = { before: 'oldrev', after: 'newrev', ref: 'ref'}
-
- WebMock.stub_request(:post, @project_hook.url)
- end
-
- it "POSTs to the web hook URL" do
- @project_hook.execute(@data)
- expect(WebMock).to have_requested(:post, @project_hook.url).once
- end
-
- it "POSTs the data as JSON" do
- json = @data.to_json
-
- @project_hook.execute(@data)
- expect(WebMock).to have_requested(:post, @project_hook.url).with(body: json).once
- end
-
- it "catches exceptions" do
- expect(WebHook).to receive(:post).and_raise("Some HTTP Post error")
-
- expect {
- @project_hook.execute(@data)
- }.to raise_error
- end
- end
-end
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
deleted file mode 100644
index 087e40c3d84..00000000000
--- a/spec/models/issue_spec.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-# == Schema Information
-#
-# Table name: issues
-#
-# id :integer not null, primary key
-# title :string(255)
-# assignee_id :integer
-# author_id :integer
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# position :integer default(0)
-# branch_name :string(255)
-# description :text
-# milestone_id :integer
-# state :string(255)
-# iid :integer
-#
-
-require 'spec_helper'
-
-describe Issue do
- describe "Associations" do
- it { is_expected.to belong_to(:milestone) }
- end
-
- describe "Mass assignment" do
- end
-
- describe 'modules' do
- it { is_expected.to include_module(Issuable) }
- end
-
- subject { create(:issue) }
-
- describe '#is_being_reassigned?' do
- it 'returns true if the issue assignee has changed' do
- subject.assignee = create(:user)
- expect(subject.is_being_reassigned?).to be_truthy
- end
- it 'returns false if the issue assignee has not changed' do
- expect(subject.is_being_reassigned?).to be_falsey
- end
- end
-
- describe '#is_being_reassigned?' do
- it 'returns issues assigned to user' do
- user = create :user
-
- 2.times do
- issue = create :issue, assignee: user
- end
-
- expect(Issue.open_for(user).count).to eq 2
- end
- end
-
- it_behaves_like 'an editable mentionable' do
- let(:subject) { create :issue, project: mproject }
- let(:backref_text) { "issue ##{subject.iid}" }
- let(:set_mentionable_text) { ->(txt){ subject.description = txt } }
- end
-
- it_behaves_like 'a Taskable' do
- let(:subject) { create :issue }
- end
-end
diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb
deleted file mode 100644
index 2fb651bef1b..00000000000
--- a/spec/models/key_spec.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-# == Schema Information
-#
-# Table name: keys
-#
-# id :integer not null, primary key
-# user_id :integer
-# created_at :datetime
-# updated_at :datetime
-# key :text
-# title :string(255)
-# type :string(255)
-# fingerprint :string(255)
-#
-
-require 'spec_helper'
-
-describe Key do
- describe "Associations" do
- it { is_expected.to belong_to(:user) }
- end
-
- describe "Mass assignment" do
- end
-
- describe "Validation" do
- it { is_expected.to validate_presence_of(:title) }
- it { is_expected.to validate_presence_of(:key) }
- it { is_expected.to ensure_length_of(:title).is_within(0..255) }
- it { is_expected.to ensure_length_of(:key).is_within(0..5000) }
- end
-
- describe "Methods" do
- it { is_expected.to respond_to :projects }
- end
-
- context "validation of uniqueness" do
- let(:user) { create(:user) }
-
- it "accepts the key once" do
- expect(build(:key, user: user)).to be_valid
- end
-
- it "does not accept the exact same key twice" do
- create(:key, user: user)
- expect(build(:key, user: user)).not_to be_valid
- end
-
- it "does not accept a duplicate key with a different comment" do
- create(:key, user: user)
- duplicate = build(:key, user: user)
- duplicate.key << ' extra comment'
- expect(duplicate).not_to be_valid
- end
- end
-
- context "validate it is a fingerprintable key" do
- it "accepts the fingerprintable key" do
- expect(build(:key)).to be_valid
- end
-
- it 'rejects an unfingerprintable key that contains a space' do
- key = build(:key)
-
- # Not always the middle, but close enough
- key.key = key.key[0..100] + ' ' + key.key[100..-1]
-
- expect(key).not_to be_valid
- end
-
- it 'rejects the unfingerprintable key (not a key)' do
- expect(build(:key, key: 'ssh-rsa an-invalid-key==')).not_to be_valid
- end
- end
-
- context 'callbacks' do
- it 'should add new key to authorized_file' do
- @key = build(:personal_key, id: 7)
- expect(GitlabShellWorker).to receive(:perform_async).with(:add_key, @key.shell_id, @key.key)
- @key.save
- end
-
- it 'should remove key from authorized_file' do
- @key = create(:personal_key)
- expect(GitlabShellWorker).to receive(:perform_async).with(:remove_key, @key.shell_id, @key.key)
- @key.destroy
- end
- end
-end
diff --git a/spec/models/label_link_spec.rb b/spec/models/label_link_spec.rb
deleted file mode 100644
index 8c240826582..00000000000
--- a/spec/models/label_link_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# == Schema Information
-#
-# Table name: label_links
-#
-# id :integer not null, primary key
-# label_id :integer
-# target_id :integer
-# target_type :string(255)
-# created_at :datetime
-# updated_at :datetime
-#
-
-require 'spec_helper'
-
-describe LabelLink do
- let(:label) { create(:label_link) }
- it { expect(label).to be_valid }
-
- it { is_expected.to belong_to(:label) }
- it { is_expected.to belong_to(:target) }
-end
diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb
deleted file mode 100644
index 8644ac46605..00000000000
--- a/spec/models/label_spec.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# == Schema Information
-#
-# Table name: labels
-#
-# id :integer not null, primary key
-# title :string(255)
-# color :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-#
-
-require 'spec_helper'
-
-describe Label do
- let(:label) { create(:label) }
- it { expect(label).to be_valid }
-
- it { is_expected.to belong_to(:project) }
-
- describe 'Validation' do
- it 'should validate color code' do
- expect(build(:label, color: 'G-ITLAB')).not_to be_valid
- expect(build(:label, color: 'AABBCC')).not_to be_valid
- expect(build(:label, color: '#AABBCCEE')).not_to be_valid
- expect(build(:label, color: '#GGHHII')).not_to be_valid
- expect(build(:label, color: '#')).not_to be_valid
- expect(build(:label, color: '')).not_to be_valid
-
- expect(build(:label, color: '#AABBCC')).to be_valid
- end
-
- it 'should validate title' do
- expect(build(:label, title: 'G,ITLAB')).not_to be_valid
- expect(build(:label, title: 'G?ITLAB')).not_to be_valid
- expect(build(:label, title: 'G&ITLAB')).not_to be_valid
- expect(build(:label, title: '')).not_to be_valid
-
- expect(build(:label, title: 'GITLAB')).to be_valid
- expect(build(:label, title: 'gitlab')).to be_valid
- end
- end
-end
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
deleted file mode 100644
index 56d030a03b3..00000000000
--- a/spec/models/member_spec.rb
+++ /dev/null
@@ -1,148 +0,0 @@
-require 'spec_helper'
-
-describe Member do
- describe "Associations" do
- it { is_expected.to belong_to(:user) }
- end
-
- describe "Validation" do
- subject { Member.new(access_level: Member::GUEST) }
-
- it { is_expected.to validate_presence_of(:user) }
- it { is_expected.to validate_presence_of(:source) }
- it { is_expected.to validate_inclusion_of(:access_level).in_array(Gitlab::Access.values) }
-
- context "when an invite email is provided" do
- let(:member) { build(:project_member, invite_email: "user@example.com", user: nil) }
-
- it "doesn't require a user" do
- expect(member).to be_valid
- end
-
- it "requires a valid invite email" do
- member.invite_email = "nope"
-
- expect(member).not_to be_valid
- end
-
- it "requires a unique invite email scoped to this source" do
- create(:project_member, source: member.source, invite_email: member.invite_email)
-
- expect(member).not_to be_valid
- end
-
- it "is valid otherwise" do
- expect(member).to be_valid
- end
- end
-
- context "when an invite email is not provided" do
- let(:member) { build(:project_member) }
-
- it "requires a user" do
- member.user = nil
-
- expect(member).not_to be_valid
- end
-
- it "is valid otherwise" do
- expect(member).to be_valid
- end
- end
- end
-
- describe "Delegate methods" do
- it { is_expected.to respond_to(:user_name) }
- it { is_expected.to respond_to(:user_email) }
- end
-
- describe ".add_user" do
- let!(:user) { create(:user) }
- let(:project) { create(:project) }
-
- context "when called with a user id" do
- it "adds the user as a member" do
- Member.add_user(project.project_members, user.id, ProjectMember::MASTER)
-
- expect(project.users).to include(user)
- end
- end
-
- context "when called with a user object" do
- it "adds the user as a member" do
- Member.add_user(project.project_members, user, ProjectMember::MASTER)
-
- expect(project.users).to include(user)
- end
- end
-
- context "when called with a known user email" do
- it "adds the user as a member" do
- Member.add_user(project.project_members, user.email, ProjectMember::MASTER)
-
- expect(project.users).to include(user)
- end
- end
-
- context "when called with an unknown user email" do
- it "adds a member invite" do
- Member.add_user(project.project_members, "user@example.com", ProjectMember::MASTER)
-
- expect(project.project_members.invite.pluck(:invite_email)).to include("user@example.com")
- end
- end
- end
-
- describe "#accept_invite!" do
- let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) }
- let(:user) { create(:user) }
-
- it "resets the invite token" do
- member.accept_invite!(user)
-
- expect(member.invite_token).to be_nil
- end
-
- it "sets the invite accepted timestamp" do
- member.accept_invite!(user)
-
- expect(member.invite_accepted_at).not_to be_nil
- end
-
- it "sets the user" do
- member.accept_invite!(user)
-
- expect(member.user).to eq(user)
- end
-
- it "calls #after_accept_invite" do
- expect(member).to receive(:after_accept_invite)
-
- member.accept_invite!(user)
- end
- end
-
- describe "#decline_invite!" do
- let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) }
-
- it "destroys the member" do
- member.decline_invite!
-
- expect(member).to be_destroyed
- end
-
- it "calls #after_decline_invite" do
- expect(member).to receive(:after_decline_invite)
-
- member.decline_invite!
- end
- end
-
- describe "#generate_invite_token" do
- let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) }
-
- it "sets the invite token" do
- expect { member.generate_invite_token }.to change { member.invite_token}
- end
- end
-end
diff --git a/spec/models/members/group_member_spec.rb b/spec/models/members/group_member_spec.rb
deleted file mode 100644
index e206c11f33a..00000000000
--- a/spec/models/members/group_member_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# == Schema Information
-#
-# Table name: members
-#
-# id :integer not null, primary key
-# access_level :integer not null
-# source_id :integer not null
-# source_type :string(255) not null
-# user_id :integer not null
-# notification_level :integer not null
-# type :string(255)
-# created_at :datetime
-# updated_at :datetime
-#
-
-require 'spec_helper'
-
-describe GroupMember do
- context 'notification' do
- describe "#after_create" do
- it "should send email to user" do
- membership = build(:group_member)
- membership.stub(notification_service: double('NotificationService').as_null_object)
- expect(membership).to receive(:notification_service)
- membership.save
- end
- end
-
- describe "#after_update" do
- before do
- @group_member = create :group_member
- @group_member.stub(notification_service: double('NotificationService').as_null_object)
- end
-
- it "should send email to user" do
- expect(@group_member).to receive(:notification_service)
- @group_member.update_attribute(:access_level, GroupMember::MASTER)
- end
-
- it "does not send an email when the access level has not changed" do
- expect(@group_member).not_to receive(:notification_service)
- @group_member.update_attribute(:access_level, GroupMember::OWNER)
- end
- end
- end
-end
diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb
deleted file mode 100644
index 521721f3577..00000000000
--- a/spec/models/members/project_member_spec.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# == Schema Information
-#
-# Table name: members
-#
-# id :integer not null, primary key
-# access_level :integer not null
-# source_id :integer not null
-# source_type :string(255) not null
-# user_id :integer not null
-# notification_level :integer not null
-# type :string(255)
-# created_at :datetime
-# updated_at :datetime
-#
-
-require 'spec_helper'
-
-describe ProjectMember do
- describe :import_team do
- before do
- @abilities = Six.new
- @abilities << Ability
-
- @project_1 = create :project
- @project_2 = create :project
-
- @user_1 = create :user
- @user_2 = create :user
-
- @project_1.team << [ @user_1, :developer ]
- @project_2.team << [ @user_2, :reporter ]
-
- @status = @project_2.team.import(@project_1)
- end
-
- it { expect(@status).to be_truthy }
-
- describe 'project 2 should get user 1 as developer. user_2 should not be changed' do
- it { expect(@project_2.users).to include(@user_1) }
- it { expect(@project_2.users).to include(@user_2) }
-
- it { expect(@abilities.allowed?(@user_1, :write_project, @project_2)).to be_truthy }
- it { expect(@abilities.allowed?(@user_2, :read_project, @project_2)).to be_truthy }
- end
-
- describe 'project 1 should not be changed' do
- it { expect(@project_1.users).to include(@user_1) }
- it { expect(@project_1.users).not_to include(@user_2) }
- end
- end
-
- describe :add_users_into_projects do
- before do
- @project_1 = create :project
- @project_2 = create :project
-
- @user_1 = create :user
- @user_2 = create :user
-
- ProjectMember.add_users_into_projects(
- [@project_1.id, @project_2.id],
- [@user_1.id, @user_2.id],
- ProjectMember::MASTER
- )
- end
-
- it { expect(@project_1.users).to include(@user_1) }
- it { expect(@project_1.users).to include(@user_2) }
-
-
- it { expect(@project_2.users).to include(@user_1) }
- it { expect(@project_2.users).to include(@user_2) }
- end
-
- describe :truncate_teams do
- before do
- @project_1 = create :project
- @project_2 = create :project
-
- @user_1 = create :user
- @user_2 = create :user
-
- @project_1.team << [ @user_1, :developer]
- @project_2.team << [ @user_2, :reporter]
-
- ProjectMember.truncate_teams([@project_1.id, @project_2.id])
- end
-
- it { expect(@project_1.users).to be_empty }
- it { expect(@project_2.users).to be_empty }
- end
-end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
deleted file mode 100644
index d40503d791c..00000000000
--- a/spec/models/merge_request_spec.rb
+++ /dev/null
@@ -1,127 +0,0 @@
-# == Schema Information
-#
-# Table name: merge_requests
-#
-# id :integer not null, primary key
-# target_branch :string(255) not null
-# source_branch :string(255) not null
-# source_project_id :integer not null
-# author_id :integer
-# assignee_id :integer
-# title :string(255)
-# created_at :datetime
-# updated_at :datetime
-# milestone_id :integer
-# state :string(255)
-# merge_status :string(255)
-# target_project_id :integer not null
-# iid :integer
-# description :text
-# position :integer default(0)
-# locked_at :datetime
-#
-
-require 'spec_helper'
-
-describe MergeRequest do
- describe "Validation" do
- it { is_expected.to validate_presence_of(:target_branch) }
- it { is_expected.to validate_presence_of(:source_branch) }
- end
-
- describe "Mass assignment" do
- end
-
- describe "Respond to" do
- it { is_expected.to respond_to(:unchecked?) }
- it { is_expected.to respond_to(:can_be_merged?) }
- it { is_expected.to respond_to(:cannot_be_merged?) }
- end
-
- describe 'modules' do
- it { is_expected.to include_module(Issuable) }
- end
-
- describe "#mr_and_commit_notes" do
- let!(:merge_request) { create(:merge_request) }
-
- before do
- allow(merge_request).to receive(:commits) { [merge_request.source_project.repository.commit] }
- create(:note, commit_id: merge_request.commits.first.id, noteable_type: 'Commit', project: merge_request.project)
- create(:note, noteable: merge_request, project: merge_request.project)
- end
-
- it "should include notes for commits" do
- expect(merge_request.commits).not_to be_empty
- expect(merge_request.mr_and_commit_notes.count).to eq(2)
- end
- end
-
- subject { create(:merge_request) }
-
- describe '#is_being_reassigned?' do
- it 'returns true if the merge_request assignee has changed' do
- subject.assignee = create(:user)
- expect(subject.is_being_reassigned?).to be_truthy
- end
- it 'returns false if the merge request assignee has not changed' do
- expect(subject.is_being_reassigned?).to be_falsey
- end
- end
-
- describe '#for_fork?' do
- it 'returns true if the merge request is for a fork' do
- subject.source_project = create(:project, namespace: create(:group))
- subject.target_project = create(:project, namespace: create(:group))
-
- expect(subject.for_fork?).to be_truthy
- end
-
- it 'returns false if is not for a fork' do
- expect(subject.for_fork?).to be_falsey
- end
- end
-
- describe 'detection of issues to be closed' do
- let(:issue0) { create :issue, project: subject.project }
- let(:issue1) { create :issue, project: subject.project }
- let(:commit0) { double('commit0', closes_issues: [issue0]) }
- let(:commit1) { double('commit1', closes_issues: [issue0]) }
- let(:commit2) { double('commit2', closes_issues: [issue1]) }
-
- before do
- subject.stub(commits: [commit0, commit1, commit2])
- end
-
- it 'accesses the set of issues that will be closed on acceptance' do
- subject.project.stub(default_branch: subject.target_branch)
-
- expect(subject.closes_issues).to eq([issue0, issue1].sort_by(&:id))
- end
-
- it 'only lists issues as to be closed if it targets the default branch' do
- subject.project.stub(default_branch: 'master')
- subject.target_branch = 'something-else'
-
- expect(subject.closes_issues).to be_empty
- end
-
- it 'detects issues mentioned in the description' do
- issue2 = create(:issue, project: subject.project)
- subject.description = "Closes ##{issue2.iid}"
- subject.project.stub(default_branch: subject.target_branch)
-
- expect(subject.closes_issues).to include(issue2)
- end
- end
-
- it_behaves_like 'an editable mentionable' do
- let(:subject) { create :merge_request, source_project: mproject, target_project: mproject }
- let(:backref_text) { "merge request !#{subject.iid}" }
- let(:set_mentionable_text) { ->(txt){ subject.title = txt } }
- end
-
- it_behaves_like 'a Taskable' do
- let(:subject) { create :merge_request, :simple }
- end
-end
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
deleted file mode 100644
index 45171e1bf64..00000000000
--- a/spec/models/milestone_spec.rb
+++ /dev/null
@@ -1,143 +0,0 @@
-# == Schema Information
-#
-# Table name: milestones
-#
-# id :integer not null, primary key
-# title :string(255) not null
-# project_id :integer not null
-# description :text
-# due_date :date
-# created_at :datetime
-# updated_at :datetime
-# state :string(255)
-# iid :integer
-#
-
-require 'spec_helper'
-
-describe Milestone do
- describe "Associations" do
- it { is_expected.to belong_to(:project) }
- it { is_expected.to have_many(:issues) }
- end
-
- describe "Mass assignment" do
- end
-
- describe "Validation" do
- before { subject.stub(set_iid: false) }
- it { is_expected.to validate_presence_of(:title) }
- it { is_expected.to validate_presence_of(:project) }
- end
-
- let(:milestone) { create(:milestone) }
- let(:issue) { create(:issue) }
-
- describe "#percent_complete" do
- it "should not count open issues" do
- milestone.issues << issue
- expect(milestone.percent_complete).to eq(0)
- end
-
- it "should count closed issues" do
- issue.close
- milestone.issues << issue
- expect(milestone.percent_complete).to eq(100)
- end
-
- it "should recover from dividing by zero" do
- expect(milestone.issues).to receive(:count).and_return(0)
- expect(milestone.percent_complete).to eq(100)
- end
- end
-
- describe "#expires_at" do
- it "should be nil when due_date is unset" do
- milestone.update_attributes(due_date: nil)
- expect(milestone.expires_at).to be_nil
- end
-
- it "should not be nil when due_date is set" do
- milestone.update_attributes(due_date: Date.tomorrow)
- expect(milestone.expires_at).to be_present
- end
- end
-
- describe :expired? do
- context "expired" do
- before do
- milestone.stub(due_date: Date.today.prev_year)
- end
-
- it { expect(milestone.expired?).to be_truthy }
- end
-
- context "not expired" do
- before do
- milestone.stub(due_date: Date.today.next_year)
- end
-
- it { expect(milestone.expired?).to be_falsey }
- end
- end
-
- describe :percent_complete do
- before do
- milestone.stub(
- closed_items_count: 3,
- total_items_count: 4
- )
- end
-
- it { expect(milestone.percent_complete).to eq(75) }
- end
-
- describe :items_count do
- before do
- milestone.issues << create(:issue)
- milestone.issues << create(:closed_issue)
- milestone.merge_requests << create(:merge_request)
- end
-
- it { expect(milestone.closed_items_count).to eq(1) }
- it { expect(milestone.open_items_count).to eq(2) }
- it { expect(milestone.total_items_count).to eq(3) }
- it { expect(milestone.is_empty?).to be_falsey }
- end
-
- describe :can_be_closed? do
- it { expect(milestone.can_be_closed?).to be_truthy }
- end
-
- describe :is_empty? do
- before do
- issue = create :closed_issue, milestone: milestone
- merge_request = create :merge_request, milestone: milestone
- end
-
- it 'Should return total count of issues and merge requests assigned to milestone' do
- expect(milestone.total_items_count).to eq 2
- end
- end
-
- describe :can_be_closed? do
- before do
- milestone = create :milestone
- create :closed_issue, milestone: milestone
-
- issue = create :issue
- end
-
- it 'should be true if milestone active and all nested issues closed' do
- expect(milestone.can_be_closed?).to be_truthy
- end
-
- it 'should be false if milestone active and not all nested issues closed' do
- issue.milestone = milestone
- issue.save
-
- expect(milestone.can_be_closed?).to be_falsey
- end
- end
-
-end
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
deleted file mode 100644
index e87432fdf62..00000000000
--- a/spec/models/namespace_spec.rb
+++ /dev/null
@@ -1,96 +0,0 @@
-# == Schema Information
-#
-# Table name: namespaces
-#
-# id :integer not null, primary key
-# name :string(255) not null
-# path :string(255) not null
-# owner_id :integer
-# created_at :datetime
-# updated_at :datetime
-# type :string(255)
-# description :string(255) default(""), not null
-# avatar :string(255)
-#
-
-require 'spec_helper'
-
-describe Namespace do
- let!(:namespace) { create(:namespace) }
-
- it { is_expected.to have_many :projects }
- it { is_expected.to validate_presence_of :name }
- it { is_expected.to validate_uniqueness_of(:name) }
- it { is_expected.to validate_presence_of :path }
- it { is_expected.to validate_uniqueness_of(:path) }
- it { is_expected.to validate_presence_of :owner }
-
- describe "Mass assignment" do
- end
-
- describe "Respond to" do
- it { is_expected.to respond_to(:human_name) }
- it { is_expected.to respond_to(:to_param) }
- end
-
- describe :to_param do
- it { expect(namespace.to_param).to eq(namespace.path) }
- end
-
- describe :human_name do
- it { expect(namespace.human_name).to eq(namespace.owner_name) }
- end
-
- describe :search do
- before do
- @namespace = create :namespace
- end
-
- it { expect(Namespace.search(@namespace.path)).to eq([@namespace]) }
- it { expect(Namespace.search('unknown')).to eq([]) }
- end
-
- describe :move_dir do
- before do
- @namespace = create :namespace
- @namespace.stub(path_changed?: true)
- end
-
- it "should raise error when directory exists" do
- expect { @namespace.move_dir }.to raise_error("namespace directory cannot be moved")
- end
-
- it "should move dir if path changed" do
- new_path = @namespace.path + "_new"
- @namespace.stub(path_was: @namespace.path)
- @namespace.stub(path: new_path)
- expect(@namespace.move_dir).to be_truthy
- end
- end
-
- describe :rm_dir do
- it "should remove dir" do
- expect(namespace.rm_dir).to be_truthy
- end
- end
-
- describe :find_by_path_or_name do
- before do
- @namespace = create(:namespace, name: 'WoW', path: 'woW')
- end
-
- it { expect(Namespace.find_by_path_or_name('wow')).to eq(@namespace) }
- it { expect(Namespace.find_by_path_or_name('WOW')).to eq(@namespace) }
- it { expect(Namespace.find_by_path_or_name('unknown')).to eq(nil) }
- end
-
- describe ".clean_path" do
-
- let!(:user) { create(:user, username: "johngitlab-etc") }
- let!(:namespace) { create(:namespace, path: "JohnGitLab-etc1") }
-
- it "cleans the path and makes sure it's available" do
- expect(Namespace.clean_path("-john+gitlab-ETC%.git@gmail.com")).to eq("johngitlab-ETC2")
- end
- end
-end
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
deleted file mode 100644
index a7bf5081d5b..00000000000
--- a/spec/models/note_spec.rb
+++ /dev/null
@@ -1,637 +0,0 @@
-# == Schema Information
-#
-# Table name: notes
-#
-# id :integer not null, primary key
-# note :text
-# noteable_type :string(255)
-# author_id :integer
-# created_at :datetime
-# updated_at :datetime
-# project_id :integer
-# attachment :string(255)
-# line_code :string(255)
-# commit_id :string(255)
-# noteable_id :integer
-# system :boolean default(FALSE), not null
-# st_diff :text
-#
-
-require 'spec_helper'
-
-describe Note do
- describe "Associations" do
- it { is_expected.to belong_to(:project) }
- it { is_expected.to belong_to(:noteable) }
- it { is_expected.to belong_to(:author).class_name('User') }
- end
-
- describe "Mass assignment" do
- end
-
- describe "Validation" do
- it { is_expected.to validate_presence_of(:note) }
- it { is_expected.to validate_presence_of(:project) }
- end
-
- describe "Voting score" do
- let(:project) { create(:project) }
-
- it "recognizes a neutral note" do
- note = create(:votable_note, note: "This is not a +1 note")
- expect(note).not_to be_upvote
- expect(note).not_to be_downvote
- end
-
- it "recognizes a neutral emoji note" do
- note = build(:votable_note, note: "I would :+1: this, but I don't want to")
- expect(note).not_to be_upvote
- expect(note).not_to be_downvote
- end
-
- it "recognizes a +1 note" do
- note = create(:votable_note, note: "+1 for this")
- expect(note).to be_upvote
- end
-
- it "recognizes a +1 emoji as a vote" do
- note = build(:votable_note, note: ":+1: for this")
- expect(note).to be_upvote
- end
-
- it "recognizes a thumbsup emoji as a vote" do
- note = build(:votable_note, note: ":thumbsup: for this")
- expect(note).to be_upvote
- end
-
- it "recognizes a -1 note" do
- note = create(:votable_note, note: "-1 for this")
- expect(note).to be_downvote
- end
-
- it "recognizes a -1 emoji as a vote" do
- note = build(:votable_note, note: ":-1: for this")
- expect(note).to be_downvote
- end
-
- it "recognizes a thumbsdown emoji as a vote" do
- note = build(:votable_note, note: ":thumbsdown: for this")
- expect(note).to be_downvote
- end
- end
-
- let(:project) { create(:project) }
-
- describe "Commit notes" do
- let!(:note) { create(:note_on_commit, note: "+1 from me") }
- let!(:commit) { note.noteable }
-
- it "should be accessible through #noteable" do
- expect(note.commit_id).to eq(commit.id)
- expect(note.noteable).to be_a(Commit)
- expect(note.noteable).to eq(commit)
- end
-
- it "should save a valid note" do
- expect(note.commit_id).to eq(commit.id)
- note.noteable == commit
- end
-
- it "should be recognized by #for_commit?" do
- expect(note).to be_for_commit
- end
-
- it "should not be votable" do
- expect(note).not_to be_votable
- end
- end
-
- describe "Commit diff line notes" do
- let!(:note) { create(:note_on_commit_diff, note: "+1 from me") }
- let!(:commit) { note.noteable }
-
- it "should save a valid note" do
- expect(note.commit_id).to eq(commit.id)
- expect(note.noteable.id).to eq(commit.id)
- end
-
- it "should be recognized by #for_diff_line?" do
- expect(note).to be_for_diff_line
- end
-
- it "should be recognized by #for_commit_diff_line?" do
- expect(note).to be_for_commit_diff_line
- end
-
- it "should not be votable" do
- expect(note).not_to be_votable
- end
- end
-
- describe "Issue notes" do
- let!(:note) { create(:note_on_issue, note: "+1 from me") }
-
- it "should not be votable" do
- expect(note).to be_votable
- end
- end
-
- describe "Merge request notes" do
- let!(:note) { create(:note_on_merge_request, note: "+1 from me") }
-
- it "should be votable" do
- expect(note).to be_votable
- end
- end
-
- describe "Merge request diff line notes" do
- let!(:note) { create(:note_on_merge_request_diff, note: "+1 from me") }
-
- it "should not be votable" do
- expect(note).not_to be_votable
- end
- end
-
- describe '#create_status_change_note' do
- let(:project) { create(:project) }
- let(:thing) { create(:issue, project: project) }
- let(:author) { create(:user) }
- let(:status) { 'new_status' }
-
- subject { Note.create_status_change_note(thing, project, author, status, nil) }
-
- it 'creates and saves a Note' do
- is_expected.to be_a Note
- expect(subject.id).not_to be_nil
- end
-
- describe '#noteable' do
- subject { super().noteable }
- it { is_expected.to eq(thing) }
- end
-
- describe '#project' do
- subject { super().project }
- it { is_expected.to eq(thing.project) }
- end
-
- describe '#author' do
- subject { super().author }
- it { is_expected.to eq(author) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("Status changed to #{status}") }
- end
-
- it 'appends a back-reference if a closing mentionable is supplied' do
- commit = double('commit', gfm_reference: 'commit 123456')
- n = Note.create_status_change_note(thing, project, author, status, commit)
-
- expect(n.note).to eq("Status changed to #{status} by commit 123456")
- end
- end
-
- describe '#create_assignee_change_note' do
- let(:project) { create(:project) }
- let(:thing) { create(:issue, project: project) }
- let(:author) { create(:user) }
- let(:assignee) { create(:user, username: "assigned_user") }
-
- subject { Note.create_assignee_change_note(thing, project, author, assignee) }
-
- context 'creates and saves a Note' do
- it { is_expected.to be_a Note }
-
- describe '#id' do
- subject { super().id }
- it { is_expected.not_to be_nil }
- end
- end
-
- describe '#noteable' do
- subject { super().noteable }
- it { is_expected.to eq(thing) }
- end
-
- describe '#project' do
- subject { super().project }
- it { is_expected.to eq(thing.project) }
- end
-
- describe '#author' do
- subject { super().author }
- it { is_expected.to eq(author) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq('Reassigned to @assigned_user') }
- end
-
- context 'assignee is removed' do
- let(:assignee) { nil }
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq('Assignee removed') }
- end
- end
- end
-
- describe '#create_labels_change_note' do
- let(:project) { create(:project) }
- let(:thing) { create(:issue, project: project) }
- let(:author) { create(:user) }
- let(:label1) { create(:label) }
- let(:label2) { create(:label) }
- let(:added_labels) { [label1, label2] }
- let(:removed_labels) { [] }
-
- subject { Note.create_labels_change_note(thing, project, author, added_labels, removed_labels) }
-
- context 'creates and saves a Note' do
- it { is_expected.to be_a Note }
-
- describe '#id' do
- subject { super().id }
- it { is_expected.not_to be_nil }
- end
- end
-
- describe '#noteable' do
- subject { super().noteable }
- it { is_expected.to eq(thing) }
- end
-
- describe '#project' do
- subject { super().project }
- it { is_expected.to eq(thing.project) }
- end
-
- describe '#author' do
- subject { super().author }
- it { is_expected.to eq(author) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("Added ~#{label1.id} ~#{label2.id} labels") }
- end
-
- context 'label is removed' do
- let(:added_labels) { [label1] }
- let(:removed_labels) { [label2] }
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("Added ~#{label1.id} and removed ~#{label2.id} labels") }
- end
- end
- end
-
- describe '#create_milestone_change_note' do
- let(:project) { create(:project) }
- let(:thing) { create(:issue, project: project) }
- let(:milestone) { create(:milestone, project: project, title: "first_milestone") }
- let(:author) { create(:user) }
-
- subject { Note.create_milestone_change_note(thing, project, author, milestone) }
-
- context 'creates and saves a Note' do
- it { is_expected.to be_a Note }
-
- describe '#id' do
- subject { super().id }
- it { is_expected.not_to be_nil }
- end
- end
-
- describe '#project' do
- subject { super().project }
- it { is_expected.to eq(thing.project) }
- end
-
- describe '#author' do
- subject { super().author }
- it { is_expected.to eq(author) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("Milestone changed to first_milestone") }
- end
- end
-
- describe '#create_cross_reference_note' do
- let(:project) { create(:project) }
- let(:author) { create(:user) }
- let(:issue) { create(:issue, project: project) }
- let(:mergereq) { create(:merge_request, :simple, target_project: project, source_project: project) }
- let(:commit) { project.repository.commit }
-
- # Test all of {issue, merge request, commit} in both the referenced and referencing
- # roles, to ensure that the correct information can be inferred from any argument.
-
- context 'issue from a merge request' do
- subject { Note.create_cross_reference_note(issue, mergereq, author, project) }
-
- it { is_expected.to be_valid }
-
- describe '#noteable' do
- subject { super().noteable }
- it { is_expected.to eq(issue) }
- end
-
- describe '#project' do
- subject { super().project }
- it { is_expected.to eq(issue.project) }
- end
-
- describe '#author' do
- subject { super().author }
- it { is_expected.to eq(author) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("mentioned in merge request !#{mergereq.iid}") }
- end
- end
-
- context 'issue from a commit' do
- subject { Note.create_cross_reference_note(issue, commit, author, project) }
-
- it { is_expected.to be_valid }
-
- describe '#noteable' do
- subject { super().noteable }
- it { is_expected.to eq(issue) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("mentioned in commit #{commit.sha}") }
- end
- end
-
- context 'merge request from an issue' do
- subject { Note.create_cross_reference_note(mergereq, issue, author, project) }
-
- it { is_expected.to be_valid }
-
- describe '#noteable' do
- subject { super().noteable }
- it { is_expected.to eq(mergereq) }
- end
-
- describe '#project' do
- subject { super().project }
- it { is_expected.to eq(mergereq.project) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("mentioned in issue ##{issue.iid}") }
- end
- end
-
- context 'commit from a merge request' do
- subject { Note.create_cross_reference_note(commit, mergereq, author, project) }
-
- it { is_expected.to be_valid }
-
- describe '#noteable' do
- subject { super().noteable }
- it { is_expected.to eq(commit) }
- end
-
- describe '#project' do
- subject { super().project }
- it { is_expected.to eq(project) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("mentioned in merge request !#{mergereq.iid}") }
- end
- end
-
- context 'commit contained in a merge request' do
- subject { Note.create_cross_reference_note(mergereq.commits.first, mergereq, author, project) }
-
- it { is_expected.to be_nil }
- end
-
- context 'commit from issue' do
- subject { Note.create_cross_reference_note(commit, issue, author, project) }
-
- it { is_expected.to be_valid }
-
- describe '#noteable_type' do
- subject { super().noteable_type }
- it { is_expected.to eq("Commit") }
- end
-
- describe '#noteable_id' do
- subject { super().noteable_id }
- it { is_expected.to be_nil }
- end
-
- describe '#commit_id' do
- subject { super().commit_id }
- it { is_expected.to eq(commit.id) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("mentioned in issue ##{issue.iid}") }
- end
- end
-
- context 'commit from commit' do
- let(:parent_commit) { commit.parents.first }
- subject { Note.create_cross_reference_note(commit, parent_commit, author, project) }
-
- it { is_expected.to be_valid }
-
- describe '#noteable_type' do
- subject { super().noteable_type }
- it { is_expected.to eq("Commit") }
- end
-
- describe '#noteable_id' do
- subject { super().noteable_id }
- it { is_expected.to be_nil }
- end
-
- describe '#commit_id' do
- subject { super().commit_id }
- it { is_expected.to eq(commit.id) }
- end
-
- describe '#note' do
- subject { super().note }
- it { is_expected.to eq("mentioned in commit #{parent_commit.id}") }
- end
- end
- end
-
- describe '#cross_reference_exists?' do
- let(:project) { create :project }
- let(:author) { create :user }
- let(:issue) { create :issue }
- let(:commit0) { project.repository.commit }
- let(:commit1) { project.repository.commit('HEAD~2') }
-
- before do
- Note.create_cross_reference_note(issue, commit0, author, project)
- end
-
- it 'detects if a mentionable has already been mentioned' do
- expect(Note.cross_reference_exists?(issue, commit0)).to be_truthy
- end
-
- it 'detects if a mentionable has not already been mentioned' do
- expect(Note.cross_reference_exists?(issue, commit1)).to be_falsey
- end
-
- context 'commit on commit' do
- before do
- Note.create_cross_reference_note(commit0, commit1, author, project)
- end
-
- it { expect(Note.cross_reference_exists?(commit0, commit1)).to be_truthy }
- it { expect(Note.cross_reference_exists?(commit1, commit0)).to be_falsey }
- end
-
- context 'legacy note with Markdown emphasis' do
- let(:issue2) { create :issue, project: project }
- let!(:note) do
- create :note, system: true, noteable_id: issue2.id,
- noteable_type: "Issue", note: "_mentioned in issue " \
- "#{issue.project.path_with_namespace}##{issue.iid}_"
- end
-
- it 'detects if a mentionable with emphasis has been mentioned' do
- expect(Note.cross_reference_exists?(issue2, issue)).to be_truthy
- end
- end
- end
-
- describe '#cross_references_with_underscores?' do
- let(:project) { create :project, path: "first_project" }
- let(:second_project) { create :project, path: "second_project" }
-
- let(:author) { create :user }
- let(:issue0) { create :issue, project: project }
- let(:issue1) { create :issue, project: second_project }
- let!(:note) { Note.create_cross_reference_note(issue0, issue1, author, project) }
-
- it 'detects if a mentionable has already been mentioned' do
- expect(Note.cross_reference_exists?(issue0, issue1)).to be_truthy
- end
-
- it 'detects if a mentionable has not already been mentioned' do
- expect(Note.cross_reference_exists?(issue1, issue0)).to be_falsey
- end
-
- it 'detects that text has underscores' do
- expect(note.note).to eq("mentioned in issue #{second_project.path_with_namespace}##{issue1.iid}")
- end
- end
-
- describe '#system?' do
- let(:project) { create(:project) }
- let(:issue) { create(:issue, project: project) }
- let(:other) { create(:issue, project: project) }
- let(:author) { create(:user) }
- let(:assignee) { create(:user) }
- let(:label) { create(:label) }
- let(:milestone) { create(:milestone) }
-
- it 'should recognize user-supplied notes as non-system' do
- @note = create(:note_on_issue)
- expect(@note).not_to be_system
- end
-
- it 'should identify status-change notes as system notes' do
- @note = Note.create_status_change_note(issue, project, author, 'closed', nil)
- expect(@note).to be_system
- end
-
- it 'should identify cross-reference notes as system notes' do
- @note = Note.create_cross_reference_note(issue, other, author, project)
- expect(@note).to be_system
- end
-
- it 'should identify assignee-change notes as system notes' do
- @note = Note.create_assignee_change_note(issue, project, author, assignee)
- expect(@note).to be_system
- end
-
- it 'should identify label-change notes as system notes' do
- @note = Note.create_labels_change_note(issue, project, author, [label], [])
- expect(@note).to be_system
- end
-
- it 'should identify milestone-change notes as system notes' do
- @note = Note.create_milestone_change_note(issue, project, author, milestone)
- expect(@note).to be_system
- end
- end
-
- describe :authorization do
- before do
- @p1 = create(:project)
- @p2 = create(:project)
- @u1 = create(:user)
- @u2 = create(:user)
- @u3 = create(:user)
- @abilities = Six.new
- @abilities << Ability
- end
-
- describe :read do
- before do
- @p1.project_members.create(user: @u2, access_level: ProjectMember::GUEST)
- @p2.project_members.create(user: @u3, access_level: ProjectMember::GUEST)
- end
-
- it { expect(@abilities.allowed?(@u1, :read_note, @p1)).to be_falsey }
- it { expect(@abilities.allowed?(@u2, :read_note, @p1)).to be_truthy }
- it { expect(@abilities.allowed?(@u3, :read_note, @p1)).to be_falsey }
- end
-
- describe :write do
- before do
- @p1.project_members.create(user: @u2, access_level: ProjectMember::DEVELOPER)
- @p2.project_members.create(user: @u3, access_level: ProjectMember::DEVELOPER)
- end
-
- it { expect(@abilities.allowed?(@u1, :write_note, @p1)).to be_falsey }
- it { expect(@abilities.allowed?(@u2, :write_note, @p1)).to be_truthy }
- it { expect(@abilities.allowed?(@u3, :write_note, @p1)).to be_falsey }
- end
-
- describe :admin do
- before do
- @p1.project_members.create(user: @u1, access_level: ProjectMember::REPORTER)
- @p1.project_members.create(user: @u2, access_level: ProjectMember::MASTER)
- @p2.project_members.create(user: @u3, access_level: ProjectMember::MASTER)
- end
-
- it { expect(@abilities.allowed?(@u1, :admin_note, @p1)).to be_falsey }
- it { expect(@abilities.allowed?(@u2, :admin_note, @p1)).to be_truthy }
- it { expect(@abilities.allowed?(@u3, :admin_note, @p1)).to be_falsey }
- end
- end
-
- it_behaves_like 'an editable mentionable' do
- let(:issue) { create :issue, project: project }
- let(:subject) { create :note, noteable: issue, project: project }
- let(:backref_text) { issue.gfm_reference }
- let(:set_mentionable_text) { ->(txt) { subject.note = txt } }
- end
-end
diff --git a/spec/models/project_security_spec.rb b/spec/models/project_security_spec.rb
deleted file mode 100644
index 1ee19003543..00000000000
--- a/spec/models/project_security_spec.rb
+++ /dev/null
@@ -1,126 +0,0 @@
-require 'spec_helper'
-
-describe Project do
- describe :authorization do
- before do
- @p1 = create(:project)
-
- @u1 = create(:user)
- @u2 = create(:user)
- @u3 = create(:user)
- @u4 = @p1.owner
-
- @abilities = Six.new
- @abilities << Ability
- end
-
- let(:guest_actions) { Ability.project_guest_rules }
- let(:report_actions) { Ability.project_report_rules }
- let(:dev_actions) { Ability.project_dev_rules }
- let(:master_actions) { Ability.project_master_rules }
- let(:admin_actions) { Ability.project_admin_rules }
-
- describe "Non member rules" do
- it "should deny for non-project users any actions" do
- admin_actions.each do |action|
- expect(@abilities.allowed?(@u1, action, @p1)).to be_falsey
- end
- end
- end
-
- describe "Guest Rules" do
- before do
- @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::GUEST)
- end
-
- it "should allow for project user any guest actions" do
- guest_actions.each do |action|
- expect(@abilities.allowed?(@u2, action, @p1)).to be_truthy
- end
- end
- end
-
- describe "Report Rules" do
- before do
- @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::REPORTER)
- end
-
- it "should allow for project user any report actions" do
- report_actions.each do |action|
- expect(@abilities.allowed?(@u2, action, @p1)).to be_truthy
- end
- end
- end
-
- describe "Developer Rules" do
- before do
- @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::REPORTER)
- @p1.project_members.create(project: @p1, user: @u3, access_level: ProjectMember::DEVELOPER)
- end
-
- it "should deny for developer master-specific actions" do
- [dev_actions - report_actions].each do |action|
- expect(@abilities.allowed?(@u2, action, @p1)).to be_falsey
- end
- end
-
- it "should allow for project user any dev actions" do
- dev_actions.each do |action|
- expect(@abilities.allowed?(@u3, action, @p1)).to be_truthy
- end
- end
- end
-
- describe "Master Rules" do
- before do
- @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::DEVELOPER)
- @p1.project_members.create(project: @p1, user: @u3, access_level: ProjectMember::MASTER)
- end
-
- it "should deny for developer master-specific actions" do
- [master_actions - dev_actions].each do |action|
- expect(@abilities.allowed?(@u2, action, @p1)).to be_falsey
- end
- end
-
- it "should allow for project user any master actions" do
- master_actions.each do |action|
- expect(@abilities.allowed?(@u3, action, @p1)).to be_truthy
- end
- end
- end
-
- describe "Admin Rules" do
- before do
- @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::DEVELOPER)
- @p1.project_members.create(project: @p1, user: @u3, access_level: ProjectMember::MASTER)
- end
-
- it "should deny for masters admin-specific actions" do
- [admin_actions - master_actions].each do |action|
- expect(@abilities.allowed?(@u2, action, @p1)).to be_falsey
- end
- end
-
- it "should allow for project owner any admin actions" do
- admin_actions.each do |action|
- expect(@abilities.allowed?(@u4, action, @p1)).to be_truthy
- end
- end
- end
- end
-end
-# == Schema Information
-#
-# Table name: projects
-#
-# id :integer not null, primary key
-# name :string(255)
-# path :string(255)
-# description :text
-# created_at :datetime
-# updated_at :datetime
-# private_flag :boolean default(TRUE), not null
-# code :string(255)
-#
-
diff --git a/spec/models/project_services/asana_service_spec.rb b/spec/models/project_services/asana_service_spec.rb
deleted file mode 100644
index 13c8d54a2af..00000000000
--- a/spec/models/project_services/asana_service_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe AsanaService, models: true do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe 'Validations' do
- context 'active' do
- before do
- subject.active = true
- end
-
- it { is_expected.to validate_presence_of :api_key }
- end
- end
-
- describe 'Execute' do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
-
- before do
- @asana = AsanaService.new
- @asana.stub(
- project: project,
- project_id: project.id,
- service_hook: true,
- api_key: 'verySecret',
- restrict_to_branch: 'master'
- )
- end
-
- it 'should call Asana service to created a story' do
- expect(Asana::Task).to receive(:find).with('123456').once
-
- @asana.check_commit('related to #123456', 'pushed')
- end
-
- it 'should call Asana service to created a story and close a task' do
- expect(Asana::Task).to receive(:find).with('456789').twice
-
- @asana.check_commit('fix #456789', 'pushed')
- end
- end
-end
diff --git a/spec/models/project_services/assembla_service_spec.rb b/spec/models/project_services/assembla_service_spec.rb
deleted file mode 100644
index 91730da1eec..00000000000
--- a/spec/models/project_services/assembla_service_spec.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe AssemblaService, models: true do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe "Execute" do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
-
- before do
- @assembla_service = AssemblaService.new
- @assembla_service.stub(
- project_id: project.id,
- project: project,
- service_hook: true,
- token: 'verySecret',
- subdomain: 'project_name'
- )
- @sample_data = Gitlab::PushDataBuilder.build_sample(project, user)
- @api_url = 'https://atlas.assembla.com/spaces/project_name/github_tool?secret_key=verySecret'
- WebMock.stub_request(:post, @api_url)
- end
-
- it "should call Assembla API" do
- @assembla_service.execute(@sample_data)
- expect(WebMock).to have_requested(:post, @api_url).with(
- body: /#{@sample_data[:before]}.*#{@sample_data[:after]}.*#{project.path}/
- ).once
- end
- end
-end
diff --git a/spec/models/project_services/buildkite_service_spec.rb b/spec/models/project_services/buildkite_service_spec.rb
deleted file mode 100644
index e987241f3ca..00000000000
--- a/spec/models/project_services/buildkite_service_spec.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe BuildkiteService do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe 'commits methods' do
- before do
- @project = Project.new
- @project.stub(
- default_branch: 'default-brancho'
- )
-
- @service = BuildkiteService.new
- @service.stub(
- project: @project,
- service_hook: true,
- project_url: 'https://buildkite.com/account-name/example-project',
- token: 'secret-sauce-webhook-token:secret-sauce-status-token'
- )
- end
-
- describe :webhook_url do
- it 'returns the webhook url' do
- expect(@service.webhook_url).to eq(
- 'https://webhook.buildkite.com/deliver/secret-sauce-webhook-token'
- )
- end
- end
-
- describe :commit_status_path do
- it 'returns the correct status page' do
- expect(@service.commit_status_path('2ab7834c')).to eq(
- 'https://gitlab.buildkite.com/status/secret-sauce-status-token.json?commit=2ab7834c'
- )
- end
- end
-
- describe :build_page do
- it 'returns the correct build page' do
- expect(@service.build_page('2ab7834c', nil)).to eq(
- 'https://buildkite.com/account-name/example-project/builds?commit=2ab7834c'
- )
- end
- end
-
- describe :builds_page do
- it 'returns the correct path to the builds page' do
- expect(@service.builds_path).to eq(
- 'https://buildkite.com/account-name/example-project/builds?branch=default-brancho'
- )
- end
- end
-
- describe :status_img_path do
- it 'returns the correct path to the status image' do
- expect(@service.status_img_path).to eq('https://badge.buildkite.com/secret-sauce-status-token.svg')
- end
- end
- end
-end
diff --git a/spec/models/project_services/flowdock_service_spec.rb b/spec/models/project_services/flowdock_service_spec.rb
deleted file mode 100644
index 73f68301a34..00000000000
--- a/spec/models/project_services/flowdock_service_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe FlowdockService do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe "Execute" do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
-
- before do
- @flowdock_service = FlowdockService.new
- @flowdock_service.stub(
- project_id: project.id,
- project: project,
- service_hook: true,
- token: 'verySecret'
- )
- @sample_data = Gitlab::PushDataBuilder.build_sample(project, user)
- @api_url = 'https://api.flowdock.com/v1/git/verySecret'
- WebMock.stub_request(:post, @api_url)
- end
-
- it "should call FlowDock API" do
- @flowdock_service.execute(@sample_data)
- expect(WebMock).to have_requested(:post, @api_url).with(
- body: /#{@sample_data[:before]}.*#{@sample_data[:after]}.*#{project.path}/
- ).once
- end
- end
-end
diff --git a/spec/models/project_services/gemnasium_service_spec.rb b/spec/models/project_services/gemnasium_service_spec.rb
deleted file mode 100644
index d44064bbe6a..00000000000
--- a/spec/models/project_services/gemnasium_service_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe GemnasiumService do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe "Execute" do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
-
- before do
- @gemnasium_service = GemnasiumService.new
- @gemnasium_service.stub(
- project_id: project.id,
- project: project,
- service_hook: true,
- token: 'verySecret',
- api_key: 'GemnasiumUserApiKey'
- )
- @sample_data = Gitlab::PushDataBuilder.build_sample(project, user)
- end
- it "should call Gemnasium service" do
- expect(Gemnasium::GitlabService).to receive(:execute).with(an_instance_of(Hash)).once
- @gemnasium_service.execute(@sample_data)
- end
- end
-end
diff --git a/spec/models/project_services/gitlab_ci_service_spec.rb b/spec/models/project_services/gitlab_ci_service_spec.rb
deleted file mode 100644
index 6a557d839ca..00000000000
--- a/spec/models/project_services/gitlab_ci_service_spec.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe GitlabCiService do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe "Mass assignment" do
- end
-
- describe 'commits methods' do
- before do
- @service = GitlabCiService.new
- @service.stub(
- service_hook: true,
- project_url: 'http://ci.gitlab.org/projects/2',
- token: 'verySecret'
- )
- end
-
- describe :commit_status_path do
- it { expect(@service.commit_status_path("2ab7834c", 'master')).to eq("http://ci.gitlab.org/projects/2/refs/master/commits/2ab7834c/status.json?token=verySecret")}
- end
-
- describe :build_page do
- it { expect(@service.build_page("2ab7834c", 'master')).to eq("http://ci.gitlab.org/projects/2/refs/master/commits/2ab7834c")}
- end
- end
-
- describe "Fork registration" do
- before do
- @old_project = create(:empty_project)
- @project = create(:empty_project)
- @user = create(:user)
-
- @service = GitlabCiService.new
- @service.stub(
- service_hook: true,
- project_url: 'http://ci.gitlab.org/projects/2',
- token: 'verySecret',
- project: @old_project
- )
- end
-
- it "performs http reuquest to ci" do
- stub_request(:post, "http://ci.gitlab.org/api/v1/forks")
- @service.fork_registration(@project, @user.private_token)
- end
- end
-end
diff --git a/spec/models/project_services/gitlab_issue_tracker_service_spec.rb b/spec/models/project_services/gitlab_issue_tracker_service_spec.rb
deleted file mode 100644
index f94bef5c365..00000000000
--- a/spec/models/project_services/gitlab_issue_tracker_service_spec.rb
+++ /dev/null
@@ -1,66 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe GitlabIssueTrackerService do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
-
- describe 'project and issue urls' do
- let(:project) { create(:project) }
-
- context 'with absolute urls' do
- before do
- GitlabIssueTrackerService.default_url_options[:script_name] = "/gitlab/root"
- @service = project.create_gitlab_issue_tracker_service(active: true)
- end
-
- after do
- @service.destroy!
- end
-
- it 'should give the correct path' do
- expect(@service.project_url).to eq("http://localhost/gitlab/root/#{project.path_with_namespace}/issues")
- expect(@service.new_issue_url).to eq("http://localhost/gitlab/root/#{project.path_with_namespace}/issues/new")
- expect(@service.issue_url(432)).to eq("http://localhost/gitlab/root/#{project.path_with_namespace}/issues/432")
- end
- end
-
- context 'with relative urls' do
- before do
- GitlabIssueTrackerService.default_url_options[:script_name] = "/gitlab/root"
- @service = project.create_gitlab_issue_tracker_service(active: true)
- end
-
- after do
- @service.destroy!
- end
-
- it 'should give the correct path' do
- expect(@service.project_path).to eq("/gitlab/root/#{project.path_with_namespace}/issues")
- expect(@service.new_issue_path).to eq("/gitlab/root/#{project.path_with_namespace}/issues/new")
- expect(@service.issue_path(432)).to eq("/gitlab/root/#{project.path_with_namespace}/issues/432")
- end
- end
- end
-end
diff --git a/spec/models/project_services/hipchat_service_spec.rb b/spec/models/project_services/hipchat_service_spec.rb
deleted file mode 100644
index 8ab847e6432..00000000000
--- a/spec/models/project_services/hipchat_service_spec.rb
+++ /dev/null
@@ -1,217 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe HipchatService do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe "Execute" do
- let(:hipchat) { HipchatService.new }
- let(:user) { create(:user, username: 'username') }
- let(:project) { create(:project, name: 'project') }
- let(:api_url) { 'https://hipchat.example.com/v2/room/123456/notification?auth_token=verySecret' }
- let(:project_name) { project.name_with_namespace.gsub(/\s/, '') }
-
- before(:each) do
- hipchat.stub(
- project_id: project.id,
- project: project,
- room: 123456,
- server: 'https://hipchat.example.com',
- token: 'verySecret'
- )
- WebMock.stub_request(:post, api_url)
- end
-
- context 'push events' do
- let(:push_sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) }
-
- it "should call Hipchat API for push events" do
- hipchat.execute(push_sample_data)
-
- expect(WebMock).to have_requested(:post, api_url).once
- end
-
- it "should create a push message" do
- message = hipchat.send(:create_push_message, push_sample_data)
-
- obj_attr = push_sample_data[:object_attributes]
- branch = push_sample_data[:ref].gsub('refs/heads/', '')
- expect(message).to include("#{user.name} pushed to branch " \
- "<a href=\"#{project.web_url}/commits/#{branch}\">#{branch}</a> of " \
- "<a href=\"#{project.web_url}\">#{project_name}</a>")
- end
- end
-
- context 'tag_push events' do
- let(:push_sample_data) { Gitlab::PushDataBuilder.build(project, user, Gitlab::Git::BLANK_SHA, '1' * 40, 'refs/tags/test', []) }
-
- it "should call Hipchat API for tag push events" do
- hipchat.execute(push_sample_data)
-
- expect(WebMock).to have_requested(:post, api_url).once
- end
-
- it "should create a tag push message" do
- message = hipchat.send(:create_push_message, push_sample_data)
-
- obj_attr = push_sample_data[:object_attributes]
- expect(message).to eq("#{user.name} pushed new tag " \
- "<a href=\"#{project.web_url}/commits/test\">test</a> to " \
- "<a href=\"#{project.web_url}\">#{project_name}</a>\n")
- end
- end
-
- context 'issue events' do
- let(:issue) { create(:issue, title: 'Awesome issue', description: 'please fix') }
- let(:issue_service) { Issues::CreateService.new(project, user) }
- let(:issues_sample_data) { issue_service.hook_data(issue, 'open') }
-
- it "should call Hipchat API for issue events" do
- hipchat.execute(issues_sample_data)
-
- expect(WebMock).to have_requested(:post, api_url).once
- end
-
- it "should create an issue message" do
- message = hipchat.send(:create_issue_message, issues_sample_data)
-
- obj_attr = issues_sample_data[:object_attributes]
- expect(message).to eq("#{user.name} opened " \
- "<a href=\"#{obj_attr[:url]}\">issue ##{obj_attr["iid"]}</a> in " \
- "<a href=\"#{project.web_url}\">#{project_name}</a>: " \
- "<b>Awesome issue</b>" \
- "<pre>please fix</pre>")
- end
- end
-
- context 'merge request events' do
- let(:merge_request) { create(:merge_request, description: 'please fix', title: 'Awesome merge request', target_project: project, source_project: project) }
- let(:merge_service) { MergeRequests::CreateService.new(project, user) }
- let(:merge_sample_data) { merge_service.hook_data(merge_request, 'open') }
-
- it "should call Hipchat API for merge requests events" do
- hipchat.execute(merge_sample_data)
-
- expect(WebMock).to have_requested(:post, api_url).once
- end
-
- it "should create a merge request message" do
- message = hipchat.send(:create_merge_request_message,
- merge_sample_data)
-
- obj_attr = merge_sample_data[:object_attributes]
- expect(message).to eq("#{user.name} opened " \
- "<a href=\"#{obj_attr[:url]}\">merge request ##{obj_attr["iid"]}</a> in " \
- "<a href=\"#{project.web_url}\">#{project_name}</a>: " \
- "<b>Awesome merge request</b>" \
- "<pre>please fix</pre>")
- end
- end
-
- context "Note events" do
- let(:user) { create(:user) }
- let(:project) { create(:project, creator_id: user.id) }
- let(:issue) { create(:issue, project: project) }
- let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
- let(:snippet) { create(:project_snippet, project: project) }
- let(:commit_note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') }
- let(:merge_request_note) { create(:note_on_merge_request, noteable_id: merge_request.id, note: "merge request note") }
- let(:issue_note) { create(:note_on_issue, noteable_id: issue.id, note: "issue note")}
- let(:snippet_note) { create(:note_on_project_snippet, noteable_id: snippet.id, note: "snippet note") }
-
- it "should call Hipchat API for commit comment events" do
- data = Gitlab::NoteDataBuilder.build(commit_note, user)
- hipchat.execute(data)
-
- expect(WebMock).to have_requested(:post, api_url).once
-
- message = hipchat.send(:create_message, data)
-
- obj_attr = data[:object_attributes]
- commit_id = Commit.truncate_sha(data[:commit][:id])
- title = hipchat.send(:format_title, data[:commit][:message])
-
- expect(message).to eq("#{user.name} commented on " \
- "<a href=\"#{obj_attr[:url]}\">commit #{commit_id}</a> in " \
- "<a href=\"#{project.web_url}\">#{project_name}</a>: " \
- "#{title}" \
- "<pre>a comment on a commit</pre>")
- end
-
- it "should call Hipchat API for merge request comment events" do
- data = Gitlab::NoteDataBuilder.build(merge_request_note, user)
- hipchat.execute(data)
-
- expect(WebMock).to have_requested(:post, api_url).once
-
- message = hipchat.send(:create_message, data)
-
- obj_attr = data[:object_attributes]
- merge_id = data[:merge_request]['iid']
- title = data[:merge_request]['title']
-
- expect(message).to eq("#{user.name} commented on " \
- "<a href=\"#{obj_attr[:url]}\">merge request ##{merge_id}</a> in " \
- "<a href=\"#{project.web_url}\">#{project_name}</a>: " \
- "<b>#{title}</b>" \
- "<pre>merge request note</pre>")
- end
-
- it "should call Hipchat API for issue comment events" do
- data = Gitlab::NoteDataBuilder.build(issue_note, user)
- hipchat.execute(data)
-
- message = hipchat.send(:create_message, data)
-
- obj_attr = data[:object_attributes]
- issue_id = data[:issue]['iid']
- title = data[:issue]['title']
-
- expect(message).to eq("#{user.name} commented on " \
- "<a href=\"#{obj_attr[:url]}\">issue ##{issue_id}</a> in " \
- "<a href=\"#{project.web_url}\">#{project_name}</a>: " \
- "<b>#{title}</b>" \
- "<pre>issue note</pre>")
- end
-
- it "should call Hipchat API for snippet comment events" do
- data = Gitlab::NoteDataBuilder.build(snippet_note, user)
- hipchat.execute(data)
-
- expect(WebMock).to have_requested(:post, api_url).once
-
- message = hipchat.send(:create_message, data)
-
- obj_attr = data[:object_attributes]
- snippet_id = data[:snippet]['id']
- title = data[:snippet]['title']
-
- expect(message).to eq("#{user.name} commented on " \
- "<a href=\"#{obj_attr[:url]}\">snippet ##{snippet_id}</a> in " \
- "<a href=\"#{project.web_url}\">#{project_name}</a>: " \
- "<b>#{title}</b>" \
- "<pre>snippet note</pre>")
- end
- end
- end
-end
diff --git a/spec/models/project_services/irker_service_spec.rb b/spec/models/project_services/irker_service_spec.rb
deleted file mode 100644
index d55399bc360..00000000000
--- a/spec/models/project_services/irker_service_spec.rb
+++ /dev/null
@@ -1,108 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-require 'socket'
-require 'json'
-
-describe IrkerService do
- describe 'Associations' do
- it { should belong_to :project }
- it { should have_one :service_hook }
- end
-
- describe 'Validations' do
- before do
- subject.active = true
- subject.properties['recipients'] = _recipients
- end
-
- context 'active' do
- let(:_recipients) { nil }
- it { should validate_presence_of :recipients }
- end
-
- context 'too many recipients' do
- let(:_recipients) { 'a b c d' }
- it 'should add an error if there is too many recipients' do
- subject.send :check_recipients_count
- subject.errors.should_not be_blank
- end
- end
-
- context '3 recipients' do
- let(:_recipients) { 'a b c' }
- it 'should not add an error if there is 3 recipients' do
- subject.send :check_recipients_count
- subject.errors.should be_blank
- end
- end
- end
-
- describe 'Execute' do
- let(:irker) { IrkerService.new }
- let(:user) { create(:user) }
- let(:project) { create(:project) }
- let(:sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) }
-
- let(:recipients) { '#commits' }
- let(:colorize_messages) { '1' }
-
- before do
- irker.stub(
- active: true,
- project: project,
- project_id: project.id,
- service_hook: true,
- properties: {
- 'recipients' => recipients,
- 'colorize_messages' => colorize_messages
- }
- )
- irker.settings = {
- server_ip: 'localhost',
- server_port: 6659,
- max_channels: 3,
- default_irc_uri: 'irc://chat.freenode.net/'
- }
- irker.valid?
- @irker_server = TCPServer.new 'localhost', 6659
- end
-
- after do
- @irker_server.close
- end
-
- it 'should send valid JSON messages to an Irker listener' do
- irker.execute(sample_data)
-
- conn = @irker_server.accept
- conn.readlines.each do |line|
- msg = JSON.load(line.chomp("\n"))
- msg.keys.should match_array(['to', 'privmsg'])
- if msg['to'].is_a?(String)
- msg['to'].should == 'irc://chat.freenode.net/#commits'
- else
- msg['to'].should match_array(['irc://chat.freenode.net/#commits'])
- end
- end
- conn.close
- end
- end
-end
diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb
deleted file mode 100644
index 355911e6377..00000000000
--- a/spec/models/project_services/jira_service_spec.rb
+++ /dev/null
@@ -1,102 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe JiraService do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe "Validations" do
- context "active" do
- before do
- subject.active = true
- end
-
- it { is_expected.to validate_presence_of :project_url }
- it { is_expected.to validate_presence_of :issues_url }
- it { is_expected.to validate_presence_of :new_issue_url }
- end
- end
-
- describe 'description and title' do
- let(:project) { create(:project) }
-
- context 'when it is not set' do
- before do
- @service = project.create_jira_service(active: true)
- end
-
- after do
- @service.destroy!
- end
-
- it 'should be initialized' do
- expect(@service.title).to eq('JIRA')
- expect(@service.description).to eq("Jira issue tracker")
- end
- end
-
- context 'when it is set' do
- before do
- properties = { 'title' => 'Jira One', 'description' => 'Jira One issue tracker' }
- @service = project.create_jira_service(active: true, properties: properties)
- end
-
- after do
- @service.destroy!
- end
-
- it "should be correct" do
- expect(@service.title).to eq('Jira One')
- expect(@service.description).to eq('Jira One issue tracker')
- end
- end
- end
-
- describe 'project and issue urls' do
- let(:project) { create(:project) }
-
- context 'when gitlab.yml was initialized' do
- before do
- settings = { "jira" => {
- "title" => "Jira",
- "project_url" => "http://jira.sample/projects/project_a",
- "issues_url" => "http://jira.sample/issues/:id",
- "new_issue_url" => "http://jira.sample/projects/project_a/issues/new"
- }
- }
- allow(Gitlab.config).to receive(:issues_tracker).and_return(settings)
- @service = project.create_jira_service(active: true)
- end
-
- after do
- @service.destroy!
- end
-
- it 'should be prepopulated with the settings' do
- expect(@service.properties[:project_url]).to eq('http://jira.sample/projects/project_a')
- expect(@service.properties[:issues_url]).to eq("http://jira.sample/issues/:id")
- expect(@service.properties[:new_issue_url]).to eq("http://jira.sample/projects/project_a/issues/new")
- end
- end
- end
-end
diff --git a/spec/models/project_services/pushover_service_spec.rb b/spec/models/project_services/pushover_service_spec.rb
deleted file mode 100644
index 5a18fd09bfc..00000000000
--- a/spec/models/project_services/pushover_service_spec.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe PushoverService do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe 'Validations' do
- context 'active' do
- before do
- subject.active = true
- end
-
- it { is_expected.to validate_presence_of :api_key }
- it { is_expected.to validate_presence_of :user_key }
- it { is_expected.to validate_presence_of :priority }
- end
- end
-
- describe 'Execute' do
- let(:pushover) { PushoverService.new }
- let(:user) { create(:user) }
- let(:project) { create(:project) }
- let(:sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) }
-
- let(:api_key) { 'verySecret' }
- let(:user_key) { 'verySecret' }
- let(:device) { 'myDevice' }
- let(:priority) { 0 }
- let(:sound) { 'bike' }
- let(:api_url) { 'https://api.pushover.net/1/messages.json' }
-
- before do
- pushover.stub(
- project: project,
- project_id: project.id,
- service_hook: true,
- api_key: api_key,
- user_key: user_key,
- device: device,
- priority: priority,
- sound: sound
- )
-
- WebMock.stub_request(:post, api_url)
- end
-
- it 'should call Pushover API' do
- pushover.execute(sample_data)
-
- expect(WebMock).to have_requested(:post, api_url).once
- end
- end
-end
diff --git a/spec/models/project_services/slack_service/issue_message_spec.rb b/spec/models/project_services/slack_service/issue_message_spec.rb
deleted file mode 100644
index 8bca1fef44c..00000000000
--- a/spec/models/project_services/slack_service/issue_message_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-require 'spec_helper'
-
-describe SlackService::IssueMessage do
- subject { SlackService::IssueMessage.new(args) }
-
- let(:args) {
- {
- user: {
- name: 'Test User',
- username: 'Test User'
- },
- project_name: 'project_name',
- project_url: 'somewhere.com',
-
- object_attributes: {
- title: 'Issue title',
- id: 10,
- iid: 100,
- assignee_id: 1,
- url: 'url',
- action: 'open',
- state: 'opened',
- description: 'issue description'
- }
- }
- }
-
- let(:color) { '#345' }
-
- context 'open' do
- it 'returns a message regarding opening of issues' do
- expect(subject.pretext).to eq(
- 'Test User opened <url|issue #100> in <somewhere.com|project_name>: '\
- '*Issue title*')
- expect(subject.attachments).to eq([
- {
- text: "issue description",
- color: color,
- }
- ])
- end
- end
-
- context 'close' do
- before do
- args[:object_attributes][:action] = 'close'
- args[:object_attributes][:state] = 'closed'
- end
- it 'returns a message regarding closing of issues' do
- expect(subject.pretext). to eq(
- 'Test User closed <url|issue #100> in <somewhere.com|project_name>: '\
- '*Issue title*')
- expect(subject.attachments).to be_empty
- end
- end
-end
diff --git a/spec/models/project_services/slack_service/merge_message_spec.rb b/spec/models/project_services/slack_service/merge_message_spec.rb
deleted file mode 100644
index aeb408aa766..00000000000
--- a/spec/models/project_services/slack_service/merge_message_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-require 'spec_helper'
-
-describe SlackService::MergeMessage do
- subject { SlackService::MergeMessage.new(args) }
-
- let(:args) {
- {
- user: {
- name: 'Test User',
- username: 'Test User'
- },
- project_name: 'project_name',
- project_url: 'somewhere.com',
-
- object_attributes: {
- title: "Issue title\nSecond line",
- id: 10,
- iid: 100,
- assignee_id: 1,
- url: 'url',
- state: 'opened',
- description: 'issue description',
- source_branch: 'source_branch',
- target_branch: 'target_branch',
- }
- }
- }
-
- let(:color) { '#345' }
-
- context 'open' do
- it 'returns a message regarding opening of merge requests' do
- expect(subject.pretext).to eq(
- 'Test User opened <somewhere.com/merge_requests/100|merge request #100> '\
- 'in <somewhere.com|project_name>: *Issue title*')
- expect(subject.attachments).to be_empty
- end
- end
-
- context 'close' do
- before do
- args[:object_attributes][:state] = 'closed'
- end
- it 'returns a message regarding closing of merge requests' do
- expect(subject.pretext).to eq(
- 'Test User closed <somewhere.com/merge_requests/100|merge request #100> '\
- 'in <somewhere.com|project_name>: *Issue title*')
- expect(subject.attachments).to be_empty
- end
- end
-end
diff --git a/spec/models/project_services/slack_service/note_message_spec.rb b/spec/models/project_services/slack_service/note_message_spec.rb
deleted file mode 100644
index 21fb575480b..00000000000
--- a/spec/models/project_services/slack_service/note_message_spec.rb
+++ /dev/null
@@ -1,129 +0,0 @@
-require 'spec_helper'
-
-describe SlackService::NoteMessage do
- let(:color) { '#345' }
-
- before do
- @args = {
- user: {
- name: 'Test User',
- username: 'username',
- avatar_url: 'http://fakeavatar'
- },
- project_name: 'project_name',
- project_url: 'somewhere.com',
- repository: {
- name: 'project_name',
- url: 'somewhere.com',
- },
- object_attributes: {
- id: 10,
- note: 'comment on a commit',
- url: 'url',
- noteable_type: 'Commit'
- }
- }
- end
-
- context 'commit notes' do
- before do
- @args[:object_attributes][:note] = 'comment on a commit'
- @args[:object_attributes][:noteable_type] = 'Commit'
- @args[:commit] = {
- id: '5f163b2b95e6f53cbd428f5f0b103702a52b9a23',
- message: "Added a commit message\ndetails\n123\n"
- }
- end
-
- it 'returns a message regarding notes on commits' do
- message = SlackService::NoteMessage.new(@args)
- expect(message.pretext).to eq("Test User commented on " \
- "<url|commit 5f163b2b> in <somewhere.com|project_name>: " \
- "*Added a commit message*")
- expected_attachments = [
- {
- text: "comment on a commit",
- color: color,
- }
- ]
- expect(message.attachments).to eq(expected_attachments)
- end
- end
-
- context 'merge request notes' do
- before do
- @args[:object_attributes][:note] = 'comment on a merge request'
- @args[:object_attributes][:noteable_type] = 'MergeRequest'
- @args[:merge_request] = {
- id: 1,
- iid: 30,
- title: "merge request title\ndetails\n"
- }
- end
- it 'returns a message regarding notes on a merge request' do
- message = SlackService::NoteMessage.new(@args)
- expect(message.pretext).to eq("Test User commented on " \
- "<url|merge request #30> in <somewhere.com|project_name>: " \
- "*merge request title*")
- expected_attachments = [
- {
- text: "comment on a merge request",
- color: color,
- }
- ]
- expect(message.attachments).to eq(expected_attachments)
- end
- end
-
- context 'issue notes' do
- before do
- @args[:object_attributes][:note] = 'comment on an issue'
- @args[:object_attributes][:noteable_type] = 'Issue'
- @args[:issue] = {
- id: 1,
- iid: 20,
- title: "issue title\ndetails\n"
- }
- end
-
- it 'returns a message regarding notes on an issue' do
- message = SlackService::NoteMessage.new(@args)
- expect(message.pretext).to eq(
- "Test User commented on " \
- "<url|issue #20> in <somewhere.com|project_name>: " \
- "*issue title*")
- expected_attachments = [
- {
- text: "comment on an issue",
- color: color,
- }
- ]
- expect(message.attachments).to eq(expected_attachments)
- end
- end
-
- context 'project snippet notes' do
- before do
- @args[:object_attributes][:note] = 'comment on a snippet'
- @args[:object_attributes][:noteable_type] = 'Snippet'
- @args[:snippet] = {
- id: 5,
- title: "snippet title\ndetails\n"
- }
- end
-
- it 'returns a message regarding notes on a project snippet' do
- message = SlackService::NoteMessage.new(@args)
- expect(message.pretext).to eq("Test User commented on " \
- "<url|snippet #5> in <somewhere.com|project_name>: " \
- "*snippet title*")
- expected_attachments = [
- {
- text: "comment on a snippet",
- color: color,
- }
- ]
- expect(message.attachments).to eq(expected_attachments)
- end
- end
-end
diff --git a/spec/models/project_services/slack_service/push_message_spec.rb b/spec/models/project_services/slack_service/push_message_spec.rb
deleted file mode 100644
index 10963481a12..00000000000
--- a/spec/models/project_services/slack_service/push_message_spec.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-require 'spec_helper'
-
-describe SlackService::PushMessage do
- subject { SlackService::PushMessage.new(args) }
-
- let(:args) {
- {
- after: 'after',
- before: 'before',
- project_name: 'project_name',
- ref: 'refs/heads/master',
- user_name: 'user_name',
- project_url: 'url'
- }
- }
-
- let(:color) { '#345' }
-
- context 'push' do
- before do
- args[:commits] = [
- { message: 'message1', url: 'url1', id: 'abcdefghijkl', author: { name: 'author1' } },
- { message: 'message2', url: 'url2', id: '123456789012', author: { name: 'author2' } },
- ]
- end
-
- it 'returns a message regarding pushes' do
- expect(subject.pretext).to eq(
- 'user_name pushed to branch <url/commits/master|master> of '\
- '<url|project_name> (<url/compare/before...after|Compare changes>)'
- )
- expect(subject.attachments).to eq([
- {
- text: "<url1|abcdefgh>: message1 - author1\n"\
- "<url2|12345678>: message2 - author2",
- color: color,
- }
- ])
- end
- end
-
- context 'tag push' do
- let(:args) {
- {
- after: 'after',
- before: Gitlab::Git::BLANK_SHA,
- project_name: 'project_name',
- ref: 'refs/tags/new_tag',
- user_name: 'user_name',
- project_url: 'url'
- }
- }
-
- it 'returns a message regarding pushes' do
- expect(subject.pretext).to eq('user_name pushed new tag ' \
- '<url/commits/new_tag|new_tag> to ' \
- '<url|project_name>')
- expect(subject.attachments).to be_empty
- end
- end
-
- context 'new branch' do
- before do
- args[:before] = Gitlab::Git::BLANK_SHA
- end
-
- it 'returns a message regarding a new branch' do
- expect(subject.pretext).to eq(
- 'user_name pushed new branch <url/commits/master|master> to '\
- '<url|project_name>'
- )
- expect(subject.attachments).to be_empty
- end
- end
-
- context 'removed branch' do
- before do
- args[:after] = Gitlab::Git::BLANK_SHA
- end
-
- it 'returns a message regarding a removed branch' do
- expect(subject.pretext).to eq(
- 'user_name removed branch master from <url|project_name>'
- )
- expect(subject.attachments).to be_empty
- end
- end
-end
diff --git a/spec/models/project_services/slack_service_spec.rb b/spec/models/project_services/slack_service_spec.rb
deleted file mode 100644
index c36506644b3..00000000000
--- a/spec/models/project_services/slack_service_spec.rb
+++ /dev/null
@@ -1,170 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe SlackService do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe "Validations" do
- context "active" do
- before do
- subject.active = true
- end
-
- it { is_expected.to validate_presence_of :webhook }
- end
- end
-
- describe "Execute" do
- let(:slack) { SlackService.new }
- let(:user) { create(:user) }
- let(:project) { create(:project) }
- let(:push_sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) }
- let(:webhook_url) { 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685' }
- let(:username) { 'slack_username' }
- let(:channel) { 'slack_channel' }
-
- before do
- slack.stub(
- project: project,
- project_id: project.id,
- service_hook: true,
- webhook: webhook_url
- )
-
- WebMock.stub_request(:post, webhook_url)
-
- opts = {
- title: 'Awesome issue',
- description: 'please fix'
- }
-
- issue_service = Issues::CreateService.new(project, user, opts)
- @issue = issue_service.execute
- @issues_sample_data = issue_service.hook_data(@issue, 'open')
-
- opts = {
- title: 'Awesome merge_request',
- description: 'please fix',
- source_branch: 'stable',
- target_branch: 'master'
- }
- merge_service = MergeRequests::CreateService.new(project,
- user, opts)
- @merge_request = merge_service.execute
- @merge_sample_data = merge_service.hook_data(@merge_request,
- 'open')
- end
-
- it "should call Slack API for push events" do
- slack.execute(push_sample_data)
-
- expect(WebMock).to have_requested(:post, webhook_url).once
- end
-
- it "should call Slack API for issue events" do
- slack.execute(@issues_sample_data)
-
- expect(WebMock).to have_requested(:post, webhook_url).once
- end
-
- it "should call Slack API for merge requests events" do
- slack.execute(@merge_sample_data)
-
- expect(WebMock).to have_requested(:post, webhook_url).once
- end
-
- it 'should use the username as an option for slack when configured' do
- slack.stub(username: username)
- expect(Slack::Notifier).to receive(:new).
- with(webhook_url, username: username).
- and_return(
- double(:slack_service).as_null_object
- )
- slack.execute(push_sample_data)
- end
-
- it 'should use the channel as an option when it is configured' do
- slack.stub(channel: channel)
- expect(Slack::Notifier).to receive(:new).
- with(webhook_url, channel: channel).
- and_return(
- double(:slack_service).as_null_object
- )
- slack.execute(push_sample_data)
- end
- end
-
- describe "Note events" do
- let(:slack) { SlackService.new }
- let(:user) { create(:user) }
- let(:project) { create(:project, creator_id: user.id) }
- let(:issue) { create(:issue, project: project) }
- let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
- let(:snippet) { create(:project_snippet, project: project) }
- let(:commit_note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') }
- let(:merge_request_note) { create(:note_on_merge_request, noteable_id: merge_request.id, note: "merge request note") }
- let(:issue_note) { create(:note_on_issue, noteable_id: issue.id, note: "issue note")}
- let(:snippet_note) { create(:note_on_project_snippet, noteable_id: snippet.id, note: "snippet note") }
- let(:webhook_url) { 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685' }
-
- before do
- slack.stub(
- project: project,
- project_id: project.id,
- service_hook: true,
- webhook: webhook_url
- )
-
- WebMock.stub_request(:post, webhook_url)
- end
-
- it "should call Slack API for commit comment events" do
- data = Gitlab::NoteDataBuilder.build(commit_note, user)
- slack.execute(data)
-
- expect(WebMock).to have_requested(:post, webhook_url).once
- end
-
- it "should call Slack API for merge request comment events" do
- data = Gitlab::NoteDataBuilder.build(merge_request_note, user)
- slack.execute(data)
-
- expect(WebMock).to have_requested(:post, webhook_url).once
- end
-
- it "should call Slack API for issue comment events" do
- data = Gitlab::NoteDataBuilder.build(issue_note, user)
- slack.execute(data)
-
- expect(WebMock).to have_requested(:post, webhook_url).once
- end
-
- it "should call Slack API for snippet comment events" do
- data = Gitlab::NoteDataBuilder.build(snippet_note, user)
- slack.execute(data)
-
- expect(WebMock).to have_requested(:post, webhook_url).once
- end
- end
-end
diff --git a/spec/models/project_snippet_spec.rb b/spec/models/project_snippet_spec.rb
deleted file mode 100644
index 3e8f106d27f..00000000000
--- a/spec/models/project_snippet_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# == Schema Information
-#
-# Table name: snippets
-#
-# id :integer not null, primary key
-# title :string(255)
-# content :text
-# author_id :integer not null
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# file_name :string(255)
-# expires_at :datetime
-# type :string(255)
-# visibility_level :integer default(0), not null
-#
-
-require 'spec_helper'
-
-describe ProjectSnippet do
- describe "Associations" do
- it { is_expected.to belong_to(:project) }
- end
-
- describe "Mass assignment" do
- end
-
- describe "Validation" do
- it { is_expected.to validate_presence_of(:project) }
- end
-end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
deleted file mode 100644
index 879a63dd9f9..00000000000
--- a/spec/models/project_spec.rb
+++ /dev/null
@@ -1,360 +0,0 @@
-# == Schema Information
-#
-# Table name: projects
-#
-# id :integer not null, primary key
-# name :string(255)
-# path :string(255)
-# description :text
-# created_at :datetime
-# updated_at :datetime
-# creator_id :integer
-# issues_enabled :boolean default(TRUE), not null
-# wall_enabled :boolean default(TRUE), not null
-# merge_requests_enabled :boolean default(TRUE), not null
-# wiki_enabled :boolean default(TRUE), not null
-# namespace_id :integer
-# issues_tracker :string(255) default("gitlab"), not null
-# issues_tracker_id :string(255)
-# snippets_enabled :boolean default(TRUE), not null
-# last_activity_at :datetime
-# import_url :string(255)
-# visibility_level :integer default(0), not null
-# archived :boolean default(FALSE), not null
-# import_status :string(255)
-# repository_size :float default(0.0)
-# star_count :integer default(0), not null
-# import_type :string(255)
-# import_source :string(255)
-# avatar :string(255)
-#
-
-require 'spec_helper'
-
-describe Project do
- describe 'Associations' do
- it { is_expected.to belong_to(:group) }
- it { is_expected.to belong_to(:namespace) }
- it { is_expected.to belong_to(:creator).class_name('User') }
- it { is_expected.to have_many(:users) }
- it { is_expected.to have_many(:events).dependent(:destroy) }
- it { is_expected.to have_many(:merge_requests).dependent(:destroy) }
- it { is_expected.to have_many(:issues).dependent(:destroy) }
- it { is_expected.to have_many(:milestones).dependent(:destroy) }
- it { is_expected.to have_many(:project_members).dependent(:destroy) }
- it { is_expected.to have_many(:notes).dependent(:destroy) }
- it { is_expected.to have_many(:snippets).class_name('ProjectSnippet').dependent(:destroy) }
- it { is_expected.to have_many(:deploy_keys_projects).dependent(:destroy) }
- it { is_expected.to have_many(:deploy_keys) }
- it { is_expected.to have_many(:hooks).dependent(:destroy) }
- it { is_expected.to have_many(:protected_branches).dependent(:destroy) }
- it { is_expected.to have_one(:forked_project_link).dependent(:destroy) }
- it { is_expected.to have_one(:slack_service).dependent(:destroy) }
- it { is_expected.to have_one(:pushover_service).dependent(:destroy) }
- it { is_expected.to have_one(:asana_service).dependent(:destroy) }
- end
-
- describe 'Mass assignment' do
- end
-
- describe 'Validation' do
- let!(:project) { create(:project) }
-
- it { is_expected.to validate_presence_of(:name) }
- it { is_expected.to validate_uniqueness_of(:name).scoped_to(:namespace_id) }
- it { is_expected.to ensure_length_of(:name).is_within(0..255) }
-
- it { is_expected.to validate_presence_of(:path) }
- it { is_expected.to validate_uniqueness_of(:path).scoped_to(:namespace_id) }
- it { is_expected.to ensure_length_of(:path).is_within(0..255) }
- it { is_expected.to ensure_length_of(:description).is_within(0..2000) }
- it { is_expected.to validate_presence_of(:creator) }
- it { is_expected.to ensure_length_of(:issues_tracker_id).is_within(0..255) }
- it { is_expected.to validate_presence_of(:namespace) }
-
- it 'should not allow new projects beyond user limits' do
- project2 = build(:project)
- allow(project2).to receive(:creator).and_return(double(can_create_project?: false, projects_limit: 0).as_null_object)
- expect(project2).not_to be_valid
- expect(project2.errors[:limit_reached].first).to match(/Your project limit is 0/)
- end
- end
-
- describe 'Respond to' do
- it { is_expected.to respond_to(:url_to_repo) }
- it { is_expected.to respond_to(:repo_exists?) }
- it { is_expected.to respond_to(:satellite) }
- it { is_expected.to respond_to(:update_merge_requests) }
- it { is_expected.to respond_to(:execute_hooks) }
- it { is_expected.to respond_to(:name_with_namespace) }
- it { is_expected.to respond_to(:owner) }
- it { is_expected.to respond_to(:path_with_namespace) }
- end
-
- it 'should return valid url to repo' do
- project = Project.new(path: 'somewhere')
- expect(project.url_to_repo).to eq(Gitlab.config.gitlab_shell.ssh_path_prefix + 'somewhere.git')
- end
-
- it 'returns the full web URL for this repo' do
- project = Project.new(path: 'somewhere')
- expect(project.web_url).to eq("#{Gitlab.config.gitlab.url}/somewhere")
- end
-
- it 'returns the web URL without the protocol for this repo' do
- project = Project.new(path: 'somewhere')
- expect(project.web_url_without_protocol).to eq("#{Gitlab.config.gitlab.url.split('://')[1]}/somewhere")
- end
-
- describe 'last_activity methods' do
- let(:project) { create(:project) }
- let(:last_event) { double(created_at: Time.now) }
-
- describe 'last_activity' do
- it 'should alias last_activity to last_event' do
- project.stub(last_event: last_event)
- expect(project.last_activity).to eq(last_event)
- end
- end
-
- describe 'last_activity_date' do
- it 'returns the creation date of the project\'s last event if present' do
- last_activity_event = create(:event, project: project)
- expect(project.last_activity_at.to_i).to eq(last_event.created_at.to_i)
- end
-
- it 'returns the project\'s last update date if it has no events' do
- expect(project.last_activity_date).to eq(project.updated_at)
- end
- end
- end
-
- describe :update_merge_requests do
- let(:project) { create(:project) }
- let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
- let(:key) { create(:key, user_id: project.owner.id) }
- let(:prev_commit_id) { merge_request.commits.last.id }
- let(:commit_id) { merge_request.commits.first.id }
-
- it 'should close merge request if last commit from source branch was pushed to target branch' do
- project.update_merge_requests(prev_commit_id, commit_id, "refs/heads/#{merge_request.target_branch}", key.user)
- merge_request.reload
- expect(merge_request.merged?).to be_truthy
- end
-
- it 'should update merge request commits with new one if pushed to source branch' do
- project.update_merge_requests(prev_commit_id, commit_id, "refs/heads/#{merge_request.source_branch}", key.user)
- merge_request.reload
- expect(merge_request.last_commit.id).to eq(commit_id)
- end
- end
-
- describe :find_with_namespace do
- context 'with namespace' do
- before do
- @group = create :group, name: 'gitlab'
- @project = create(:project, name: 'gitlabhq', namespace: @group)
- end
-
- it { expect(Project.find_with_namespace('gitlab/gitlabhq')).to eq(@project) }
- it { expect(Project.find_with_namespace('gitlab-ci')).to be_nil }
- end
- end
-
- describe :to_param do
- context 'with namespace' do
- before do
- @group = create :group, name: 'gitlab'
- @project = create(:project, name: 'gitlabhq', namespace: @group)
- end
-
- it { expect(@project.to_param).to eq('gitlabhq') }
- end
- end
-
- describe :repository do
- let(:project) { create(:project) }
-
- it 'should return valid repo' do
- expect(project.repository).to be_kind_of(Repository)
- end
- end
-
- describe :issue_exists? do
- let(:project) { create(:project) }
- let(:existed_issue) { create(:issue, project: project) }
- let(:not_existed_issue) { create(:issue) }
- let(:ext_project) { create(:redmine_project) }
-
- it 'should be true or if used internal tracker and issue exists' do
- expect(project.issue_exists?(existed_issue.iid)).to be_truthy
- end
-
- it 'should be false or if used internal tracker and issue not exists' do
- expect(project.issue_exists?(not_existed_issue.iid)).to be_falsey
- end
-
- it 'should always be true if used other tracker' do
- expect(ext_project.issue_exists?(rand(100))).to be_truthy
- end
- end
-
- describe :default_issues_tracker? do
- let(:project) { create(:project) }
- let(:ext_project) { create(:redmine_project) }
-
- it "should be true if used internal tracker" do
- expect(project.default_issues_tracker?).to be_truthy
- end
-
- it "should be false if used other tracker" do
- expect(ext_project.default_issues_tracker?).to be_falsey
- end
- end
-
- describe :can_have_issues_tracker_id? do
- let(:project) { create(:project) }
- let(:ext_project) { create(:redmine_project) }
-
- it 'should be true for projects with external issues tracker if issues enabled' do
- expect(ext_project.can_have_issues_tracker_id?).to be_truthy
- end
-
- it 'should be false for projects with internal issue tracker if issues enabled' do
- expect(project.can_have_issues_tracker_id?).to be_falsey
- end
-
- it 'should be always false if issues disabled' do
- project.issues_enabled = false
- ext_project.issues_enabled = false
-
- expect(project.can_have_issues_tracker_id?).to be_falsey
- expect(ext_project.can_have_issues_tracker_id?).to be_falsey
- end
- end
-
- describe :open_branches do
- let(:project) { create(:project) }
-
- before do
- project.protected_branches.create(name: 'master')
- end
-
- it { expect(project.open_branches.map(&:name)).to include('feature') }
- it { expect(project.open_branches.map(&:name)).not_to include('master') }
- end
-
- describe '#star_count' do
- it 'counts stars from multiple users' do
- user1 = create :user
- user2 = create :user
- project = create :project, :public
-
- expect(project.star_count).to eq(0)
-
- user1.toggle_star(project)
- expect(project.reload.star_count).to eq(1)
-
- user2.toggle_star(project)
- project.reload
- expect(project.reload.star_count).to eq(2)
-
- user1.toggle_star(project)
- project.reload
- expect(project.reload.star_count).to eq(1)
-
- user2.toggle_star(project)
- project.reload
- expect(project.reload.star_count).to eq(0)
- end
-
- it 'counts stars on the right project' do
- user = create :user
- project1 = create :project, :public
- project2 = create :project, :public
-
- expect(project1.star_count).to eq(0)
- expect(project2.star_count).to eq(0)
-
- user.toggle_star(project1)
- project1.reload
- project2.reload
- expect(project1.star_count).to eq(1)
- expect(project2.star_count).to eq(0)
-
- user.toggle_star(project1)
- project1.reload
- project2.reload
- expect(project1.star_count).to eq(0)
- expect(project2.star_count).to eq(0)
-
- user.toggle_star(project2)
- project1.reload
- project2.reload
- expect(project1.star_count).to eq(0)
- expect(project2.star_count).to eq(1)
-
- user.toggle_star(project2)
- project1.reload
- project2.reload
- expect(project1.star_count).to eq(0)
- expect(project2.star_count).to eq(0)
- end
-
- it 'is decremented when an upvoter account is deleted' do
- user = create :user
- project = create :project, :public
- user.toggle_star(project)
- project.reload
- expect(project.star_count).to eq(1)
- user.destroy
- project.reload
- expect(project.star_count).to eq(0)
- end
- end
-
- describe :avatar_type do
- let(:project) { create(:project) }
-
- it 'should be true if avatar is image' do
- project.update_attribute(:avatar, 'uploads/avatar.png')
- expect(project.avatar_type).to be_truthy
- end
-
- it 'should be false if avatar is html page' do
- project.update_attribute(:avatar, 'uploads/avatar.html')
- expect(project.avatar_type).to eq(['only images allowed'])
- end
- end
-
- describe :avatar_url do
- subject { project.avatar_url }
-
- let(:project) { create(:project) }
-
- context 'When avatar file is uploaded' do
- before do
- project.update_columns(avatar: 'uploads/avatar.png')
- allow(project.avatar).to receive(:present?) { true }
- end
-
- let(:avatar_path) do
- "/uploads/project/avatar/#{project.id}/uploads/avatar.png"
- end
-
- it { should eq "http://localhost#{avatar_path}" }
- end
-
- context 'When avatar file in git' do
- before do
- allow(project).to receive(:avatar_in_git) { true }
- end
-
- let(:avatar_path) do
- "/#{project.namespace.name}/#{project.path}/avatar"
- end
-
- it { should eq "http://localhost#{avatar_path}" }
- end
- end
-end
diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb
deleted file mode 100644
index 19201cc15a7..00000000000
--- a/spec/models/project_team_spec.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-require "spec_helper"
-
-describe ProjectTeam do
- let(:master) { create(:user) }
- let(:reporter) { create(:user) }
- let(:guest) { create(:user) }
- let(:nonmember) { create(:user) }
-
- context 'personal project' do
- let(:project) { create(:empty_project) }
-
- before do
- project.team << [master, :master]
- project.team << [reporter, :reporter]
- project.team << [guest, :guest]
- end
-
- describe 'members collection' do
- it { expect(project.team.masters).to include(master) }
- it { expect(project.team.masters).not_to include(guest) }
- it { expect(project.team.masters).not_to include(reporter) }
- it { expect(project.team.masters).not_to include(nonmember) }
- end
-
- describe 'access methods' do
- it { expect(project.team.master?(master)).to be_truthy }
- it { expect(project.team.master?(guest)).to be_falsey }
- it { expect(project.team.master?(reporter)).to be_falsey }
- it { expect(project.team.master?(nonmember)).to be_falsey }
- it { expect(project.team.member?(nonmember)).to be_falsey }
- it { expect(project.team.member?(guest)).to be_truthy }
- end
- end
-
- context 'group project' do
- let(:group) { create(:group) }
- let(:project) { create(:empty_project, group: group) }
-
- before do
- group.add_user(master, Gitlab::Access::MASTER)
- group.add_user(reporter, Gitlab::Access::REPORTER)
- group.add_user(guest, Gitlab::Access::GUEST)
-
- # If user is a group and a project member - GitLab uses highest permission
- # So we add group guest as master and add group master as guest
- # to this project to test highest access
- project.team << [guest, :master]
- project.team << [master, :guest]
- end
-
- describe 'members collection' do
- it { expect(project.team.reporters).to include(reporter) }
- it { expect(project.team.masters).to include(master) }
- it { expect(project.team.masters).to include(guest) }
- it { expect(project.team.masters).not_to include(reporter) }
- it { expect(project.team.masters).not_to include(nonmember) }
- end
-
- describe 'access methods' do
- it { expect(project.team.reporter?(reporter)).to be_truthy }
- it { expect(project.team.master?(master)).to be_truthy }
- it { expect(project.team.master?(guest)).to be_truthy }
- it { expect(project.team.master?(reporter)).to be_falsey }
- it { expect(project.team.master?(nonmember)).to be_falsey }
- it { expect(project.team.member?(nonmember)).to be_falsey }
- it { expect(project.team.member?(guest)).to be_truthy }
- end
- end
-end
-
diff --git a/spec/models/project_wiki_spec.rb b/spec/models/project_wiki_spec.rb
deleted file mode 100644
index 2acdb7dfddc..00000000000
--- a/spec/models/project_wiki_spec.rb
+++ /dev/null
@@ -1,244 +0,0 @@
-require "spec_helper"
-
-describe ProjectWiki do
- let(:project) { create(:empty_project) }
- let(:repository) { project.repository }
- let(:user) { project.owner }
- let(:gitlab_shell) { Gitlab::Shell.new }
- let(:project_wiki) { ProjectWiki.new(project, user) }
-
- subject { project_wiki }
- before { project_wiki.wiki }
-
- describe "#path_with_namespace" do
- it "returns the project path with namespace with the .wiki extension" do
- expect(subject.path_with_namespace).to eq(project.path_with_namespace + ".wiki")
- end
- end
-
- describe "#url_to_repo" do
- it "returns the correct ssh url to the repo" do
- expect(subject.url_to_repo).to eq(gitlab_shell.url_to_repo(subject.path_with_namespace))
- end
- end
-
- describe "#ssh_url_to_repo" do
- it "equals #url_to_repo" do
- expect(subject.ssh_url_to_repo).to eq(subject.url_to_repo)
- end
- end
-
- describe "#http_url_to_repo" do
- it "provides the full http url to the repo" do
- gitlab_url = Gitlab.config.gitlab.url
- repo_http_url = "#{gitlab_url}/#{subject.path_with_namespace}.git"
- expect(subject.http_url_to_repo).to eq(repo_http_url)
- end
- end
-
- describe "#wiki" do
- it "contains a Gollum::Wiki instance" do
- expect(subject.wiki).to be_a Gollum::Wiki
- end
-
- it "creates a new wiki repo if one does not yet exist" do
- expect(project_wiki.create_page("index", "test content")).to be_truthy
- end
-
- it "raises CouldNotCreateWikiError if it can't create the wiki repository" do
- allow(project_wiki).to receive(:init_repo).and_return(false)
- expect { project_wiki.send(:create_repo!) }.to raise_exception(ProjectWiki::CouldNotCreateWikiError)
- end
- end
-
- describe "#empty?" do
- context "when the wiki repository is empty" do
- before do
- allow_any_instance_of(Gitlab::Shell).to receive(:add_repository) do
- create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git")
- end
- allow(project).to receive(:path_with_namespace).and_return("non-existant")
- end
-
- describe '#empty?' do
- subject { super().empty? }
- it { is_expected.to be_truthy }
- end
- end
-
- context "when the wiki has pages" do
- before do
- project_wiki.create_page("index", "This is an awesome new Gollum Wiki")
- end
-
- describe '#empty?' do
- subject { super().empty? }
- it { is_expected.to be_falsey }
- end
- end
- end
-
- describe "#pages" do
- before do
- create_page("index", "This is an awesome new Gollum Wiki")
- @pages = subject.pages
- end
-
- after do
- destroy_page(@pages.first.page)
- end
-
- it "returns an array of WikiPage instances" do
- expect(@pages.first).to be_a WikiPage
- end
-
- it "returns the correct number of pages" do
- expect(@pages.count).to eq(1)
- end
- end
-
- describe "#find_page" do
- before do
- create_page("index page", "This is an awesome Gollum Wiki")
- end
-
- after do
- destroy_page(subject.pages.first.page)
- end
-
- it "returns the latest version of the page if it exists" do
- page = subject.find_page("index page")
- expect(page.title).to eq("index page")
- end
-
- it "returns nil if the page does not exist" do
- expect(subject.find_page("non-existant")).to eq(nil)
- end
-
- it "can find a page by slug" do
- page = subject.find_page("index-page")
- expect(page.title).to eq("index page")
- end
-
- it "returns a WikiPage instance" do
- page = subject.find_page("index page")
- expect(page).to be_a WikiPage
- end
- end
-
- describe '#find_file' do
- before do
- file = Gollum::File.new(subject.wiki)
- allow_any_instance_of(Gollum::Wiki).
- to receive(:file).with('image.jpg', 'master', true).
- and_return(file)
- allow_any_instance_of(Gollum::File).
- to receive(:mime_type).
- and_return('image/jpeg')
- allow_any_instance_of(Gollum::Wiki).
- to receive(:file).with('non-existant', 'master', true).
- and_return(nil)
- end
-
- after do
- allow_any_instance_of(Gollum::Wiki).to receive(:file).and_call_original
- allow_any_instance_of(Gollum::File).to receive(:mime_type).and_call_original
- end
-
- it 'returns the latest version of the file if it exists' do
- file = subject.find_file('image.jpg')
- expect(file.mime_type).to eq('image/jpeg')
- end
-
- it 'returns nil if the page does not exist' do
- expect(subject.find_file('non-existant')).to eq(nil)
- end
-
- it 'returns a Gollum::File instance' do
- file = subject.find_file('image.jpg')
- expect(file).to be_a Gollum::File
- end
- end
-
- describe "#create_page" do
- after do
- destroy_page(subject.pages.first.page)
- end
-
- it "creates a new wiki page" do
- expect(subject.create_page("test page", "this is content")).not_to eq(false)
- expect(subject.pages.count).to eq(1)
- end
-
- it "returns false when a duplicate page exists" do
- subject.create_page("test page", "content")
- expect(subject.create_page("test page", "content")).to eq(false)
- end
-
- it "stores an error message when a duplicate page exists" do
- 2.times { subject.create_page("test page", "content") }
- expect(subject.error_message).to match(/Duplicate page:/)
- end
-
- it "sets the correct commit message" do
- subject.create_page("test page", "some content", :markdown, "commit message")
- expect(subject.pages.first.page.version.message).to eq("commit message")
- end
- end
-
- describe "#update_page" do
- before do
- create_page("update-page", "some content")
- @gollum_page = subject.wiki.paged("update-page")
- subject.update_page(@gollum_page, "some other content", :markdown, "updated page")
- @page = subject.pages.first.page
- end
-
- after do
- destroy_page(@page)
- end
-
- it "updates the content of the page" do
- expect(@page.raw_data).to eq("some other content")
- end
-
- it "sets the correct commit message" do
- expect(@page.version.message).to eq("updated page")
- end
- end
-
- describe "#delete_page" do
- before do
- create_page("index", "some content")
- @page = subject.wiki.paged("index")
- end
-
- it "deletes the page" do
- subject.delete_page(@page)
- expect(subject.pages.count).to eq(0)
- end
- end
-
- private
-
- def create_temp_repo(path)
- FileUtils.mkdir_p path
- system(*%W(git init --quiet --bare -- #{path}))
- end
-
- def remove_temp_repo(path)
- FileUtils.rm_rf path
- end
-
- def commit_details
- commit = {name: user.name, email: user.email, message: "test commit"}
- end
-
- def create_page(name, content)
- subject.wiki.write_page(name, :markdown, content, commit_details)
- end
-
- def destroy_page(page)
- subject.wiki.delete_page(page, commit_details)
- end
-end
diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb
deleted file mode 100644
index 1e6937b536c..00000000000
--- a/spec/models/protected_branch_spec.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# == Schema Information
-#
-# Table name: protected_branches
-#
-# id :integer not null, primary key
-# project_id :integer not null
-# name :string(255) not null
-# created_at :datetime
-# updated_at :datetime
-# developers_can_push :boolean default(FALSE), not null
-#
-
-require 'spec_helper'
-
-describe ProtectedBranch do
- describe 'Associations' do
- it { is_expected.to belong_to(:project) }
- end
-
- describe "Mass assignment" do
- end
-
- describe 'Validation' do
- it { is_expected.to validate_presence_of(:project) }
- it { is_expected.to validate_presence_of(:name) }
- end
-end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
deleted file mode 100644
index f41e5a97ca3..00000000000
--- a/spec/models/repository_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-require 'spec_helper'
-
-describe Repository do
- include RepoHelpers
-
- let(:repository) { create(:project).repository }
-
- describe :branch_names_contains do
- subject { repository.branch_names_contains(sample_commit.id) }
-
- it { is_expected.to include('master') }
- it { is_expected.not_to include('feature') }
- it { is_expected.not_to include('fix') }
- end
-
- describe :tag_names_contains do
- subject { repository.tag_names_contains(sample_commit.id) }
-
- it { is_expected.to include('v1.1.0') }
- it { is_expected.not_to include('v1.0.0') }
- end
-
- describe :last_commit_for_path do
- subject { repository.last_commit_for_path(sample_commit.id, '.gitignore').id }
-
- it { is_expected.to eq('c1acaa58bbcbc3eafe538cb8274ba387047b69f8') }
- end
-end
diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb
deleted file mode 100644
index 735652aea78..00000000000
--- a/spec/models/service_spec.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# == Schema Information
-#
-# Table name: services
-#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
-# template :boolean default(FALSE)
-# push_events :boolean default(TRUE)
-# issues_events :boolean default(TRUE)
-# merge_requests_events :boolean default(TRUE)
-# tag_push_events :boolean default(TRUE)
-#
-
-require 'spec_helper'
-
-describe Service do
-
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
- describe "Mass assignment" do
- end
-
- describe "Test Button" do
- before do
- @service = Service.new
- end
-
- describe "Testable" do
- let (:project) { create :project }
-
- before do
- @service.stub(
- project: project
- )
- @testable = @service.can_test?
- end
-
- describe :can_test do
- it { expect(@testable).to eq(true) }
- end
- end
-
- describe "With commits" do
- let (:project) { create :project }
-
- before do
- @service.stub(
- project: project
- )
- @testable = @service.can_test?
- end
-
- describe :can_test do
- it { expect(@testable).to eq(true) }
- end
- end
- end
-
- describe "Template" do
- describe "for pushover service" do
- let(:service_template) {
- PushoverService.create(template: true, properties: {device: 'MyDevice', sound: 'mic', priority: 4, api_key: '123456789'})
- }
- let(:project) { create(:project) }
-
- describe 'should be prefilled for projects pushover service' do
- before do
- service_template
- project.build_missing_services
- end
-
- it "should have all fields prefilled" do
- service = project.pushover_service
- expect(service.template).to eq(false)
- expect(service.device).to eq('MyDevice')
- expect(service.sound).to eq('mic')
- expect(service.priority).to eq(4)
- expect(service.api_key).to eq('123456789')
- end
- end
- end
- end
-end
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
deleted file mode 100644
index e37dcc75230..00000000000
--- a/spec/models/snippet_spec.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# == Schema Information
-#
-# Table name: snippets
-#
-# id :integer not null, primary key
-# title :string(255)
-# content :text
-# author_id :integer not null
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# file_name :string(255)
-# expires_at :datetime
-# type :string(255)
-# visibility_level :integer default(0), not null
-#
-
-require 'spec_helper'
-
-describe Snippet do
- describe "Associations" do
- it { is_expected.to belong_to(:author).class_name('User') }
- it { is_expected.to have_many(:notes).dependent(:destroy) }
- end
-
- describe "Mass assignment" do
- end
-
- describe "Validation" do
- it { is_expected.to validate_presence_of(:author) }
-
- it { is_expected.to validate_presence_of(:title) }
- it { is_expected.to ensure_length_of(:title).is_within(0..255) }
-
- it { is_expected.to validate_presence_of(:file_name) }
- it { is_expected.to ensure_length_of(:title).is_within(0..255) }
-
- it { is_expected.to validate_presence_of(:content) }
- end
-end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
deleted file mode 100644
index 24384e8bf22..00000000000
--- a/spec/models/user_spec.rb
+++ /dev/null
@@ -1,532 +0,0 @@
-# == Schema Information
-#
-# Table name: users
-#
-# id :integer not null, primary key
-# email :string(255) default(""), not null
-# encrypted_password :string(255) default(""), not null
-# reset_password_token :string(255)
-# reset_password_sent_at :datetime
-# remember_created_at :datetime
-# sign_in_count :integer default(0)
-# current_sign_in_at :datetime
-# last_sign_in_at :datetime
-# current_sign_in_ip :string(255)
-# last_sign_in_ip :string(255)
-# created_at :datetime
-# updated_at :datetime
-# name :string(255)
-# admin :boolean default(FALSE), not null
-# projects_limit :integer default(10)
-# skype :string(255) default(""), not null
-# linkedin :string(255) default(""), not null
-# twitter :string(255) default(""), not null
-# authentication_token :string(255)
-# theme_id :integer default(1), not null
-# bio :string(255)
-# failed_attempts :integer default(0)
-# locked_at :datetime
-# username :string(255)
-# can_create_group :boolean default(TRUE), not null
-# can_create_team :boolean default(TRUE), not null
-# state :string(255)
-# color_scheme_id :integer default(1), not null
-# notification_level :integer default(1), not null
-# password_expires_at :datetime
-# created_by_id :integer
-# last_credential_check_at :datetime
-# avatar :string(255)
-# confirmation_token :string(255)
-# confirmed_at :datetime
-# confirmation_sent_at :datetime
-# unconfirmed_email :string(255)
-# hide_no_ssh_key :boolean default(FALSE)
-# website_url :string(255) default(""), not null
-# github_access_token :string(255)
-# gitlab_access_token :string(255)
-# notification_email :string(255)
-# hide_no_password :boolean default(FALSE)
-# password_automatically_set :boolean default(FALSE)
-# bitbucket_access_token :string(255)
-# bitbucket_access_token_secret :string(255)
-#
-
-require 'spec_helper'
-
-describe User do
- describe "Associations" do
- it { is_expected.to have_one(:namespace) }
- it { is_expected.to have_many(:snippets).class_name('Snippet').dependent(:destroy) }
- it { is_expected.to have_many(:project_members).dependent(:destroy) }
- it { is_expected.to have_many(:groups) }
- it { is_expected.to have_many(:keys).dependent(:destroy) }
- it { is_expected.to have_many(:events).class_name('Event').dependent(:destroy) }
- it { is_expected.to have_many(:recent_events).class_name('Event') }
- it { is_expected.to have_many(:issues).dependent(:destroy) }
- it { is_expected.to have_many(:notes).dependent(:destroy) }
- it { is_expected.to have_many(:assigned_issues).dependent(:destroy) }
- it { is_expected.to have_many(:merge_requests).dependent(:destroy) }
- it { is_expected.to have_many(:assigned_merge_requests).dependent(:destroy) }
- it { is_expected.to have_many(:identities).dependent(:destroy) }
- end
-
- describe "Mass assignment" do
- end
-
- describe 'validations' do
- it { is_expected.to validate_presence_of(:username) }
- it { is_expected.to validate_presence_of(:projects_limit) }
- it { is_expected.to validate_numericality_of(:projects_limit) }
- it { is_expected.to allow_value(0).for(:projects_limit) }
- it { is_expected.not_to allow_value(-1).for(:projects_limit) }
-
- it { is_expected.to ensure_length_of(:bio).is_within(0..255) }
-
- describe 'email' do
- it 'accepts info@example.com' do
- user = build(:user, email: 'info@example.com')
- expect(user).to be_valid
- end
-
- it 'accepts info+test@example.com' do
- user = build(:user, email: 'info+test@example.com')
- expect(user).to be_valid
- end
-
- it "accepts o'reilly@example.com" do
- user = build(:user, email: "o'reilly@example.com")
- expect(user).to be_valid
- end
-
- it 'rejects test@test@example.com' do
- user = build(:user, email: 'test@test@example.com')
- expect(user).to be_invalid
- end
-
- it 'rejects mailto:test@example.com' do
- user = build(:user, email: 'mailto:test@example.com')
- expect(user).to be_invalid
- end
-
- it "rejects lol!'+=?><#$%^&*()@gmail.com" do
- user = build(:user, email: "lol!'+=?><#$%^&*()@gmail.com")
- expect(user).to be_invalid
- end
- end
- end
-
- describe "Respond to" do
- it { is_expected.to respond_to(:is_admin?) }
- it { is_expected.to respond_to(:name) }
- it { is_expected.to respond_to(:private_token) }
- end
-
- describe '#generate_password' do
- it "should execute callback when force_random_password specified" do
- user = build(:user, force_random_password: true)
- expect(user).to receive(:generate_password)
- user.save
- end
-
- it "should not generate password by default" do
- user = create(:user, password: 'abcdefghe')
- expect(user.password).to eq('abcdefghe')
- end
-
- it "should generate password when forcing random password" do
- allow(Devise).to receive(:friendly_token).and_return('123456789')
- user = create(:user, password: 'abcdefg', force_random_password: true)
- expect(user.password).to eq('12345678')
- end
- end
-
- describe 'authentication token' do
- it "should have authentication token" do
- user = create(:user)
- expect(user.authentication_token).not_to be_blank
- end
- end
-
- describe 'projects' do
- before do
- @user = create :user
- @project = create :project, namespace: @user.namespace
- @project_2 = create :project, group: create(:group) # Grant MASTER access to the user
- @project_3 = create :project, group: create(:group) # Grant DEVELOPER access to the user
-
- @project_2.team << [@user, :master]
- @project_3.team << [@user, :developer]
- end
-
- it { expect(@user.authorized_projects).to include(@project) }
- it { expect(@user.authorized_projects).to include(@project_2) }
- it { expect(@user.authorized_projects).to include(@project_3) }
- it { expect(@user.owned_projects).to include(@project) }
- it { expect(@user.owned_projects).not_to include(@project_2) }
- it { expect(@user.owned_projects).not_to include(@project_3) }
- it { expect(@user.personal_projects).to include(@project) }
- it { expect(@user.personal_projects).not_to include(@project_2) }
- it { expect(@user.personal_projects).not_to include(@project_3) }
- end
-
- describe 'groups' do
- before do
- @user = create :user
- @group = create :group
- @group.add_owner(@user)
- end
-
- it { expect(@user.several_namespaces?).to be_truthy }
- it { expect(@user.authorized_groups).to eq([@group]) }
- it { expect(@user.owned_groups).to eq([@group]) }
- end
-
- describe 'group multiple owners' do
- before do
- @user = create :user
- @user2 = create :user
- @group = create :group
- @group.add_owner(@user)
-
- @group.add_user(@user2, GroupMember::OWNER)
- end
-
- it { expect(@user2.several_namespaces?).to be_truthy }
- end
-
- describe 'namespaced' do
- before do
- @user = create :user
- @project = create :project, namespace: @user.namespace
- end
-
- it { expect(@user.several_namespaces?).to be_falsey }
- end
-
- describe 'blocking user' do
- let(:user) { create(:user, name: 'John Smith') }
-
- it "should block user" do
- user.block
- expect(user.blocked?).to be_truthy
- end
- end
-
- describe 'filter' do
- before do
- User.delete_all
- @user = create :user
- @admin = create :user, admin: true
- @blocked = create :user, state: :blocked
- end
-
- it { expect(User.filter("admins")).to eq([@admin]) }
- it { expect(User.filter("blocked")).to eq([@blocked]) }
- it { expect(User.filter("wop")).to include(@user, @admin, @blocked) }
- it { expect(User.filter(nil)).to include(@user, @admin) }
- end
-
- describe :not_in_project do
- before do
- User.delete_all
- @user = create :user
- @project = create :project
- end
-
- it { expect(User.not_in_project(@project)).to include(@user, @project.owner) }
- end
-
- describe 'user creation' do
- describe 'normal user' do
- let(:user) { create(:user, name: 'John Smith') }
-
- it { expect(user.is_admin?).to be_falsey }
- it { expect(user.require_ssh_key?).to be_truthy }
- it { expect(user.can_create_group?).to be_truthy }
- it { expect(user.can_create_project?).to be_truthy }
- it { expect(user.first_name).to eq('John') }
- end
-
- describe 'with defaults' do
- let(:user) { User.new }
-
- it "should apply defaults to user" do
- expect(user.projects_limit).to eq(Gitlab.config.gitlab.default_projects_limit)
- expect(user.can_create_group).to eq(Gitlab.config.gitlab.default_can_create_group)
- expect(user.theme_id).to eq(Gitlab.config.gitlab.default_theme)
- end
- end
-
- describe 'with default overrides' do
- let(:user) { User.new(projects_limit: 123, can_create_group: false, can_create_team: true, theme_id: Gitlab::Theme::BASIC) }
-
- it "should apply defaults to user" do
- expect(user.projects_limit).to eq(123)
- expect(user.can_create_group).to be_falsey
- expect(user.theme_id).to eq(Gitlab::Theme::BASIC)
- end
- end
- end
-
- describe 'search' do
- let(:user1) { create(:user, username: 'James', email: 'james@testing.com') }
- let(:user2) { create(:user, username: 'jameson', email: 'jameson@example.com') }
-
- it "should be case insensitive" do
- expect(User.search(user1.username.upcase).to_a).to eq([user1])
- expect(User.search(user1.username.downcase).to_a).to eq([user1])
- expect(User.search(user2.username.upcase).to_a).to eq([user2])
- expect(User.search(user2.username.downcase).to_a).to eq([user2])
- expect(User.search(user1.username.downcase).to_a.count).to eq(2)
- expect(User.search(user2.username.downcase).to_a.count).to eq(1)
- end
- end
-
- describe 'by_username_or_id' do
- let(:user1) { create(:user, username: 'foo') }
-
- it "should get the correct user" do
- expect(User.by_username_or_id(user1.id)).to eq(user1)
- expect(User.by_username_or_id('foo')).to eq(user1)
- expect(User.by_username_or_id(-1)).to be_nil
- expect(User.by_username_or_id('bar')).to be_nil
- end
- end
-
- describe '.by_login' do
- let(:username) { 'John' }
- let!(:user) { create(:user, username: username) }
-
- it 'should get the correct user' do
- expect(User.by_login(user.email.upcase)).to eq user
- expect(User.by_login(user.email)).to eq user
- expect(User.by_login(username.downcase)).to eq user
- expect(User.by_login(username)).to eq user
- expect(User.by_login(nil)).to be_nil
- expect(User.by_login('')).to be_nil
- end
- end
-
- describe 'all_ssh_keys' do
- it { is_expected.to have_many(:keys).dependent(:destroy) }
-
- it "should have all ssh keys" do
- user = create :user
- key = create :key, key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD33bWLBxu48Sev9Fert1yzEO4WGcWglWF7K/AwblIUFselOt/QdOL9DSjpQGxLagO1s9wl53STIO8qGS4Ms0EJZyIXOEFMjFJ5xmjSy+S37By4sG7SsltQEHMxtbtFOaW5LV2wCrX+rUsRNqLMamZjgjcPO0/EgGCXIGMAYW4O7cwGZdXWYIhQ1Vwy+CsVMDdPkPgBXqK7nR/ey8KMs8ho5fMNgB5hBw/AL9fNGhRw3QTD6Q12Nkhl4VZES2EsZqlpNnJttnPdp847DUsT6yuLRlfiQfz5Cn9ysHFdXObMN5VYIiPFwHeYCZp1X2S4fDZooRE8uOLTfxWHPXwrhqSH", user_id: user.id
-
- expect(user.all_ssh_keys).to include(key.key)
- end
- end
-
- describe :avatar_type do
- let(:user) { create(:user) }
-
- it "should be true if avatar is image" do
- user.update_attribute(:avatar, 'uploads/avatar.png')
- expect(user.avatar_type).to be_truthy
- end
-
- it "should be false if avatar is html page" do
- user.update_attribute(:avatar, 'uploads/avatar.html')
- expect(user.avatar_type).to eq(["only images allowed"])
- end
- end
-
- describe :requires_ldap_check? do
- let(:user) { User.new }
-
- it 'is false when LDAP is disabled' do
- # Create a condition which would otherwise cause 'true' to be returned
- user.stub(ldap_user?: true)
- user.last_credential_check_at = nil
- expect(user.requires_ldap_check?).to be_falsey
- end
-
- context 'when LDAP is enabled' do
- before { Gitlab.config.ldap.stub(enabled: true) }
-
- it 'is false for non-LDAP users' do
- user.stub(ldap_user?: false)
- expect(user.requires_ldap_check?).to be_falsey
- end
-
- context 'and when the user is an LDAP user' do
- before { user.stub(ldap_user?: true) }
-
- it 'is true when the user has never had an LDAP check before' do
- user.last_credential_check_at = nil
- expect(user.requires_ldap_check?).to be_truthy
- end
-
- it 'is true when the last LDAP check happened over 1 hour ago' do
- user.last_credential_check_at = 2.hours.ago
- expect(user.requires_ldap_check?).to be_truthy
- end
- end
- end
- end
-
- describe :ldap_user? do
- it "is true if provider name starts with ldap" do
- user = create(:omniauth_user, provider: 'ldapmain')
- expect( user.ldap_user? ).to be_truthy
- end
-
- it "is false for other providers" do
- user = create(:omniauth_user, provider: 'other-provider')
- expect( user.ldap_user? ).to be_falsey
- end
-
- it "is false if no extern_uid is provided" do
- user = create(:omniauth_user, extern_uid: nil)
- expect( user.ldap_user? ).to be_falsey
- end
- end
-
- describe :ldap_identity do
- it "returns ldap identity" do
- user = create :omniauth_user
- expect(user.ldap_identity.provider).not_to be_empty
- end
- end
-
- describe '#full_website_url' do
- let(:user) { create(:user) }
-
- it 'begins with http if website url omits it' do
- user.website_url = 'test.com'
-
- expect(user.full_website_url).to eq 'http://test.com'
- end
-
- it 'begins with http if website url begins with http' do
- user.website_url = 'http://test.com'
-
- expect(user.full_website_url).to eq 'http://test.com'
- end
-
- it 'begins with https if website url begins with https' do
- user.website_url = 'https://test.com'
-
- expect(user.full_website_url).to eq 'https://test.com'
- end
- end
-
- describe '#short_website_url' do
- let(:user) { create(:user) }
-
- it 'does not begin with http if website url omits it' do
- user.website_url = 'test.com'
-
- expect(user.short_website_url).to eq 'test.com'
- end
-
- it 'does not begin with http if website url begins with http' do
- user.website_url = 'http://test.com'
-
- expect(user.short_website_url).to eq 'test.com'
- end
-
- it 'does not begin with https if website url begins with https' do
- user.website_url = 'https://test.com'
-
- expect(user.short_website_url).to eq 'test.com'
- end
- end
-
- describe "#starred?" do
- it "determines if user starred a project" do
- user = create :user
- project1 = create :project, :public
- project2 = create :project, :public
-
- expect(user.starred?(project1)).to be_falsey
- expect(user.starred?(project2)).to be_falsey
-
- star1 = UsersStarProject.create!(project: project1, user: user)
- expect(user.starred?(project1)).to be_truthy
- expect(user.starred?(project2)).to be_falsey
-
- star2 = UsersStarProject.create!(project: project2, user: user)
- expect(user.starred?(project1)).to be_truthy
- expect(user.starred?(project2)).to be_truthy
-
- star1.destroy
- expect(user.starred?(project1)).to be_falsey
- expect(user.starred?(project2)).to be_truthy
-
- star2.destroy
- expect(user.starred?(project1)).to be_falsey
- expect(user.starred?(project2)).to be_falsey
- end
- end
-
- describe "#toggle_star" do
- it "toggles stars" do
- user = create :user
- project = create :project, :public
-
- expect(user.starred?(project)).to be_falsey
- user.toggle_star(project)
- expect(user.starred?(project)).to be_truthy
- user.toggle_star(project)
- expect(user.starred?(project)).to be_falsey
- end
- end
-
- describe "#sort" do
- before do
- User.delete_all
- @user = create :user, created_at: Date.today, last_sign_in_at: Date.today, name: 'Alpha'
- @user1 = create :user, created_at: Date.today - 1, last_sign_in_at: Date.today - 1, name: 'Omega'
- end
-
- it "sorts users as recently_signed_in" do
- expect(User.sort('recent_sign_in').first).to eq(@user)
- end
-
- it "sorts users as late_signed_in" do
- expect(User.sort('oldest_sign_in').first).to eq(@user1)
- end
-
- it "sorts users as recently_created" do
- expect(User.sort('created_desc').first).to eq(@user)
- end
-
- it "sorts users as late_created" do
- expect(User.sort('created_asc').first).to eq(@user1)
- end
-
- it "sorts users by name when nil is passed" do
- expect(User.sort(nil).first).to eq(@user)
- end
- end
-
- describe "#contributed_projects_ids" do
-
- subject { create(:user) }
- let!(:project1) { create(:project) }
- let!(:project2) { create(:project, forked_from_project: project3) }
- let!(:project3) { create(:project) }
- let!(:merge_request) { create(:merge_request, source_project: project2, target_project: project3, author: subject) }
- let!(:push_event) { create(:event, action: Event::PUSHED, project: project1, target: project1, author: subject) }
- let!(:merge_event) { create(:event, action: Event::CREATED, project: project3, target: merge_request, author: subject) }
-
- before do
- project1.team << [subject, :master]
- project2.team << [subject, :master]
- end
-
- it "includes IDs for projects the user has pushed to" do
- expect(subject.contributed_projects_ids).to include(project1.id)
- end
-
- it "includes IDs for projects the user has had merge requests merged into" do
- expect(subject.contributed_projects_ids).to include(project3.id)
- end
-
- it "doesn't include IDs for unrelated projects" do
- expect(subject.contributed_projects_ids).not_to include(project2.id)
- end
- end
-end
diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb
deleted file mode 100644
index fceb7668cac..00000000000
--- a/spec/models/wiki_page_spec.rb
+++ /dev/null
@@ -1,210 +0,0 @@
-require "spec_helper"
-
-describe WikiPage do
- let(:project) { create(:empty_project) }
- let(:user) { project.owner }
- let(:wiki) { ProjectWiki.new(project, user) }
-
- subject { WikiPage.new(wiki) }
-
- describe "#initialize" do
- context "when initialized with an existing gollum page" do
- before do
- create_page("test page", "test content")
- @page = wiki.wiki.paged("test page")
- @wiki_page = WikiPage.new(wiki, @page, true)
- end
-
- it "sets the slug attribute" do
- expect(@wiki_page.slug).to eq("test-page")
- end
-
- it "sets the title attribute" do
- expect(@wiki_page.title).to eq("test page")
- end
-
- it "sets the formatted content attribute" do
- expect(@wiki_page.content).to eq("test content")
- end
-
- it "sets the format attribute" do
- expect(@wiki_page.format).to eq(:markdown)
- end
-
- it "sets the message attribute" do
- expect(@wiki_page.message).to eq("test commit")
- end
-
- it "sets the version attribute" do
- expect(@wiki_page.version).to be_a Gollum::Git::Commit
- end
- end
- end
-
- describe "validations" do
- before do
- subject.attributes = {title: 'title', content: 'content'}
- end
-
- it "validates presence of title" do
- subject.attributes.delete(:title)
- expect(subject.valid?).to be_falsey
- end
-
- it "validates presence of content" do
- subject.attributes.delete(:content)
- expect(subject.valid?).to be_falsey
- end
- end
-
- before do
- @wiki_attr = {title: "Index", content: "Home Page", format: "markdown"}
- end
-
- describe "#create" do
- after do
- destroy_page("Index")
- end
-
- context "with valid attributes" do
- it "saves the wiki page" do
- subject.create(@wiki_attr)
- expect(wiki.find_page("Index")).not_to be_nil
- end
-
- it "returns true" do
- expect(subject.create(@wiki_attr)).to eq(true)
- end
- end
- end
-
- describe "dot in the title" do
- let(:title) { 'Index v1.2.3' }
-
- before do
- @wiki_attr = {title: title, content: "Home Page", format: "markdown"}
- end
-
- describe "#create" do
- after do
- destroy_page(title)
- end
-
- context "with valid attributes" do
- it "saves the wiki page" do
- subject.create(@wiki_attr)
- expect(wiki.find_page(title)).not_to be_nil
- end
-
- it "returns true" do
- expect(subject.create(@wiki_attr)).to eq(true)
- end
- end
- end
-
- describe "#update" do
- before do
- create_page(title, "content")
- @page = wiki.find_page(title)
- end
-
- it "updates the content of the page" do
- @page.update("new content")
- @page = wiki.find_page(title)
- end
-
- it "returns true" do
- expect(@page.update("more content")).to be_truthy
- end
- end
- end
-
- describe "#update" do
- before do
- create_page("Update", "content")
- @page = wiki.find_page("Update")
- end
-
- after do
- destroy_page("Update")
- end
-
- context "with valid attributes" do
- it "updates the content of the page" do
- @page.update("new content")
- @page = wiki.find_page("Update")
- end
-
- it "returns true" do
- expect(@page.update("more content")).to be_truthy
- end
- end
- end
-
- describe "#destroy" do
- before do
- create_page("Delete Page", "content")
- @page = wiki.find_page("Delete Page")
- end
-
- it "should delete the page" do
- @page.delete
- expect(wiki.pages).to be_empty
- end
-
- it "should return true" do
- expect(@page.delete).to eq(true)
- end
- end
-
- describe "#versions" do
- before do
- create_page("Update", "content")
- @page = wiki.find_page("Update")
- end
-
- after do
- destroy_page("Update")
- end
-
- it "returns an array of all commits for the page" do
- 3.times { |i| @page.update("content #{i}") }
- expect(@page.versions.count).to eq(4)
- end
- end
-
- describe "#title" do
- before do
- create_page("Title", "content")
- @page = wiki.find_page("Title")
- end
-
- after do
- destroy_page("Title")
- end
-
- it "should be replace a hyphen to a space" do
- @page.title = "Import-existing-repositories-into-GitLab"
- expect(@page.title).to eq("Import existing repositories into GitLab")
- end
- end
-
- private
-
- def remove_temp_repo(path)
- FileUtils.rm_rf path
- end
-
- def commit_details
- commit = {name: user.name, email: user.email, message: "test commit"}
- end
-
- def create_page(name, content)
- wiki.wiki.write_page(name, :markdown, content, commit_details)
- end
-
- def destroy_page(title)
- page = wiki.wiki.paged(title)
- wiki.wiki.delete_page(page, commit_details)
- end
-end
diff --git a/spec/requests/api/api_helpers_spec.rb b/spec/requests/api/api_helpers_spec.rb
deleted file mode 100644
index 20cb30a39bb..00000000000
--- a/spec/requests/api/api_helpers_spec.rb
+++ /dev/null
@@ -1,173 +0,0 @@
-require 'spec_helper'
-
-describe API, api: true do
- include API::APIHelpers
- include ApiHelpers
- let(:user) { create(:user) }
- let(:admin) { create(:admin) }
- let(:key) { create(:key, user: user) }
-
- let(:params) { {} }
- let(:env) { {} }
-
- def set_env(token_usr, identifier)
- clear_env
- clear_param
- env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = token_usr.private_token
- env[API::APIHelpers::SUDO_HEADER] = identifier
- end
-
- def set_param(token_usr, identifier)
- clear_env
- clear_param
- params[API::APIHelpers::PRIVATE_TOKEN_PARAM] = token_usr.private_token
- params[API::APIHelpers::SUDO_PARAM] = identifier
- end
-
- def clear_env
- env.delete(API::APIHelpers::PRIVATE_TOKEN_HEADER)
- env.delete(API::APIHelpers::SUDO_HEADER)
- end
-
- def clear_param
- params.delete(API::APIHelpers::PRIVATE_TOKEN_PARAM)
- params.delete(API::APIHelpers::SUDO_PARAM)
- end
-
- def error!(message, status)
- raise Exception
- end
-
- describe ".current_user" do
- it "should return nil for an invalid token" do
- env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = 'invalid token'
- allow_any_instance_of(self.class).to receive(:doorkeeper_guard){ false }
- expect(current_user).to be_nil
- end
-
- it "should return nil for a user without access" do
- env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = user.private_token
- Gitlab::UserAccess.stub(allowed?: false)
- expect(current_user).to be_nil
- end
-
- it "should leave user as is when sudo not specified" do
- env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = user.private_token
- expect(current_user).to eq(user)
- clear_env
- params[API::APIHelpers::PRIVATE_TOKEN_PARAM] = user.private_token
- expect(current_user).to eq(user)
- end
-
- it "should change current user to sudo when admin" do
- set_env(admin, user.id)
- expect(current_user).to eq(user)
- set_param(admin, user.id)
- expect(current_user).to eq(user)
- set_env(admin, user.username)
- expect(current_user).to eq(user)
- set_param(admin, user.username)
- expect(current_user).to eq(user)
- end
-
- it "should throw an error when the current user is not an admin and attempting to sudo" do
- set_env(user, admin.id)
- expect { current_user }.to raise_error
- set_param(user, admin.id)
- expect { current_user }.to raise_error
- set_env(user, admin.username)
- expect { current_user }.to raise_error
- set_param(user, admin.username)
- expect { current_user }.to raise_error
- end
-
- it "should throw an error when the user cannot be found for a given id" do
- id = user.id + admin.id
- expect(user.id).not_to eq(id)
- expect(admin.id).not_to eq(id)
- set_env(admin, id)
- expect { current_user }.to raise_error
-
- set_param(admin, id)
- expect { current_user }.to raise_error
- end
-
- it "should throw an error when the user cannot be found for a given username" do
- username = "#{user.username}#{admin.username}"
- expect(user.username).not_to eq(username)
- expect(admin.username).not_to eq(username)
- set_env(admin, username)
- expect { current_user }.to raise_error
-
- set_param(admin, username)
- expect { current_user }.to raise_error
- end
-
- it "should handle sudo's to oneself" do
- set_env(admin, admin.id)
- expect(current_user).to eq(admin)
- set_param(admin, admin.id)
- expect(current_user).to eq(admin)
- set_env(admin, admin.username)
- expect(current_user).to eq(admin)
- set_param(admin, admin.username)
- expect(current_user).to eq(admin)
- end
-
- it "should handle multiple sudo's to oneself" do
- set_env(admin, user.id)
- expect(current_user).to eq(user)
- expect(current_user).to eq(user)
- set_env(admin, user.username)
- expect(current_user).to eq(user)
- expect(current_user).to eq(user)
-
- set_param(admin, user.id)
- expect(current_user).to eq(user)
- expect(current_user).to eq(user)
- set_param(admin, user.username)
- expect(current_user).to eq(user)
- expect(current_user).to eq(user)
- end
-
- it "should handle multiple sudo's to oneself using string ids" do
- set_env(admin, user.id.to_s)
- expect(current_user).to eq(user)
- expect(current_user).to eq(user)
-
- set_param(admin, user.id.to_s)
- expect(current_user).to eq(user)
- expect(current_user).to eq(user)
- end
- end
-
- describe '.sudo_identifier' do
- it "should return integers when input is an int" do
- set_env(admin, '123')
- expect(sudo_identifier).to eq(123)
- set_env(admin, '0001234567890')
- expect(sudo_identifier).to eq(1234567890)
-
- set_param(admin, '123')
- expect(sudo_identifier).to eq(123)
- set_param(admin, '0001234567890')
- expect(sudo_identifier).to eq(1234567890)
- end
-
- it "should return string when input is an is not an int" do
- set_env(admin, '12.30')
- expect(sudo_identifier).to eq("12.30")
- set_env(admin, 'hello')
- expect(sudo_identifier).to eq('hello')
- set_env(admin, ' 123')
- expect(sudo_identifier).to eq(' 123')
-
- set_param(admin, '12.30')
- expect(sudo_identifier).to eq("12.30")
- set_param(admin, 'hello')
- expect(sudo_identifier).to eq('hello')
- set_param(admin, ' 123')
- expect(sudo_identifier).to eq(' 123')
- end
- end
-end
diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb
deleted file mode 100644
index f40d68b75a4..00000000000
--- a/spec/requests/api/branches_spec.rb
+++ /dev/null
@@ -1,170 +0,0 @@
-require 'spec_helper'
-require 'mime/types'
-
-describe API::API, api: true do
- include ApiHelpers
-
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let!(:project) { create(:project, creator_id: user.id) }
- let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) }
- let!(:guest) { create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) }
- let!(:branch_name) { 'feature' }
- let!(:branch_sha) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' }
-
- describe "GET /projects/:id/repository/branches" do
- it "should return an array of project branches" do
- get api("/projects/#{project.id}/repository/branches", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['name']).to eq(project.repository.branch_names.first)
- end
- end
-
- describe "GET /projects/:id/repository/branches/:branch" do
- it "should return the branch information for a single branch" do
- get api("/projects/#{project.id}/repository/branches/#{branch_name}", user)
- expect(response.status).to eq(200)
-
- expect(json_response['name']).to eq(branch_name)
- expect(json_response['commit']['id']).to eq(branch_sha)
- expect(json_response['protected']).to eq(false)
- end
-
- it "should return a 403 error if guest" do
- get api("/projects/#{project.id}/repository/branches", user2)
- expect(response.status).to eq(403)
- end
-
- it "should return a 404 error if branch is not available" do
- get api("/projects/#{project.id}/repository/branches/unknown", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe "PUT /projects/:id/repository/branches/:branch/protect" do
- it "should protect a single branch" do
- put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user)
- expect(response.status).to eq(200)
-
- expect(json_response['name']).to eq(branch_name)
- expect(json_response['commit']['id']).to eq(branch_sha)
- expect(json_response['protected']).to eq(true)
- end
-
- it "should return a 404 error if branch not found" do
- put api("/projects/#{project.id}/repository/branches/unknown/protect", user)
- expect(response.status).to eq(404)
- end
-
- it "should return a 403 error if guest" do
- put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user2)
- expect(response.status).to eq(403)
- end
-
- it "should return success when protect branch again" do
- put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user)
- put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user)
- expect(response.status).to eq(200)
- end
- end
-
- describe "PUT /projects/:id/repository/branches/:branch/unprotect" do
- it "should unprotect a single branch" do
- put api("/projects/#{project.id}/repository/branches/#{branch_name}/unprotect", user)
- expect(response.status).to eq(200)
-
- expect(json_response['name']).to eq(branch_name)
- expect(json_response['commit']['id']).to eq(branch_sha)
- expect(json_response['protected']).to eq(false)
- end
-
- it "should return success when unprotect branch" do
- put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user)
- expect(response.status).to eq(404)
- end
-
- it "should return success when unprotect branch again" do
- put api("/projects/#{project.id}/repository/branches/#{branch_name}/unprotect", user)
- put api("/projects/#{project.id}/repository/branches/#{branch_name}/unprotect", user)
- expect(response.status).to eq(200)
- end
- end
-
- describe "POST /projects/:id/repository/branches" do
- it "should create a new branch" do
- post api("/projects/#{project.id}/repository/branches", user),
- branch_name: 'feature1',
- ref: branch_sha
-
- expect(response.status).to eq(201)
-
- expect(json_response['name']).to eq('feature1')
- expect(json_response['commit']['id']).to eq(branch_sha)
- end
-
- it "should deny for user without push access" do
- post api("/projects/#{project.id}/repository/branches", user2),
- branch_name: branch_name,
- ref: branch_sha
- expect(response.status).to eq(403)
- end
-
- it 'should return 400 if branch name is invalid' do
- post api("/projects/#{project.id}/repository/branches", user),
- branch_name: 'new design',
- ref: branch_sha
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('Branch name invalid')
- end
-
- it 'should return 400 if branch already exists' do
- post api("/projects/#{project.id}/repository/branches", user),
- branch_name: 'new_design1',
- ref: branch_sha
- expect(response.status).to eq(201)
-
- post api("/projects/#{project.id}/repository/branches", user),
- branch_name: 'new_design1',
- ref: branch_sha
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('Branch already exists')
- end
-
- it 'should return 400 if ref name is invalid' do
- post api("/projects/#{project.id}/repository/branches", user),
- branch_name: 'new_design3',
- ref: 'foo'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('Invalid reference name')
- end
- end
-
- describe "DELETE /projects/:id/repository/branches/:branch" do
- before { Repository.any_instance.stub(rm_branch: true) }
-
- it "should remove branch" do
- delete api("/projects/#{project.id}/repository/branches/#{branch_name}", user)
- expect(response.status).to eq(200)
- expect(json_response['branch_name']).to eq(branch_name)
- end
-
- it 'should return 404 if branch not exists' do
- delete api("/projects/#{project.id}/repository/branches/foobar", user)
- expect(response.status).to eq(404)
- end
-
- it "should remove protected branch" do
- project.protected_branches.create(name: branch_name)
- delete api("/projects/#{project.id}/repository/branches/#{branch_name}", user)
- expect(response.status).to eq(405)
- expect(json_response['message']).to eq('Protected branch cant be removed')
- end
-
- it "should not remove HEAD branch" do
- delete api("/projects/#{project.id}/repository/branches/master", user)
- expect(response.status).to eq(405)
- expect(json_response['message']).to eq('Cannot remove HEAD branch')
- end
- end
-end
diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb
deleted file mode 100644
index 9ea60e1a4ad..00000000000
--- a/spec/requests/api/commits_spec.rb
+++ /dev/null
@@ -1,149 +0,0 @@
-require 'spec_helper'
-require 'mime/types'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let!(:project) { create(:project, creator_id: user.id) }
- let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) }
- let!(:guest) { create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) }
- let!(:note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') }
-
- before { project.team << [user, :reporter] }
-
- describe "GET /projects/:id/repository/commits" do
- context "authorized user" do
- before { project.team << [user2, :reporter] }
-
- it "should return project commits" do
- get api("/projects/#{project.id}/repository/commits", user)
- expect(response.status).to eq(200)
-
- expect(json_response).to be_an Array
- expect(json_response.first['id']).to eq(project.repository.commit.id)
- end
- end
-
- context "unauthorized user" do
- it "should not return project commits" do
- get api("/projects/#{project.id}/repository/commits")
- expect(response.status).to eq(401)
- end
- end
- end
-
- describe "GET /projects:id/repository/commits/:sha" do
- context "authorized user" do
- it "should return a commit by sha" do
- get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['id']).to eq(project.repository.commit.id)
- expect(json_response['title']).to eq(project.repository.commit.title)
- end
-
- it "should return a 404 error if not found" do
- get api("/projects/#{project.id}/repository/commits/invalid_sha", user)
- expect(response.status).to eq(404)
- end
- end
-
- context "unauthorized user" do
- it "should not return the selected commit" do
- get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}")
- expect(response.status).to eq(401)
- end
- end
- end
-
- describe "GET /projects:id/repository/commits/:sha/diff" do
- context "authorized user" do
- before { project.team << [user2, :reporter] }
-
- it "should return the diff of the selected commit" do
- get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff", user)
- expect(response.status).to eq(200)
-
- expect(json_response).to be_an Array
- expect(json_response.length).to be >= 1
- expect(json_response.first.keys).to include "diff"
- end
-
- it "should return a 404 error if invalid commit" do
- get api("/projects/#{project.id}/repository/commits/invalid_sha/diff", user)
- expect(response.status).to eq(404)
- end
- end
-
- context "unauthorized user" do
- it "should not return the diff of the selected commit" do
- get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff")
- expect(response.status).to eq(401)
- end
- end
- end
-
- describe 'GET /projects:id/repository/commits/:sha/comments' do
- context 'authorized user' do
- it 'should return merge_request comments' do
- get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['note']).to eq('a comment on a commit')
- expect(json_response.first['author']['id']).to eq(user.id)
- end
-
- it 'should return a 404 error if merge_request_id not found' do
- get api("/projects/#{project.id}/repository/commits/1234ab/comments", user)
- expect(response.status).to eq(404)
- end
- end
-
- context 'unauthorized user' do
- it 'should not return the diff of the selected commit' do
- get api("/projects/#{project.id}/repository/commits/1234ab/comments")
- expect(response.status).to eq(401)
- end
- end
- end
-
- describe 'POST /projects:id/repository/commits/:sha/comments' do
- context 'authorized user' do
- it 'should return comment' do
- post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user), note: 'My comment'
- expect(response.status).to eq(201)
- expect(json_response['note']).to eq('My comment')
- expect(json_response['path']).to be_nil
- expect(json_response['line']).to be_nil
- expect(json_response['line_type']).to be_nil
- end
-
- it 'should return the inline comment' do
- post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user), note: 'My comment', path: project.repository.commit.diffs.first.new_path, line: 7, line_type: 'new'
- expect(response.status).to eq(201)
- expect(json_response['note']).to eq('My comment')
- expect(json_response['path']).to eq(project.repository.commit.diffs.first.new_path)
- expect(json_response['line']).to eq(7)
- expect(json_response['line_type']).to eq('new')
- end
-
- it 'should return 400 if note is missing' do
- post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user)
- expect(response.status).to eq(400)
- end
-
- it 'should return 404 if note is attached to non existent commit' do
- post api("/projects/#{project.id}/repository/commits/1234ab/comments", user), note: 'My comment'
- expect(response.status).to eq(404)
- end
- end
-
- context 'unauthorized user' do
- it 'should not return the diff of the selected commit' do
- post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments")
- expect(response.status).to eq(401)
- end
- end
- end
-end
diff --git a/spec/requests/api/doorkeeper_access_spec.rb b/spec/requests/api/doorkeeper_access_spec.rb
deleted file mode 100644
index 39949a90422..00000000000
--- a/spec/requests/api/doorkeeper_access_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
-
- let!(:user) { create(:user) }
- let!(:application) { Doorkeeper::Application.create!(:name => "MyApp", :redirect_uri => "https://app.com", :owner => user) }
- let!(:token) { Doorkeeper::AccessToken.create! :application_id => application.id, :resource_owner_id => user.id }
-
-
- describe "when unauthenticated" do
- it "returns authentication success" do
- get api("/user"), :access_token => token.token
- expect(response.status).to eq(200)
- end
- end
-
- describe "when token invalid" do
- it "returns authentication error" do
- get api("/user"), :access_token => "123a"
- expect(response.status).to eq(401)
- end
- end
-
- describe "authorization by private token" do
- it "returns authentication success" do
- get api("/user", user)
- expect(response.status).to eq(200)
- end
- end
-end
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
deleted file mode 100644
index bab8888a631..00000000000
--- a/spec/requests/api/files_spec.rb
+++ /dev/null
@@ -1,164 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let!(:project) { create(:project, namespace: user.namespace ) }
- let(:file_path) { 'files/ruby/popen.rb' }
-
- before { project.team << [user, :developer] }
-
- describe "GET /projects/:id/repository/files" do
- it "should return file info" do
- params = {
- file_path: file_path,
- ref: 'master',
- }
-
- get api("/projects/#{project.id}/repository/files", user), params
- expect(response.status).to eq(200)
- expect(json_response['file_path']).to eq(file_path)
- expect(json_response['file_name']).to eq('popen.rb')
- expect(Base64.decode64(json_response['content']).lines.first).to eq("require 'fileutils'\n")
- end
-
- it "should return a 400 bad request if no params given" do
- get api("/projects/#{project.id}/repository/files", user)
- expect(response.status).to eq(400)
- end
-
- it "should return a 404 if such file does not exist" do
- params = {
- file_path: 'app/models/application.rb',
- ref: 'master',
- }
-
- get api("/projects/#{project.id}/repository/files", user), params
- expect(response.status).to eq(404)
- end
- end
-
- describe "POST /projects/:id/repository/files" do
- let(:valid_params) {
- {
- file_path: 'newfile.rb',
- branch_name: 'master',
- content: 'puts 8',
- commit_message: 'Added newfile'
- }
- }
-
- it "should create a new file in project repo" do
- Gitlab::Satellite::NewFileAction.any_instance.stub(
- commit!: true,
- )
-
- post api("/projects/#{project.id}/repository/files", user), valid_params
- expect(response.status).to eq(201)
- expect(json_response['file_path']).to eq('newfile.rb')
- end
-
- it "should return a 400 bad request if no params given" do
- post api("/projects/#{project.id}/repository/files", user)
- expect(response.status).to eq(400)
- end
-
- it "should return a 400 if satellite fails to create file" do
- Gitlab::Satellite::NewFileAction.any_instance.stub(
- commit!: false,
- )
-
- post api("/projects/#{project.id}/repository/files", user), valid_params
- expect(response.status).to eq(400)
- end
- end
-
- describe "PUT /projects/:id/repository/files" do
- let(:valid_params) {
- {
- file_path: file_path,
- branch_name: 'master',
- content: 'puts 8',
- commit_message: 'Changed file'
- }
- }
-
- it "should update existing file in project repo" do
- Gitlab::Satellite::EditFileAction.any_instance.stub(
- commit!: true,
- )
-
- put api("/projects/#{project.id}/repository/files", user), valid_params
- expect(response.status).to eq(200)
- expect(json_response['file_path']).to eq(file_path)
- end
-
- it "should return a 400 bad request if no params given" do
- put api("/projects/#{project.id}/repository/files", user)
- expect(response.status).to eq(400)
- end
-
- it 'should return a 400 if the checkout fails' do
- Gitlab::Satellite::EditFileAction.any_instance.stub(:commit!)
- .and_raise(Gitlab::Satellite::CheckoutFailed)
-
- put api("/projects/#{project.id}/repository/files", user), valid_params
- expect(response.status).to eq(400)
-
- ref = valid_params[:branch_name]
- expect(response.body).to match("ref '#{ref}' could not be checked out")
- end
-
- it 'should return a 409 if the file was not modified' do
- Gitlab::Satellite::EditFileAction.any_instance.stub(:commit!)
- .and_raise(Gitlab::Satellite::CommitFailed)
-
- put api("/projects/#{project.id}/repository/files", user), valid_params
- expect(response.status).to eq(409)
- expect(response.body).to match("Maybe there was nothing to commit?")
- end
-
- it 'should return a 409 if the push fails' do
- Gitlab::Satellite::EditFileAction.any_instance.stub(:commit!)
- .and_raise(Gitlab::Satellite::PushFailed)
-
- put api("/projects/#{project.id}/repository/files", user), valid_params
- expect(response.status).to eq(409)
- expect(response.body).to match("Maybe the file was changed by another process?")
- end
- end
-
- describe "DELETE /projects/:id/repository/files" do
- let(:valid_params) {
- {
- file_path: file_path,
- branch_name: 'master',
- commit_message: 'Changed file'
- }
- }
-
- it "should delete existing file in project repo" do
- Gitlab::Satellite::DeleteFileAction.any_instance.stub(
- commit!: true,
- )
-
- delete api("/projects/#{project.id}/repository/files", user), valid_params
- expect(response.status).to eq(200)
- expect(json_response['file_path']).to eq(file_path)
- end
-
- it "should return a 400 bad request if no params given" do
- delete api("/projects/#{project.id}/repository/files", user)
- expect(response.status).to eq(400)
- end
-
- it "should return a 400 if satellite fails to create file" do
- Gitlab::Satellite::DeleteFileAction.any_instance.stub(
- commit!: false,
- )
-
- delete api("/projects/#{project.id}/repository/files", user), valid_params
- expect(response.status).to eq(400)
- end
- end
-end
diff --git a/spec/requests/api/fork_spec.rb b/spec/requests/api/fork_spec.rb
deleted file mode 100644
index fb3ff552c8d..00000000000
--- a/spec/requests/api/fork_spec.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:user3) { create(:user) }
- let(:admin) { create(:admin) }
- let(:project) {
- create(:project, creator_id: user.id,
- namespace: user.namespace)
- }
- let(:project_user2) {
- create(:project_member, user: user2,
- project: project,
- access_level: ProjectMember::GUEST)
- }
-
- describe 'POST /projects/fork/:id' do
- before { project_user2 }
- before { user3 }
-
- context 'when authenticated' do
- it 'should fork if user has sufficient access to project' do
- post api("/projects/fork/#{project.id}", user2)
- expect(response.status).to eq(201)
- expect(json_response['name']).to eq(project.name)
- expect(json_response['path']).to eq(project.path)
- expect(json_response['owner']['id']).to eq(user2.id)
- expect(json_response['namespace']['id']).to eq(user2.namespace.id)
- expect(json_response['forked_from_project']['id']).to eq(project.id)
- end
-
- it 'should fork if user is admin' do
- post api("/projects/fork/#{project.id}", admin)
- expect(response.status).to eq(201)
- expect(json_response['name']).to eq(project.name)
- expect(json_response['path']).to eq(project.path)
- expect(json_response['owner']['id']).to eq(admin.id)
- expect(json_response['namespace']['id']).to eq(admin.namespace.id)
- expect(json_response['forked_from_project']['id']).to eq(project.id)
- end
-
- it 'should fail on missing project access for the project to fork' do
- post api("/projects/fork/#{project.id}", user3)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Project Not Found')
- end
-
- it 'should fail if forked project exists in the user namespace' do
- post api("/projects/fork/#{project.id}", user)
- expect(response.status).to eq(409)
- expect(json_response['message']['base']).to eq(['Invalid fork destination'])
- expect(json_response['message']['name']).to eq(['has already been taken'])
- expect(json_response['message']['path']).to eq(['has already been taken'])
- end
-
- it 'should fail if project to fork from does not exist' do
- post api('/projects/fork/424242', user)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Project Not Found')
- end
- end
-
- context 'when unauthenticated' do
- it 'should return authentication error' do
- post api("/projects/fork/#{project.id}")
- expect(response.status).to eq(401)
- expect(json_response['message']).to eq('401 Unauthorized')
- end
- end
- end
-end
diff --git a/spec/requests/api/group_members_spec.rb b/spec/requests/api/group_members_spec.rb
deleted file mode 100644
index 8ba6876a95b..00000000000
--- a/spec/requests/api/group_members_spec.rb
+++ /dev/null
@@ -1,199 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
-
- let(:owner) { create(:user) }
- let(:reporter) { create(:user) }
- let(:developer) { create(:user) }
- let(:master) { create(:user) }
- let(:guest) { create(:user) }
- let(:stranger) { create(:user) }
-
- let!(:group_with_members) do
- group = create(:group)
- group.add_users([reporter.id], GroupMember::REPORTER)
- group.add_users([developer.id], GroupMember::DEVELOPER)
- group.add_users([master.id], GroupMember::MASTER)
- group.add_users([guest.id], GroupMember::GUEST)
- group
- end
-
- let!(:group_no_members) { create(:group) }
-
- before do
- group_with_members.add_owner owner
- group_no_members.add_owner owner
- end
-
- describe "GET /groups/:id/members" do
- context "when authenticated as user that is part or the group" do
- it "each user: should return an array of members groups of group3" do
- [owner, master, developer, reporter, guest].each do |user|
- get api("/groups/#{group_with_members.id}/members", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.size).to eq(5)
- expect(json_response.find { |e| e['id']==owner.id }['access_level']).to eq(GroupMember::OWNER)
- expect(json_response.find { |e| e['id']==reporter.id }['access_level']).to eq(GroupMember::REPORTER)
- expect(json_response.find { |e| e['id']==developer.id }['access_level']).to eq(GroupMember::DEVELOPER)
- expect(json_response.find { |e| e['id']==master.id }['access_level']).to eq(GroupMember::MASTER)
- expect(json_response.find { |e| e['id']==guest.id }['access_level']).to eq(GroupMember::GUEST)
- end
- end
-
- it "users not part of the group should get access error" do
- get api("/groups/#{group_with_members.id}/members", stranger)
- expect(response.status).to eq(403)
- end
- end
- end
-
- describe "POST /groups/:id/members" do
- context "when not a member of the group" do
- it "should not add guest as member of group_no_members when adding being done by person outside the group" do
- post api("/groups/#{group_no_members.id}/members", reporter), user_id: guest.id, access_level: GroupMember::MASTER
- expect(response.status).to eq(403)
- end
- end
-
- context "when a member of the group" do
- it "should return ok and add new member" do
- new_user = create(:user)
-
- expect {
- post api("/groups/#{group_no_members.id}/members", owner),
- user_id: new_user.id, access_level: GroupMember::MASTER
- }.to change { group_no_members.members.count }.by(1)
-
- expect(response.status).to eq(201)
- expect(json_response['name']).to eq(new_user.name)
- expect(json_response['access_level']).to eq(GroupMember::MASTER)
- end
-
- it "should not allow guest to modify group members" do
- new_user = create(:user)
-
- expect {
- post api("/groups/#{group_with_members.id}/members", guest),
- user_id: new_user.id, access_level: GroupMember::MASTER
- }.not_to change { group_with_members.members.count }
-
- expect(response.status).to eq(403)
- end
-
- it "should return error if member already exists" do
- post api("/groups/#{group_with_members.id}/members", owner), user_id: master.id, access_level: GroupMember::MASTER
- expect(response.status).to eq(409)
- end
-
- it "should return a 400 error when user id is not given" do
- post api("/groups/#{group_no_members.id}/members", owner), access_level: GroupMember::MASTER
- expect(response.status).to eq(400)
- end
-
- it "should return a 400 error when access level is not given" do
- post api("/groups/#{group_no_members.id}/members", owner), user_id: master.id
- expect(response.status).to eq(400)
- end
-
- it "should return a 422 error when access level is not known" do
- post api("/groups/#{group_no_members.id}/members", owner), user_id: master.id, access_level: 1234
- expect(response.status).to eq(422)
- end
- end
- end
-
- describe 'PUT /groups/:id/members/:user_id' do
- context 'when not a member of the group' do
- it 'should return a 409 error if the user is not a group member' do
- put(
- api("/groups/#{group_no_members.id}/members/#{developer.id}",
- owner), access_level: GroupMember::MASTER
- )
- expect(response.status).to eq(404)
- end
- end
-
- context 'when a member of the group' do
- it 'should return ok and update member access level' do
- put(
- api("/groups/#{group_with_members.id}/members/#{reporter.id}",
- owner),
- access_level: GroupMember::MASTER
- )
-
- expect(response.status).to eq(200)
-
- get api("/groups/#{group_with_members.id}/members", owner)
- json_reporter = json_response.find do |e|
- e['id'] == reporter.id
- end
-
- expect(json_reporter['access_level']).to eq(GroupMember::MASTER)
- end
-
- it 'should not allow guest to modify group members' do
- put(
- api("/groups/#{group_with_members.id}/members/#{developer.id}",
- guest),
- access_level: GroupMember::MASTER
- )
-
- expect(response.status).to eq(403)
-
- get api("/groups/#{group_with_members.id}/members", owner)
- json_developer = json_response.find do |e|
- e['id'] == developer.id
- end
-
- expect(json_developer['access_level']).to eq(GroupMember::DEVELOPER)
- end
-
- it 'should return a 400 error when access level is not given' do
- put(
- api("/groups/#{group_with_members.id}/members/#{master.id}", owner)
- )
- expect(response.status).to eq(400)
- end
-
- it 'should return a 422 error when access level is not known' do
- put(
- api("/groups/#{group_with_members.id}/members/#{master.id}", owner),
- access_level: 1234
- )
- expect(response.status).to eq(422)
- end
- end
- end
-
- describe "DELETE /groups/:id/members/:user_id" do
- context "when not a member of the group" do
- it "should not delete guest's membership of group_with_members" do
- random_user = create(:user)
- delete api("/groups/#{group_with_members.id}/members/#{owner.id}", random_user)
- expect(response.status).to eq(403)
- end
- end
-
- context "when a member of the group" do
- it "should delete guest's membership of group" do
- expect {
- delete api("/groups/#{group_with_members.id}/members/#{guest.id}", owner)
- }.to change { group_with_members.members.count }.by(-1)
-
- expect(response.status).to eq(200)
- end
-
- it "should return a 404 error when user id is not known" do
- delete api("/groups/#{group_with_members.id}/members/1328", owner)
- expect(response.status).to eq(404)
- end
-
- it "should not allow guest to modify group members" do
- delete api("/groups/#{group_with_members.id}/members/#{master.id}", guest)
- expect(response.status).to eq(403)
- end
- end
- end
-end
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
deleted file mode 100644
index d963dbac9f1..00000000000
--- a/spec/requests/api/groups_spec.rb
+++ /dev/null
@@ -1,187 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
-
- let(:user1) { create(:user) }
- let(:user2) { create(:user) }
- let(:admin) { create(:admin) }
- let!(:group1) { create(:group) }
- let!(:group2) { create(:group) }
-
- before do
- group1.add_owner(user1)
- group2.add_owner(user2)
- end
-
- describe "GET /groups" do
- context "when unauthenticated" do
- it "should return authentication error" do
- get api("/groups")
- expect(response.status).to eq(401)
- end
- end
-
- context "when authenticated as user" do
- it "normal user: should return an array of groups of user1" do
- get api("/groups", user1)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['name']).to eq(group1.name)
- end
- end
-
- context "when authenticated as admin" do
- it "admin: should return an array of all groups" do
- get api("/groups", admin)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(2)
- end
- end
- end
-
- describe "GET /groups/:id" do
- context "when authenticated as user" do
- it "should return one of user1's groups" do
- get api("/groups/#{group1.id}", user1)
- expect(response.status).to eq(200)
- json_response['name'] == group1.name
- end
-
- it "should not return a non existing group" do
- get api("/groups/1328", user1)
- expect(response.status).to eq(404)
- end
-
- it "should not return a group not attached to user1" do
- get api("/groups/#{group2.id}", user1)
- expect(response.status).to eq(403)
- end
- end
-
- context "when authenticated as admin" do
- it "should return any existing group" do
- get api("/groups/#{group2.id}", admin)
- expect(response.status).to eq(200)
- json_response['name'] == group2.name
- end
-
- it "should not return a non existing group" do
- get api("/groups/1328", admin)
- expect(response.status).to eq(404)
- end
- end
-
- context 'when using group path in URL' do
- it 'should return any existing group' do
- get api("/groups/#{group1.path}", admin)
- expect(response.status).to eq(200)
- json_response['name'] == group2.name
- end
-
- it 'should not return a non existing group' do
- get api('/groups/unknown', admin)
- expect(response.status).to eq(404)
- end
-
- it 'should not return a group not attached to user1' do
- get api("/groups/#{group2.path}", user1)
- expect(response.status).to eq(403)
- end
- end
- end
-
- describe "POST /groups" do
- context "when authenticated as user" do
- it "should not create group" do
- post api("/groups", user1), attributes_for(:group)
- expect(response.status).to eq(403)
- end
- end
-
- context "when authenticated as admin" do
- it "should create group" do
- post api("/groups", admin), attributes_for(:group)
- expect(response.status).to eq(201)
- end
-
- it "should not create group, duplicate" do
- post api("/groups", admin), {name: "Duplicate Test", path: group2.path}
- expect(response.status).to eq(400)
- expect(response.message).to eq("Bad Request")
- end
-
- it "should return 400 bad request error if name not given" do
- post api("/groups", admin), {path: group2.path}
- expect(response.status).to eq(400)
- end
-
- it "should return 400 bad request error if path not given" do
- post api("/groups", admin), { name: 'test' }
- expect(response.status).to eq(400)
- end
- end
- end
-
- describe "DELETE /groups/:id" do
- context "when authenticated as user" do
- it "should remove group" do
- delete api("/groups/#{group1.id}", user1)
- expect(response.status).to eq(200)
- end
-
- it "should not remove a group if not an owner" do
- user3 = create(:user)
- group1.add_user(user3, Gitlab::Access::MASTER)
- delete api("/groups/#{group1.id}", user3)
- expect(response.status).to eq(403)
- end
-
- it "should not remove a non existing group" do
- delete api("/groups/1328", user1)
- expect(response.status).to eq(404)
- end
-
- it "should not remove a group not attached to user1" do
- delete api("/groups/#{group2.id}", user1)
- expect(response.status).to eq(403)
- end
- end
-
- context "when authenticated as admin" do
- it "should remove any existing group" do
- delete api("/groups/#{group2.id}", admin)
- expect(response.status).to eq(200)
- end
-
- it "should not remove a non existing group" do
- delete api("/groups/1328", admin)
- expect(response.status).to eq(404)
- end
- end
- end
-
- describe "POST /groups/:id/projects/:project_id" do
- let(:project) { create(:project) }
- before(:each) do
- Projects::TransferService.any_instance.stub(execute: true)
- allow(Project).to receive(:find).and_return(project)
- end
-
- context "when authenticated as user" do
- it "should not transfer project to group" do
- post api("/groups/#{group1.id}/projects/#{project.id}", user2)
- expect(response.status).to eq(403)
- end
- end
-
- context "when authenticated as admin" do
- it "should transfer project to group" do
- post api("/groups/#{group1.id}/projects/#{project.id}", admin)
- expect(response.status).to eq(201)
- end
- end
- end
-end
diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb
deleted file mode 100644
index 4c7d15d6594..00000000000
--- a/spec/requests/api/internal_spec.rb
+++ /dev/null
@@ -1,229 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let(:key) { create(:key, user: user) }
- let(:project) { create(:project) }
- let(:secret_token) { File.read Rails.root.join('.gitlab_shell_secret') }
-
- describe "GET /internal/check", no_db: true do
- it do
- get api("/internal/check"), secret_token: secret_token
-
- expect(response.status).to eq(200)
- expect(json_response['api_version']).to eq(API::API.version)
- end
- end
-
- describe "GET /internal/broadcast_message" do
- context "broadcast message exists" do
- let!(:broadcast_message) { create(:broadcast_message, starts_at: Time.now.yesterday, ends_at: Time.now.tomorrow ) }
-
- it do
- get api("/internal/broadcast_message"), secret_token: secret_token
-
- expect(response.status).to eq(200)
- expect(json_response["message"]).to eq(broadcast_message.message)
- end
- end
-
- context "broadcast message doesn't exist" do
- it do
- get api("/internal/broadcast_message"), secret_token: secret_token
-
- expect(response.status).to eq(200)
- expect(json_response).to be_empty
- end
- end
- end
-
- describe "GET /internal/discover" do
- it do
- get(api("/internal/discover"), key_id: key.id, secret_token: secret_token)
-
- expect(response.status).to eq(200)
-
- expect(json_response['name']).to eq(user.name)
- end
- end
-
- describe "POST /internal/allowed" do
- context "access granted" do
- before do
- project.team << [user, :developer]
- end
-
- context "git pull" do
- it do
- pull(key, project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_truthy
- end
- end
-
- context "git push" do
- it do
- push(key, project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_truthy
- end
- end
- end
-
- context "access denied" do
- before do
- project.team << [user, :guest]
- end
-
- context "git pull" do
- it do
- pull(key, project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_falsey
- end
- end
-
- context "git push" do
- it do
- push(key, project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_falsey
- end
- end
- end
-
- context "blocked user" do
- let(:personal_project) { create(:project, namespace: user.namespace) }
-
- before do
- user.block
- end
-
- context "git pull" do
- it do
- pull(key, personal_project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_falsey
- end
- end
-
- context "git push" do
- it do
- push(key, personal_project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_falsey
- end
- end
- end
-
- context "archived project" do
- let(:personal_project) { create(:project, namespace: user.namespace) }
-
- before do
- project.team << [user, :developer]
- project.archive!
- end
-
- context "git pull" do
- it do
- pull(key, project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_truthy
- end
- end
-
- context "git push" do
- it do
- push(key, project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_falsey
- end
- end
- end
-
- context "deploy key" do
- let(:key) { create(:deploy_key) }
-
- context "added to project" do
- before do
- key.projects << project
- end
-
- it do
- archive(key, project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_truthy
- end
- end
-
- context "not added to project" do
- it do
- archive(key, project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_falsey
- end
- end
- end
-
- context 'project does not exist' do
- it do
- pull(key, OpenStruct.new(path_with_namespace: 'gitlab/notexists'))
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_falsey
- end
- end
-
- context 'user does not exist' do
- it do
- pull(OpenStruct.new(id: 0), project)
-
- expect(response.status).to eq(200)
- expect(json_response["status"]).to be_falsey
- end
- end
- end
-
- def pull(key, project)
- post(
- api("/internal/allowed"),
- key_id: key.id,
- project: project.path_with_namespace,
- action: 'git-upload-pack',
- secret_token: secret_token
- )
- end
-
- def push(key, project)
- post(
- api("/internal/allowed"),
- changes: 'd14d6c0abdd253381df51a723d58691b2ee1ab08 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/master',
- key_id: key.id,
- project: project.path_with_namespace,
- action: 'git-receive-pack',
- secret_token: secret_token
- )
- end
-
- def archive(key, project)
- post(
- api("/internal/allowed"),
- ref: 'master',
- key_id: key.id,
- project: project.path_with_namespace,
- action: 'git-upload-archive',
- secret_token: secret_token
- )
- end
-end
diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb
deleted file mode 100644
index b6b0427debf..00000000000
--- a/spec/requests/api/issues_spec.rb
+++ /dev/null
@@ -1,330 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let!(:project) { create(:project, namespace: user.namespace ) }
- let!(:closed_issue) do
- create :closed_issue,
- author: user,
- assignee: user,
- project: project,
- state: :closed,
- milestone: milestone
- end
- let!(:issue) do
- create :issue,
- author: user,
- assignee: user,
- project: project,
- milestone: milestone
- end
- let!(:label) do
- create(:label, title: 'label', color: '#FFAABB', project: project)
- end
- let!(:label_link) { create(:label_link, label: label, target: issue) }
- let!(:milestone) { create(:milestone, title: '1.0.0', project: project) }
- let!(:empty_milestone) do
- create(:milestone, title: '2.0.0', project: project)
- end
-
- before { project.team << [user, :reporter] }
-
- describe "GET /issues" do
- context "when unauthenticated" do
- it "should return authentication error" do
- get api("/issues")
- expect(response.status).to eq(401)
- end
- end
-
- context "when authenticated" do
- it "should return an array of issues" do
- get api("/issues", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['title']).to eq(issue.title)
- end
-
- it "should add pagination headers" do
- get api("/issues?per_page=3", user)
- expect(response.headers['Link']).to eq(
- '<http://www.example.com/api/v3/issues?page=1&per_page=3>; rel="first", <http://www.example.com/api/v3/issues?page=1&per_page=3>; rel="last"'
- )
- end
-
- it 'should return an array of closed issues' do
- get api('/issues?state=closed', user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['id']).to eq(closed_issue.id)
- end
-
- it 'should return an array of opened issues' do
- get api('/issues?state=opened', user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['id']).to eq(issue.id)
- end
-
- it 'should return an array of all issues' do
- get api('/issues?state=all', user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(2)
- expect(json_response.first['id']).to eq(issue.id)
- expect(json_response.second['id']).to eq(closed_issue.id)
- end
-
- it 'should return an array of labeled issues' do
- get api("/issues?labels=#{label.title}", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['labels']).to eq([label.title])
- end
-
- it 'should return an array of labeled issues when at least one label matches' do
- get api("/issues?labels=#{label.title},foo,bar", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['labels']).to eq([label.title])
- end
-
- it 'should return an empty array if no issue matches labels' do
- get api('/issues?labels=foo,bar', user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(0)
- end
-
- it 'should return an array of labeled issues matching given state' do
- get api("/issues?labels=#{label.title}&state=opened", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['labels']).to eq([label.title])
- expect(json_response.first['state']).to eq('opened')
- end
-
- it 'should return an empty array if no issue matches labels and state filters' do
- get api("/issues?labels=#{label.title}&state=closed", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(0)
- end
- end
- end
-
- describe "GET /projects/:id/issues" do
- let(:base_url) { "/projects/#{project.id}" }
- let(:title) { milestone.title }
-
- it "should return project issues" do
- get api("#{base_url}/issues", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['title']).to eq(issue.title)
- end
-
- it 'should return an array of labeled project issues' do
- get api("#{base_url}/issues?labels=#{label.title}", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['labels']).to eq([label.title])
- end
-
- it 'should return an array of labeled project issues when at least one label matches' do
- get api("#{base_url}/issues?labels=#{label.title},foo,bar", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['labels']).to eq([label.title])
- end
-
- it 'should return an empty array if no project issue matches labels' do
- get api("#{base_url}/issues?labels=foo,bar", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(0)
- end
-
- it 'should return an empty array if no issue matches milestone' do
- get api("#{base_url}/issues?milestone=#{empty_milestone.title}", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(0)
- end
-
- it 'should return an empty array if milestone does not exist' do
- get api("#{base_url}/issues?milestone=foo", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(0)
- end
-
- it 'should return an array of issues in given milestone' do
- get api("#{base_url}/issues?milestone=#{title}", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(2)
- expect(json_response.first['id']).to eq(issue.id)
- expect(json_response.second['id']).to eq(closed_issue.id)
- end
-
- it 'should return an array of issues matching state in milestone' do
- get api("#{base_url}/issues?milestone=#{milestone.title}"\
- '&state=closed', user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['id']).to eq(closed_issue.id)
- end
- end
-
- describe "GET /projects/:id/issues/:issue_id" do
- it "should return a project issue by id" do
- get api("/projects/#{project.id}/issues/#{issue.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq(issue.title)
- expect(json_response['iid']).to eq(issue.iid)
- end
-
- it "should return 404 if issue id not found" do
- get api("/projects/#{project.id}/issues/54321", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe "POST /projects/:id/issues" do
- it "should create a new project issue" do
- post api("/projects/#{project.id}/issues", user),
- title: 'new issue', labels: 'label, label2'
- expect(response.status).to eq(201)
- expect(json_response['title']).to eq('new issue')
- expect(json_response['description']).to be_nil
- expect(json_response['labels']).to eq(['label', 'label2'])
- end
-
- it "should return a 400 bad request if title not given" do
- post api("/projects/#{project.id}/issues", user), labels: 'label, label2'
- expect(response.status).to eq(400)
- end
-
- it 'should return 400 on invalid label names' do
- post api("/projects/#{project.id}/issues", user),
- title: 'new issue',
- labels: 'label, ?'
- expect(response.status).to eq(400)
- expect(json_response['message']['labels']['?']['title']).to eq(['is invalid'])
- end
-
- it 'should return 400 if title is too long' do
- post api("/projects/#{project.id}/issues", user),
- title: 'g' * 256
- expect(response.status).to eq(400)
- expect(json_response['message']['title']).to eq([
- 'is too long (maximum is 255 characters)'
- ])
- end
- end
-
- describe "PUT /projects/:id/issues/:issue_id to update only title" do
- it "should update a project issue" do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- title: 'updated title'
- expect(response.status).to eq(200)
-
- expect(json_response['title']).to eq('updated title')
- end
-
- it "should return 404 error if issue id not found" do
- put api("/projects/#{project.id}/issues/44444", user),
- title: 'updated title'
- expect(response.status).to eq(404)
- end
-
- it 'should return 400 on invalid label names' do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- title: 'updated title',
- labels: 'label, ?'
- expect(response.status).to eq(400)
- expect(json_response['message']['labels']['?']['title']).to eq(['is invalid'])
- end
- end
-
- describe 'PUT /projects/:id/issues/:issue_id to update labels' do
- let!(:label) { create(:label, title: 'dummy', project: project) }
- let!(:label_link) { create(:label_link, label: label, target: issue) }
-
- it 'should not update labels if not present' do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- title: 'updated title'
- expect(response.status).to eq(200)
- expect(json_response['labels']).to eq([label.title])
- end
-
- it 'should remove all labels' do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- labels: ''
- expect(response.status).to eq(200)
- expect(json_response['labels']).to eq([])
- end
-
- it 'should update labels' do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- labels: 'foo,bar'
- expect(response.status).to eq(200)
- expect(json_response['labels']).to include 'foo'
- expect(json_response['labels']).to include 'bar'
- end
-
- it 'should return 400 on invalid label names' do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- labels: 'label, ?'
- expect(response.status).to eq(400)
- expect(json_response['message']['labels']['?']['title']).to eq(['is invalid'])
- end
-
- it 'should allow special label names' do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- labels: 'label:foo, label-bar,label_bar,label/bar'
- expect(response.status).to eq(200)
- expect(json_response['labels']).to include 'label:foo'
- expect(json_response['labels']).to include 'label-bar'
- expect(json_response['labels']).to include 'label_bar'
- expect(json_response['labels']).to include 'label/bar'
- end
-
- it 'should return 400 if title is too long' do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- title: 'g' * 256
- expect(response.status).to eq(400)
- expect(json_response['message']['title']).to eq([
- 'is too long (maximum is 255 characters)'
- ])
- end
- end
-
- describe "PUT /projects/:id/issues/:issue_id to update state and label" do
- it "should update a project issue" do
- put api("/projects/#{project.id}/issues/#{issue.id}", user),
- labels: 'label2', state_event: "close"
- expect(response.status).to eq(200)
-
- expect(json_response['labels']).to include 'label2'
- expect(json_response['state']).to eq "closed"
- end
- end
-
- describe "DELETE /projects/:id/issues/:issue_id" do
- it "should delete a project issue" do
- delete api("/projects/#{project.id}/issues/#{issue.id}", user)
- expect(response.status).to eq(405)
- end
- end
-end
diff --git a/spec/requests/api/labels_spec.rb b/spec/requests/api/labels_spec.rb
deleted file mode 100644
index aff109a9424..00000000000
--- a/spec/requests/api/labels_spec.rb
+++ /dev/null
@@ -1,170 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
-
- let(:user) { create(:user) }
- let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
- let!(:label1) { create(:label, title: 'label1', project: project) }
-
- before do
- project.team << [user, :master]
- end
-
-
- describe 'GET /projects/:id/labels' do
- it 'should return project labels' do
- get api("/projects/#{project.id}/labels", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.size).to eq(1)
- expect(json_response.first['name']).to eq(label1.name)
- end
- end
-
- describe 'POST /projects/:id/labels' do
- it 'should return created label' do
- post api("/projects/#{project.id}/labels", user),
- name: 'Foo',
- color: '#FFAABB'
- expect(response.status).to eq(201)
- expect(json_response['name']).to eq('Foo')
- expect(json_response['color']).to eq('#FFAABB')
- end
-
- it 'should return a 400 bad request if name not given' do
- post api("/projects/#{project.id}/labels", user), color: '#FFAABB'
- expect(response.status).to eq(400)
- end
-
- it 'should return a 400 bad request if color not given' do
- post api("/projects/#{project.id}/labels", user), name: 'Foobar'
- expect(response.status).to eq(400)
- end
-
- it 'should return 400 for invalid color' do
- post api("/projects/#{project.id}/labels", user),
- name: 'Foo',
- color: '#FFAA'
- expect(response.status).to eq(400)
- expect(json_response['message']['color']).to eq(['is invalid'])
- end
-
- it 'should return 400 for too long color code' do
- post api("/projects/#{project.id}/labels", user),
- name: 'Foo',
- color: '#FFAAFFFF'
- expect(response.status).to eq(400)
- expect(json_response['message']['color']).to eq(['is invalid'])
- end
-
- it 'should return 400 for invalid name' do
- post api("/projects/#{project.id}/labels", user),
- name: '?',
- color: '#FFAABB'
- expect(response.status).to eq(400)
- expect(json_response['message']['title']).to eq(['is invalid'])
- end
-
- it 'should return 409 if label already exists' do
- post api("/projects/#{project.id}/labels", user),
- name: 'label1',
- color: '#FFAABB'
- expect(response.status).to eq(409)
- expect(json_response['message']).to eq('Label already exists')
- end
- end
-
- describe 'DELETE /projects/:id/labels' do
- it 'should return 200 for existing label' do
- delete api("/projects/#{project.id}/labels", user), name: 'label1'
- expect(response.status).to eq(200)
- end
-
- it 'should return 404 for non existing label' do
- delete api("/projects/#{project.id}/labels", user), name: 'label2'
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Label Not Found')
- end
-
- it 'should return 400 for wrong parameters' do
- delete api("/projects/#{project.id}/labels", user)
- expect(response.status).to eq(400)
- end
- end
-
- describe 'PUT /projects/:id/labels' do
- it 'should return 200 if name and colors are changed' do
- put api("/projects/#{project.id}/labels", user),
- name: 'label1',
- new_name: 'New Label',
- color: '#FFFFFF'
- expect(response.status).to eq(200)
- expect(json_response['name']).to eq('New Label')
- expect(json_response['color']).to eq('#FFFFFF')
- end
-
- it 'should return 200 if name is changed' do
- put api("/projects/#{project.id}/labels", user),
- name: 'label1',
- new_name: 'New Label'
- expect(response.status).to eq(200)
- expect(json_response['name']).to eq('New Label')
- expect(json_response['color']).to eq(label1.color)
- end
-
- it 'should return 200 if colors is changed' do
- put api("/projects/#{project.id}/labels", user),
- name: 'label1',
- color: '#FFFFFF'
- expect(response.status).to eq(200)
- expect(json_response['name']).to eq(label1.name)
- expect(json_response['color']).to eq('#FFFFFF')
- end
-
- it 'should return 404 if label does not exist' do
- put api("/projects/#{project.id}/labels", user),
- name: 'label2',
- new_name: 'label3'
- expect(response.status).to eq(404)
- end
-
- it 'should return 400 if no label name given' do
- put api("/projects/#{project.id}/labels", user), new_name: 'label2'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('400 (Bad request) "name" not given')
- end
-
- it 'should return 400 if no new parameters given' do
- put api("/projects/#{project.id}/labels", user), name: 'label1'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('Required parameters '\
- '"new_name" or "color" missing')
- end
-
- it 'should return 400 for invalid name' do
- put api("/projects/#{project.id}/labels", user),
- name: 'label1',
- new_name: '?',
- color: '#FFFFFF'
- expect(response.status).to eq(400)
- expect(json_response['message']['title']).to eq(['is invalid'])
- end
-
- it 'should return 400 for invalid name' do
- put api("/projects/#{project.id}/labels", user),
- name: 'label1',
- color: '#FF'
- expect(response.status).to eq(400)
- expect(json_response['message']['color']).to eq(['is invalid'])
- end
-
- it 'should return 400 for too long color code' do
- post api("/projects/#{project.id}/labels", user),
- name: 'Foo',
- color: '#FFAAFFFF'
- expect(response.status).to eq(400)
- expect(json_response['message']['color']).to eq(['is invalid'])
- end
- end
-end
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
deleted file mode 100644
index 9e252441a4f..00000000000
--- a/spec/requests/api/merge_requests_spec.rb
+++ /dev/null
@@ -1,409 +0,0 @@
-require "spec_helper"
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
- let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
- let!(:merge_request_closed) { create(:merge_request, state: "closed", author: user, assignee: user, source_project: project, target_project: project, title: "Closed test") }
- let!(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignee: user, source_project: project, target_project: project, title: "Merged test") }
- let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") }
- before {
- project.team << [user, :reporters]
- }
-
- describe "GET /projects/:id/merge_requests" do
- context "when unauthenticated" do
- it "should return authentication error" do
- get api("/projects/#{project.id}/merge_requests")
- expect(response.status).to eq(401)
- end
- end
-
- context "when authenticated" do
- it "should return an array of all merge_requests" do
- get api("/projects/#{project.id}/merge_requests", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(3)
- expect(json_response.last['title']).to eq(merge_request.title)
- end
-
- it "should return an array of all merge_requests" do
- get api("/projects/#{project.id}/merge_requests?state", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(3)
- expect(json_response.last['title']).to eq(merge_request.title)
- end
-
- it "should return an array of open merge_requests" do
- get api("/projects/#{project.id}/merge_requests?state=opened", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.last['title']).to eq(merge_request.title)
- end
-
- it "should return an array of closed merge_requests" do
- get api("/projects/#{project.id}/merge_requests?state=closed", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(2)
- expect(json_response.second['title']).to eq(merge_request_closed.title)
- expect(json_response.first['title']).to eq(merge_request_merged.title)
- end
-
- it "should return an array of merged merge_requests" do
- get api("/projects/#{project.id}/merge_requests?state=merged", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['title']).to eq(merge_request_merged.title)
- end
-
- context "with ordering" do
- before do
- @mr_later = mr_with_later_created_and_updated_at_time
- @mr_earlier = mr_with_earlier_created_and_updated_at_time
- end
-
- it "should return an array of merge_requests in ascending order" do
- get api("/projects/#{project.id}/merge_requests?sort=asc", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(3)
- expect(json_response.last['id']).to eq(@mr_earlier.id)
- expect(json_response.first['id']).to eq(@mr_later.id)
- end
-
- it "should return an array of merge_requests in descending order" do
- get api("/projects/#{project.id}/merge_requests?sort=desc", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(3)
- expect(json_response.first['id']).to eq(@mr_later.id)
- expect(json_response.last['id']).to eq(@mr_earlier.id)
- end
-
- it "should return an array of merge_requests ordered by updated_at" do
- get api("/projects/#{project.id}/merge_requests?order_by=updated_at", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(3)
- expect(json_response.last['id']).to eq(@mr_earlier.id)
- expect(json_response.first['id']).to eq(@mr_later.id)
- end
-
- it "should return an array of merge_requests ordered by created_at" do
- get api("/projects/#{project.id}/merge_requests?sort=created_at", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(3)
- expect(json_response.last['id']).to eq(@mr_earlier.id)
- expect(json_response.first['id']).to eq(@mr_later.id)
- end
- end
- end
- end
-
- describe "GET /projects/:id/merge_request/:merge_request_id" do
- it "should return merge_request" do
- get api("/projects/#{project.id}/merge_request/#{merge_request.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq(merge_request.title)
- expect(json_response['iid']).to eq(merge_request.iid)
- end
-
- it "should return a 404 error if merge_request_id not found" do
- get api("/projects/#{project.id}/merge_request/999", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe 'GET /projects/:id/merge_request/:merge_request_id/changes' do
- it 'should return the change information of the merge_request' do
- get api("/projects/#{project.id}/merge_request/#{merge_request.id}/changes", user)
- expect(response.status).to eq 200
- expect(json_response['changes'].size).to eq(merge_request.diffs.size)
- end
-
- it 'returns a 404 when merge_request_id not found' do
- get api("/projects/#{project.id}/merge_request/999/changes", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe "POST /projects/:id/merge_requests" do
- context 'between branches projects' do
- it "should return merge_request" do
- post api("/projects/#{project.id}/merge_requests", user),
- title: 'Test merge_request',
- source_branch: 'stable',
- target_branch: 'master',
- author: user,
- labels: 'label, label2'
- expect(response.status).to eq(201)
- expect(json_response['title']).to eq('Test merge_request')
- expect(json_response['labels']).to eq(['label', 'label2'])
- end
-
- it "should return 422 when source_branch equals target_branch" do
- post api("/projects/#{project.id}/merge_requests", user),
- title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
- expect(response.status).to eq(422)
- end
-
- it "should return 400 when source_branch is missing" do
- post api("/projects/#{project.id}/merge_requests", user),
- title: "Test merge_request", target_branch: "master", author: user
- expect(response.status).to eq(400)
- end
-
- it "should return 400 when target_branch is missing" do
- post api("/projects/#{project.id}/merge_requests", user),
- title: "Test merge_request", source_branch: "stable", author: user
- expect(response.status).to eq(400)
- end
-
- it "should return 400 when title is missing" do
- post api("/projects/#{project.id}/merge_requests", user),
- target_branch: 'master', source_branch: 'stable'
- expect(response.status).to eq(400)
- end
-
- it 'should return 400 on invalid label names' do
- post api("/projects/#{project.id}/merge_requests", user),
- title: 'Test merge_request',
- source_branch: 'stable',
- target_branch: 'master',
- author: user,
- labels: 'label, ?'
- expect(response.status).to eq(400)
- expect(json_response['message']['labels']['?']['title']).to eq(
- ['is invalid']
- )
- end
-
- context 'with existing MR' do
- before do
- post api("/projects/#{project.id}/merge_requests", user),
- title: 'Test merge_request',
- source_branch: 'stable',
- target_branch: 'master',
- author: user
- @mr = MergeRequest.all.last
- end
-
- it 'should return 409 when MR already exists for source/target' do
- expect do
- post api("/projects/#{project.id}/merge_requests", user),
- title: 'New test merge_request',
- source_branch: 'stable',
- target_branch: 'master',
- author: user
- end.to change { MergeRequest.count }.by(0)
- expect(response.status).to eq(409)
- end
- end
- end
-
- context 'forked projects' do
- let!(:user2) { create(:user) }
- let!(:fork_project) { create(:project, forked_from_project: project, namespace: user2.namespace, creator_id: user2.id) }
- let!(:unrelated_project) { create(:project, namespace: create(:user).namespace, creator_id: user2.id) }
-
- before :each do |each|
- fork_project.team << [user2, :reporters]
- end
-
- it "should return merge_request" do
- post api("/projects/#{fork_project.id}/merge_requests", user2),
- title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id, description: 'Test description for Test merge_request'
- expect(response.status).to eq(201)
- expect(json_response['title']).to eq('Test merge_request')
- expect(json_response['description']).to eq('Test description for Test merge_request')
- end
-
- it "should not return 422 when source_branch equals target_branch" do
- expect(project.id).not_to eq(fork_project.id)
- expect(fork_project.forked?).to be_truthy
- expect(fork_project.forked_from_project).to eq(project)
- post api("/projects/#{fork_project.id}/merge_requests", user2),
- title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
- expect(response.status).to eq(201)
- expect(json_response['title']).to eq('Test merge_request')
- end
-
- it "should return 400 when source_branch is missing" do
- post api("/projects/#{fork_project.id}/merge_requests", user2),
- title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
- expect(response.status).to eq(400)
- end
-
- it "should return 400 when target_branch is missing" do
- post api("/projects/#{fork_project.id}/merge_requests", user2),
- title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
- expect(response.status).to eq(400)
- end
-
- it "should return 400 when title is missing" do
- post api("/projects/#{fork_project.id}/merge_requests", user2),
- target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id
- expect(response.status).to eq(400)
- end
-
- context 'when target_branch is specified' do
- it 'should return 422 if not a forked project' do
- post api("/projects/#{project.id}/merge_requests", user),
- title: 'Test merge_request',
- target_branch: 'master',
- source_branch: 'stable',
- author: user,
- target_project_id: fork_project.id
- expect(response.status).to eq(422)
- end
-
- it 'should return 422 if targeting a different fork' do
- post api("/projects/#{fork_project.id}/merge_requests", user2),
- title: 'Test merge_request',
- target_branch: 'master',
- source_branch: 'stable',
- author: user2,
- target_project_id: unrelated_project.id
- expect(response.status).to eq(422)
- end
- end
-
- it "should return 201 when target_branch is specified and for the same project" do
- post api("/projects/#{fork_project.id}/merge_requests", user2),
- title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
- expect(response.status).to eq(201)
- end
- end
- end
-
- describe "PUT /projects/:id/merge_request/:merge_request_id to close MR" do
- it "should return merge_request" do
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), state_event: "close"
- expect(response.status).to eq(200)
- expect(json_response['state']).to eq('closed')
- end
- end
-
- describe "PUT /projects/:id/merge_request/:merge_request_id/merge" do
- it "should return merge_request in case of success" do
- MergeRequest.any_instance.stub(can_be_merged?: true, automerge!: true)
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user)
- expect(response.status).to eq(200)
- end
-
- it "should return 405 if branch can't be merged" do
- MergeRequest.any_instance.stub(can_be_merged?: false)
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user)
- expect(response.status).to eq(405)
- expect(json_response['message']).to eq('Branch cannot be merged')
- end
-
- it "should return 405 if merge_request is not open" do
- merge_request.close
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user)
- expect(response.status).to eq(405)
- expect(json_response['message']).to eq('405 Method Not Allowed')
- end
-
- it "should return 401 if user has no permissions to merge" do
- user2 = create(:user)
- project.team << [user2, :reporter]
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user2)
- expect(response.status).to eq(401)
- expect(json_response['message']).to eq('401 Unauthorized')
- end
- end
-
- describe "PUT /projects/:id/merge_request/:merge_request_id" do
- it "should return merge_request" do
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), title: "New title"
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq('New title')
- end
-
- it "should return merge_request" do
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), description: "New description"
- expect(response.status).to eq(200)
- expect(json_response['description']).to eq('New description')
- end
-
- it "should return 422 when source_branch and target_branch are renamed the same" do
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user),
- source_branch: "master", target_branch: "master"
- expect(response.status).to eq(422)
- end
-
- it "should return merge_request with renamed target_branch" do
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), target_branch: "wiki"
- expect(response.status).to eq(200)
- expect(json_response['target_branch']).to eq('wiki')
- end
-
- it 'should return 400 on invalid label names' do
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}",
- user),
- title: 'new issue',
- labels: 'label, ?'
- expect(response.status).to eq(400)
- expect(json_response['message']['labels']['?']['title']).to eq(['is invalid'])
- end
- end
-
- describe "POST /projects/:id/merge_request/:merge_request_id/comments" do
- it "should return comment" do
- post api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user), note: "My comment"
- expect(response.status).to eq(201)
- expect(json_response['note']).to eq('My comment')
- end
-
- it "should return 400 if note is missing" do
- post api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user)
- expect(response.status).to eq(400)
- end
-
- it "should return 404 if note is attached to non existent merge request" do
- post api("/projects/#{project.id}/merge_request/404/comments", user),
- note: 'My comment'
- expect(response.status).to eq(404)
- end
- end
-
- describe "GET :id/merge_request/:merge_request_id/comments" do
- it "should return merge_request comments" do
- get api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- expect(json_response.first['note']).to eq("a comment on a MR")
- expect(json_response.first['author']['id']).to eq(user.id)
- end
-
- it "should return a 404 error if merge_request_id not found" do
- get api("/projects/#{project.id}/merge_request/999/comments", user)
- expect(response.status).to eq(404)
- end
- end
-
- def mr_with_later_created_and_updated_at_time
- merge_request
- merge_request.created_at += 1.hour
- merge_request.updated_at += 30.minutes
- merge_request.save
- merge_request
- end
-
- def mr_with_earlier_created_and_updated_at_time
- merge_request_closed
- merge_request_closed.created_at -= 1.hour
- merge_request_closed.updated_at -= 30.minutes
- merge_request_closed.save
- merge_request_closed
- end
-end
diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb
deleted file mode 100644
index effb0723476..00000000000
--- a/spec/requests/api/milestones_spec.rb
+++ /dev/null
@@ -1,116 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let!(:project) { create(:project, namespace: user.namespace ) }
- let!(:milestone) { create(:milestone, project: project) }
-
- before { project.team << [user, :developer] }
-
- describe 'GET /projects/:id/milestones' do
- it 'should return project milestones' do
- get api("/projects/#{project.id}/milestones", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['title']).to eq(milestone.title)
- end
-
- it 'should return a 401 error if user not authenticated' do
- get api("/projects/#{project.id}/milestones")
- expect(response.status).to eq(401)
- end
- end
-
- describe 'GET /projects/:id/milestones/:milestone_id' do
- it 'should return a project milestone by id' do
- get api("/projects/#{project.id}/milestones/#{milestone.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq(milestone.title)
- expect(json_response['iid']).to eq(milestone.iid)
- end
-
- it 'should return 401 error if user not authenticated' do
- get api("/projects/#{project.id}/milestones/#{milestone.id}")
- expect(response.status).to eq(401)
- end
-
- it 'should return a 404 error if milestone id not found' do
- get api("/projects/#{project.id}/milestones/1234", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe 'POST /projects/:id/milestones' do
- it 'should create a new project milestone' do
- post api("/projects/#{project.id}/milestones", user), title: 'new milestone'
- expect(response.status).to eq(201)
- expect(json_response['title']).to eq('new milestone')
- expect(json_response['description']).to be_nil
- end
-
- it 'should create a new project milestone with description and due date' do
- post api("/projects/#{project.id}/milestones", user),
- title: 'new milestone', description: 'release', due_date: '2013-03-02'
- expect(response.status).to eq(201)
- expect(json_response['description']).to eq('release')
- expect(json_response['due_date']).to eq('2013-03-02')
- end
-
- it 'should return a 400 error if title is missing' do
- post api("/projects/#{project.id}/milestones", user)
- expect(response.status).to eq(400)
- end
- end
-
- describe 'PUT /projects/:id/milestones/:milestone_id' do
- it 'should update a project milestone' do
- put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
- title: 'updated title'
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq('updated title')
- end
-
- it 'should return a 404 error if milestone id not found' do
- put api("/projects/#{project.id}/milestones/1234", user),
- title: 'updated title'
- expect(response.status).to eq(404)
- end
- end
-
- describe 'PUT /projects/:id/milestones/:milestone_id to close milestone' do
- it 'should update a project milestone' do
- put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
- state_event: 'close'
- expect(response.status).to eq(200)
-
- expect(json_response['state']).to eq('closed')
- end
- end
-
- describe 'PUT /projects/:id/milestones/:milestone_id to test observer on close' do
- it 'should create an activity event when an milestone is closed' do
- expect(Event).to receive(:create)
-
- put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
- state_event: 'close'
- end
- end
-
- describe 'GET /projects/:id/milestones/:milestone_id/issues' do
- before do
- milestone.issues << create(:issue)
- end
- it 'should return project issues for a particular milestone' do
- get api("/projects/#{project.id}/milestones/#{milestone.id}/issues", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['milestone']['title']).to eq(milestone.title)
- end
-
- it 'should return a 401 error if user not authenticated' do
- get api("/projects/#{project.id}/milestones/#{milestone.id}/issues")
- expect(response.status).to eq(401)
- end
- end
-end
diff --git a/spec/requests/api/namespaces_spec.rb b/spec/requests/api/namespaces_spec.rb
deleted file mode 100644
index 6ddaaa0a6dd..00000000000
--- a/spec/requests/api/namespaces_spec.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:admin) { create(:admin) }
- let!(:group1) { create(:group) }
- let!(:group2) { create(:group) }
-
- describe "GET /namespaces" do
- context "when unauthenticated" do
- it "should return authentication error" do
- get api("/namespaces")
- expect(response.status).to eq(401)
- end
- end
-
- context "when authenticated as admin" do
- it "admin: should return an array of all namespaces" do
- get api("/namespaces", admin)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
-
- expect(json_response.length).to eq(Namespace.count)
- end
- end
- end
-end
diff --git a/spec/requests/api/notes_spec.rb b/spec/requests/api/notes_spec.rb
deleted file mode 100644
index 8b177af4689..00000000000
--- a/spec/requests/api/notes_spec.rb
+++ /dev/null
@@ -1,188 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let!(:project) { create(:project, namespace: user.namespace ) }
- let!(:issue) { create(:issue, project: project, author: user) }
- let!(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: user) }
- let!(:snippet) { create(:project_snippet, project: project, author: user) }
- let!(:issue_note) { create(:note, noteable: issue, project: project, author: user) }
- let!(:merge_request_note) { create(:note, noteable: merge_request, project: project, author: user) }
- let!(:snippet_note) { create(:note, noteable: snippet, project: project, author: user) }
- before { project.team << [user, :reporter] }
-
- describe "GET /projects/:id/noteable/:noteable_id/notes" do
- context "when noteable is an Issue" do
- it "should return an array of issue notes" do
- get api("/projects/#{project.id}/issues/#{issue.id}/notes", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['body']).to eq(issue_note.note)
- end
-
- it "should return a 404 error when issue id not found" do
- get api("/projects/#{project.id}/issues/123/notes", user)
- expect(response.status).to eq(404)
- end
- end
-
- context "when noteable is a Snippet" do
- it "should return an array of snippet notes" do
- get api("/projects/#{project.id}/snippets/#{snippet.id}/notes", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['body']).to eq(snippet_note.note)
- end
-
- it "should return a 404 error when snippet id not found" do
- get api("/projects/#{project.id}/snippets/42/notes", user)
- expect(response.status).to eq(404)
- end
- end
-
- context "when noteable is a Merge Request" do
- it "should return an array of merge_requests notes" do
- get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/notes", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['body']).to eq(merge_request_note.note)
- end
-
- it "should return a 404 error if merge request id not found" do
- get api("/projects/#{project.id}/merge_requests/4444/notes", user)
- expect(response.status).to eq(404)
- end
- end
- end
-
- describe "GET /projects/:id/noteable/:noteable_id/notes/:note_id" do
- context "when noteable is an Issue" do
- it "should return an issue note by id" do
- get api("/projects/#{project.id}/issues/#{issue.id}/notes/#{issue_note.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['body']).to eq(issue_note.note)
- end
-
- it "should return a 404 error if issue note not found" do
- get api("/projects/#{project.id}/issues/#{issue.id}/notes/123", user)
- expect(response.status).to eq(404)
- end
- end
-
- context "when noteable is a Snippet" do
- it "should return a snippet note by id" do
- get api("/projects/#{project.id}/snippets/#{snippet.id}/notes/#{snippet_note.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['body']).to eq(snippet_note.note)
- end
-
- it "should return a 404 error if snippet note not found" do
- get api("/projects/#{project.id}/snippets/#{snippet.id}/notes/123", user)
- expect(response.status).to eq(404)
- end
- end
- end
-
- describe "POST /projects/:id/noteable/:noteable_id/notes" do
- context "when noteable is an Issue" do
- it "should create a new issue note" do
- post api("/projects/#{project.id}/issues/#{issue.id}/notes", user), body: 'hi!'
- expect(response.status).to eq(201)
- expect(json_response['body']).to eq('hi!')
- expect(json_response['author']['username']).to eq(user.username)
- end
-
- it "should return a 400 bad request error if body not given" do
- post api("/projects/#{project.id}/issues/#{issue.id}/notes", user)
- expect(response.status).to eq(400)
- end
-
- it "should return a 401 unauthorized error if user not authenticated" do
- post api("/projects/#{project.id}/issues/#{issue.id}/notes"), body: 'hi!'
- expect(response.status).to eq(401)
- end
- end
-
- context "when noteable is a Snippet" do
- it "should create a new snippet note" do
- post api("/projects/#{project.id}/snippets/#{snippet.id}/notes", user), body: 'hi!'
- expect(response.status).to eq(201)
- expect(json_response['body']).to eq('hi!')
- expect(json_response['author']['username']).to eq(user.username)
- end
-
- it "should return a 400 bad request error if body not given" do
- post api("/projects/#{project.id}/snippets/#{snippet.id}/notes", user)
- expect(response.status).to eq(400)
- end
-
- it "should return a 401 unauthorized error if user not authenticated" do
- post api("/projects/#{project.id}/snippets/#{snippet.id}/notes"), body: 'hi!'
- expect(response.status).to eq(401)
- end
- end
- end
-
- describe "POST /projects/:id/noteable/:noteable_id/notes to test observer on create" do
- it "should create an activity event when an issue note is created" do
- expect(Event).to receive(:create)
-
- post api("/projects/#{project.id}/issues/#{issue.id}/notes", user), body: 'hi!'
- end
- end
-
- describe 'PUT /projects/:id/noteable/:noteable_id/notes/:note_id' do
- context 'when noteable is an Issue' do
- it 'should return modified note' do
- put api("/projects/#{project.id}/issues/#{issue.id}/"\
- "notes/#{issue_note.id}", user), body: 'Hello!'
- expect(response.status).to eq(200)
- expect(json_response['body']).to eq('Hello!')
- end
-
- it 'should return a 404 error when note id not found' do
- put api("/projects/#{project.id}/issues/#{issue.id}/notes/123", user),
- body: 'Hello!'
- expect(response.status).to eq(404)
- end
-
- it 'should return a 400 bad request error if body not given' do
- put api("/projects/#{project.id}/issues/#{issue.id}/"\
- "notes/#{issue_note.id}", user)
- expect(response.status).to eq(400)
- end
- end
-
- context 'when noteable is a Snippet' do
- it 'should return modified note' do
- put api("/projects/#{project.id}/snippets/#{snippet.id}/"\
- "notes/#{snippet_note.id}", user), body: 'Hello!'
- expect(response.status).to eq(200)
- expect(json_response['body']).to eq('Hello!')
- end
-
- it 'should return a 404 error when note id not found' do
- put api("/projects/#{project.id}/snippets/#{snippet.id}/"\
- "notes/123", user), body: "Hello!"
- expect(response.status).to eq(404)
- end
- end
-
- context 'when noteable is a Merge Request' do
- it 'should return modified note' do
- put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/"\
- "notes/#{merge_request_note.id}", user), body: 'Hello!'
- expect(response.status).to eq(200)
- expect(json_response['body']).to eq('Hello!')
- end
-
- it 'should return a 404 error when note id not found' do
- put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/"\
- "notes/123", user), body: "Hello!"
- expect(response.status).to eq(404)
- end
- end
- end
-
-end
diff --git a/spec/requests/api/project_hooks_spec.rb b/spec/requests/api/project_hooks_spec.rb
deleted file mode 100644
index 81fe68de662..00000000000
--- a/spec/requests/api/project_hooks_spec.rb
+++ /dev/null
@@ -1,129 +0,0 @@
-require 'spec_helper'
-
-describe API::API, 'ProjectHooks', api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let(:user3) { create(:user) }
- let!(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
- let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
-
- before do
- project.team << [user, :master]
- project.team << [user3, :developer]
- end
-
- describe "GET /projects/:id/hooks" do
- context "authorized user" do
- it "should return project hooks" do
- get api("/projects/#{project.id}/hooks", user)
- expect(response.status).to eq(200)
-
- expect(json_response).to be_an Array
- expect(json_response.count).to eq(1)
- expect(json_response.first['url']).to eq("http://example.com")
- end
- end
-
- context "unauthorized user" do
- it "should not access project hooks" do
- get api("/projects/#{project.id}/hooks", user3)
- expect(response.status).to eq(403)
- end
- end
- end
-
- describe "GET /projects/:id/hooks/:hook_id" do
- context "authorized user" do
- it "should return a project hook" do
- get api("/projects/#{project.id}/hooks/#{hook.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['url']).to eq(hook.url)
- end
-
- it "should return a 404 error if hook id is not available" do
- get api("/projects/#{project.id}/hooks/1234", user)
- expect(response.status).to eq(404)
- end
- end
-
- context "unauthorized user" do
- it "should not access an existing hook" do
- get api("/projects/#{project.id}/hooks/#{hook.id}", user3)
- expect(response.status).to eq(403)
- end
- end
-
- it "should return a 404 error if hook id is not available" do
- get api("/projects/#{project.id}/hooks/1234", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe "POST /projects/:id/hooks" do
- it "should add hook to project" do
- expect {
- post api("/projects/#{project.id}/hooks", user),
- url: "http://example.com", issues_events: true
- }.to change {project.hooks.count}.by(1)
- expect(response.status).to eq(201)
- end
-
- it "should return a 400 error if url not given" do
- post api("/projects/#{project.id}/hooks", user)
- expect(response.status).to eq(400)
- end
-
- it "should return a 422 error if url not valid" do
- post api("/projects/#{project.id}/hooks", user), "url" => "ftp://example.com"
- expect(response.status).to eq(422)
- end
- end
-
- describe "PUT /projects/:id/hooks/:hook_id" do
- it "should update an existing project hook" do
- put api("/projects/#{project.id}/hooks/#{hook.id}", user),
- url: 'http://example.org', push_events: false
- expect(response.status).to eq(200)
- expect(json_response['url']).to eq('http://example.org')
- end
-
- it "should return 404 error if hook id not found" do
- put api("/projects/#{project.id}/hooks/1234", user), url: 'http://example.org'
- expect(response.status).to eq(404)
- end
-
- it "should return 400 error if url is not given" do
- put api("/projects/#{project.id}/hooks/#{hook.id}", user)
- expect(response.status).to eq(400)
- end
-
- it "should return a 422 error if url is not valid" do
- put api("/projects/#{project.id}/hooks/#{hook.id}", user), url: 'ftp://example.com'
- expect(response.status).to eq(422)
- end
- end
-
- describe "DELETE /projects/:id/hooks/:hook_id" do
- it "should delete hook from project" do
- expect {
- delete api("/projects/#{project.id}/hooks/#{hook.id}", user)
- }.to change {project.hooks.count}.by(-1)
- expect(response.status).to eq(200)
- end
-
- it "should return success when deleting hook" do
- delete api("/projects/#{project.id}/hooks/#{hook.id}", user)
- expect(response.status).to eq(200)
- end
-
- it "should return success when deleting non existent hook" do
- delete api("/projects/#{project.id}/hooks/42", user)
- expect(response.status).to eq(200)
- end
-
- it "should return a 405 error if hook id not given" do
- delete api("/projects/#{project.id}/hooks", user)
- expect(response.status).to eq(405)
- end
- end
-end
diff --git a/spec/requests/api/project_members_spec.rb b/spec/requests/api/project_members_spec.rb
deleted file mode 100644
index 8419a364ed1..00000000000
--- a/spec/requests/api/project_members_spec.rb
+++ /dev/null
@@ -1,153 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:user3) { create(:user) }
- let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
- let(:project_member) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) }
- let(:project_member2) { create(:project_member, user: user3, project: project, access_level: ProjectMember::DEVELOPER) }
-
- describe "GET /projects/:id/members" do
- before { project_member }
- before { project_member2 }
-
- it "should return project team members" do
- get api("/projects/#{project.id}/members", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.count).to eq(2)
- expect(json_response.map { |u| u['username'] }).to include user.username
- end
-
- it "finds team members with query string" do
- get api("/projects/#{project.id}/members", user), query: user.username
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.count).to eq(1)
- expect(json_response.first['username']).to eq(user.username)
- end
-
- it "should return a 404 error if id not found" do
- get api("/projects/9999/members", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe "GET /projects/:id/members/:user_id" do
- before { project_member }
-
- it "should return project team member" do
- get api("/projects/#{project.id}/members/#{user.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['username']).to eq(user.username)
- expect(json_response['access_level']).to eq(ProjectMember::MASTER)
- end
-
- it "should return a 404 error if user id not found" do
- get api("/projects/#{project.id}/members/1234", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe "POST /projects/:id/members" do
- it "should add user to project team" do
- expect {
- post api("/projects/#{project.id}/members", user), user_id: user2.id,
- access_level: ProjectMember::DEVELOPER
- }.to change { ProjectMember.count }.by(1)
-
- expect(response.status).to eq(201)
- expect(json_response['username']).to eq(user2.username)
- expect(json_response['access_level']).to eq(ProjectMember::DEVELOPER)
- end
-
- it "should return a 201 status if user is already project member" do
- post api("/projects/#{project.id}/members", user), user_id: user2.id,
- access_level: ProjectMember::DEVELOPER
- expect {
- post api("/projects/#{project.id}/members", user), user_id: user2.id,
- access_level: ProjectMember::DEVELOPER
- }.not_to change { ProjectMember.count }
-
- expect(response.status).to eq(201)
- expect(json_response['username']).to eq(user2.username)
- expect(json_response['access_level']).to eq(ProjectMember::DEVELOPER)
- end
-
- it "should return a 400 error when user id is not given" do
- post api("/projects/#{project.id}/members", user), access_level: ProjectMember::MASTER
- expect(response.status).to eq(400)
- end
-
- it "should return a 400 error when access level is not given" do
- post api("/projects/#{project.id}/members", user), user_id: user2.id
- expect(response.status).to eq(400)
- end
-
- it "should return a 422 error when access level is not known" do
- post api("/projects/#{project.id}/members", user), user_id: user2.id, access_level: 1234
- expect(response.status).to eq(422)
- end
- end
-
- describe "PUT /projects/:id/members/:user_id" do
- before { project_member2 }
-
- it "should update project team member" do
- put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: ProjectMember::MASTER
- expect(response.status).to eq(200)
- expect(json_response['username']).to eq(user3.username)
- expect(json_response['access_level']).to eq(ProjectMember::MASTER)
- end
-
- it "should return a 404 error if user_id is not found" do
- put api("/projects/#{project.id}/members/1234", user), access_level: ProjectMember::MASTER
- expect(response.status).to eq(404)
- end
-
- it "should return a 400 error when access level is not given" do
- put api("/projects/#{project.id}/members/#{user3.id}", user)
- expect(response.status).to eq(400)
- end
-
- it "should return a 422 error when access level is not known" do
- put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: 123
- expect(response.status).to eq(422)
- end
- end
-
- describe "DELETE /projects/:id/members/:user_id" do
- before { project_member }
- before { project_member2 }
-
- it "should remove user from project team" do
- expect {
- delete api("/projects/#{project.id}/members/#{user3.id}", user)
- }.to change { ProjectMember.count }.by(-1)
- end
-
- it "should return 200 if team member is not part of a project" do
- delete api("/projects/#{project.id}/members/#{user3.id}", user)
- expect {
- delete api("/projects/#{project.id}/members/#{user3.id}", user)
- }.to_not change { ProjectMember.count }
- end
-
- it "should return 200 if team member already removed" do
- delete api("/projects/#{project.id}/members/#{user3.id}", user)
- delete api("/projects/#{project.id}/members/#{user3.id}", user)
- expect(response.status).to eq(200)
- end
-
- it "should return 200 OK when the user was not member" do
- expect {
- delete api("/projects/#{project.id}/members/1000000", user)
- }.to change { ProjectMember.count }.by(0)
- expect(response.status).to eq(200)
- expect(json_response['message']).to eq("Access revoked")
- expect(json_response['id']).to eq(1000000)
- end
- end
-end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
deleted file mode 100644
index cc387378d3a..00000000000
--- a/spec/requests/api/projects_spec.rb
+++ /dev/null
@@ -1,825 +0,0 @@
-# -*- coding: utf-8 -*-
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
- include Gitlab::CurrentSettings
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:user3) { create(:user) }
- let(:admin) { create(:admin) }
- let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
- let(:project2) { create(:project, path: 'project2', creator_id: user.id, namespace: user.namespace) }
- let(:project3) { create(:project, path: 'project3', creator_id: user.id, namespace: user.namespace) }
- let(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }
- let(:project_member) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) }
- let(:project_member2) { create(:project_member, user: user3, project: project, access_level: ProjectMember::DEVELOPER) }
- let(:user4) { create(:user) }
- let(:project3) do
- create(:project,
- name: 'second_project',
- path: 'second_project',
- creator_id: user.id,
- namespace: user.namespace,
- merge_requests_enabled: false,
- issues_enabled: false, wiki_enabled: false,
- snippets_enabled: false, visibility_level: 0)
- end
- let(:project_member3) do
- create(:project_member,
- user: user4,
- project: project3,
- access_level: ProjectMember::MASTER)
- end
- let(:project4) do
- create(:project,
- name: 'third_project',
- path: 'third_project',
- creator_id: user4.id,
- namespace: user4.namespace)
- end
-
- describe 'GET /projects' do
- before { project }
-
- context 'when unauthenticated' do
- it 'should return authentication error' do
- get api('/projects')
- expect(response.status).to eq(401)
- end
- end
-
- context 'when authenticated' do
- it 'should return an array of projects' do
- get api('/projects', user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['name']).to eq(project.name)
- expect(json_response.first['owner']['username']).to eq(user.username)
- end
-
- it 'should include the project labels as the tag_list' do
- get api('/projects', user)
- response.status.should == 200
- json_response.should be_an Array
- json_response.first.keys.should include('tag_list')
- end
-
- context 'and using search' do
- it 'should return searched project' do
- get api('/projects', user), { search: project.name }
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
- end
- end
-
- context 'and using sorting' do
- before do
- project2
- project3
- end
-
- it 'should return the correct order when sorted by id' do
- get api('/projects', user), { order_by: 'id', sort: 'desc'}
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['id']).to eq(project3.id)
- end
- end
- end
- end
-
- describe 'GET /projects/all' do
- before { project }
-
- context 'when unauthenticated' do
- it 'should return authentication error' do
- get api('/projects/all')
- expect(response.status).to eq(401)
- end
- end
-
- context 'when authenticated as regular user' do
- it 'should return authentication error' do
- get api('/projects/all', user)
- expect(response.status).to eq(403)
- end
- end
-
- context 'when authenticated as admin' do
- it 'should return an array of all projects' do
- get api('/projects/all', admin)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- project_name = project.name
-
- expect(json_response.detect {
- |project| project['name'] == project_name
- }['name']).to eq(project_name)
-
- expect(json_response.detect {
- |project| project['owner']['username'] == user.username
- }['owner']['username']).to eq(user.username)
- end
- end
- end
-
- describe 'POST /projects' do
- context 'maximum number of projects reached' do
- it 'should not create new project and respond with 403' do
- allow_any_instance_of(User).to receive(:projects_limit_left).and_return(0)
- expect {
- post api('/projects', user2), name: 'foo'
- }.to change {Project.count}.by(0)
- expect(response.status).to eq(403)
- end
- end
-
- it 'should create new project without path and return 201' do
- expect { post api('/projects', user), name: 'foo' }.
- to change { Project.count }.by(1)
- expect(response.status).to eq(201)
- end
-
- it 'should create last project before reaching project limit' do
- allow_any_instance_of(User).to receive(:projects_limit_left).and_return(1)
- post api('/projects', user2), name: 'foo'
- expect(response.status).to eq(201)
- end
-
- it 'should not create new project without name and return 400' do
- expect { post api('/projects', user) }.to_not change { Project.count }
- expect(response.status).to eq(400)
- end
-
- it "should assign attributes to project" do
- project = attributes_for(:project, {
- path: 'camelCasePath',
- description: Faker::Lorem.sentence,
- issues_enabled: false,
- merge_requests_enabled: false,
- wiki_enabled: false
- })
-
- post api('/projects', user), project
-
- project.each_pair do |k,v|
- expect(json_response[k.to_s]).to eq(v)
- end
- end
-
- it 'should set a project as public' do
- project = attributes_for(:project, :public)
- post api('/projects', user), project
- expect(json_response['public']).to be_truthy
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PUBLIC)
- end
-
- it 'should set a project as public using :public' do
- project = attributes_for(:project, { public: true })
- post api('/projects', user), project
- expect(json_response['public']).to be_truthy
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PUBLIC)
- end
-
- it 'should set a project as internal' do
- project = attributes_for(:project, :internal)
- post api('/projects', user), project
- expect(json_response['public']).to be_falsey
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::INTERNAL)
- end
-
- it 'should set a project as internal overriding :public' do
- project = attributes_for(:project, :internal, { public: true })
- post api('/projects', user), project
- expect(json_response['public']).to be_falsey
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::INTERNAL)
- end
-
- it 'should set a project as private' do
- project = attributes_for(:project, :private)
- post api('/projects', user), project
- expect(json_response['public']).to be_falsey
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
-
- it 'should set a project as private using :public' do
- project = attributes_for(:project, { public: false })
- post api('/projects', user), project
- expect(json_response['public']).to be_falsey
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
-
- context 'when a visibility level is restricted' do
- before do
- @project = attributes_for(:project, { public: true })
- allow_any_instance_of(ApplicationSetting).to(
- receive(:restricted_visibility_levels).and_return([20])
- )
- end
-
- it 'should not allow a non-admin to use a restricted visibility level' do
- post api('/projects', user), @project
- expect(response.status).to eq(400)
- expect(json_response['message']['visibility_level'].first).to(
- match('restricted by your GitLab administrator')
- )
- end
-
- it 'should allow an admin to override restricted visibility settings' do
- post api('/projects', admin), @project
- expect(json_response['public']).to be_truthy
- expect(json_response['visibility_level']).to(
- eq(Gitlab::VisibilityLevel::PUBLIC)
- )
- end
- end
- end
-
- describe 'POST /projects/user/:id' do
- before { project }
- before { admin }
-
- it 'should create new project without path and return 201' do
- expect { post api("/projects/user/#{user.id}", admin), name: 'foo' }.to change {Project.count}.by(1)
- expect(response.status).to eq(201)
- end
-
- it 'should respond with 400 on failure and not project' do
- expect { post api("/projects/user/#{user.id}", admin) }.
- to_not change { Project.count }
-
- expect(response.status).to eq(400)
- expect(json_response['message']['name']).to eq([
- 'can\'t be blank',
- 'is too short (minimum is 0 characters)',
- Gitlab::Regex.project_name_regex_message
- ])
- expect(json_response['message']['path']).to eq([
- 'can\'t be blank',
- 'is too short (minimum is 0 characters)',
- Gitlab::Regex.send(:project_path_regex_message)
- ])
- end
-
- it 'should assign attributes to project' do
- project = attributes_for(:project, {
- description: Faker::Lorem.sentence,
- issues_enabled: false,
- merge_requests_enabled: false,
- wiki_enabled: false
- })
-
- post api("/projects/user/#{user.id}", admin), project
-
- project.each_pair do |k,v|
- next if k == :path
- expect(json_response[k.to_s]).to eq(v)
- end
- end
-
- it 'should set a project as public' do
- project = attributes_for(:project, :public)
- post api("/projects/user/#{user.id}", admin), project
- expect(json_response['public']).to be_truthy
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PUBLIC)
- end
-
- it 'should set a project as public using :public' do
- project = attributes_for(:project, { public: true })
- post api("/projects/user/#{user.id}", admin), project
- expect(json_response['public']).to be_truthy
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PUBLIC)
- end
-
- it 'should set a project as internal' do
- project = attributes_for(:project, :internal)
- post api("/projects/user/#{user.id}", admin), project
- expect(json_response['public']).to be_falsey
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::INTERNAL)
- end
-
- it 'should set a project as internal overriding :public' do
- project = attributes_for(:project, :internal, { public: true })
- post api("/projects/user/#{user.id}", admin), project
- expect(json_response['public']).to be_falsey
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::INTERNAL)
- end
-
- it 'should set a project as private' do
- project = attributes_for(:project, :private)
- post api("/projects/user/#{user.id}", admin), project
- expect(json_response['public']).to be_falsey
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
-
- it 'should set a project as private using :public' do
- project = attributes_for(:project, { public: false })
- post api("/projects/user/#{user.id}", admin), project
- expect(json_response['public']).to be_falsey
- expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
- end
-
- describe 'GET /projects/:id' do
- before { project }
- before { project_member }
-
- it 'should return a project by id' do
- get api("/projects/#{project.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['name']).to eq(project.name)
- expect(json_response['owner']['username']).to eq(user.username)
- end
-
- it 'should return a project by path name' do
- get api("/projects/#{project.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['name']).to eq(project.name)
- end
-
- it 'should return a 404 error if not found' do
- get api('/projects/42', user)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Project Not Found')
- end
-
- it 'should return a 404 error if user is not a member' do
- other_user = create(:user)
- get api("/projects/#{project.id}", other_user)
- expect(response.status).to eq(404)
- end
-
- describe 'permissions' do
- context 'personal project' do
- it 'Sets project access and returns 200' do
- project.team << [user, :master]
- get api("/projects/#{project.id}", user)
-
- expect(response.status).to eq(200)
- expect(json_response['permissions']['project_access']['access_level']).
- to eq(Gitlab::Access::MASTER)
- expect(json_response['permissions']['group_access']).to be_nil
- end
- end
-
- context 'group project' do
- it 'should set the owner and return 200' do
- project2 = create(:project, group: create(:group))
- project2.group.add_owner(user)
- get api("/projects/#{project2.id}", user)
-
- expect(response.status).to eq(200)
- expect(json_response['permissions']['project_access']).to be_nil
- expect(json_response['permissions']['group_access']['access_level']).
- to eq(Gitlab::Access::OWNER)
- end
- end
- end
- end
-
- describe 'GET /projects/:id/events' do
- before { project_member2 }
-
- it 'should return a project events' do
- get api("/projects/#{project.id}/events", user)
- expect(response.status).to eq(200)
- json_event = json_response.first
-
- expect(json_event['action_name']).to eq('joined')
- expect(json_event['project_id'].to_i).to eq(project.id)
- expect(json_event['author_username']).to eq(user3.username)
- end
-
- it 'should return a 404 error if not found' do
- get api('/projects/42/events', user)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Project Not Found')
- end
-
- it 'should return a 404 error if user is not a member' do
- other_user = create(:user)
- get api("/projects/#{project.id}/events", other_user)
- expect(response.status).to eq(404)
- end
- end
-
- describe 'GET /projects/:id/snippets' do
- before { snippet }
-
- it 'should return an array of project snippets' do
- get api("/projects/#{project.id}/snippets", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['title']).to eq(snippet.title)
- end
- end
-
- describe 'GET /projects/:id/snippets/:snippet_id' do
- it 'should return a project snippet' do
- get api("/projects/#{project.id}/snippets/#{snippet.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq(snippet.title)
- end
-
- it 'should return a 404 error if snippet id not found' do
- get api("/projects/#{project.id}/snippets/1234", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe 'POST /projects/:id/snippets' do
- it 'should create a new project snippet' do
- post api("/projects/#{project.id}/snippets", user),
- title: 'api test', file_name: 'sample.rb', code: 'test',
- visibility_level: '0'
- expect(response.status).to eq(201)
- expect(json_response['title']).to eq('api test')
- end
-
- it 'should return a 400 error if invalid snippet is given' do
- post api("/projects/#{project.id}/snippets", user)
- expect(status).to eq(400)
- end
- end
-
- describe 'PUT /projects/:id/snippets/:shippet_id' do
- it 'should update an existing project snippet' do
- put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
- code: 'updated code'
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq('example')
- expect(snippet.reload.content).to eq('updated code')
- end
-
- it 'should update an existing project snippet with new title' do
- put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
- title: 'other api test'
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq('other api test')
- end
- end
-
- describe 'DELETE /projects/:id/snippets/:snippet_id' do
- before { snippet }
-
- it 'should delete existing project snippet' do
- expect {
- delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
- }.to change { Snippet.count }.by(-1)
- expect(response.status).to eq(200)
- end
-
- it 'should return 404 when deleting unknown snippet id' do
- delete api("/projects/#{project.id}/snippets/1234", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe 'GET /projects/:id/snippets/:snippet_id/raw' do
- it 'should get a raw project snippet' do
- get api("/projects/#{project.id}/snippets/#{snippet.id}/raw", user)
- expect(response.status).to eq(200)
- end
-
- it 'should return a 404 error if raw project snippet not found' do
- get api("/projects/#{project.id}/snippets/5555/raw", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe :deploy_keys do
- let(:deploy_keys_project) { create(:deploy_keys_project, project: project) }
- let(:deploy_key) { deploy_keys_project.deploy_key }
-
- describe 'GET /projects/:id/keys' do
- before { deploy_key }
-
- it 'should return array of ssh keys' do
- get api("/projects/#{project.id}/keys", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['title']).to eq(deploy_key.title)
- end
- end
-
- describe 'GET /projects/:id/keys/:key_id' do
- it 'should return a single key' do
- get api("/projects/#{project.id}/keys/#{deploy_key.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['title']).to eq(deploy_key.title)
- end
-
- it 'should return 404 Not Found with invalid ID' do
- get api("/projects/#{project.id}/keys/404", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe 'POST /projects/:id/keys' do
- it 'should not create an invalid ssh key' do
- post api("/projects/#{project.id}/keys", user), { title: 'invalid key' }
- expect(response.status).to eq(400)
- expect(json_response['message']['key']).to eq([
- 'can\'t be blank',
- 'is too short (minimum is 0 characters)',
- 'is invalid'
- ])
- end
-
- it 'should not create a key without title' do
- post api("/projects/#{project.id}/keys", user), key: 'some key'
- expect(response.status).to eq(400)
- expect(json_response['message']['title']).to eq([
- 'can\'t be blank',
- 'is too short (minimum is 0 characters)'
- ])
- end
-
- it 'should create new ssh key' do
- key_attrs = attributes_for :key
- expect {
- post api("/projects/#{project.id}/keys", user), key_attrs
- }.to change{ project.deploy_keys.count }.by(1)
- end
- end
-
- describe 'DELETE /projects/:id/keys/:key_id' do
- before { deploy_key }
-
- it 'should delete existing key' do
- expect {
- delete api("/projects/#{project.id}/keys/#{deploy_key.id}", user)
- }.to change{ project.deploy_keys.count }.by(-1)
- end
-
- it 'should return 404 Not Found with invalid ID' do
- delete api("/projects/#{project.id}/keys/404", user)
- expect(response.status).to eq(404)
- end
- end
- end
-
- describe :fork_admin do
- let(:project_fork_target) { create(:project) }
- let(:project_fork_source) { create(:project, :public) }
-
- describe 'POST /projects/:id/fork/:forked_from_id' do
- let(:new_project_fork_source) { create(:project, :public) }
-
- it "shouldn't available for non admin users" do
- post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", user)
- expect(response.status).to eq(403)
- end
-
- it 'should allow project to be forked from an existing project' do
- expect(project_fork_target.forked?).not_to be_truthy
- post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
- expect(response.status).to eq(201)
- project_fork_target.reload
- expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id)
- expect(project_fork_target.forked_project_link).not_to be_nil
- expect(project_fork_target.forked?).to be_truthy
- end
-
- it 'should fail if forked_from project which does not exist' do
- post api("/projects/#{project_fork_target.id}/fork/9999", admin)
- expect(response.status).to eq(404)
- end
-
- it 'should fail with 409 if already forked' do
- post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
- project_fork_target.reload
- expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id)
- post api("/projects/#{project_fork_target.id}/fork/#{new_project_fork_source.id}", admin)
- expect(response.status).to eq(409)
- project_fork_target.reload
- expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id)
- expect(project_fork_target.forked?).to be_truthy
- end
- end
-
- describe 'DELETE /projects/:id/fork' do
-
- it "shouldn't available for non admin users" do
- delete api("/projects/#{project_fork_target.id}/fork", user)
- expect(response.status).to eq(403)
- end
-
- it 'should make forked project unforked' do
- post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
- project_fork_target.reload
- expect(project_fork_target.forked_from_project).not_to be_nil
- expect(project_fork_target.forked?).to be_truthy
- delete api("/projects/#{project_fork_target.id}/fork", admin)
- expect(response.status).to eq(200)
- project_fork_target.reload
- expect(project_fork_target.forked_from_project).to be_nil
- expect(project_fork_target.forked?).not_to be_truthy
- end
-
- it 'should be idempotent if not forked' do
- expect(project_fork_target.forked_from_project).to be_nil
- delete api("/projects/#{project_fork_target.id}/fork", admin)
- expect(response.status).to eq(200)
- expect(project_fork_target.reload.forked_from_project).to be_nil
- end
- end
- end
-
- describe 'GET /projects/search/:query' do
- let!(:query) { 'query'}
- let!(:search) { create(:empty_project, name: query, creator_id: user.id, namespace: user.namespace) }
- let!(:pre) { create(:empty_project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) }
- let!(:post) { create(:empty_project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) }
- let!(:pre_post) { create(:empty_project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) }
- let!(:unfound) { create(:empty_project, name: 'unfound', creator_id: user.id, namespace: user.namespace) }
- let!(:internal) { create(:empty_project, :internal, name: "internal #{query}") }
- let!(:unfound_internal) { create(:empty_project, :internal, name: 'unfound internal') }
- let!(:public) { create(:empty_project, :public, name: "public #{query}") }
- let!(:unfound_public) { create(:empty_project, :public, name: 'unfound public') }
-
- context 'when unauthenticated' do
- it 'should return authentication error' do
- get api("/projects/search/#{query}")
- expect(response.status).to eq(401)
- end
- end
-
- context 'when authenticated' do
- it 'should return an array of projects' do
- get api("/projects/search/#{query}",user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.size).to eq(6)
- json_response.each {|project| expect(project['name']).to match(/.*query.*/)}
- end
- end
-
- context 'when authenticated as a different user' do
- it 'should return matching public projects' do
- get api("/projects/search/#{query}", user2)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.size).to eq(2)
- json_response.each {|project| expect(project['name']).to match(/(internal|public) query/)}
- end
- end
- end
-
- describe 'PUT /projects/:id̈́' do
- before { project }
- before { user }
- before { user3 }
- before { user4 }
- before { project3 }
- before { project4 }
- before { project_member3 }
- before { project_member2 }
-
- context 'when unauthenticated' do
- it 'should return authentication error' do
- project_param = { name: 'bar' }
- put api("/projects/#{project.id}"), project_param
- expect(response.status).to eq(401)
- end
- end
-
- context 'when authenticated as project owner' do
- it 'should update name' do
- project_param = { name: 'bar' }
- put api("/projects/#{project.id}", user), project_param
- expect(response.status).to eq(200)
- project_param.each_pair do |k, v|
- expect(json_response[k.to_s]).to eq(v)
- end
- end
-
- it 'should update visibility_level' do
- project_param = { visibility_level: 20 }
- put api("/projects/#{project3.id}", user), project_param
- expect(response.status).to eq(200)
- project_param.each_pair do |k, v|
- expect(json_response[k.to_s]).to eq(v)
- end
- end
-
- it 'should not update name to existing name' do
- project_param = { name: project3.name }
- put api("/projects/#{project.id}", user), project_param
- expect(response.status).to eq(400)
- expect(json_response['message']['name']).to eq(['has already been taken'])
- end
-
- it 'should update path & name to existing path & name in different namespace' do
- project_param = { path: project4.path, name: project4.name }
- put api("/projects/#{project3.id}", user), project_param
- expect(response.status).to eq(200)
- project_param.each_pair do |k, v|
- expect(json_response[k.to_s]).to eq(v)
- end
- end
- end
-
- context 'when authenticated as project master' do
- it 'should update path' do
- project_param = { path: 'bar' }
- put api("/projects/#{project3.id}", user4), project_param
- expect(response.status).to eq(200)
- project_param.each_pair do |k, v|
- expect(json_response[k.to_s]).to eq(v)
- end
- end
-
- it 'should update other attributes' do
- project_param = { issues_enabled: true,
- wiki_enabled: true,
- snippets_enabled: true,
- merge_requests_enabled: true,
- description: 'new description' }
-
- put api("/projects/#{project3.id}", user4), project_param
- expect(response.status).to eq(200)
- project_param.each_pair do |k, v|
- expect(json_response[k.to_s]).to eq(v)
- end
- end
-
- it 'should not update path to existing path' do
- project_param = { path: project.path }
- put api("/projects/#{project3.id}", user4), project_param
- expect(response.status).to eq(400)
- expect(json_response['message']['path']).to eq(['has already been taken'])
- end
-
- it 'should not update name' do
- project_param = { name: 'bar' }
- put api("/projects/#{project3.id}", user4), project_param
- expect(response.status).to eq(403)
- end
-
- it 'should not update visibility_level' do
- project_param = { visibility_level: 20 }
- put api("/projects/#{project3.id}", user4), project_param
- expect(response.status).to eq(403)
- end
- end
-
- context 'when authenticated as project developer' do
- it 'should not update other attributes' do
- project_param = { path: 'bar',
- issues_enabled: true,
- wiki_enabled: true,
- snippets_enabled: true,
- merge_requests_enabled: true,
- description: 'new description' }
- put api("/projects/#{project.id}", user3), project_param
- expect(response.status).to eq(403)
- end
- end
- end
-
- describe 'DELETE /projects/:id' do
- context 'when authenticated as user' do
- it 'should remove project' do
- expect(GitlabShellWorker).to(
- receive(:perform_async).with(:remove_repository,
- /#{project.path_with_namespace}/)
- ).twice
-
- delete api("/projects/#{project.id}", user)
- expect(response.status).to eq(200)
- end
-
- it 'should not remove a project if not an owner' do
- user3 = create(:user)
- project.team << [user3, :developer]
- delete api("/projects/#{project.id}", user3)
- expect(response.status).to eq(403)
- end
-
- it 'should not remove a non existing project' do
- delete api('/projects/1328', user)
- expect(response.status).to eq(404)
- end
-
- it 'should not remove a project not attached to user' do
- delete api("/projects/#{project.id}", user2)
- expect(response.status).to eq(404)
- end
- end
-
- context 'when authenticated as admin' do
- it 'should remove any existing project' do
- delete api("/projects/#{project.id}", admin)
- expect(response.status).to eq(200)
- end
-
- it 'should not remove a non existing project' do
- delete api('/projects/1328', admin)
- expect(response.status).to eq(404)
- end
- end
- end
-end
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
deleted file mode 100644
index 09a79553f72..00000000000
--- a/spec/requests/api/repositories_spec.rb
+++ /dev/null
@@ -1,247 +0,0 @@
-require 'spec_helper'
-require 'mime/types'
-
-describe API::API, api: true do
- include ApiHelpers
- include RepoHelpers
-
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let!(:project) { create(:project, creator_id: user.id) }
- let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) }
- let!(:guest) { create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) }
-
- describe "GET /projects/:id/repository/tags" do
- it "should return an array of project tags" do
- get api("/projects/#{project.id}/repository/tags", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['name']).to eq(project.repo.tags.sort_by(&:name).reverse.first.name)
- end
- end
-
- describe 'POST /projects/:id/repository/tags' do
- context 'lightweight tags' do
- it 'should create a new tag' do
- post api("/projects/#{project.id}/repository/tags", user),
- tag_name: 'v7.0.1',
- ref: 'master'
-
- expect(response.status).to eq(201)
- expect(json_response['name']).to eq('v7.0.1')
- end
- end
-
- context 'annotated tag' do
- it 'should create a new annotated tag' do
- # Identity must be set in .gitconfig to create annotated tag.
- repo_path = project.repository.path_to_repo
- system(*%W(git --git-dir=#{repo_path} config user.name #{user.name}))
- system(*%W(git --git-dir=#{repo_path} config user.email #{user.email}))
-
- post api("/projects/#{project.id}/repository/tags", user),
- tag_name: 'v7.1.0',
- ref: 'master',
- message: 'Release 7.1.0'
-
- expect(response.status).to eq(201)
- expect(json_response['name']).to eq('v7.1.0')
- expect(json_response['message']).to eq('Release 7.1.0')
- end
- end
-
- it 'should deny for user without push access' do
- post api("/projects/#{project.id}/repository/tags", user2),
- tag_name: 'v1.9.0',
- ref: '621491c677087aa243f165eab467bfdfbee00be1'
- expect(response.status).to eq(403)
- end
-
- it 'should return 400 if tag name is invalid' do
- post api("/projects/#{project.id}/repository/tags", user),
- tag_name: 'v 1.0.0',
- ref: 'master'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('Tag name invalid')
- end
-
- it 'should return 400 if tag already exists' do
- post api("/projects/#{project.id}/repository/tags", user),
- tag_name: 'v8.0.0',
- ref: 'master'
- expect(response.status).to eq(201)
- post api("/projects/#{project.id}/repository/tags", user),
- tag_name: 'v8.0.0',
- ref: 'master'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('Tag already exists')
- end
-
- it 'should return 400 if ref name is invalid' do
- post api("/projects/#{project.id}/repository/tags", user),
- tag_name: 'mytag',
- ref: 'foo'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('Invalid reference name')
- end
- end
-
- describe "GET /projects/:id/repository/tree" do
- context "authorized user" do
- before { project.team << [user2, :reporter] }
-
- it "should return project commits" do
- get api("/projects/#{project.id}/repository/tree", user)
- expect(response.status).to eq(200)
-
- expect(json_response).to be_an Array
- expect(json_response.first['name']).to eq('encoding')
- expect(json_response.first['type']).to eq('tree')
- expect(json_response.first['mode']).to eq('040000')
- end
-
- it 'should return a 404 for unknown ref' do
- get api("/projects/#{project.id}/repository/tree?ref_name=foo", user)
- expect(response.status).to eq(404)
-
- expect(json_response).to be_an Object
- json_response['message'] == '404 Tree Not Found'
- end
- end
-
- context "unauthorized user" do
- it "should not return project commits" do
- get api("/projects/#{project.id}/repository/tree")
- expect(response.status).to eq(401)
- end
- end
- end
-
- describe "GET /projects/:id/repository/blobs/:sha" do
- it "should get the raw file contents" do
- get api("/projects/#{project.id}/repository/blobs/master?filepath=README.md", user)
- expect(response.status).to eq(200)
- end
-
- it "should return 404 for invalid branch_name" do
- get api("/projects/#{project.id}/repository/blobs/invalid_branch_name?filepath=README.md", user)
- expect(response.status).to eq(404)
- end
-
- it "should return 404 for invalid file" do
- get api("/projects/#{project.id}/repository/blobs/master?filepath=README.invalid", user)
- expect(response.status).to eq(404)
- end
-
- it "should return a 400 error if filepath is missing" do
- get api("/projects/#{project.id}/repository/blobs/master", user)
- expect(response.status).to eq(400)
- end
- end
-
- describe "GET /projects/:id/repository/commits/:sha/blob" do
- it "should get the raw file contents" do
- get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.md", user)
- expect(response.status).to eq(200)
- end
- end
-
- describe "GET /projects/:id/repository/raw_blobs/:sha" do
- it "should get the raw file contents" do
- get api("/projects/#{project.id}/repository/raw_blobs/#{sample_blob.oid}", user)
- expect(response.status).to eq(200)
- end
-
- it 'should return a 404 for unknown blob' do
- get api("/projects/#{project.id}/repository/raw_blobs/123456", user)
- expect(response.status).to eq(404)
-
- expect(json_response).to be_an Object
- json_response['message'] == '404 Blob Not Found'
- end
- end
-
- describe "GET /projects/:id/repository/archive(.:format)?:sha" do
- it "should get the archive" do
- get api("/projects/#{project.id}/repository/archive", user)
- repo_name = project.repository.name.gsub("\.git", "")
- expect(response.status).to eq(200)
- expect(response.headers['Content-Disposition']).to match(/filename\=\"#{repo_name}\-[^\.]+\.tar.gz\"/)
- expect(response.content_type).to eq(MIME::Types.type_for('file.tar.gz').first.content_type)
- end
-
- it "should get the archive.zip" do
- get api("/projects/#{project.id}/repository/archive.zip", user)
- repo_name = project.repository.name.gsub("\.git", "")
- expect(response.status).to eq(200)
- expect(response.headers['Content-Disposition']).to match(/filename\=\"#{repo_name}\-[^\.]+\.zip\"/)
- expect(response.content_type).to eq(MIME::Types.type_for('file.zip').first.content_type)
- end
-
- it "should get the archive.tar.bz2" do
- get api("/projects/#{project.id}/repository/archive.tar.bz2", user)
- repo_name = project.repository.name.gsub("\.git", "")
- expect(response.status).to eq(200)
- expect(response.headers['Content-Disposition']).to match(/filename\=\"#{repo_name}\-[^\.]+\.tar.bz2\"/)
- expect(response.content_type).to eq(MIME::Types.type_for('file.tar.bz2').first.content_type)
- end
-
- it "should return 404 for invalid sha" do
- get api("/projects/#{project.id}/repository/archive/?sha=xxx", user)
- expect(response.status).to eq(404)
- end
- end
-
- describe 'GET /projects/:id/repository/compare' do
- it "should compare branches" do
- get api("/projects/#{project.id}/repository/compare", user), from: 'master', to: 'feature'
- expect(response.status).to eq(200)
- expect(json_response['commits']).to be_present
- expect(json_response['diffs']).to be_present
- end
-
- it "should compare tags" do
- get api("/projects/#{project.id}/repository/compare", user), from: 'v1.0.0', to: 'v1.1.0'
- expect(response.status).to eq(200)
- expect(json_response['commits']).to be_present
- expect(json_response['diffs']).to be_present
- end
-
- it "should compare commits" do
- get api("/projects/#{project.id}/repository/compare", user), from: sample_commit.id, to: sample_commit.parent_id
- expect(response.status).to eq(200)
- expect(json_response['commits']).to be_empty
- expect(json_response['diffs']).to be_empty
- expect(json_response['compare_same_ref']).to be_falsey
- end
-
- it "should compare commits in reverse order" do
- get api("/projects/#{project.id}/repository/compare", user), from: sample_commit.parent_id, to: sample_commit.id
- expect(response.status).to eq(200)
- expect(json_response['commits']).to be_present
- expect(json_response['diffs']).to be_present
- end
-
- it "should compare same refs" do
- get api("/projects/#{project.id}/repository/compare", user), from: 'master', to: 'master'
- expect(response.status).to eq(200)
- expect(json_response['commits']).to be_empty
- expect(json_response['diffs']).to be_empty
- expect(json_response['compare_same_ref']).to be_truthy
- end
- end
-
- describe 'GET /projects/:id/repository/contributors' do
- it 'should return valid data' do
- get api("/projects/#{project.id}/repository/contributors", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- contributor = json_response.first
- expect(contributor['email']).to eq('dmitriy.zaporozhets@gmail.com')
- expect(contributor['name']).to eq('Dmitriy Zaporozhets')
- expect(contributor['commits']).to eq(13)
- expect(contributor['additions']).to eq(0)
- expect(contributor['deletions']).to eq(0)
- end
- end
-end
diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb
deleted file mode 100644
index 51c543578df..00000000000
--- a/spec/requests/api/services_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-require "spec_helper"
-
-describe API::API, api: true do
- include ApiHelpers
- let(:user) { create(:user) }
- let(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
-
- describe "POST /projects/:id/services/gitlab-ci" do
- it "should update gitlab-ci settings" do
- put api("/projects/#{project.id}/services/gitlab-ci", user), token: 'secret-token', project_url: "http://ci.example.com/projects/1"
-
- expect(response.status).to eq(200)
- end
-
- it "should return if required fields missing" do
- put api("/projects/#{project.id}/services/gitlab-ci", user), project_url: "http://ci.example.com/projects/1", active: true
-
- expect(response.status).to eq(400)
- end
- end
-
- describe "DELETE /projects/:id/services/gitlab-ci" do
- it "should update gitlab-ci settings" do
- delete api("/projects/#{project.id}/services/gitlab-ci", user)
-
- expect(response.status).to eq(200)
- expect(project.gitlab_ci_service).to be_nil
- end
- end
-
- describe 'PUT /projects/:id/services/hipchat' do
- it 'should update hipchat settings' do
- put api("/projects/#{project.id}/services/hipchat", user),
- token: 'secret-token', room: 'test'
-
- expect(response.status).to eq(200)
- expect(project.hipchat_service).not_to be_nil
- end
-
- it 'should return if required fields missing' do
- put api("/projects/#{project.id}/services/gitlab-ci", user),
- token: 'secret-token', active: true
-
- expect(response.status).to eq(400)
- end
- end
-
- describe 'DELETE /projects/:id/services/hipchat' do
- it 'should delete hipchat settings' do
- delete api("/projects/#{project.id}/services/hipchat", user)
-
- expect(response.status).to eq(200)
- expect(project.hipchat_service).to be_nil
- end
- end
-end
diff --git a/spec/requests/api/session_spec.rb b/spec/requests/api/session_spec.rb
deleted file mode 100644
index fbd57b34a58..00000000000
--- a/spec/requests/api/session_spec.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
-
- let(:user) { create(:user) }
-
- describe "POST /session" do
- context "when valid password" do
- it "should return private token" do
- post api("/session"), email: user.email, password: '12345678'
- expect(response.status).to eq(201)
-
- expect(json_response['email']).to eq(user.email)
- expect(json_response['private_token']).to eq(user.private_token)
- expect(json_response['is_admin']).to eq(user.is_admin?)
- expect(json_response['can_create_project']).to eq(user.can_create_project?)
- expect(json_response['can_create_group']).to eq(user.can_create_group?)
- end
- end
-
- context 'when email has case-typo and password is valid' do
- it 'should return private token' do
- post api('/session'), email: user.email.upcase, password: '12345678'
- expect(response.status).to eq 201
-
- expect(json_response['email']).to eq user.email
- expect(json_response['private_token']).to eq user.private_token
- expect(json_response['is_admin']).to eq user.is_admin?
- expect(json_response['can_create_project']).to eq user.can_create_project?
- expect(json_response['can_create_group']).to eq user.can_create_group?
- end
- end
-
- context 'when login has case-typo and password is valid' do
- it 'should return private token' do
- post api('/session'), login: user.username.upcase, password: '12345678'
- expect(response.status).to eq 201
-
- expect(json_response['email']).to eq user.email
- expect(json_response['private_token']).to eq user.private_token
- expect(json_response['is_admin']).to eq user.is_admin?
- expect(json_response['can_create_project']).to eq user.can_create_project?
- expect(json_response['can_create_group']).to eq user.can_create_group?
- end
- end
-
- context "when invalid password" do
- it "should return authentication error" do
- post api("/session"), email: user.email, password: '123'
- expect(response.status).to eq(401)
-
- expect(json_response['email']).to be_nil
- expect(json_response['private_token']).to be_nil
- end
- end
-
- context "when empty password" do
- it "should return authentication error" do
- post api("/session"), email: user.email
- expect(response.status).to eq(401)
-
- expect(json_response['email']).to be_nil
- expect(json_response['private_token']).to be_nil
- end
- end
-
- context "when empty name" do
- it "should return authentication error" do
- post api("/session"), password: user.password
- expect(response.status).to eq(401)
-
- expect(json_response['email']).to be_nil
- expect(json_response['private_token']).to be_nil
- end
- end
- end
-end
diff --git a/spec/requests/api/system_hooks_spec.rb b/spec/requests/api/system_hooks_spec.rb
deleted file mode 100644
index a9d86bbce6c..00000000000
--- a/spec/requests/api/system_hooks_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
-
- let(:user) { create(:user) }
- let(:admin) { create(:admin) }
- let!(:hook) { create(:system_hook, url: "http://example.com") }
-
- before { stub_request(:post, hook.url) }
-
- describe "GET /hooks" do
- context "when no user" do
- it "should return authentication error" do
- get api("/hooks")
- expect(response.status).to eq(401)
- end
- end
-
- context "when not an admin" do
- it "should return forbidden error" do
- get api("/hooks", user)
- expect(response.status).to eq(403)
- end
- end
-
- context "when authenticated as admin" do
- it "should return an array of hooks" do
- get api("/hooks", admin)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['url']).to eq(hook.url)
- end
- end
- end
-
- describe "POST /hooks" do
- it "should create new hook" do
- expect {
- post api("/hooks", admin), url: 'http://example.com'
- }.to change { SystemHook.count }.by(1)
- end
-
- it "should respond with 400 if url not given" do
- post api("/hooks", admin)
- expect(response.status).to eq(400)
- end
-
- it "should not create new hook without url" do
- expect {
- post api("/hooks", admin)
- }.to_not change { SystemHook.count }
- end
- end
-
- describe "GET /hooks/:id" do
- it "should return hook by id" do
- get api("/hooks/#{hook.id}", admin)
- expect(response.status).to eq(200)
- expect(json_response['event_name']).to eq('project_create')
- end
-
- it "should return 404 on failure" do
- get api("/hooks/404", admin)
- expect(response.status).to eq(404)
- end
- end
-
- describe "DELETE /hooks/:id" do
- it "should delete a hook" do
- expect {
- delete api("/hooks/#{hook.id}", admin)
- }.to change { SystemHook.count }.by(-1)
- end
-
- it "should return success if hook id not found" do
- delete api("/hooks/12345", admin)
- expect(response.status).to eq(200)
- end
- end
-end
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
deleted file mode 100644
index e6d5545f812..00000000000
--- a/spec/requests/api/users_spec.rb
+++ /dev/null
@@ -1,524 +0,0 @@
-require 'spec_helper'
-
-describe API::API, api: true do
- include ApiHelpers
-
- let(:user) { create(:user) }
- let(:admin) { create(:admin) }
- let(:key) { create(:key, user: user) }
-
- describe "GET /users" do
- context "when unauthenticated" do
- it "should return authentication error" do
- get api("/users")
- expect(response.status).to eq(401)
- end
- end
-
- context "when authenticated" do
- it "should return an array of users" do
- get api("/users", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- username = user.username
- expect(json_response.detect {
- |user| user['username'] == username
- }['username']).to eq(username)
- end
- end
-
- context "when admin" do
- it "should return an array of users" do
- get api("/users", admin)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first.keys).to include 'email'
- expect(json_response.first.keys).to include 'identities'
- expect(json_response.first.keys).to include 'can_create_project'
- end
- end
- end
-
- describe "GET /users/:id" do
- it "should return a user by id" do
- get api("/users/#{user.id}", user)
- expect(response.status).to eq(200)
- expect(json_response['username']).to eq(user.username)
- end
-
- it "should return a 401 if unauthenticated" do
- get api("/users/9998")
- expect(response.status).to eq(401)
- end
-
- it "should return a 404 error if user id not found" do
- get api("/users/9999", user)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Not found')
- end
- end
-
- describe "POST /users" do
- before{ admin }
-
- it "should create user" do
- expect {
- post api("/users", admin), attributes_for(:user, projects_limit: 3)
- }.to change { User.count }.by(1)
- end
-
- it "should create user with correct attributes" do
- post api('/users', admin), attributes_for(:user, admin: true, can_create_group: true)
- expect(response.status).to eq(201)
- user_id = json_response['id']
- new_user = User.find(user_id)
- expect(new_user).not_to eq(nil)
- expect(new_user.admin).to eq(true)
- expect(new_user.can_create_group).to eq(true)
- end
-
- it "should create non-admin user" do
- post api('/users', admin), attributes_for(:user, admin: false, can_create_group: false)
- expect(response.status).to eq(201)
- user_id = json_response['id']
- new_user = User.find(user_id)
- expect(new_user).not_to eq(nil)
- expect(new_user.admin).to eq(false)
- expect(new_user.can_create_group).to eq(false)
- end
-
- it "should create non-admin users by default" do
- post api('/users', admin), attributes_for(:user)
- expect(response.status).to eq(201)
- user_id = json_response['id']
- new_user = User.find(user_id)
- expect(new_user).not_to eq(nil)
- expect(new_user.admin).to eq(false)
- end
-
- it "should return 201 Created on success" do
- post api("/users", admin), attributes_for(:user, projects_limit: 3)
- expect(response.status).to eq(201)
- end
-
- it "should not create user with invalid email" do
- post api('/users', admin),
- email: 'invalid email',
- password: 'password',
- name: 'test'
- expect(response.status).to eq(400)
- end
-
- it 'should return 400 error if name not given' do
- post api('/users', admin), email: 'test@example.com', password: 'pass1234'
- expect(response.status).to eq(400)
- end
-
- it 'should return 400 error if password not given' do
- post api('/users', admin), email: 'test@example.com', name: 'test'
- expect(response.status).to eq(400)
- end
-
- it "should return 400 error if email not given" do
- post api('/users', admin), password: 'pass1234', name: 'test'
- expect(response.status).to eq(400)
- end
-
- it 'should return 400 error if user does not validate' do
- post api('/users', admin),
- password: 'pass',
- email: 'test@example.com',
- username: 'test!',
- name: 'test',
- bio: 'g' * 256,
- projects_limit: -1
- expect(response.status).to eq(400)
- expect(json_response['message']['password']).
- to eq(['is too short (minimum is 8 characters)'])
- expect(json_response['message']['bio']).
- to eq(['is too long (maximum is 255 characters)'])
- expect(json_response['message']['projects_limit']).
- to eq(['must be greater than or equal to 0'])
- expect(json_response['message']['username']).
- to eq([Gitlab::Regex.send(:namespace_regex_message)])
- end
-
- it "shouldn't available for non admin users" do
- post api("/users", user), attributes_for(:user)
- expect(response.status).to eq(403)
- end
-
- context 'with existing user' do
- before do
- post api('/users', admin),
- email: 'test@example.com',
- password: 'password',
- username: 'test',
- name: 'foo'
- end
-
- it 'should return 409 conflict error if user with same email exists' do
- expect {
- post api('/users', admin),
- name: 'foo',
- email: 'test@example.com',
- password: 'password',
- username: 'foo'
- }.to change { User.count }.by(0)
- expect(response.status).to eq(409)
- expect(json_response['message']).to eq('Email has already been taken')
- end
-
- it 'should return 409 conflict error if same username exists' do
- expect do
- post api('/users', admin),
- name: 'foo',
- email: 'foo@example.com',
- password: 'password',
- username: 'test'
- end.to change { User.count }.by(0)
- expect(response.status).to eq(409)
- expect(json_response['message']).to eq('Username has already been taken')
- end
- end
- end
-
- describe "GET /users/sign_up" do
-
- it "should redirect to sign in page" do
- get "/users/sign_up"
- expect(response.status).to eq(302)
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- describe "PUT /users/:id" do
- let!(:admin_user) { create(:admin) }
-
- before { admin }
-
- it "should update user with new bio" do
- put api("/users/#{user.id}", admin), {bio: 'new test bio'}
- expect(response.status).to eq(200)
- expect(json_response['bio']).to eq('new test bio')
- expect(user.reload.bio).to eq('new test bio')
- end
-
- it 'should update user with his own email' do
- put api("/users/#{user.id}", admin), email: user.email
- expect(response.status).to eq(200)
- expect(json_response['email']).to eq(user.email)
- expect(user.reload.email).to eq(user.email)
- end
-
- it 'should update user with his own username' do
- put api("/users/#{user.id}", admin), username: user.username
- expect(response.status).to eq(200)
- expect(json_response['username']).to eq(user.username)
- expect(user.reload.username).to eq(user.username)
- end
-
- it "should update admin status" do
- put api("/users/#{user.id}", admin), {admin: true}
- expect(response.status).to eq(200)
- expect(json_response['is_admin']).to eq(true)
- expect(user.reload.admin).to eq(true)
- end
-
- it "should not update admin status" do
- put api("/users/#{admin_user.id}", admin), {can_create_group: false}
- expect(response.status).to eq(200)
- expect(json_response['is_admin']).to eq(true)
- expect(admin_user.reload.admin).to eq(true)
- expect(admin_user.can_create_group).to eq(false)
- end
-
- it "should not allow invalid update" do
- put api("/users/#{user.id}", admin), {email: 'invalid email'}
- expect(response.status).to eq(400)
- expect(user.reload.email).not_to eq('invalid email')
- end
-
- it "shouldn't available for non admin users" do
- put api("/users/#{user.id}", user), attributes_for(:user)
- expect(response.status).to eq(403)
- end
-
- it "should return 404 for non-existing user" do
- put api("/users/999999", admin), {bio: 'update should fail'}
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Not found')
- end
-
- it 'should return 400 error if user does not validate' do
- put api("/users/#{user.id}", admin),
- password: 'pass',
- email: 'test@example.com',
- username: 'test!',
- name: 'test',
- bio: 'g' * 256,
- projects_limit: -1
- expect(response.status).to eq(400)
- expect(json_response['message']['password']).
- to eq(['is too short (minimum is 8 characters)'])
- expect(json_response['message']['bio']).
- to eq(['is too long (maximum is 255 characters)'])
- expect(json_response['message']['projects_limit']).
- to eq(['must be greater than or equal to 0'])
- expect(json_response['message']['username']).
- to eq([Gitlab::Regex.send(:namespace_regex_message)])
- end
-
- context "with existing user" do
- before {
- post api("/users", admin), { email: 'test@example.com', password: 'password', username: 'test', name: 'test' }
- post api("/users", admin), { email: 'foo@bar.com', password: 'password', username: 'john', name: 'john' }
- @user = User.all.last
- }
-
- it 'should return 409 conflict error if email address exists' do
- put api("/users/#{@user.id}", admin), email: 'test@example.com'
- expect(response.status).to eq(409)
- expect(@user.reload.email).to eq(@user.email)
- end
-
- it 'should return 409 conflict error if username taken' do
- @user_id = User.all.last.id
- put api("/users/#{@user.id}", admin), username: 'test'
- expect(response.status).to eq(409)
- expect(@user.reload.username).to eq(@user.username)
- end
- end
- end
-
- describe "POST /users/:id/keys" do
- before { admin }
-
- it "should not create invalid ssh key" do
- post api("/users/#{user.id}/keys", admin), { title: "invalid key" }
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('400 (Bad request) "key" not given')
- end
-
- it 'should not create key without title' do
- post api("/users/#{user.id}/keys", admin), key: 'some key'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('400 (Bad request) "title" not given')
- end
-
- it "should create ssh key" do
- key_attrs = attributes_for :key
- expect {
- post api("/users/#{user.id}/keys", admin), key_attrs
- }.to change{ user.keys.count }.by(1)
- end
- end
-
- describe 'GET /user/:uid/keys' do
- before { admin }
-
- context 'when unauthenticated' do
- it 'should return authentication error' do
- get api("/users/#{user.id}/keys")
- expect(response.status).to eq(401)
- end
- end
-
- context 'when authenticated' do
- it 'should return 404 for non-existing user' do
- get api('/users/999999/keys', admin)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 User Not Found')
- end
-
- it 'should return array of ssh keys' do
- user.keys << key
- user.save
- get api("/users/#{user.id}/keys", admin)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first['title']).to eq(key.title)
- end
- end
- end
-
- describe 'DELETE /user/:uid/keys/:id' do
- before { admin }
-
- context 'when unauthenticated' do
- it 'should return authentication error' do
- delete api("/users/#{user.id}/keys/42")
- expect(response.status).to eq(401)
- end
- end
-
- context 'when authenticated' do
- it 'should delete existing key' do
- user.keys << key
- user.save
- expect {
- delete api("/users/#{user.id}/keys/#{key.id}", admin)
- }.to change { user.keys.count }.by(-1)
- expect(response.status).to eq(200)
- end
-
- it 'should return 404 error if user not found' do
- user.keys << key
- user.save
- delete api("/users/999999/keys/#{key.id}", admin)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 User Not Found')
- end
-
- it 'should return 404 error if key not foud' do
- delete api("/users/#{user.id}/keys/42", admin)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Key Not Found')
- end
- end
- end
-
- describe "DELETE /users/:id" do
- before { admin }
-
- it "should delete user" do
- delete api("/users/#{user.id}", admin)
- expect(response.status).to eq(200)
- expect { User.find(user.id) }.to raise_error ActiveRecord::RecordNotFound
- expect(json_response['email']).to eq(user.email)
- end
-
- it "should not delete for unauthenticated user" do
- delete api("/users/#{user.id}")
- expect(response.status).to eq(401)
- end
-
- it "shouldn't available for non admin users" do
- delete api("/users/#{user.id}", user)
- expect(response.status).to eq(403)
- end
-
- it "should return 404 for non-existing user" do
- delete api("/users/999999", admin)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 User Not Found')
- end
- end
-
- describe "GET /user" do
- it "should return current user" do
- get api("/user", user)
- expect(response.status).to eq(200)
- expect(json_response['email']).to eq(user.email)
- expect(json_response['is_admin']).to eq(user.is_admin?)
- expect(json_response['can_create_project']).to eq(user.can_create_project?)
- expect(json_response['can_create_group']).to eq(user.can_create_group?)
- expect(json_response['projects_limit']).to eq(user.projects_limit)
- end
-
- it "should return 401 error if user is unauthenticated" do
- get api("/user")
- expect(response.status).to eq(401)
- end
- end
-
- describe "GET /user/keys" do
- context "when unauthenticated" do
- it "should return authentication error" do
- get api("/user/keys")
- expect(response.status).to eq(401)
- end
- end
-
- context "when authenticated" do
- it "should return array of ssh keys" do
- user.keys << key
- user.save
- get api("/user/keys", user)
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
- expect(json_response.first["title"]).to eq(key.title)
- end
- end
- end
-
- describe "GET /user/keys/:id" do
- it "should return single key" do
- user.keys << key
- user.save
- get api("/user/keys/#{key.id}", user)
- expect(response.status).to eq(200)
- expect(json_response["title"]).to eq(key.title)
- end
-
- it "should return 404 Not Found within invalid ID" do
- get api("/user/keys/42", user)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Not found')
- end
-
- it "should return 404 error if admin accesses user's ssh key" do
- user.keys << key
- user.save
- admin
- get api("/user/keys/#{key.id}", admin)
- expect(response.status).to eq(404)
- expect(json_response['message']).to eq('404 Not found')
- end
- end
-
- describe "POST /user/keys" do
- it "should create ssh key" do
- key_attrs = attributes_for :key
- expect {
- post api("/user/keys", user), key_attrs
- }.to change{ user.keys.count }.by(1)
- expect(response.status).to eq(201)
- end
-
- it "should return a 401 error if unauthorized" do
- post api("/user/keys"), title: 'some title', key: 'some key'
- expect(response.status).to eq(401)
- end
-
- it "should not create ssh key without key" do
- post api("/user/keys", user), title: 'title'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('400 (Bad request) "key" not given')
- end
-
- it 'should not create ssh key without title' do
- post api('/user/keys', user), key: 'some key'
- expect(response.status).to eq(400)
- expect(json_response['message']).to eq('400 (Bad request) "title" not given')
- end
-
- it "should not create ssh key without title" do
- post api("/user/keys", user), key: "somekey"
- expect(response.status).to eq(400)
- end
- end
-
- describe "DELETE /user/keys/:id" do
- it "should delete existed key" do
- user.keys << key
- user.save
- expect {
- delete api("/user/keys/#{key.id}", user)
- }.to change{user.keys.count}.by(-1)
- expect(response.status).to eq(200)
- end
-
- it "should return success if key ID not found" do
- delete api("/user/keys/42", user)
- expect(response.status).to eq(200)
- end
-
- it "should return 401 error if unauthorized" do
- user.keys << key
- user.save
- delete api("/user/keys/#{key.id}")
- expect(response.status).to eq(401)
- end
- end
-end
diff --git a/spec/routing/admin_routing_spec.rb b/spec/routing/admin_routing_spec.rb
deleted file mode 100644
index bf8abcfb00f..00000000000
--- a/spec/routing/admin_routing_spec.rb
+++ /dev/null
@@ -1,121 +0,0 @@
-require 'spec_helper'
-
-# team_update_admin_user PUT /admin/users/:id/team_update(.:format) admin/users#team_update
-# block_admin_user PUT /admin/users/:id/block(.:format) admin/users#block
-# unblock_admin_user PUT /admin/users/:id/unblock(.:format) admin/users#unblock
-# admin_users GET /admin/users(.:format) admin/users#index
-# POST /admin/users(.:format) admin/users#create
-# new_admin_user GET /admin/users/new(.:format) admin/users#new
-# edit_admin_user GET /admin/users/:id/edit(.:format) admin/users#edit
-# admin_user GET /admin/users/:id(.:format) admin/users#show
-# PUT /admin/users/:id(.:format) admin/users#update
-# DELETE /admin/users/:id(.:format) admin/users#destroy
-describe Admin::UsersController, "routing" do
- it "to #team_update" do
- expect(put("/admin/users/1/team_update")).to route_to('admin/users#team_update', id: '1')
- end
-
- it "to #block" do
- expect(put("/admin/users/1/block")).to route_to('admin/users#block', id: '1')
- end
-
- it "to #unblock" do
- expect(put("/admin/users/1/unblock")).to route_to('admin/users#unblock', id: '1')
- end
-
- it "to #index" do
- expect(get("/admin/users")).to route_to('admin/users#index')
- end
-
- it "to #show" do
- expect(get("/admin/users/1")).to route_to('admin/users#show', id: '1')
- end
-
- it "to #create" do
- expect(post("/admin/users")).to route_to('admin/users#create')
- end
-
- it "to #new" do
- expect(get("/admin/users/new")).to route_to('admin/users#new')
- end
-
- it "to #edit" do
- expect(get("/admin/users/1/edit")).to route_to('admin/users#edit', id: '1')
- end
-
- it "to #show" do
- expect(get("/admin/users/1")).to route_to('admin/users#show', id: '1')
- end
-
- it "to #update" do
- expect(put("/admin/users/1")).to route_to('admin/users#update', id: '1')
- end
-
- it "to #destroy" do
- expect(delete("/admin/users/1")).to route_to('admin/users#destroy', id: '1')
- end
-end
-
-# team_admin_project GET /admin/projects/:id/team(.:format) admin/projects#team {id: /[^\/]+/}
-# team_update_admin_project PUT /admin/projects/:id/team_update(.:format) admin/projects#team_update {id: /[^\/]+/}
-# admin_projects GET /admin/projects(.:format) admin/projects#index {id: /[^\/]+/}
-# POST /admin/projects(.:format) admin/projects#create {id: /[^\/]+/}
-# new_admin_project GET /admin/projects/new(.:format) admin/projects#new {id: /[^\/]+/}
-# edit_admin_project GET /admin/projects/:id/edit(.:format) admin/projects#edit {id: /[^\/]+/}
-# admin_project GET /admin/projects/:id(.:format) admin/projects#show {id: /[^\/]+/}
-# PUT /admin/projects/:id(.:format) admin/projects#update {id: /[^\/]+/}
-# DELETE /admin/projects/:id(.:format) admin/projects#destroy {id: /[^\/]+/}
-describe Admin::ProjectsController, "routing" do
- it "to #index" do
- expect(get("/admin/projects")).to route_to('admin/projects#index')
- end
-
- it "to #show" do
- expect(get("/admin/projects/gitlab")).to route_to('admin/projects#show', namespace_id: 'gitlab')
- end
-end
-
-# admin_hook_test GET /admin/hooks/:hook_id/test(.:format) admin/hooks#test
-# admin_hooks GET /admin/hooks(.:format) admin/hooks#index
-# POST /admin/hooks(.:format) admin/hooks#create
-# admin_hook DELETE /admin/hooks/:id(.:format) admin/hooks#destroy
-describe Admin::HooksController, "routing" do
- it "to #test" do
- expect(get("/admin/hooks/1/test")).to route_to('admin/hooks#test', hook_id: '1')
- end
-
- it "to #index" do
- expect(get("/admin/hooks")).to route_to('admin/hooks#index')
- end
-
- it "to #create" do
- expect(post("/admin/hooks")).to route_to('admin/hooks#create')
- end
-
- it "to #destroy" do
- expect(delete("/admin/hooks/1")).to route_to('admin/hooks#destroy', id: '1')
- end
-
-end
-
-# admin_logs GET /admin/logs(.:format) admin/logs#show
-describe Admin::LogsController, "routing" do
- it "to #show" do
- expect(get("/admin/logs")).to route_to('admin/logs#show')
- end
-end
-
-# admin_background_jobs GET /admin/background_jobs(.:format) admin/background_jobs#show
-describe Admin::BackgroundJobsController, "routing" do
- it "to #show" do
- expect(get("/admin/background_jobs")).to route_to('admin/background_jobs#show')
- end
-end
-
-# admin_root /admin(.:format) admin/dashboard#index
-describe Admin::DashboardController, "routing" do
- it "to #index" do
- expect(get("/admin")).to route_to('admin/dashboard#index')
- end
-end
-
diff --git a/spec/routing/notifications_routing_spec.rb b/spec/routing/notifications_routing_spec.rb
deleted file mode 100644
index 24592942a96..00000000000
--- a/spec/routing/notifications_routing_spec.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-require "spec_helper"
-
-describe Profiles::NotificationsController do
- describe "routing" do
- it "routes to #show" do
- expect(get("/profile/notifications")).to route_to("profiles/notifications#show")
- end
-
- it "routes to #update" do
- expect(put("/profile/notifications")).to route_to("profiles/notifications#update")
- end
- end
-end
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
deleted file mode 100644
index 042352311da..00000000000
--- a/spec/routing/project_routing_spec.rb
+++ /dev/null
@@ -1,492 +0,0 @@
-require 'spec_helper'
-
-# Shared examples for a resource inside a Project
-#
-# By default it tests all the default REST actions: index, create, new, edit,
-# show, update, and destroy. You can remove actions by customizing the
-# `actions` variable.
-#
-# It also expects a `controller` variable to be available which defines both
-# the path to the resource as well as the controller name.
-#
-# Examples
-#
-# # Default behavior
-# it_behaves_like 'RESTful project resources' do
-# let(:controller) { 'issues' }
-# end
-#
-# # Customizing actions
-# it_behaves_like 'RESTful project resources' do
-# let(:actions) { [:index] }
-# let(:controller) { 'issues' }
-# end
-shared_examples 'RESTful project resources' do
- let(:actions) { [:index, :create, :new, :edit, :show, :update, :destroy] }
-
- it 'to #index' do
- expect(get("/gitlab/gitlabhq/#{controller}")).to route_to("projects/#{controller}#index", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:index)
- end
-
- it 'to #create' do
- expect(post("/gitlab/gitlabhq/#{controller}")).to route_to("projects/#{controller}#create", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:create)
- end
-
- it 'to #new' do
- expect(get("/gitlab/gitlabhq/#{controller}/new")).to route_to("projects/#{controller}#new", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:new)
- end
-
- it 'to #edit' do
- expect(get("/gitlab/gitlabhq/#{controller}/1/edit")).to route_to("projects/#{controller}#edit", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:edit)
- end
-
- it 'to #show' do
- expect(get("/gitlab/gitlabhq/#{controller}/1")).to route_to("projects/#{controller}#show", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:show)
- end
-
- it 'to #update' do
- expect(put("/gitlab/gitlabhq/#{controller}/1")).to route_to("projects/#{controller}#update", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:update)
- end
-
- it 'to #destroy' do
- expect(delete("/gitlab/gitlabhq/#{controller}/1")).to route_to("projects/#{controller}#destroy", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:destroy)
- end
-end
-
-# projects POST /projects(.:format) projects#create
-# new_project GET /projects/new(.:format) projects#new
-# files_project GET /:id/files(.:format) projects#files
-# edit_project GET /:id/edit(.:format) projects#edit
-# project GET /:id(.:format) projects#show
-# PUT /:id(.:format) projects#update
-# DELETE /:id(.:format) projects#destroy
-# markdown_preview_project POST /:id/markdown_preview(.:format) projects#markdown_preview
-describe ProjectsController, 'routing' do
- it 'to #create' do
- expect(post('/projects')).to route_to('projects#create')
- end
-
- it 'to #new' do
- expect(get('/projects/new')).to route_to('projects#new')
- end
-
- it 'to #edit' do
- expect(get('/gitlab/gitlabhq/edit')).to route_to('projects#edit', namespace_id: 'gitlab', id: 'gitlabhq')
- end
-
- it 'to #autocomplete_sources' do
- expect(get('/gitlab/gitlabhq/autocomplete_sources')).to route_to('projects#autocomplete_sources', namespace_id: 'gitlab', id: 'gitlabhq')
- end
-
- it 'to #show' do
- expect(get('/gitlab/gitlabhq')).to route_to('projects#show', namespace_id: 'gitlab', id: 'gitlabhq')
- end
-
- it 'to #update' do
- expect(put('/gitlab/gitlabhq')).to route_to('projects#update', namespace_id: 'gitlab', id: 'gitlabhq')
- end
-
- it 'to #destroy' do
- expect(delete('/gitlab/gitlabhq')).to route_to('projects#destroy', namespace_id: 'gitlab', id: 'gitlabhq')
- end
-
- it 'to #markdown_preview' do
- expect(post('/gitlab/gitlabhq/markdown_preview')).to(
- route_to('projects#markdown_preview', namespace_id: 'gitlab', id: 'gitlabhq')
- )
- end
-end
-
-# pages_project_wikis GET /:project_id/wikis/pages(.:format) projects/wikis#pages
-# history_project_wiki GET /:project_id/wikis/:id/history(.:format) projects/wikis#history
-# project_wikis POST /:project_id/wikis(.:format) projects/wikis#create
-# edit_project_wiki GET /:project_id/wikis/:id/edit(.:format) projects/wikis#edit
-# project_wiki GET /:project_id/wikis/:id(.:format) projects/wikis#show
-# DELETE /:project_id/wikis/:id(.:format) projects/wikis#destroy
-describe Projects::WikisController, 'routing' do
- it 'to #pages' do
- expect(get('/gitlab/gitlabhq/wikis/pages')).to route_to('projects/wikis#pages', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #history' do
- expect(get('/gitlab/gitlabhq/wikis/1/history')).to route_to('projects/wikis#history', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-
- it_behaves_like 'RESTful project resources' do
- let(:actions) { [:create, :edit, :show, :destroy] }
- let(:controller) { 'wikis' }
- end
-end
-
-# branches_project_repository GET /:project_id/repository/branches(.:format) projects/repositories#branches
-# tags_project_repository GET /:project_id/repository/tags(.:format) projects/repositories#tags
-# archive_project_repository GET /:project_id/repository/archive(.:format) projects/repositories#archive
-# edit_project_repository GET /:project_id/repository/edit(.:format) projects/repositories#edit
-describe Projects::RepositoriesController, 'routing' do
- it 'to #archive' do
- expect(get('/gitlab/gitlabhq/repository/archive')).to route_to('projects/repositories#archive', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #archive format:zip' do
- expect(get('/gitlab/gitlabhq/repository/archive.zip')).to route_to('projects/repositories#archive', namespace_id: 'gitlab', project_id: 'gitlabhq', format: 'zip')
- end
-
- it 'to #archive format:tar.bz2' do
- expect(get('/gitlab/gitlabhq/repository/archive.tar.bz2')).to route_to('projects/repositories#archive', namespace_id: 'gitlab', project_id: 'gitlabhq', format: 'tar.bz2')
- end
-
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/repository')).to route_to('projects/repositories#show', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-end
-
-describe Projects::BranchesController, 'routing' do
- it 'to #branches' do
- expect(get('/gitlab/gitlabhq/branches')).to route_to('projects/branches#index', namespace_id: 'gitlab', project_id: 'gitlabhq')
- expect(delete('/gitlab/gitlabhq/branches/feature%2345')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45')
- expect(delete('/gitlab/gitlabhq/branches/feature%2B45')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45')
- expect(delete('/gitlab/gitlabhq/branches/feature@45')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45')
- expect(delete('/gitlab/gitlabhq/branches/feature%2345/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45/foo/bar/baz')
- expect(delete('/gitlab/gitlabhq/branches/feature%2B45/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45/foo/bar/baz')
- expect(delete('/gitlab/gitlabhq/branches/feature@45/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45/foo/bar/baz')
- end
-end
-
-describe Projects::TagsController, 'routing' do
- it 'to #tags' do
- expect(get('/gitlab/gitlabhq/tags')).to route_to('projects/tags#index', namespace_id: 'gitlab', project_id: 'gitlabhq')
- expect(delete('/gitlab/gitlabhq/tags/feature%2345')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45')
- expect(delete('/gitlab/gitlabhq/tags/feature%2B45')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45')
- expect(delete('/gitlab/gitlabhq/tags/feature@45')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45')
- expect(delete('/gitlab/gitlabhq/tags/feature%2345/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45/foo/bar/baz')
- expect(delete('/gitlab/gitlabhq/tags/feature%2B45/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45/foo/bar/baz')
- expect(delete('/gitlab/gitlabhq/tags/feature@45/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45/foo/bar/baz')
- end
-end
-
-
-# project_deploy_keys GET /:project_id/deploy_keys(.:format) deploy_keys#index
-# POST /:project_id/deploy_keys(.:format) deploy_keys#create
-# new_project_deploy_key GET /:project_id/deploy_keys/new(.:format) deploy_keys#new
-# project_deploy_key GET /:project_id/deploy_keys/:id(.:format) deploy_keys#show
-# DELETE /:project_id/deploy_keys/:id(.:format) deploy_keys#destroy
-describe Projects::DeployKeysController, 'routing' do
- it_behaves_like 'RESTful project resources' do
- let(:actions) { [:index, :show, :new, :create] }
- let(:controller) { 'deploy_keys' }
- end
-end
-
-# project_protected_branches GET /:project_id/protected_branches(.:format) protected_branches#index
-# POST /:project_id/protected_branches(.:format) protected_branches#create
-# project_protected_branch DELETE /:project_id/protected_branches/:id(.:format) protected_branches#destroy
-describe Projects::ProtectedBranchesController, 'routing' do
- it_behaves_like 'RESTful project resources' do
- let(:actions) { [:index, :create, :destroy] }
- let(:controller) { 'protected_branches' }
- end
-end
-
-# switch_project_refs GET /:project_id/refs/switch(.:format) refs#switch
-# logs_tree_project_ref GET /:project_id/refs/:id/logs_tree(.:format) refs#logs_tree
-# logs_file_project_ref GET /:project_id/refs/:id/logs_tree/:path(.:format) refs#logs_tree
-describe Projects::RefsController, 'routing' do
- it 'to #switch' do
- expect(get('/gitlab/gitlabhq/refs/switch')).to route_to('projects/refs#switch', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #logs_tree' do
- expect(get('/gitlab/gitlabhq/refs/stable/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable')
- expect(get('/gitlab/gitlabhq/refs/feature%2345/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45')
- expect(get('/gitlab/gitlabhq/refs/feature%2B45/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45')
- expect(get('/gitlab/gitlabhq/refs/feature@45/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45')
- expect(get('/gitlab/gitlabhq/refs/stable/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable', path: 'foo/bar/baz')
- expect(get('/gitlab/gitlabhq/refs/feature%2345/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45', path: 'foo/bar/baz')
- expect(get('/gitlab/gitlabhq/refs/feature%2B45/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45', path: 'foo/bar/baz')
- expect(get('/gitlab/gitlabhq/refs/feature@45/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45', path: 'foo/bar/baz')
- expect(get('/gitlab/gitlabhq/refs/stable/logs_tree/files.scss')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable', path: 'files.scss')
- end
-end
-
-# diffs_project_merge_request GET /:project_id/merge_requests/:id/diffs(.:format) projects/merge_requests#diffs
-# automerge_project_merge_request POST /:project_id/merge_requests/:id/automerge(.:format) projects/merge_requests#automerge
-# automerge_check_project_merge_request GET /:project_id/merge_requests/:id/automerge_check(.:format) projects/merge_requests#automerge_check
-# branch_from_project_merge_requests GET /:project_id/merge_requests/branch_from(.:format) projects/merge_requests#branch_from
-# branch_to_project_merge_requests GET /:project_id/merge_requests/branch_to(.:format) projects/merge_requests#branch_to
-# project_merge_requests GET /:project_id/merge_requests(.:format) projects/merge_requests#index
-# POST /:project_id/merge_requests(.:format) projects/merge_requests#create
-# new_project_merge_request GET /:project_id/merge_requests/new(.:format) projects/merge_requests#new
-# edit_project_merge_request GET /:project_id/merge_requests/:id/edit(.:format) projects/merge_requests#edit
-# project_merge_request GET /:project_id/merge_requests/:id(.:format) projects/merge_requests#show
-# PUT /:project_id/merge_requests/:id(.:format) projects/merge_requests#update
-# DELETE /:project_id/merge_requests/:id(.:format) projects/merge_requests#destroy
-describe Projects::MergeRequestsController, 'routing' do
- it 'to #diffs' do
- expect(get('/gitlab/gitlabhq/merge_requests/1/diffs')).to route_to('projects/merge_requests#diffs', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-
- it 'to #automerge' do
- expect(post('/gitlab/gitlabhq/merge_requests/1/automerge')).to route_to(
- 'projects/merge_requests#automerge',
- namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1'
- )
- end
-
- it 'to #automerge_check' do
- expect(get('/gitlab/gitlabhq/merge_requests/1/automerge_check')).to route_to('projects/merge_requests#automerge_check', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-
- it 'to #branch_from' do
- expect(get('/gitlab/gitlabhq/merge_requests/branch_from')).to route_to('projects/merge_requests#branch_from', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #branch_to' do
- expect(get('/gitlab/gitlabhq/merge_requests/branch_to')).to route_to('projects/merge_requests#branch_to', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/merge_requests/1.diff')).to route_to('projects/merge_requests#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1', format: 'diff')
- expect(get('/gitlab/gitlabhq/merge_requests/1.patch')).to route_to('projects/merge_requests#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1', format: 'patch')
- end
-
- it_behaves_like 'RESTful project resources' do
- let(:controller) { 'merge_requests' }
- let(:actions) { [:index, :create, :new, :edit, :show, :update] }
- end
-end
-
-# raw_project_snippet GET /:project_id/snippets/:id/raw(.:format) snippets#raw
-# project_snippets GET /:project_id/snippets(.:format) snippets#index
-# POST /:project_id/snippets(.:format) snippets#create
-# new_project_snippet GET /:project_id/snippets/new(.:format) snippets#new
-# edit_project_snippet GET /:project_id/snippets/:id/edit(.:format) snippets#edit
-# project_snippet GET /:project_id/snippets/:id(.:format) snippets#show
-# PUT /:project_id/snippets/:id(.:format) snippets#update
-# DELETE /:project_id/snippets/:id(.:format) snippets#destroy
-describe SnippetsController, 'routing' do
- it 'to #raw' do
- expect(get('/gitlab/gitlabhq/snippets/1/raw')).to route_to('projects/snippets#raw', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-
- it 'to #index' do
- expect(get('/gitlab/gitlabhq/snippets')).to route_to('projects/snippets#index', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #create' do
- expect(post('/gitlab/gitlabhq/snippets')).to route_to('projects/snippets#create', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #new' do
- expect(get('/gitlab/gitlabhq/snippets/new')).to route_to('projects/snippets#new', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #edit' do
- expect(get('/gitlab/gitlabhq/snippets/1/edit')).to route_to('projects/snippets#edit', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/snippets/1')).to route_to('projects/snippets#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-
- it 'to #update' do
- expect(put('/gitlab/gitlabhq/snippets/1')).to route_to('projects/snippets#update', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-
- it 'to #destroy' do
- expect(delete('/gitlab/gitlabhq/snippets/1')).to route_to('projects/snippets#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-end
-
-# test_project_hook GET /:project_id/hooks/:id/test(.:format) hooks#test
-# project_hooks GET /:project_id/hooks(.:format) hooks#index
-# POST /:project_id/hooks(.:format) hooks#create
-# project_hook DELETE /:project_id/hooks/:id(.:format) hooks#destroy
-describe Projects::HooksController, 'routing' do
- it 'to #test' do
- expect(get('/gitlab/gitlabhq/hooks/1/test')).to route_to('projects/hooks#test', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
- end
-
- it_behaves_like 'RESTful project resources' do
- let(:actions) { [:index, :create, :destroy] }
- let(:controller) { 'hooks' }
- end
-end
-
-# project_commit GET /:project_id/commit/:id(.:format) commit#show {id: /[[:alnum:]]{6,40}/, project_id: /[^\/]+/}
-describe Projects::CommitController, 'routing' do
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/commit/4246fb')).to route_to('projects/commit#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '4246fb')
- expect(get('/gitlab/gitlabhq/commit/4246fb.diff')).to route_to('projects/commit#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '4246fb', format: 'diff')
- expect(get('/gitlab/gitlabhq/commit/4246fb.patch')).to route_to('projects/commit#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '4246fb', format: 'patch')
- expect(get('/gitlab/gitlabhq/commit/4246fbd13872934f72a8fd0d6fb1317b47b59cb5')).to route_to('projects/commit#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '4246fbd13872934f72a8fd0d6fb1317b47b59cb5')
- end
-end
-
-# patch_project_commit GET /:project_id/commits/:id/patch(.:format) commits#patch
-# project_commits GET /:project_id/commits(.:format) commits#index
-# POST /:project_id/commits(.:format) commits#create
-# project_commit GET /:project_id/commits/:id(.:format) commits#show
-describe Projects::CommitsController, 'routing' do
- it_behaves_like 'RESTful project resources' do
- let(:actions) { [:show] }
- let(:controller) { 'commits' }
- end
-
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/commits/master.atom')).to route_to('projects/commits#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master', format: 'atom')
- end
-end
-
-# project_project_members GET /:project_id/project_members(.:format) project_members#index
-# POST /:project_id/project_members(.:format) project_members#create
-# PUT /:project_id/project_members/:id(.:format) project_members#update
-# DELETE /:project_id/project_members/:id(.:format) project_members#destroy
-describe Projects::ProjectMembersController, 'routing' do
- it_behaves_like 'RESTful project resources' do
- let(:actions) { [:index, :create, :update, :destroy] }
- let(:controller) { 'project_members' }
- end
-end
-
-# project_milestones GET /:project_id/milestones(.:format) milestones#index
-# POST /:project_id/milestones(.:format) milestones#create
-# new_project_milestone GET /:project_id/milestones/new(.:format) milestones#new
-# edit_project_milestone GET /:project_id/milestones/:id/edit(.:format) milestones#edit
-# project_milestone GET /:project_id/milestones/:id(.:format) milestones#show
-# PUT /:project_id/milestones/:id(.:format) milestones#update
-# DELETE /:project_id/milestones/:id(.:format) milestones#destroy
-describe Projects::MilestonesController, 'routing' do
- it_behaves_like 'RESTful project resources' do
- let(:controller) { 'milestones' }
- let(:actions) { [:index, :create, :new, :edit, :show, :update] }
- end
-end
-
-# project_labels GET /:project_id/labels(.:format) labels#index
-describe Projects::LabelsController, 'routing' do
- it 'to #index' do
- expect(get('/gitlab/gitlabhq/labels')).to route_to('projects/labels#index', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-end
-
-# sort_project_issues POST /:project_id/issues/sort(.:format) issues#sort
-# bulk_update_project_issues POST /:project_id/issues/bulk_update(.:format) issues#bulk_update
-# search_project_issues GET /:project_id/issues/search(.:format) issues#search
-# project_issues GET /:project_id/issues(.:format) issues#index
-# POST /:project_id/issues(.:format) issues#create
-# new_project_issue GET /:project_id/issues/new(.:format) issues#new
-# edit_project_issue GET /:project_id/issues/:id/edit(.:format) issues#edit
-# project_issue GET /:project_id/issues/:id(.:format) issues#show
-# PUT /:project_id/issues/:id(.:format) issues#update
-# DELETE /:project_id/issues/:id(.:format) issues#destroy
-describe Projects::IssuesController, 'routing' do
- it 'to #bulk_update' do
- expect(post('/gitlab/gitlabhq/issues/bulk_update')).to route_to('projects/issues#bulk_update', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it_behaves_like 'RESTful project resources' do
- let(:controller) { 'issues' }
- let(:actions) { [:index, :create, :new, :edit, :show, :update] }
- end
-end
-
-# project_notes GET /:project_id/notes(.:format) notes#index
-# POST /:project_id/notes(.:format) notes#create
-# project_note DELETE /:project_id/notes/:id(.:format) notes#destroy
-describe Projects::NotesController, 'routing' do
- it_behaves_like 'RESTful project resources' do
- let(:actions) { [:index, :create, :destroy] }
- let(:controller) { 'notes' }
- end
-end
-
-# project_blame GET /:project_id/blame/:id(.:format) blame#show {id: /.+/, project_id: /[^\/]+/}
-describe Projects::BlameController, 'routing' do
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/blame/master/app/models/project.rb')).to route_to('projects/blame#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/project.rb')
- expect(get('/gitlab/gitlabhq/blame/master/files.scss')).to route_to('projects/blame#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/files.scss')
- end
-end
-
-# project_blob GET /:project_id/blob/:id(.:format) blob#show {id: /.+/, project_id: /[^\/]+/}
-describe Projects::BlobController, 'routing' do
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/blob/master/app/models/project.rb')).to route_to('projects/blob#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/project.rb')
- expect(get('/gitlab/gitlabhq/blob/master/app/models/compare.rb')).to route_to('projects/blob#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/compare.rb')
- expect(get('/gitlab/gitlabhq/blob/master/app/models/diff.js')).to route_to('projects/blob#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/diff.js')
- expect(get('/gitlab/gitlabhq/blob/master/files.scss')).to route_to('projects/blob#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/files.scss')
- end
-end
-
-# project_tree GET /:project_id/tree/:id(.:format) tree#show {id: /.+/, project_id: /[^\/]+/}
-describe Projects::TreeController, 'routing' do
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/tree/master/app/models/project.rb')).to route_to('projects/tree#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/project.rb')
- expect(get('/gitlab/gitlabhq/tree/master/files.scss')).to route_to('projects/tree#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/files.scss')
- end
-end
-
-describe Projects::BlobController, 'routing' do
- it 'to #edit' do
- expect(get('/gitlab/gitlabhq/edit/master/app/models/project.rb')).to(
- route_to('projects/blob#edit',
- namespace_id: 'gitlab', project_id: 'gitlabhq',
- id: 'master/app/models/project.rb'))
- end
-
- it 'to #preview' do
- expect(post('/gitlab/gitlabhq/preview/master/app/models/project.rb')).to(
- route_to('projects/blob#preview',
- namespace_id: 'gitlab', project_id: 'gitlabhq',
- id: 'master/app/models/project.rb'))
- end
-end
-
-# project_compare_index GET /:project_id/compare(.:format) compare#index {id: /[^\/]+/, project_id: /[^\/]+/}
-# POST /:project_id/compare(.:format) compare#create {id: /[^\/]+/, project_id: /[^\/]+/}
-# project_compare /:project_id/compare/:from...:to(.:format) compare#show {from: /.+/, to: /.+/, id: /[^\/]+/, project_id: /[^\/]+/}
-describe Projects::CompareController, 'routing' do
- it 'to #index' do
- expect(get('/gitlab/gitlabhq/compare')).to route_to('projects/compare#index', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #compare' do
- expect(post('/gitlab/gitlabhq/compare')).to route_to('projects/compare#create', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/compare/master...stable')).to route_to('projects/compare#show', namespace_id: 'gitlab', project_id: 'gitlabhq', from: 'master', to: 'stable')
- expect(get('/gitlab/gitlabhq/compare/issue/1234...stable')).to route_to('projects/compare#show', namespace_id: 'gitlab', project_id: 'gitlabhq', from: 'issue/1234', to: 'stable')
- end
-end
-
-describe Projects::NetworkController, 'routing' do
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/network/master')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master')
- expect(get('/gitlab/gitlabhq/network/master.json')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master', format: 'json')
- end
-end
-
-describe Projects::GraphsController, 'routing' do
- it 'to #show' do
- expect(get('/gitlab/gitlabhq/graphs/master')).to route_to('projects/graphs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master')
- end
-end
-
-describe Projects::ForksController, 'routing' do
- it 'to #new' do
- expect(get('/gitlab/gitlabhq/fork/new')).to route_to('projects/forks#new', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-
- it 'to #create' do
- expect(post('/gitlab/gitlabhq/fork')).to route_to('projects/forks#create', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-end
-
-# project_avatar DELETE /project/avatar(.:format) projects/avatars#destroy
-describe Projects::AvatarsController, 'routing' do
- it 'to #destroy' do
- expect(delete('/gitlab/gitlabhq/avatar')).to route_to(
- 'projects/avatars#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq')
- end
-end
diff --git a/spec/services/archive_repository_service_spec.rb b/spec/services/archive_repository_service_spec.rb
deleted file mode 100644
index f168a913976..00000000000
--- a/spec/services/archive_repository_service_spec.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-require 'spec_helper'
-
-describe ArchiveRepositoryService do
- let(:project) { create(:project) }
- subject { ArchiveRepositoryService.new(project, "master", "zip") }
-
- describe "#execute" do
- it "cleans old archives" do
- expect(project.repository).to receive(:clean_old_archives)
-
- subject.execute(timeout: 0.0)
- end
-
- context "when the repository doesn't have an archive file path" do
- before do
- allow(project.repository).to receive(:archive_file_path).and_return(nil)
- end
-
- it "raises an error" do
- expect {
- subject.execute(timeout: 0.0)
- }.to raise_error
- end
- end
-
- context "when the repository has an archive file path" do
- let(:file_path) { "/archive.zip" }
- let(:pid_file_path) { "/archive.zip.pid" }
-
- before do
- allow(project.repository).to receive(:archive_file_path).and_return(file_path)
- allow(project.repository).to receive(:archive_pid_file_path).and_return(pid_file_path)
- end
-
- context "when the archive file already exists" do
- before do
- allow(File).to receive(:exist?).with(file_path).and_return(true)
- end
-
- it "returns the file path" do
- expect(subject.execute(timeout: 0.0)).to eq(file_path)
- end
- end
-
- context "when the archive file doesn't exist yet" do
- before do
- allow(File).to receive(:exist?).with(file_path).and_return(false)
- allow(File).to receive(:exist?).with(pid_file_path).and_return(true)
- end
-
- context "when the archive pid file doesn't exist yet" do
- before do
- allow(File).to receive(:exist?).with(pid_file_path).and_return(false)
- end
-
- it "queues the RepositoryArchiveWorker" do
- expect(RepositoryArchiveWorker).to receive(:perform_async)
-
- subject.execute(timeout: 0.0)
- end
- end
-
- context "when the archive pid file already exists" do
- it "doesn't queue the RepositoryArchiveWorker" do
- expect(RepositoryArchiveWorker).not_to receive(:perform_async)
-
- subject.execute(timeout: 0.0)
- end
- end
-
- context "when the archive file exists after a little while" do
- before do
- Thread.new do
- sleep 0.1
- allow(File).to receive(:exist?).with(file_path).and_return(true)
- end
- end
-
- it "returns the file path" do
- expect(subject.execute(timeout: 0.2)).to eq(file_path)
- end
- end
-
- context "when the archive file doesn't exist after the timeout" do
- it "returns nil" do
- expect(subject.execute(timeout: 0.0)).to eq(nil)
- end
- end
- end
- end
- end
-end
-
diff --git a/spec/services/create_snippet_service_spec.rb b/spec/services/create_snippet_service_spec.rb
deleted file mode 100644
index 08689c15ca8..00000000000
--- a/spec/services/create_snippet_service_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-require 'spec_helper'
-
-describe CreateSnippetService do
- before do
- @user = create :user
- @admin = create :user, admin: true
- @opts = {
- title: 'Test snippet',
- file_name: 'snippet.rb',
- content: 'puts "hello world"',
- visibility_level: Gitlab::VisibilityLevel::PRIVATE
- }
- end
-
- context 'When public visibility is restricted' do
- before do
- allow_any_instance_of(ApplicationSetting).to(
- receive(:restricted_visibility_levels).and_return(
- [Gitlab::VisibilityLevel::PUBLIC]
- )
- )
-
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
- end
-
- it 'non-admins should not be able to create a public snippet' do
- snippet = create_snippet(nil, @user, @opts)
- expect(snippet.errors.messages).to have_key(:visibility_level)
- expect(snippet.errors.messages[:visibility_level].first).to(
- match('Public visibility has been restricted')
- )
- end
-
- it 'admins should be able to create a public snippet' do
- snippet = create_snippet(nil, @admin, @opts)
- expect(snippet.errors.any?).to be_falsey
- expect(snippet.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC)
- end
- end
-
- def create_snippet(project, user, opts)
- CreateSnippetService.new(project, user, opts).execute
- end
-end
diff --git a/spec/services/event_create_service_spec.rb b/spec/services/event_create_service_spec.rb
deleted file mode 100644
index 007a9eed192..00000000000
--- a/spec/services/event_create_service_spec.rb
+++ /dev/null
@@ -1,103 +0,0 @@
-require 'spec_helper'
-
-describe EventCreateService do
- let(:service) { EventCreateService.new }
-
- describe 'Issues' do
- describe :open_issue do
- let(:issue) { create(:issue) }
-
- it { expect(service.open_issue(issue, issue.author)).to be_truthy }
-
- it "should create new event" do
- expect { service.open_issue(issue, issue.author) }.to change { Event.count }
- end
- end
-
- describe :close_issue do
- let(:issue) { create(:issue) }
-
- it { expect(service.close_issue(issue, issue.author)).to be_truthy }
-
- it "should create new event" do
- expect { service.close_issue(issue, issue.author) }.to change { Event.count }
- end
- end
-
- describe :reopen_issue do
- let(:issue) { create(:issue) }
-
- it { expect(service.reopen_issue(issue, issue.author)).to be_truthy }
-
- it "should create new event" do
- expect { service.reopen_issue(issue, issue.author) }.to change { Event.count }
- end
- end
- end
-
- describe 'Merge Requests' do
- describe :open_mr do
- let(:merge_request) { create(:merge_request) }
-
- it { expect(service.open_mr(merge_request, merge_request.author)).to be_truthy }
-
- it "should create new event" do
- expect { service.open_mr(merge_request, merge_request.author) }.to change { Event.count }
- end
- end
-
- describe :close_mr do
- let(:merge_request) { create(:merge_request) }
-
- it { expect(service.close_mr(merge_request, merge_request.author)).to be_truthy }
-
- it "should create new event" do
- expect { service.close_mr(merge_request, merge_request.author) }.to change { Event.count }
- end
- end
-
- describe :merge_mr do
- let(:merge_request) { create(:merge_request) }
-
- it { expect(service.merge_mr(merge_request, merge_request.author)).to be_truthy }
-
- it "should create new event" do
- expect { service.merge_mr(merge_request, merge_request.author) }.to change { Event.count }
- end
- end
-
- describe :reopen_mr do
- let(:merge_request) { create(:merge_request) }
-
- it { expect(service.reopen_mr(merge_request, merge_request.author)).to be_truthy }
-
- it "should create new event" do
- expect { service.reopen_mr(merge_request, merge_request.author) }.to change { Event.count }
- end
- end
- end
-
- describe 'Milestone' do
- let(:user) { create :user }
-
- describe :open_milestone do
- let(:milestone) { create(:milestone) }
-
- it { expect(service.open_milestone(milestone, user)).to be_truthy }
-
- it "should create new event" do
- expect { service.open_milestone(milestone, user) }.to change { Event.count }
- end
- end
-
- describe :close_mr do
- let(:milestone) { create(:milestone) }
-
- it { expect(service.close_milestone(milestone, user)).to be_truthy }
-
- it "should create new event" do
- expect { service.close_milestone(milestone, user) }.to change { Event.count }
- end
- end
- end
-end
diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb
deleted file mode 100644
index aa9b15dd9ec..00000000000
--- a/spec/services/git_push_service_spec.rb
+++ /dev/null
@@ -1,238 +0,0 @@
-require 'spec_helper'
-
-describe GitPushService do
- include RepoHelpers
-
- let (:user) { create :user }
- let (:project) { create :project }
- let (:service) { GitPushService.new }
-
- before do
- @blankrev = Gitlab::Git::BLANK_SHA
- @oldrev = sample_commit.parent_id
- @newrev = sample_commit.id
- @ref = 'refs/heads/master'
- end
-
- describe 'Push branches' do
- context 'new branch' do
- subject do
- service.execute(project, user, @blankrev, @newrev, @ref)
- end
-
- it { is_expected.to be_truthy }
- end
-
- context 'existing branch' do
- subject do
- service.execute(project, user, @oldrev, @newrev, @ref)
- end
-
- it { is_expected.to be_truthy }
- end
-
- context 'rm branch' do
- subject do
- service.execute(project, user, @oldrev, @blankrev, @ref)
- end
-
- it { is_expected.to be_truthy }
- end
- end
-
- describe "Git Push Data" do
- before do
- service.execute(project, user, @oldrev, @newrev, @ref)
- @push_data = service.push_data
- @commit = project.repository.commit(@newrev)
- end
-
- subject { @push_data }
-
- it { is_expected.to include(object_kind: 'push') }
- it { is_expected.to include(before: @oldrev) }
- it { is_expected.to include(after: @newrev) }
- it { is_expected.to include(ref: @ref) }
- it { is_expected.to include(user_id: user.id) }
- it { is_expected.to include(user_name: user.name) }
- it { is_expected.to include(project_id: project.id) }
-
- context "with repository data" do
- subject { @push_data[:repository] }
-
- it { is_expected.to include(name: project.name) }
- it { is_expected.to include(url: project.url_to_repo) }
- it { is_expected.to include(description: project.description) }
- it { is_expected.to include(homepage: project.web_url) }
- end
-
- context "with commits" do
- subject { @push_data[:commits] }
-
- it { is_expected.to be_an(Array) }
- it 'has 1 element' do
- expect(subject.size).to eq(1)
- end
-
- context "the commit" do
- subject { @push_data[:commits].first }
-
- it { is_expected.to include(id: @commit.id) }
- it { is_expected.to include(message: @commit.safe_message) }
- it { is_expected.to include(timestamp: @commit.date.xmlschema) }
- it do
- is_expected.to include(
- url: [
- Gitlab.config.gitlab.url,
- project.namespace.to_param,
- project.to_param,
- 'commit',
- @commit.id
- ].join('/')
- )
- end
-
- context "with a author" do
- subject { @push_data[:commits].first[:author] }
-
- it { is_expected.to include(name: @commit.author_name) }
- it { is_expected.to include(email: @commit.author_email) }
- end
- end
- end
- end
-
- describe "Push Event" do
- before do
- service.execute(project, user, @oldrev, @newrev, @ref)
- @event = Event.last
- end
-
- it { expect(@event).not_to be_nil }
- it { expect(@event.project).to eq(project) }
- it { expect(@event.action).to eq(Event::PUSHED) }
- it { expect(@event.data).to eq(service.push_data) }
- end
-
- describe "Web Hooks" do
- context "execute web hooks" do
- it "when pushing a branch for the first time" do
- expect(project).to receive(:execute_hooks)
- expect(project.default_branch).to eq("master")
- expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: false })
- service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
- end
-
- it "when pushing a branch for the first time with default branch protection disabled" do
- ApplicationSetting.any_instance.stub(default_branch_protection: 0)
-
- expect(project).to receive(:execute_hooks)
- expect(project.default_branch).to eq("master")
- expect(project.protected_branches).not_to receive(:create)
- service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
- end
-
- it "when pushing a branch for the first time with default branch protection set to 'developers can push'" do
- ApplicationSetting.any_instance.stub(default_branch_protection: 1)
-
- expect(project).to receive(:execute_hooks)
- expect(project.default_branch).to eq("master")
- expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: true })
- service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
- end
-
- it "when pushing new commits to existing branch" do
- expect(project).to receive(:execute_hooks)
- service.execute(project, user, 'oldrev', 'newrev', 'refs/heads/master')
- end
- end
- end
-
- describe "cross-reference notes" do
- let(:issue) { create :issue, project: project }
- let(:commit_author) { create :user }
- let(:commit) { project.repository.commit }
-
- before do
- commit.stub({
- safe_message: "this commit \n mentions ##{issue.id}",
- references: [issue],
- author_name: commit_author.name,
- author_email: commit_author.email
- })
- project.repository.stub(commits_between: [commit])
- end
-
- it "creates a note if a pushed commit mentions an issue" do
- expect(Note).to receive(:create_cross_reference_note).with(issue, commit, commit_author, project)
-
- service.execute(project, user, @oldrev, @newrev, @ref)
- end
-
- it "only creates a cross-reference note if one doesn't already exist" do
- Note.create_cross_reference_note(issue, commit, user, project)
-
- expect(Note).not_to receive(:create_cross_reference_note).with(issue, commit, commit_author, project)
-
- service.execute(project, user, @oldrev, @newrev, @ref)
- end
-
- it "defaults to the pushing user if the commit's author is not known" do
- commit.stub(author_name: 'unknown name', author_email: 'unknown@email.com')
- expect(Note).to receive(:create_cross_reference_note).with(issue, commit, user, project)
-
- service.execute(project, user, @oldrev, @newrev, @ref)
- end
-
- it "finds references in the first push to a non-default branch" do
- allow(project.repository).to receive(:commits_between).with(@blankrev, @newrev).and_return([])
- allow(project.repository).to receive(:commits_between).with("master", @newrev).and_return([commit])
-
- expect(Note).to receive(:create_cross_reference_note).with(issue, commit, commit_author, project)
-
- service.execute(project, user, @blankrev, @newrev, 'refs/heads/other')
- end
- end
-
- describe "closing issues from pushed commits" do
- let(:issue) { create :issue, project: project }
- let(:other_issue) { create :issue, project: project }
- let(:commit_author) { create :user }
- let(:closing_commit) { project.repository.commit }
-
- before do
- closing_commit.stub({
- issue_closing_regex: /^([Cc]loses|[Ff]ixes) #\d+/,
- safe_message: "this is some work.\n\ncloses ##{issue.iid}",
- author_name: commit_author.name,
- author_email: commit_author.email
- })
-
- project.repository.stub(commits_between: [closing_commit])
- end
-
- it "closes issues with commit messages" do
- service.execute(project, user, @oldrev, @newrev, @ref)
-
- expect(Issue.find(issue.id)).to be_closed
- end
-
- it "doesn't create cross-reference notes for a closing reference" do
- expect {
- service.execute(project, user, @oldrev, @newrev, @ref)
- }.not_to change { Note.where(project_id: project.id, system: true, commit_id: closing_commit.id).count }
- end
-
- it "doesn't close issues when pushed to non-default branches" do
- project.stub(default_branch: 'durf')
-
- # The push still shouldn't create cross-reference notes.
- expect {
- service.execute(project, user, @oldrev, @newrev, 'refs/heads/hurf')
- }.not_to change { Note.where(project_id: project.id, system: true).count }
-
- expect(Issue.find(issue.id)).to be_opened
- end
- end
-end
-
diff --git a/spec/services/git_tag_push_service_spec.rb b/spec/services/git_tag_push_service_spec.rb
deleted file mode 100644
index a050fdf6c0e..00000000000
--- a/spec/services/git_tag_push_service_spec.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-require 'spec_helper'
-
-describe GitTagPushService do
- include RepoHelpers
-
- let (:user) { create :user }
- let (:project) { create :project }
- let (:service) { GitTagPushService.new }
-
- before do
- @oldrev = Gitlab::Git::BLANK_SHA
- @newrev = "8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b" # gitlab-test: git rev-parse refs/tags/v1.1.0
- @ref = 'refs/tags/v1.1.0'
- end
-
- describe "Git Tag Push Data" do
- before do
- service.execute(project, user, @oldrev, @newrev, @ref)
- @push_data = service.push_data
- @tag_name = Gitlab::Git.ref_name(@ref)
- @tag = project.repository.find_tag(@tag_name)
- @commit = project.repository.commit(@tag.target)
- end
-
- subject { @push_data }
-
- it { is_expected.to include(object_kind: 'tag_push') }
- it { is_expected.to include(ref: @ref) }
- it { is_expected.to include(before: @oldrev) }
- it { is_expected.to include(after: @newrev) }
- it { is_expected.to include(message: @tag.message) }
- it { is_expected.to include(user_id: user.id) }
- it { is_expected.to include(user_name: user.name) }
- it { is_expected.to include(project_id: project.id) }
-
- context "with repository data" do
- subject { @push_data[:repository] }
-
- it { is_expected.to include(name: project.name) }
- it { is_expected.to include(url: project.url_to_repo) }
- it { is_expected.to include(description: project.description) }
- it { is_expected.to include(homepage: project.web_url) }
- end
-
- context "with commits" do
- subject { @push_data[:commits] }
-
- it { is_expected.to be_an(Array) }
- it 'has 1 element' do
- expect(subject.size).to eq(1)
- end
-
- context "the commit" do
- subject { @push_data[:commits].first }
-
- it { is_expected.to include(id: @commit.id) }
- it { is_expected.to include(message: @commit.safe_message) }
- it { is_expected.to include(timestamp: @commit.date.xmlschema) }
- it do
- is_expected.to include(
- url: [
- Gitlab.config.gitlab.url,
- project.namespace.to_param,
- project.to_param,
- 'commit',
- @commit.id
- ].join('/')
- )
- end
-
- context "with a author" do
- subject { @push_data[:commits].first[:author] }
-
- it { is_expected.to include(name: @commit.author_name) }
- it { is_expected.to include(email: @commit.author_email) }
- end
- end
- end
- end
-
- describe "Web Hooks" do
- context "execute web hooks" do
- it "when pushing tags" do
- expect(project).to receive(:execute_hooks)
- service.execute(project, user, 'oldrev', 'newrev', 'refs/tags/v1.0.0')
- end
- end
- end
-end
diff --git a/spec/services/issues/bulk_update_service_spec.rb b/spec/services/issues/bulk_update_service_spec.rb
deleted file mode 100644
index a97c55011c9..00000000000
--- a/spec/services/issues/bulk_update_service_spec.rb
+++ /dev/null
@@ -1,121 +0,0 @@
-require 'spec_helper'
-
-describe Issues::BulkUpdateService do
- let(:issue) {
- create(:issue, project: @project)
- }
-
- before do
- @user = create :user
- opts = {
- name: "GitLab",
- namespace: @user.namespace
- }
- @project = Projects::CreateService.new(@user, opts).execute
- end
-
- describe :close_issue do
-
- before do
- @issues = 5.times.collect do
- create(:issue, project: @project)
- end
- @params = {
- state_event: 'close',
- issues_ids: @issues.map(&:id)
- }
- end
-
- it {
- result = Issues::BulkUpdateService.new(@project, @user, @params).execute
- expect(result[:success]).to be_truthy
- expect(result[:count]).to eq(@issues.count)
-
- expect(@project.issues.opened).to be_empty
- expect(@project.issues.closed).not_to be_empty
- }
-
- end
-
- describe :reopen_issues do
-
- before do
- @issues = 5.times.collect do
- create(:closed_issue, project: @project)
- end
- @params = {
- state_event: 'reopen',
- issues_ids: @issues.map(&:id)
- }
- end
-
- it {
- result = Issues::BulkUpdateService.new(@project, @user, @params).execute
- expect(result[:success]).to be_truthy
- expect(result[:count]).to eq(@issues.count)
-
- expect(@project.issues.closed).to be_empty
- expect(@project.issues.opened).not_to be_empty
- }
-
- end
-
- describe :update_assignee do
-
- before do
- @new_assignee = create :user
- @params = {
- issues_ids: [issue.id],
- assignee_id: @new_assignee.id
- }
- end
-
- it {
- result = Issues::BulkUpdateService.new(@project, @user, @params).execute
- expect(result[:success]).to be_truthy
- expect(result[:count]).to eq(1)
-
- expect(@project.issues.first.assignee).to eq(@new_assignee)
- }
-
- it 'allows mass-unassigning' do
- @project.issues.first.update_attribute(:assignee, @new_assignee)
- expect(@project.issues.first.assignee).not_to be_nil
-
- @params[:assignee_id] = -1
-
- Issues::BulkUpdateService.new(@project, @user, @params).execute
- expect(@project.issues.first.assignee).to be_nil
- end
-
- it 'does not unassign when assignee_id is not present' do
- @project.issues.first.update_attribute(:assignee, @new_assignee)
- expect(@project.issues.first.assignee).not_to be_nil
-
- @params[:assignee_id] = ''
-
- Issues::BulkUpdateService.new(@project, @user, @params).execute
- expect(@project.issues.first.assignee).not_to be_nil
- end
- end
-
- describe :update_milestone do
-
- before do
- @milestone = create :milestone
- @params = {
- issues_ids: [issue.id],
- milestone_id: @milestone.id
- }
- end
-
- it {
- result = Issues::BulkUpdateService.new(@project, @user, @params).execute
- expect(result[:success]).to be_truthy
- expect(result[:count]).to eq(1)
-
- expect(@project.issues.first.milestone).to eq(@milestone)
- }
- end
-
-end
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
deleted file mode 100644
index d15dff1b52b..00000000000
--- a/spec/services/issues/close_service_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-require 'spec_helper'
-
-describe Issues::CloseService do
- let(:project) { create(:empty_project) }
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:issue) { create(:issue, assignee: user2) }
-
- before do
- project.team << [user, :master]
- project.team << [user2, :developer]
- end
-
- describe :execute do
- context "valid params" do
- before do
- @issue = Issues::CloseService.new(project, user, {}).execute(issue)
- end
-
- it { expect(@issue).to be_valid }
- it { expect(@issue).to be_closed }
-
- it 'should send email to user2 about assign of new issue' do
- email = ActionMailer::Base.deliveries.last
- expect(email.to.first).to eq(user2.email)
- expect(email.subject).to include(issue.title)
- end
-
- it 'should create system note about issue reassign' do
- note = @issue.notes.last
- expect(note.note).to include "Status changed to closed"
- end
- end
- end
-end
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
deleted file mode 100644
index 7f1ebcb3198..00000000000
--- a/spec/services/issues/create_service_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-require 'spec_helper'
-
-describe Issues::CreateService do
- let(:project) { create(:empty_project) }
- let(:user) { create(:user) }
-
- describe :execute do
- context "valid params" do
- before do
- project.team << [user, :master]
- opts = {
- title: 'Awesome issue',
- description: 'please fix'
- }
-
- @issue = Issues::CreateService.new(project, user, opts).execute
- end
-
- it { expect(@issue).to be_valid }
- it { expect(@issue.title).to eq('Awesome issue') }
- end
- end
-end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
deleted file mode 100644
index 22b89bec96d..00000000000
--- a/spec/services/issues/update_service_spec.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-require 'spec_helper'
-
-describe Issues::UpdateService do
- let(:project) { create(:empty_project) }
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:issue) { create(:issue) }
- let(:label) { create(:label) }
-
- before do
- project.team << [user, :master]
- project.team << [user2, :developer]
- end
-
- describe :execute do
- context "valid params" do
- before do
- opts = {
- title: 'New title',
- description: 'Also please fix',
- assignee_id: user2.id,
- state_event: 'close',
- label_ids: [label.id]
- }
-
- @issue = Issues::UpdateService.new(project, user, opts).execute(issue)
- @issue.reload
- end
-
- it { expect(@issue).to be_valid }
- it { expect(@issue.title).to eq('New title') }
- it { expect(@issue.assignee).to eq(user2) }
- it { expect(@issue).to be_closed }
- it { expect(@issue.labels.count).to eq(1) }
- it { expect(@issue.labels.first.title).to eq('Bug') }
-
- it 'should send email to user2 about assign of new issue' do
- email = ActionMailer::Base.deliveries.last
- expect(email.to.first).to eq(user2.email)
- expect(email.subject).to include(issue.title)
- end
-
- it 'should create system note about issue reassign' do
- note = @issue.notes.last
- expect(note.note).to include "Reassigned to \@#{user2.username}"
- end
-
- it 'should create system note about issue label edit' do
- note = @issue.notes[1]
- expect(note.note).to include "Added ~#{label.id} label"
- end
- end
- end
-end
diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb
deleted file mode 100644
index b3cbfd4b5b8..00000000000
--- a/spec/services/merge_requests/close_service_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-require 'spec_helper'
-
-describe MergeRequests::CloseService do
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:merge_request) { create(:merge_request, assignee: user2) }
- let(:project) { merge_request.project }
-
- before do
- project.team << [user, :master]
- project.team << [user2, :developer]
- end
-
- describe :execute do
- context 'valid params' do
- let(:service) { MergeRequests::CloseService.new(project, user, {}) }
-
- before do
- allow(service).to receive(:execute_hooks)
-
- @merge_request = service.execute(merge_request)
- end
-
- it { expect(@merge_request).to be_valid }
- it { expect(@merge_request).to be_closed }
-
- it 'should execute hooks with close action' do
- expect(service).to have_received(:execute_hooks).
- with(@merge_request, 'close')
- end
-
- it 'should send email to user2 about assign of new merge_request' do
- email = ActionMailer::Base.deliveries.last
- expect(email.to.first).to eq(user2.email)
- expect(email.subject).to include(merge_request.title)
- end
-
- it 'should create system note about merge_request reassign' do
- note = @merge_request.notes.last
- expect(note.note).to include 'Status changed to closed'
- end
- end
- end
-end
diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb
deleted file mode 100644
index d9bfdf64308..00000000000
--- a/spec/services/merge_requests/create_service_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-require 'spec_helper'
-
-describe MergeRequests::CreateService do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- describe :execute do
- context 'valid params' do
- let(:opts) do
- {
- title: 'Awesome merge_request',
- description: 'please fix',
- source_branch: 'stable',
- target_branch: 'master'
- }
- end
- let(:service) { MergeRequests::CreateService.new(project, user, opts) }
-
- before do
- project.team << [user, :master]
- allow(service).to receive(:execute_hooks)
-
- @merge_request = service.execute
- end
-
- it { expect(@merge_request).to be_valid }
- it { expect(@merge_request.title).to eq('Awesome merge_request') }
-
- it 'should execute hooks with default action' do
- expect(service).to have_received(:execute_hooks).with(@merge_request)
- end
- end
- end
-end
diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb
deleted file mode 100644
index 0a25fb12f4e..00000000000
--- a/spec/services/merge_requests/merge_service_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-require 'spec_helper'
-
-describe MergeRequests::MergeService do
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:merge_request) { create(:merge_request, assignee: user2) }
- let(:project) { merge_request.project }
-
- before do
- project.team << [user, :master]
- project.team << [user2, :developer]
- end
-
- describe :execute do
- context 'valid params' do
- let(:service) { MergeRequests::MergeService.new(project, user, {}) }
-
- before do
- allow(service).to receive(:execute_hooks)
-
- service.execute(merge_request, 'Awesome message')
- end
-
- it { expect(merge_request).to be_valid }
- it { expect(merge_request).to be_merged }
-
- it 'should execute hooks with merge action' do
- expect(service).to have_received(:execute_hooks).
- with(merge_request, 'merge')
- end
-
- it 'should send email to user2 about merge of new merge_request' do
- email = ActionMailer::Base.deliveries.last
- expect(email.to.first).to eq(user2.email)
- expect(email.subject).to include(merge_request.title)
- end
-
- it 'should create system note about merge_request merge' do
- note = merge_request.notes.last
- expect(note.note).to include 'Status changed to merged'
- end
- end
- end
-end
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
deleted file mode 100644
index 879df0c9c67..00000000000
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-require 'spec_helper'
-
-describe MergeRequests::RefreshService do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
- let(:service) { MergeRequests::RefreshService }
-
- describe :execute do
- before do
- @user = create(:user)
- group = create(:group)
- group.add_owner(@user)
-
- @project = create(:project, namespace: group)
- @fork_project = Projects::ForkService.new(@project, @user).execute
- @merge_request = create(:merge_request, source_project: @project,
- source_branch: 'master',
- target_branch: 'feature',
- target_project: @project)
-
- @fork_merge_request = create(:merge_request, source_project: @fork_project,
- source_branch: 'master',
- target_branch: 'feature',
- target_project: @project)
-
- @commits = @merge_request.commits
-
- @oldrev = @commits.last.id
- @newrev = @commits.first.id
- end
-
- context 'push to origin repo source branch' do
- before do
- service.new(@project, @user).execute(@oldrev, @newrev, 'refs/heads/master')
- reload_mrs
- end
-
- it { expect(@merge_request.notes).not_to be_empty }
- it { expect(@merge_request).to be_open }
- it { expect(@fork_merge_request).to be_open }
- it { expect(@fork_merge_request.notes).to be_empty }
- end
-
- context 'push to origin repo target branch' do
- before do
- service.new(@project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
- reload_mrs
- end
-
- it { expect(@merge_request.notes.last.note).to include('changed to merged') }
- it { expect(@merge_request).to be_merged }
- it { expect(@fork_merge_request).to be_merged }
- it { expect(@fork_merge_request.notes.last.note).to include('changed to merged') }
- end
-
- context 'push to fork repo source branch' do
- before do
- service.new(@fork_project, @user).execute(@oldrev, @newrev, 'refs/heads/master')
- reload_mrs
- end
-
- it { expect(@merge_request.notes).to be_empty }
- it { expect(@merge_request).to be_open }
- it { expect(@fork_merge_request.notes.last.note).to include('Added 4 commits') }
- it { expect(@fork_merge_request).to be_open }
- end
-
- context 'push to fork repo target branch' do
- before do
- service.new(@fork_project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
- reload_mrs
- end
-
- it { expect(@merge_request.notes).to be_empty }
- it { expect(@merge_request).to be_open }
- it { expect(@fork_merge_request.notes).to be_empty }
- it { expect(@fork_merge_request).to be_open }
- end
-
- context 'push to origin repo target branch after fork project was removed' do
- before do
- @fork_project.destroy
- service.new(@project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
- reload_mrs
- end
-
- it { expect(@merge_request.notes.last.note).to include('changed to merged') }
- it { expect(@merge_request).to be_merged }
- it { expect(@fork_merge_request).to be_open }
- it { expect(@fork_merge_request.notes).to be_empty }
- end
-
- def reload_mrs
- @merge_request.reload
- @fork_merge_request.reload
- end
- end
-end
diff --git a/spec/services/merge_requests/reopen_service_spec.rb b/spec/services/merge_requests/reopen_service_spec.rb
deleted file mode 100644
index 9401bc3b558..00000000000
--- a/spec/services/merge_requests/reopen_service_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-require 'spec_helper'
-
-describe MergeRequests::ReopenService do
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:merge_request) { create(:merge_request, assignee: user2) }
- let(:project) { merge_request.project }
-
- before do
- project.team << [user, :master]
- project.team << [user2, :developer]
- end
-
- describe :execute do
- context 'valid params' do
- let(:service) { MergeRequests::ReopenService.new(project, user, {}) }
-
- before do
- allow(service).to receive(:execute_hooks)
-
- merge_request.state = :closed
- service.execute(merge_request)
- end
-
- it { expect(merge_request).to be_valid }
- it { expect(merge_request).to be_reopened }
-
- it 'should execute hooks with reopen action' do
- expect(service).to have_received(:execute_hooks).
- with(merge_request, 'reopen')
- end
-
- it 'should send email to user2 about reopen of merge_request' do
- email = ActionMailer::Base.deliveries.last
- expect(email.to.first).to eq(user2.email)
- expect(email.subject).to include(merge_request.title)
- end
-
- it 'should create system note about merge_request reopen' do
- note = merge_request.notes.last
- expect(note.note).to include 'Status changed to reopened'
- end
- end
- end
-end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
deleted file mode 100644
index 916b01e1c45..00000000000
--- a/spec/services/merge_requests/update_service_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-require 'spec_helper'
-
-describe MergeRequests::UpdateService do
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:merge_request) { create(:merge_request, :simple) }
- let(:project) { merge_request.project }
- let(:label) { create(:label) }
-
- before do
- project.team << [user, :master]
- project.team << [user2, :developer]
- end
-
- describe :execute do
- context 'valid params' do
- let(:opts) do
- {
- title: 'New title',
- description: 'Also please fix',
- assignee_id: user2.id,
- state_event: 'close',
- label_ids: [label.id]
- }
- end
-
- let(:service) { MergeRequests::UpdateService.new(project, user, opts) }
-
- before do
- allow(service).to receive(:execute_hooks)
-
- @merge_request = service.execute(merge_request)
- @merge_request.reload
- end
-
- it { expect(@merge_request).to be_valid }
- it { expect(@merge_request.title).to eq('New title') }
- it { expect(@merge_request.assignee).to eq(user2) }
- it { expect(@merge_request).to be_closed }
- it { expect(@merge_request.labels.count).to eq(1) }
- it { expect(@merge_request.labels.first.title).to eq('Bug') }
-
- it 'should execute hooks with update action' do
- expect(service).to have_received(:execute_hooks).
- with(@merge_request, 'update')
- end
-
- it 'should send email to user2 about assign of new merge_request' do
- email = ActionMailer::Base.deliveries.last
- expect(email.to.first).to eq(user2.email)
- expect(email.subject).to include(merge_request.title)
- end
-
- it 'should create system note about merge_request reassign' do
- note = @merge_request.notes.last
- expect(note.note).to include "Reassigned to \@#{user2.username}"
- end
-
- it 'should create system note about merge_request label edit' do
- note = @merge_request.notes[1]
- expect(note.note).to include "Added ~#{label.id} label"
- end
- end
- end
-end
diff --git a/spec/services/milestones/group_service_spec.rb b/spec/services/milestones/group_service_spec.rb
deleted file mode 100644
index 74eb0f99e0f..00000000000
--- a/spec/services/milestones/group_service_spec.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-require 'spec_helper'
-
-describe Milestones::GroupService do
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:group) { create(:group) }
- let(:project1) { create(:project, group: group) }
- let(:project2) { create(:project, path: 'gitlab-ci', group: group) }
- let(:project3) { create(:project, path: 'cookbook-gitlab', group: group) }
- let(:milestone1_project1) { create(:milestone, title: "Milestone v1.2", project: project1) }
- let(:milestone1_project2) { create(:milestone, title: "Milestone v1.2", project: project2) }
- let(:milestone1_project3) { create(:milestone, title: "Milestone v1.2", project: project3) }
- let(:milestone2_project1) { create(:milestone, title: "VD-123", project: project1) }
- let(:milestone2_project2) { create(:milestone, title: "VD-123", project: project2) }
- let(:milestone2_project3) { create(:milestone, title: "VD-123", project: project3) }
-
- describe 'execute' do
- context 'with valid projects' do
- before do
- milestones =
- [
- milestone1_project1,
- milestone1_project2,
- milestone1_project3,
- milestone2_project1,
- milestone2_project2,
- milestone2_project3
- ]
- @group_milestones = Milestones::GroupService.new(milestones).execute
- end
-
- it 'should have all project milestones' do
- expect(@group_milestones.count).to eq(2)
- end
-
- it 'should have all project milestones titles' do
- expect(@group_milestones.map { |group_milestone| group_milestone.title }).to match_array(['Milestone v1.2', 'VD-123'])
- end
-
- it 'should have all project milestones' do
- expect(@group_milestones.map { |group_milestone| group_milestone.milestones.count }.sum).to eq(6)
- end
- end
- end
-
- describe 'milestone' do
- context 'with valid title' do
- before do
- milestones =
- [
- milestone1_project1,
- milestone1_project2,
- milestone1_project3,
- milestone2_project1,
- milestone2_project2,
- milestone2_project3
- ]
- @group_milestones = Milestones::GroupService.new(milestones).milestone('Milestone v1.2')
- end
-
- it 'should have exactly one group milestone' do
- expect(@group_milestones.title).to eq('Milestone v1.2')
- end
-
- it 'should have all project milestones with the same title' do
- expect(@group_milestones.milestones.count).to eq(3)
- end
- end
- end
-end
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
deleted file mode 100644
index 1a02299bf19..00000000000
--- a/spec/services/notes/create_service_spec.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-require 'spec_helper'
-
-describe Notes::CreateService do
- let(:project) { create(:empty_project) }
- let(:issue) { create(:issue, project: project) }
- let(:user) { create(:user) }
-
- describe :execute do
- context "valid params" do
- before do
- project.team << [user, :master]
- opts = {
- note: 'Awesome comment',
- noteable_type: 'Issue',
- noteable_id: issue.id
- }
-
- @note = Notes::CreateService.new(project, user, opts).execute
- end
-
- it { expect(@note).to be_valid }
- it { expect(@note.note).to eq('Awesome comment') }
- end
- end
-end
-
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
deleted file mode 100644
index bfca2c88264..00000000000
--- a/spec/services/notification_service_spec.rb
+++ /dev/null
@@ -1,455 +0,0 @@
-require 'spec_helper'
-
-describe NotificationService do
- let(:notification) { NotificationService.new }
-
- describe 'Keys' do
- describe :new_key do
- let!(:key) { create(:personal_key) }
-
- it { expect(notification.new_key(key)).to be_truthy }
-
- it 'should sent email to key owner' do
- expect(Notify).to receive(:new_ssh_key_email).with(key.id)
- notification.new_key(key)
- end
- end
- end
-
- describe 'Email' do
- describe :new_email do
- let!(:email) { create(:email) }
-
- it { expect(notification.new_email(email)).to be_truthy }
-
- it 'should send email to email owner' do
- expect(Notify).to receive(:new_email_email).with(email.id)
- notification.new_email(email)
- end
- end
- end
-
- describe 'Notes' do
- context 'issue note' do
- let(:issue) { create(:issue, assignee: create(:user)) }
- let(:mentioned_issue) { create(:issue, assignee: issue.assignee) }
- let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@mention referenced') }
-
- before do
- build_team(note.project)
- end
-
- describe :new_note do
- it do
- add_users_with_subscription(note.project, issue)
-
- should_email(@u_watcher.id)
- should_email(note.noteable.author_id)
- should_email(note.noteable.assignee_id)
- should_email(@u_mentioned.id)
- should_email(@subscriber.id)
- should_not_email(note.author_id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- should_not_email(@unsubscriber.id)
-
- notification.new_note(note)
- end
-
- it 'filters out "mentioned in" notes' do
- mentioned_note = Note.create_cross_reference_note(mentioned_issue, issue, issue.author, issue.project)
-
- expect(Notify).not_to receive(:note_issue_email)
- notification.new_note(mentioned_note)
- end
- end
-
- describe 'new note on issue in project that belongs to a group' do
- let(:group) { create(:group) }
-
- before do
- note.project.namespace_id = group.id
- note.project.group.add_user(@u_watcher, GroupMember::MASTER)
- note.project.save
- user_project = note.project.project_members.find_by_user_id(@u_watcher.id)
- user_project.notification_level = Notification::N_PARTICIPATING
- user_project.save
- group_member = note.project.group.group_members.find_by_user_id(@u_watcher.id)
- group_member.notification_level = Notification::N_GLOBAL
- group_member.save
- end
-
- it do
- should_email(note.noteable.author_id)
- should_email(note.noteable.assignee_id)
- should_email(@u_mentioned.id)
- should_not_email(@u_watcher.id)
- should_not_email(note.author_id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- notification.new_note(note)
- end
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:note_issue_email).with(user_id, note.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:note_issue_email).with(user_id, note.id)
- end
- end
-
- context 'issue note mention' do
- let(:issue) { create(:issue, assignee: create(:user)) }
- let(:mentioned_issue) { create(:issue, assignee: issue.assignee) }
- let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@all mentioned') }
-
- before do
- build_team(note.project)
- end
-
- describe :new_note do
- it do
- # Notify all team members
- note.project.team.members.each do |member|
- # User with disabled notification should not be notified
- next if member.id == @u_disabled.id
- should_email(member.id)
- end
- should_email(note.noteable.author_id)
- should_email(note.noteable.assignee_id)
-
- should_not_email(note.author_id)
- should_not_email(@u_mentioned.id)
- should_not_email(@u_disabled.id)
- should_not_email(@u_not_mentioned.id)
- notification.new_note(note)
- end
-
- it 'filters out "mentioned in" notes' do
- mentioned_note = Note.create_cross_reference_note(mentioned_issue, issue, issue.author, issue.project)
-
- expect(Notify).not_to receive(:note_issue_email)
- notification.new_note(mentioned_note)
- end
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:note_issue_email).with(user_id, note.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:note_issue_email).with(user_id, note.id)
- end
- end
-
- context 'commit note' do
- let(:note) { create(:note_on_commit) }
-
- before do
- build_team(note.project)
- note.stub(:commit_author => @u_committer)
- end
-
- describe :new_note do
- it do
- should_email(@u_committer.id, note)
- should_email(@u_watcher.id, note)
- should_not_email(@u_mentioned.id, note)
- should_not_email(note.author_id, note)
- should_not_email(@u_participating.id, note)
- should_not_email(@u_disabled.id, note)
- notification.new_note(note)
- end
-
- it do
- note.update_attribute(:note, '@mention referenced')
- should_email(@u_committer.id, note)
- should_email(@u_watcher.id, note)
- should_email(@u_mentioned.id, note)
- should_not_email(note.author_id, note)
- should_not_email(@u_participating.id, note)
- should_not_email(@u_disabled.id, note)
- notification.new_note(note)
- end
-
- it do
- @u_committer.update_attributes(notification_level: Notification::N_MENTION)
- should_not_email(@u_committer.id, note)
- notification.new_note(note)
- end
-
- def should_email(user_id, n)
- expect(Notify).to receive(:note_commit_email).with(user_id, n.id)
- end
-
- def should_not_email(user_id, n)
- expect(Notify).not_to receive(:note_commit_email).with(user_id, n.id)
- end
- end
- end
- end
-
- describe 'Issues' do
- let(:issue) { create :issue, assignee: create(:user), description: 'cc @participant' }
-
- before do
- build_team(issue.project)
- add_users_with_subscription(issue.project, issue)
- end
-
- describe :new_issue do
- it do
- should_email(issue.assignee_id)
- should_email(@u_watcher.id)
- should_email(@u_participant_mentioned.id)
- should_not_email(@u_mentioned.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- notification.new_issue(issue, @u_disabled)
- end
-
- it do
- issue.assignee.update_attributes(notification_level: Notification::N_MENTION)
- should_not_email(issue.assignee_id)
- notification.new_issue(issue, @u_disabled)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:new_issue_email).with(user_id, issue.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:new_issue_email).with(user_id, issue.id)
- end
- end
-
- describe :reassigned_issue do
- it 'should email new assignee' do
- should_email(issue.assignee_id)
- should_email(@u_watcher.id)
- should_email(@u_participant_mentioned.id)
- should_email(@subscriber.id)
- should_not_email(@unsubscriber.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
-
- notification.reassigned_issue(issue, @u_disabled)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:reassigned_issue_email).with(user_id, issue.id, nil, @u_disabled.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:reassigned_issue_email).with(user_id, issue.id, issue.assignee_id, @u_disabled.id)
- end
- end
-
- describe :close_issue do
- it 'should sent email to issue assignee and issue author' do
- should_email(issue.assignee_id)
- should_email(issue.author_id)
- should_email(@u_watcher.id)
- should_email(@u_participant_mentioned.id)
- should_email(@subscriber.id)
- should_not_email(@unsubscriber.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
-
- notification.close_issue(issue, @u_disabled)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:closed_issue_email).with(user_id, issue.id, @u_disabled.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:closed_issue_email).with(user_id, issue.id, @u_disabled.id)
- end
- end
-
- describe :reopen_issue do
- it 'should send email to issue assignee and issue author' do
- should_email(issue.assignee_id)
- should_email(issue.author_id)
- should_email(@u_watcher.id)
- should_email(@u_participant_mentioned.id)
- should_email(@subscriber.id)
- should_not_email(@unsubscriber.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
-
- notification.reopen_issue(issue, @u_disabled)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:issue_status_changed_email).with(user_id, issue.id, 'reopened', @u_disabled.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:issue_status_changed_email).with(user_id, issue.id, 'reopened', @u_disabled.id)
- end
- end
- end
-
- describe 'Merge Requests' do
- let(:merge_request) { create :merge_request, assignee: create(:user) }
-
- before do
- build_team(merge_request.target_project)
- add_users_with_subscription(merge_request.target_project, merge_request)
- end
-
- describe :new_merge_request do
- it do
- should_email(merge_request.assignee_id)
- should_email(@u_watcher.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- notification.new_merge_request(merge_request, @u_disabled)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:new_merge_request_email).with(user_id, merge_request.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:new_merge_request_email).with(user_id, merge_request.id)
- end
- end
-
- describe :reassigned_merge_request do
- it do
- should_email(merge_request.assignee_id)
- should_email(@u_watcher.id)
- should_email(@subscriber.id)
- should_not_email(@unsubscriber.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- notification.reassigned_merge_request(merge_request, merge_request.author)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:reassigned_merge_request_email).with(user_id, merge_request.id, nil, merge_request.author_id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:reassigned_merge_request_email).with(user_id, merge_request.id, merge_request.assignee_id, merge_request.author_id)
- end
- end
-
- describe :closed_merge_request do
- it do
- should_email(merge_request.assignee_id)
- should_email(@u_watcher.id)
- should_email(@subscriber.id)
- should_not_email(@unsubscriber.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- notification.close_mr(merge_request, @u_disabled)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:closed_merge_request_email).with(user_id, merge_request.id, @u_disabled.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:closed_merge_request_email).with(user_id, merge_request.id, @u_disabled.id)
- end
- end
-
- describe :merged_merge_request do
- it do
- should_email(merge_request.assignee_id)
- should_email(@u_watcher.id)
- should_email(@subscriber.id)
- should_not_email(@unsubscriber.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- notification.merge_mr(merge_request, @u_disabled)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:merged_merge_request_email).with(user_id, merge_request.id, @u_disabled.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:merged_merge_request_email).with(user_id, merge_request.id, @u_disabled.id)
- end
- end
-
- describe :reopen_merge_request do
- it do
- should_email(merge_request.assignee_id)
- should_email(@u_watcher.id)
- should_email(@subscriber.id)
- should_not_email(@unsubscriber.id)
- should_not_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- notification.reopen_mr(merge_request, @u_disabled)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:merge_request_status_email).with(user_id, merge_request.id, 'reopened', @u_disabled.id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:merge_request_status_email).with(user_id, merge_request.id, 'reopened', @u_disabled.id)
- end
- end
- end
-
- describe 'Projects' do
- let(:project) { create :project }
-
- before do
- build_team(project)
- end
-
- describe :project_was_moved do
- it do
- should_email(@u_watcher.id)
- should_email(@u_participating.id)
- should_not_email(@u_disabled.id)
- notification.project_was_moved(project)
- end
-
- def should_email(user_id)
- expect(Notify).to receive(:project_was_moved_email).with(project.id, user_id)
- end
-
- def should_not_email(user_id)
- expect(Notify).not_to receive(:project_was_moved_email).with(project.id, user_id)
- end
- end
- end
-
- def build_team(project)
- @u_watcher = create(:user, notification_level: Notification::N_WATCH)
- @u_participating = create(:user, notification_level: Notification::N_PARTICIPATING)
- @u_participant_mentioned = create(:user, username: 'participant', notification_level: Notification::N_PARTICIPATING)
- @u_disabled = create(:user, notification_level: Notification::N_DISABLED)
- @u_mentioned = create(:user, username: 'mention', notification_level: Notification::N_MENTION)
- @u_committer = create(:user, username: 'committer')
- @u_not_mentioned = create(:user, username: 'regular', notification_level: Notification::N_PARTICIPATING)
-
- project.team << [@u_watcher, :master]
- project.team << [@u_participating, :master]
- project.team << [@u_disabled, :master]
- project.team << [@u_mentioned, :master]
- project.team << [@u_committer, :master]
- end
-
- def add_users_with_subscription(project, issuable)
- @subscriber = create :user
- @unsubscriber = create :user
-
- project.team << [@subscriber, :master]
- project.team << [@unsubscriber, :master]
-
- issuable.subscriptions.create(user: @subscriber, subscribed: true)
- issuable.subscriptions.create(user: @unsubscriber, subscribed: false)
- end
-end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
deleted file mode 100644
index 337dae592dd..00000000000
--- a/spec/services/projects/create_service_spec.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-require 'spec_helper'
-
-describe Projects::CreateService do
- describe :create_by_user do
- before do
- @user = create :user
- @admin = create :user, admin: true
- @opts = {
- name: "GitLab",
- namespace: @user.namespace
- }
- end
-
- context 'user namespace' do
- before do
- @project = create_project(@user, @opts)
- end
-
- it { expect(@project).to be_valid }
- it { expect(@project.owner).to eq(@user) }
- it { expect(@project.namespace).to eq(@user.namespace) }
- end
-
- context 'group namespace' do
- before do
- @group = create :group
- @group.add_owner(@user)
-
- @opts.merge!(namespace_id: @group.id)
- @project = create_project(@user, @opts)
- end
-
- it { expect(@project).to be_valid }
- it { expect(@project.owner).to eq(@group) }
- it { expect(@project.namespace).to eq(@group) }
- end
-
- context 'wiki_enabled creates repository directory' do
- context 'wiki_enabled true creates wiki repository directory' do
- before do
- @project = create_project(@user, @opts)
- @path = ProjectWiki.new(@project, @user).send(:path_to_repo)
- end
-
- it { expect(File.exists?(@path)).to be_truthy }
- end
-
- context 'wiki_enabled false does not create wiki repository directory' do
- before do
- @opts.merge!(wiki_enabled: false)
- @project = create_project(@user, @opts)
- @path = ProjectWiki.new(@project, @user).send(:path_to_repo)
- end
-
- it { expect(File.exists?(@path)).to be_falsey }
- end
- end
-
- context 'restricted visibility level' do
- before do
- allow_any_instance_of(ApplicationSetting).to(
- receive(:restricted_visibility_levels).and_return([20])
- )
-
- @opts.merge!(
- visibility_level: Gitlab::VisibilityLevel.options['Public']
- )
- end
-
- it 'should not allow a restricted visibility level for non-admins' do
- project = create_project(@user, @opts)
- expect(project).to respond_to(:errors)
- expect(project.errors.messages).to have_key(:visibility_level)
- expect(project.errors.messages[:visibility_level].first).to(
- match('restricted by your GitLab administrator')
- )
- end
-
- it 'should allow a restricted visibility level for admins' do
- project = create_project(@admin, @opts)
- expect(project.errors.any?).to be(false)
- expect(project.saved?).to be(true)
- end
- end
- end
-
- def create_project(user, opts)
- Projects::CreateService.new(user, opts).execute
- end
-end
diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb
deleted file mode 100644
index c9025bdf133..00000000000
--- a/spec/services/projects/fork_service_spec.rb
+++ /dev/null
@@ -1,108 +0,0 @@
-require 'spec_helper'
-
-describe Projects::ForkService do
- describe :fork_by_user do
- before do
- @from_namespace = create(:namespace)
- @from_user = create(:user, namespace: @from_namespace )
- @from_project = create(:project, creator_id: @from_user.id,
- namespace: @from_namespace, star_count: 107,
- description: 'wow such project')
- @to_namespace = create(:namespace)
- @to_user = create(:user, namespace: @to_namespace)
- end
-
- context 'fork project' do
- describe "successfully creates project in the user namespace" do
- let(:to_project) { fork_project(@from_project, @to_user) }
-
- it { expect(to_project.owner).to eq(@to_user) }
- it { expect(to_project.namespace).to eq(@to_user.namespace) }
- it { expect(to_project.star_count).to be_zero }
- it { expect(to_project.description).to eq(@from_project.description) }
- end
- end
-
- context 'fork project failure' do
- it "fails due to transaction failure" do
- @to_project = fork_project(@from_project, @to_user, false)
- expect(@to_project.errors).not_to be_empty
- expect(@to_project.errors[:base]).to include("Fork transaction failed.")
- end
- end
-
- context 'project already exists' do
- it "should fail due to validation, not transaction failure" do
- @existing_project = create(:project, creator_id: @to_user.id, name: @from_project.name, namespace: @to_namespace)
- @to_project = fork_project(@from_project, @to_user)
- expect(@existing_project.persisted?).to be_truthy
- expect(@to_project.errors[:base]).to include("Invalid fork destination")
- expect(@to_project.errors[:base]).not_to include("Fork transaction failed.")
- end
- end
-
- context 'GitLab CI is enabled' do
- it "calls fork registrator for CI" do
- @from_project.build_missing_services
- @from_project.gitlab_ci_service.update_attributes(active: true)
-
- expect(ForkRegistrationWorker).to receive(:perform_async)
-
- fork_project(@from_project, @to_user)
- end
- end
- end
-
- describe :fork_to_namespace do
- before do
- @group_owner = create(:user)
- @developer = create(:user)
- @project = create(:project, creator_id: @group_owner.id,
- star_count: 777,
- description: 'Wow, such a cool project!')
- @group = create(:group)
- @group.add_user(@group_owner, GroupMember::OWNER)
- @group.add_user(@developer, GroupMember::DEVELOPER)
- @opts = { namespace: @group }
- end
-
- context 'fork project for group' do
- it 'group owner successfully forks project into the group' do
- to_project = fork_project(@project, @group_owner, true, @opts)
- expect(to_project.owner).to eq(@group)
- expect(to_project.namespace).to eq(@group)
- expect(to_project.name).to eq(@project.name)
- expect(to_project.path).to eq(@project.path)
- expect(to_project.description).to eq(@project.description)
- expect(to_project.star_count).to be_zero
- end
- end
-
- context 'fork project for group when user not owner' do
- it 'group developer should fail to fork project into the group' do
- to_project = fork_project(@project, @developer, true, @opts)
- expect(to_project.errors[:namespace]).to eq(['insufficient access rights'])
- end
- end
-
- context 'project already exists in group' do
- it 'should fail due to validation, not transaction failure' do
- existing_project = create(:project, name: @project.name,
- namespace: @group)
- to_project = fork_project(@project, @group_owner, true, @opts)
- expect(existing_project.persisted?).to be_truthy
- expect(to_project.errors[:base]).to eq(['Invalid fork destination'])
- expect(to_project.errors[:name]).to eq(['has already been taken'])
- expect(to_project.errors[:path]).to eq(['has already been taken'])
- end
- end
- end
-
- def fork_project(from_project, user, fork_success = true, params = {})
- context = Projects::ForkService.new(from_project, user, params)
- shell = double('gitlab_shell')
- shell.stub(fork_repository: fork_success)
- context.stub(gitlab_shell: shell)
- context.execute
- end
-end
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
deleted file mode 100644
index 5650626fb18..00000000000
--- a/spec/services/projects/transfer_service_spec.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-require 'spec_helper'
-
-describe Projects::TransferService do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project) { create(:project, namespace: user.namespace) }
-
- context 'namespace -> namespace' do
- before do
- group.add_owner(user)
- @result = transfer_project(project, user, new_namespace_id: group.id)
- end
-
- it { expect(@result).to be_truthy }
- it { expect(project.namespace).to eq(group) }
- end
-
- context 'namespace -> no namespace' do
- before do
- @result = transfer_project(project, user, new_namespace_id: nil)
- end
-
- it { expect(@result).not_to be_nil } # { result.should be_false } passes on nil
- it { expect(@result).to be_falsey }
- it { expect(project.namespace).to eq(user.namespace) }
- end
-
- context 'namespace -> not allowed namespace' do
- before do
- @result = transfer_project(project, user, new_namespace_id: group.id)
- end
-
- it { expect(@result).not_to be_nil } # { result.should be_false } passes on nil
- it { expect(@result).to be_falsey }
- it { expect(project.namespace).to eq(user.namespace) }
- end
-
- def transfer_project(project, user, params)
- Projects::TransferService.new(project, user, params).execute
- end
-end
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
deleted file mode 100644
index ea5b8813105..00000000000
--- a/spec/services/projects/update_service_spec.rb
+++ /dev/null
@@ -1,108 +0,0 @@
-require 'spec_helper'
-
-describe Projects::UpdateService do
- describe :update_by_user do
- before do
- @user = create :user
- @admin = create :user, admin: true
- @project = create :project, creator_id: @user.id, namespace: @user.namespace
- @opts = {}
- end
-
- context 'should be private when updated to private' do
- before do
- @created_private = @project.private?
-
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
- update_project(@project, @user, @opts)
- end
-
- it { expect(@created_private).to be_truthy }
- it { expect(@project.private?).to be_truthy }
- end
-
- context 'should be internal when updated to internal' do
- before do
- @created_private = @project.private?
-
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
- update_project(@project, @user, @opts)
- end
-
- it { expect(@created_private).to be_truthy }
- it { expect(@project.internal?).to be_truthy }
- end
-
- context 'should be public when updated to public' do
- before do
- @created_private = @project.private?
-
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
- update_project(@project, @user, @opts)
- end
-
- it { expect(@created_private).to be_truthy }
- it { expect(@project.public?).to be_truthy }
- end
-
- context 'respect configured visibility restrictions setting' do
- before(:each) do
- allow_any_instance_of(ApplicationSetting).to(
- receive(:restricted_visibility_levels).and_return([20])
- )
- end
-
- context 'should be private when updated to private' do
- before do
- @created_private = @project.private?
-
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
- update_project(@project, @user, @opts)
- end
-
- it { expect(@created_private).to be_truthy }
- it { expect(@project.private?).to be_truthy }
- end
-
- context 'should be internal when updated to internal' do
- before do
- @created_private = @project.private?
-
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
- update_project(@project, @user, @opts)
- end
-
- it { expect(@created_private).to be_truthy }
- it { expect(@project.internal?).to be_truthy }
- end
-
- context 'should be private when updated to public' do
- before do
- @created_private = @project.private?
-
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
- update_project(@project, @user, @opts)
- end
-
- it { expect(@created_private).to be_truthy }
- it { expect(@project.private?).to be_truthy }
- end
-
- context 'should be public when updated to public by admin' do
- before do
- @created_private = @project.private?
-
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
- update_project(@project, @admin, @opts)
- end
-
- it { expect(@created_private).to be_truthy }
- it { expect(@project.public?).to be_truthy }
- end
- end
- end
-
- def update_project(project, user, opts)
- Projects::UpdateService.new(project, user, opts).execute
- end
-end
diff --git a/spec/services/projects/upload_service_spec.rb b/spec/services/projects/upload_service_spec.rb
deleted file mode 100644
index e5c47015a03..00000000000
--- a/spec/services/projects/upload_service_spec.rb
+++ /dev/null
@@ -1,85 +0,0 @@
-require 'spec_helper'
-
-describe Projects::UploadService do
- describe 'File service' do
- before do
- @user = create :user
- @project = create :project, creator_id: @user.id, namespace: @user.namespace
- end
-
- context 'for valid gif file' do
- before do
- gif = fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif')
- @link_to_file = upload_file(@project.repository, gif)
- end
-
- it { expect(@link_to_file).to have_key('alt') }
- it { expect(@link_to_file).to have_key('url') }
- it { expect(@link_to_file).to have_key('is_image') }
- it { expect(@link_to_file).to have_value('banana_sample') }
- it { expect(@link_to_file['is_image']).to equal(true) }
- it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") }
- it { expect(@link_to_file['url']).to match('banana_sample.gif') }
- end
-
- context 'for valid png file' do
- before do
- png = fixture_file_upload(Rails.root + 'spec/fixtures/dk.png',
- 'image/png')
- @link_to_file = upload_file(@project.repository, png)
- end
-
- it { expect(@link_to_file).to have_key('alt') }
- it { expect(@link_to_file).to have_key('url') }
- it { expect(@link_to_file).to have_value('dk') }
- it { expect(@link_to_file).to have_key('is_image') }
- it { expect(@link_to_file['is_image']).to equal(true) }
- it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") }
- it { expect(@link_to_file['url']).to match('dk.png') }
- end
-
- context 'for valid jpg file' do
- before do
- jpg = fixture_file_upload(Rails.root + 'spec/fixtures/rails_sample.jpg', 'image/jpg')
- @link_to_file = upload_file(@project.repository, jpg)
- end
-
- it { expect(@link_to_file).to have_key('alt') }
- it { expect(@link_to_file).to have_key('url') }
- it { expect(@link_to_file).to have_key('is_image') }
- it { expect(@link_to_file).to have_value('rails_sample') }
- it { expect(@link_to_file['is_image']).to equal(true) }
- it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") }
- it { expect(@link_to_file['url']).to match('rails_sample.jpg') }
- end
-
- context 'for txt file' do
- before do
- txt = fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain')
- @link_to_file = upload_file(@project.repository, txt)
- end
-
- it { expect(@link_to_file).to have_key('alt') }
- it { expect(@link_to_file).to have_key('url') }
- it { expect(@link_to_file).to have_key('is_image') }
- it { expect(@link_to_file).to have_value('doc_sample.txt') }
- it { expect(@link_to_file['is_image']).to equal(false) }
- it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") }
- it { expect(@link_to_file['url']).to match('doc_sample.txt') }
- end
-
- context 'for too large a file' do
- before do
- txt = fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain')
- allow(txt).to receive(:size) { 1000.megabytes.to_i }
- @link_to_file = upload_file(@project.repository, txt)
- end
-
- it { expect(@link_to_file).to eq(nil) }
- end
- end
-
- def upload_file(repository, file)
- Projects::UploadService.new(repository, file).execute
- end
-end
diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb
deleted file mode 100644
index f57bfaea879..00000000000
--- a/spec/services/search_service_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-require 'spec_helper'
-
-describe 'Search::GlobalService' do
- let(:user) { create(:user) }
- let(:public_user) { create(:user) }
- let(:internal_user) { create(:user) }
-
- let!(:found_project) { create(:empty_project, :private, name: 'searchable_project') }
- let!(:unfound_project) { create(:empty_project, :private, name: 'unfound_project') }
- let!(:internal_project) { create(:empty_project, :internal, name: 'searchable_internal_project') }
- let!(:public_project) { create(:empty_project, :public, name: 'searchable_public_project') }
-
- before do
- found_project.team << [user, :master]
- end
-
- describe '#execute' do
- context 'unauthenticated' do
- it 'should return public projects only' do
- context = Search::GlobalService.new(nil, search: "searchable")
- results = context.execute
- expect(results.objects('projects')).to match_array [public_project]
- end
- end
-
- context 'authenticated' do
- it 'should return public, internal and private projects' do
- context = Search::GlobalService.new(user, search: "searchable")
- results = context.execute
- expect(results.objects('projects')).to match_array [public_project, found_project, internal_project]
- end
-
- it 'should return only public & internal projects' do
- context = Search::GlobalService.new(internal_user, search: "searchable")
- results = context.execute
- expect(results.objects('projects')).to match_array [internal_project, public_project]
- end
-
- it 'namespace name should be searchable' do
- context = Search::GlobalService.new(user, search: found_project.namespace.path)
- results = context.execute
- expect(results.objects('projects')).to match_array [found_project]
- end
- end
- end
-end
diff --git a/spec/services/system_hooks_service_spec.rb b/spec/services/system_hooks_service_spec.rb
deleted file mode 100644
index 199ac996608..00000000000
--- a/spec/services/system_hooks_service_spec.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-require 'spec_helper'
-
-describe SystemHooksService do
- let (:user) { create :user }
- let (:project) { create :project }
- let (:project_member) { create :project_member }
- let (:key) { create(:key, user: user) }
- let (:group) { create(:group) }
- let (:group_member) { create(:group_member) }
-
- context 'event data' do
- it { expect(event_data(user, :create)).to include(:event_name, :name, :created_at, :email, :user_id) }
- it { expect(event_data(user, :destroy)).to include(:event_name, :name, :created_at, :email, :user_id) }
- it { expect(event_data(project, :create)).to include(:event_name, :name, :created_at, :path, :project_id, :owner_name, :owner_email, :project_visibility) }
- it { expect(event_data(project, :destroy)).to include(:event_name, :name, :created_at, :path, :project_id, :owner_name, :owner_email, :project_visibility) }
- it { expect(event_data(project_member, :create)).to include(:event_name, :created_at, :project_name, :project_path, :project_id, :user_name, :user_email, :access_level, :project_visibility) }
- it { expect(event_data(project_member, :destroy)).to include(:event_name, :created_at, :project_name, :project_path, :project_id, :user_name, :user_email, :access_level, :project_visibility) }
- it { expect(event_data(key, :create)).to include(:username, :key, :id) }
- it { expect(event_data(key, :destroy)).to include(:username, :key, :id) }
-
- it do
- expect(event_data(group, :create)).to include(
- :event_name, :name, :created_at, :path, :group_id, :owner_name,
- :owner_email
- )
- end
- it do
- expect(event_data(group, :destroy)).to include(
- :event_name, :name, :created_at, :path, :group_id, :owner_name,
- :owner_email
- )
- end
- it do
- expect(event_data(group_member, :create)).to include(
- :event_name, :created_at, :group_name, :group_path, :group_id, :user_id,
- :user_name, :user_email, :group_access
- )
- end
- it do
- expect(event_data(group_member, :destroy)).to include(
- :event_name, :created_at, :group_name, :group_path, :group_id, :user_id,
- :user_name, :user_email, :group_access
- )
- end
- end
-
- context 'event names' do
- it { expect(event_name(user, :create)).to eq "user_create" }
- it { expect(event_name(user, :destroy)).to eq "user_destroy" }
- it { expect(event_name(project, :create)).to eq "project_create" }
- it { expect(event_name(project, :destroy)).to eq "project_destroy" }
- it { expect(event_name(project_member, :create)).to eq "user_add_to_team" }
- it { expect(event_name(project_member, :destroy)).to eq "user_remove_from_team" }
- it { expect(event_name(key, :create)).to eq 'key_create' }
- it { expect(event_name(key, :destroy)).to eq 'key_destroy' }
- it { expect(event_name(group, :create)).to eq 'group_create' }
- it { expect(event_name(group, :destroy)).to eq 'group_destroy' }
- it { expect(event_name(group_member, :create)).to eq 'user_add_to_group' }
- it { expect(event_name(group_member, :destroy)).to eq 'user_remove_from_group' }
- end
-
- def event_data(*args)
- SystemHooksService.new.send :build_event_data, *args
- end
-
- def event_name(*args)
- SystemHooksService.new.send :build_event_name, *args
- end
-end
diff --git a/spec/services/test_hook_service_spec.rb b/spec/services/test_hook_service_spec.rb
deleted file mode 100644
index d2b505f55a2..00000000000
--- a/spec/services/test_hook_service_spec.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-require 'spec_helper'
-
-describe TestHookService do
- let (:user) { create :user }
- let (:project) { create :project }
- let (:hook) { create :project_hook, project: project }
-
- describe :execute do
- it "should execute successfully" do
- stub_request(:post, hook.url).to_return(status: 200)
- expect(TestHookService.new.execute(hook, user)).to be_truthy
- end
- end
-end
diff --git a/spec/services/update_snippet_service_spec.rb b/spec/services/update_snippet_service_spec.rb
deleted file mode 100644
index 841ef9bfed1..00000000000
--- a/spec/services/update_snippet_service_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-require 'spec_helper'
-
-describe UpdateSnippetService do
- before do
- @user = create :user
- @admin = create :user, admin: true
- @opts = {
- title: 'Test snippet',
- file_name: 'snippet.rb',
- content: 'puts "hello world"',
- visibility_level: Gitlab::VisibilityLevel::PRIVATE
- }
- end
-
- context 'When public visibility is restricted' do
- before do
- allow_any_instance_of(ApplicationSetting).to(
- receive(:restricted_visibility_levels).and_return(
- [Gitlab::VisibilityLevel::PUBLIC]
- )
- )
-
- @snippet = create_snippet(@project, @user, @opts)
- @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
- end
-
- it 'non-admins should not be able to update to public visibility' do
- old_visibility = @snippet.visibility_level
- update_snippet(@project, @user, @snippet, @opts)
- expect(@snippet.errors.messages).to have_key(:visibility_level)
- expect(@snippet.errors.messages[:visibility_level].first).to(
- match('Public visibility has been restricted')
- )
- expect(@snippet.visibility_level).to eq(old_visibility)
- end
-
- it 'admins should be able to update to pubic visibility' do
- old_visibility = @snippet.visibility_level
- update_snippet(@project, @admin, @snippet, @opts)
- expect(@snippet.visibility_level).not_to eq(old_visibility)
- expect(@snippet.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC)
- end
- end
-
- def create_snippet(project, user, opts)
- CreateSnippetService.new(project, user, opts).execute
- end
-
- def update_snippet(project = nil, user, snippet, opts)
- UpdateSnippetService.new(project, user, snippet, opts).execute
- end
-end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
deleted file mode 100644
index 53ccaa4fd67..00000000000
--- a/spec/spec_helper.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-if ENV['SIMPLECOV']
- require 'simplecov'
-end
-
-if ENV['COVERALLS']
- require 'coveralls'
- Coveralls.wear_merged!
-end
-
-ENV["RAILS_ENV"] ||= 'test'
-require File.expand_path("../../config/environment", __FILE__)
-require 'rspec/rails'
-require 'capybara/rails'
-require 'capybara/rspec'
-require 'webmock/rspec'
-require 'email_spec'
-require 'sidekiq/testing/inline'
-require 'capybara/poltergeist'
-
-Capybara.javascript_driver = :poltergeist
-Capybara.default_wait_time = 10
-
-# Requires supporting ruby files with custom matchers and macros, etc,
-# in spec/support/ and its subdirectories.
-Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
-
-WebMock.disable_net_connect!(allow_localhost: true)
-
-RSpec.configure do |config|
- config.use_transactional_fixtures = false
- config.use_instantiated_fixtures = false
- config.mock_with :rspec
-
- config.include LoginHelpers, type: :feature
- config.include LoginHelpers, type: :request
- config.include FactoryGirl::Syntax::Methods
- config.include Devise::TestHelpers, type: :controller
-
- config.include TestEnv
- config.infer_spec_type_from_file_location!
- config.raise_errors_for_deprecations!
-
- config.before(:suite) do
- TestEnv.init
- end
-end
-
-ActiveRecord::Migration.maintain_test_schema!
diff --git a/spec/support/api_helpers.rb b/spec/support/api_helpers.rb
deleted file mode 100644
index ec9a326a1ea..00000000000
--- a/spec/support/api_helpers.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-module ApiHelpers
- # Public: Prepend a request path with the path to the API
- #
- # path - Path to append
- # user - User object - If provided, automatically appends private_token query
- # string for authenticated requests
- #
- # Examples
- #
- # >> api('/issues')
- # => "/api/v2/issues"
- #
- # >> api('/issues', User.last)
- # => "/api/v2/issues?private_token=..."
- #
- # >> api('/issues?foo=bar', User.last)
- # => "/api/v2/issues?foo=bar&private_token=..."
- #
- # Returns the relative path to the requested API resource
- def api(path, user = nil)
- "/api/#{API::API.version}#{path}" +
-
- # Normalize query string
- (path.index('?') ? '' : '?') +
-
- # Append private_token if given a User object
- (user.respond_to?(:private_token) ?
- "&private_token=#{user.private_token}" : "")
- end
-
- def json_response
- JSON.parse(response.body)
- end
-end
diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb
deleted file mode 100644
index cca7652093a..00000000000
--- a/spec/support/db_cleaner.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# RSpec.configure do |config|
-
-# config.around(:each) do |example|
-# DatabaseCleaner.strategy = :transaction
-# DatabaseCleaner.clean_with(:truncation)
-# DatabaseCleaner.cleaning do
-# example.run
-# end
-# end
-
-# config.around(:each, js: true) do |example|
-# DatabaseCleaner.strategy = :truncation
-# DatabaseCleaner.clean_with(:truncation)
-# DatabaseCleaner.cleaning do
-# example.run
-# end
-# end
-# end
-RSpec.configure do |config|
- config.before(:suite) do
- DatabaseCleaner.clean_with(:truncation)
- end
-
- config.before(:each) do
- DatabaseCleaner.strategy = :transaction
- end
-
- config.before(:each, :js => true) do
- DatabaseCleaner.strategy = :truncation
- end
-
- config.before(:each) do
- DatabaseCleaner.start
- end
-
- config.after(:each) do
- DatabaseCleaner.clean
- end
-
- # rspec-rails 3 will no longer automatically infer an example group's spec type
- # from the file location. You can explicitly opt-in to the feature using this
- # config option.
- # To explicitly tag specs without using automatic inference, set the `:type`
- # metadata manually:
- #
- # describe ThingsController, :type => :controller do
- # # Equivalent to being in spec/controllers
- # end
- config.infer_spec_type_from_file_location!
-end
diff --git a/spec/support/login_helpers.rb b/spec/support/login_helpers.rb
deleted file mode 100644
index 791d2a1fd64..00000000000
--- a/spec/support/login_helpers.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-module LoginHelpers
- # Internal: Create and log in as a user of the specified role
- #
- # role - User role (e.g., :admin, :user)
- def login_as(role)
- @user = create(role)
-
- login_with(@user)
- end
-
- # Internal: Login as the specified user
- #
- # user - User instance to login with
- def login_with(user)
- visit new_user_session_path
- fill_in "user_login", with: user.email
- fill_in "user_password", with: "12345678"
- click_button "Sign in"
- Thread.current[:current_user] = user
- end
-
- # Requires Javascript driver.
- def logout
- find(:css, ".fa.fa-sign-out").click
- end
-end
diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb
deleted file mode 100644
index 52b11bd6323..00000000000
--- a/spec/support/matchers.rb
+++ /dev/null
@@ -1,79 +0,0 @@
-RSpec::Matchers.define :be_valid_commit do
- match do |actual|
- actual != nil
- actual.id == ValidCommit::ID
- actual.message == ValidCommit::MESSAGE
- actual.author_name == ValidCommit::AUTHOR_FULL_NAME
- end
-end
-
-RSpec::Matchers.define :be_allowed_for do |user|
- match do |url|
- include UrlAccess
- url_allowed?(user, url)
- end
-end
-
-RSpec::Matchers.define :be_denied_for do |user|
- match do |url|
- include UrlAccess
- url_denied?(user, url)
- end
-end
-
-RSpec::Matchers.define :be_404_for do |user|
- match do |url|
- include UrlAccess
- url_404?(user, url)
- end
-end
-
-RSpec::Matchers.define :include_module do |expected|
- match do
- described_class.included_modules.include?(expected)
- end
-
- failure_message_for_should do
- "expected #{described_class} to include the #{expected} module"
- end
-end
-
-module UrlAccess
- def url_allowed?(user, url)
- emulate_user(user)
- visit url
- (status_code != 404 && current_path != new_user_session_path)
- end
-
- def url_denied?(user, url)
- emulate_user(user)
- visit url
- (status_code == 404 || current_path == new_user_session_path)
- end
-
- def url_404?(user, url)
- emulate_user(user)
- visit url
- status_code == 404
- end
-
- def emulate_user(user)
- user = case user
- when :user then create(:user)
- when :visitor then nil
- when :admin then create(:admin)
- else user
- end
- login_with(user) if user
- end
-end
-
-# Extend shoulda-matchers
-module Shoulda::Matchers::ActiveModel
- class EnsureLengthOfMatcher
- # Shortcut for is_at_least and is_at_most
- def is_within(range)
- is_at_least(range.min) && is_at_most(range.max)
- end
- end
-end
diff --git a/spec/support/mentionable_shared_examples.rb b/spec/support/mentionable_shared_examples.rb
deleted file mode 100644
index 305592fa5a6..00000000000
--- a/spec/support/mentionable_shared_examples.rb
+++ /dev/null
@@ -1,115 +0,0 @@
-# Specifications for behavior common to all Mentionable implementations.
-# Requires a shared context containing:
-# - let(:subject) { "the mentionable implementation" }
-# - let(:backref_text) { "the way that +subject+ should refer to itself in backreferences " }
-# - let(:set_mentionable_text) { lambda { |txt| "block that assigns txt to the subject's mentionable_text" } }
-
-def common_mentionable_setup
- # Avoid name collisions with let(:project) or let(:author) in the surrounding scope.
- let(:mproject) { create :project }
- let(:mauthor) { subject.author }
-
- let(:mentioned_issue) { create :issue, project: mproject }
- let(:other_issue) { create :issue, project: mproject }
- let(:mentioned_mr) { create :merge_request, :simple, source_project: mproject }
- let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object }
-
- let(:ext_proj) { create :project, :public }
- let(:ext_issue) { create :issue, project: ext_proj }
- let(:other_ext_issue) { create :issue, project: ext_proj }
- let(:ext_mr) { create :merge_request, :simple, source_project: ext_proj }
- let(:ext_commit) { ext_proj.repository.commit }
-
- # Override to add known commits to the repository stub.
- let(:extra_commits) { [] }
-
- # A string that mentions each of the +mentioned_.*+ objects above. Mentionables should add a self-reference
- # to this string and place it in their +mentionable_text+.
- let(:ref_string) do
- "mentions ##{mentioned_issue.iid} twice ##{mentioned_issue.iid}, " +
- "!#{mentioned_mr.iid}, " +
- "#{ext_proj.path_with_namespace}##{ext_issue.iid}, " +
- "#{ext_proj.path_with_namespace}!#{ext_mr.iid}, " +
- "#{ext_proj.path_with_namespace}@#{ext_commit.short_id}, " +
- "#{mentioned_commit.sha[0..10]} and itself as #{backref_text}"
- end
-
- before do
- # Wire the project's repository to return the mentioned commit, and +nil+ for any
- # unrecognized commits.
- commitmap = { '1234567890a' => mentioned_commit }
- extra_commits.each { |c| commitmap[c.short_id] = c }
- allow(mproject.repository).to receive(:commit) { |sha| commitmap[sha] }
- set_mentionable_text.call(ref_string)
- end
-end
-
-shared_examples 'a mentionable' do
- common_mentionable_setup
-
- it 'generates a descriptive back-reference' do
- expect(subject.gfm_reference).to eq(backref_text)
- end
-
- it "extracts references from its reference property" do
- # De-duplicate and omit itself
- refs = subject.references(mproject)
- expect(refs.size).to eq(6)
- expect(refs).to include(mentioned_issue)
- expect(refs).to include(mentioned_mr)
- expect(refs).to include(mentioned_commit)
- expect(refs).to include(ext_issue)
- expect(refs).to include(ext_mr)
- expect(refs).to include(ext_commit)
- end
-
- it 'creates cross-reference notes' do
- mentioned_objects = [mentioned_issue, mentioned_mr, mentioned_commit,
- ext_issue, ext_mr, ext_commit]
-
- mentioned_objects.each do |referenced|
- expect(Note).to receive(:create_cross_reference_note).with(referenced, subject.local_reference, mauthor, mproject)
- end
-
- subject.create_cross_references!(mproject, mauthor)
- end
-
- it 'detects existing cross-references' do
- Note.create_cross_reference_note(mentioned_issue, subject.local_reference, mauthor, mproject)
-
- expect(subject.has_mentioned?(mentioned_issue)).to be_truthy
- expect(subject.has_mentioned?(mentioned_mr)).to be_falsey
- end
-end
-
-shared_examples 'an editable mentionable' do
- common_mentionable_setup
-
- it_behaves_like 'a mentionable'
-
- it 'creates new cross-reference notes when the mentionable text is edited' do
- new_text = "still mentions ##{mentioned_issue.iid}, " +
- "#{mentioned_commit.sha[0..10]}, " +
- "#{ext_issue.iid}, " +
- "new refs: ##{other_issue.iid}, " +
- "#{ext_proj.path_with_namespace}##{other_ext_issue.iid}"
-
- [mentioned_issue, mentioned_commit, ext_issue].each do |oldref|
- expect(Note).not_to receive(:create_cross_reference_note).with(oldref, subject.local_reference,
- mauthor, mproject)
- end
-
- [other_issue, other_ext_issue].each do |newref|
- expect(Note).to receive(:create_cross_reference_note).with(
- newref,
- subject.local_reference,
- mauthor,
- mproject
- )
- end
-
- subject.save
- set_mentionable_text.call(new_text)
- subject.notice_added_references(mproject, mauthor)
- end
-end
diff --git a/spec/support/repo_helpers.rb b/spec/support/repo_helpers.rb
deleted file mode 100644
index aadf791bf3f..00000000000
--- a/spec/support/repo_helpers.rb
+++ /dev/null
@@ -1,118 +0,0 @@
-module RepoHelpers
- extend self
-
- # Text file in repo
- #
- # Ex.
- #
- # # Get object
- # blob = RepoHelpers.text_blob
- #
- # blob.path # => 'files/js/commit.js.coffee'
- # blob.data # => 'class Commit...'
- #
- def sample_blob
- OpenStruct.new(
- oid: '5f53439ca4b009096571d3c8bc3d09d30e7431b3',
- path: "files/js/commit.js.coffee",
- data: <<eos
-class Commit
- constructor: ->
- $('.files .diff-file').each ->
- new CommitFile(this)
-
-@Commit = Commit
-eos
- )
- end
-
- def sample_commit
- OpenStruct.new(
- id: "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
- parent_id: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9',
- author_full_name: "Dmitriy Zaporozhets",
- author_email: "dmitriy.zaporozhets@gmail.com",
- files_changed_count: 2,
- line_code: '2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14',
- line_code_path: 'files/ruby/popen.rb',
- del_line_code: '2f6fcd96b88b36ce98c38da085c795a27d92a3dd_13_13',
- message: <<eos
-Change some files
-Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
-eos
- )
- end
-
- def another_sample_commit
- OpenStruct.new(
- id: "e56497bb5f03a90a51293fc6d516788730953899",
- parent_id: '4cd80ccab63c82b4bad16faa5193fbd2aa06df40',
- author_full_name: "Sytse Sijbrandij",
- author_email: "sytse@gitlab.com",
- files_changed_count: 1,
- message: <<eos
-Add directory structure for tree_helper spec
-
-This directory structure is needed for a testing the method flatten_tree(tree) in the TreeHelper module
-
-See [merge request #275](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/275#note_732774)
-
-See merge request !2
-eos
- )
- end
-
- def sample_big_commit
- OpenStruct.new(
- id: "913c66a37b4a45b9769037c55c2d238bd0942d2e",
- author_full_name: "Dmitriy Zaporozhets",
- author_email: "dmitriy.zaporozhets@gmail.com",
- message: <<eos
-Files, encoding and much more
-Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
-eos
- )
- end
-
- def sample_image_commit
- OpenStruct.new(
- id: "2f63565e7aac07bcdadb654e253078b727143ec4",
- author_full_name: "Dmitriy Zaporozhets",
- author_email: "dmitriy.zaporozhets@gmail.com",
- old_blob_id: '33f3729a45c02fc67d00adb1b8bca394b0e761d9',
- new_blob_id: '2f63565e7aac07bcdadb654e253078b727143ec4',
- message: <<eos
-Modified image
-Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
-eos
- )
- end
-
- def sample_compare
- changes = [
- {
- line_code: 'a5cc2925ca8258af241be7e5b0381edf30266302_20_20',
- file_path: '.gitignore',
- },
- {
- line_code: '7445606fbf8f3683cd42bdc54b05d7a0bc2dfc44_4_6',
- file_path: '.gitmodules',
- }
- ]
-
- commits = [
- '5937ac0a7beb003549fc5fd26fc247adbce4a52e',
- '570e7b2abdd848b95f2f578043fc23bd6f6fd24d',
- '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9',
- 'd14d6c0abdd253381df51a723d58691b2ee1ab08',
- 'c1acaa58bbcbc3eafe538cb8274ba387047b69f8',
- ].reverse # last commit is recent one
-
- OpenStruct.new(
- source_branch: 'master',
- target_branch: 'feature',
- changes: changes,
- commits: commits
- )
- end
-end
diff --git a/spec/support/select2_helper.rb b/spec/support/select2_helper.rb
deleted file mode 100644
index 691f84f39d4..00000000000
--- a/spec/support/select2_helper.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# Select2 ajax programmatic helper
-# It allows you to select value from select2
-#
-# Params
-# value - real value of selected item
-# opts - options containing css selector
-#
-# Usage:
-#
-# select2(2, from: '#user_ids')
-#
-
-module Select2Helper
- def select2(value, options={})
- raise "Must pass a hash containing 'from'" if not options.is_a?(Hash) or not options.has_key?(:from)
-
- selector = options[:from]
-
- if options[:multiple]
- execute_script("$('#{selector}').select2('val', ['#{value}'], true);")
- else
- execute_script("$('#{selector}').select2('val', '#{value}', true);")
- end
- end
-end
diff --git a/spec/support/taskable_shared_examples.rb b/spec/support/taskable_shared_examples.rb
deleted file mode 100644
index 490f453d468..00000000000
--- a/spec/support/taskable_shared_examples.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# Specs for task state functionality for issues and merge requests.
-#
-# Requires a context containing:
-# let(:subject) { Issue or MergeRequest }
-shared_examples 'a Taskable' do
- before do
- subject.description = <<EOT.gsub(/ {6}/, '')
- * [ ] Task 1
- * [x] Task 2
- * [x] Task 3
- * [ ] Task 4
- * [ ] Task 5
-EOT
- end
-
- it 'updates the Nth task correctly' do
- subject.update_nth_task(1, true)
- expect(subject.description).to match(/\[x\] Task 1/)
-
- subject.update_nth_task(2, true)
- expect(subject.description).to match('\[x\] Task 2')
-
- subject.update_nth_task(3, false)
- expect(subject.description).to match('\[ \] Task 3')
-
- subject.update_nth_task(4, false)
- expect(subject.description).to match('\[ \] Task 4')
- end
-
- it 'returns the correct task status' do
- expect(subject.task_status).to match('5 tasks')
- expect(subject.task_status).to match('2 done')
- expect(subject.task_status).to match('3 unfinished')
- end
-
- it 'knows if it has tasks' do
- expect(subject.tasks?).to be_truthy
-
- subject.description = 'Now I have no tasks'
- expect(subject.tasks?).to be_falsey
- end
-end
diff --git a/spec/support/test_env.rb b/spec/support/test_env.rb
deleted file mode 100644
index 44d70e741b2..00000000000
--- a/spec/support/test_env.rb
+++ /dev/null
@@ -1,122 +0,0 @@
-require 'rspec/mocks'
-
-module TestEnv
- extend self
-
- # When developing the seed repository, comment out the branch you will modify.
- BRANCH_SHA = {
- 'flatten-dir' => 'e56497b',
- 'feature' => '0b4bc9a',
- 'feature_conflict' => 'bb5206f',
- 'fix' => '12d65c8',
- 'improve/awesome' => '5937ac0',
- 'markdown' => '0ed8c6c',
- 'master' => '5937ac0'
- }
-
- # Test environment
- #
- # See gitlab.yml.example test section for paths
- #
- def init(opts = {})
- # Disable mailer for spinach tests
- disable_mailer if opts[:mailer] == false
-
- clean_test_path
-
- FileUtils.mkdir_p(repos_path)
-
- # Setup GitLab shell for test instance
- setup_gitlab_shell
-
- # Create repository for FactoryGirl.create(:project)
- setup_factory_repo
- end
-
- def disable_mailer
- NotificationService.any_instance.stub(mailer: double.as_null_object)
- end
-
- def enable_mailer
- allow_any_instance_of(NotificationService).to receive(:mailer).and_call_original
- end
-
- # Clean /tmp/tests
- #
- # Keeps gitlab-shell and gitlab-test
- def clean_test_path
- tmp_test_path = Rails.root.join('tmp', 'tests', '**')
-
- Dir[tmp_test_path].each do |entry|
- unless File.basename(entry) =~ /\Agitlab-(shell|test)\z/
- FileUtils.rm_rf(entry)
- end
- end
- end
-
- def setup_gitlab_shell
- unless File.directory?(Rails.root.join(*%w(tmp tests gitlab-shell)))
- `rake gitlab:shell:install`
- end
- end
-
- def setup_factory_repo
- clone_url = "https://gitlab.com/gitlab-org/#{factory_repo_name}.git"
-
- unless File.directory?(factory_repo_path)
- system(*%W(git clone -q #{clone_url} #{factory_repo_path}))
- end
-
- Dir.chdir(factory_repo_path) do
- BRANCH_SHA.each do |branch, sha|
- # Try to reset without fetching to avoid using the network.
- reset = %W(git update-ref refs/heads/#{branch} #{sha})
- unless system(*reset)
- if system(*%w(git fetch origin))
- unless system(*reset)
- raise 'The fetched test seed '\
- 'does not contain the required revision.'
- end
- else
- raise 'Could not fetch test seed repository.'
- end
- end
- end
- end
-
- # We must copy bare repositories because we will push to them.
- system(git_env, *%W(git clone -q --bare #{factory_repo_path} #{factory_repo_path_bare}))
- end
-
- def copy_repo(project)
- base_repo_path = File.expand_path(factory_repo_path_bare)
- target_repo_path = File.expand_path(repos_path + "/#{project.namespace.path}/#{project.path}.git")
- FileUtils.mkdir_p(target_repo_path)
- FileUtils.cp_r("#{base_repo_path}/.", target_repo_path)
- FileUtils.chmod_R 0755, target_repo_path
- end
-
- def repos_path
- Gitlab.config.gitlab_shell.repos_path
- end
-
- private
-
- def factory_repo_path
- @factory_repo_path ||= Rails.root.join('tmp', 'tests', factory_repo_name)
- end
-
- def factory_repo_path_bare
- "#{factory_repo_path}_bare"
- end
-
- def factory_repo_name
- 'gitlab-test'
- end
-
- # Prevent developer git configurations from being persisted to test
- # repositories
- def git_env
- {'GIT_TEMPLATE_DIR' => ''}
- end
-end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
deleted file mode 100644
index a59f74c2121..00000000000
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ /dev/null
@@ -1,152 +0,0 @@
-require 'spec_helper'
-require 'rake'
-
-describe 'gitlab:app namespace rake task' do
- before :all do
- Rake.application.rake_require "tasks/gitlab/task_helpers"
- Rake.application.rake_require "tasks/gitlab/backup"
- Rake.application.rake_require "tasks/gitlab/shell"
- # empty task as env is already loaded
- Rake::Task.define_task :environment
- end
-
- def run_rake_task(task_name)
- Rake::Task[task_name].reenable
- Rake.application.invoke_task task_name
- end
-
- describe 'backup_restore' do
- before do
- # avoid writing task output to spec progress
- allow($stdout).to receive :write
- end
-
- context 'gitlab version' do
- before do
- Dir.stub glob: []
- allow(Dir).to receive :chdir
- File.stub exists?: true
- Kernel.stub system: true
- FileUtils.stub cp_r: true
- FileUtils.stub mv: true
- Rake::Task["gitlab:shell:setup"].stub invoke: true
- end
-
- let(:gitlab_version) { Gitlab::VERSION }
-
- it 'should fail on mismatch' do
- YAML.stub load_file: {gitlab_version: "not #{gitlab_version}" }
- expect { run_rake_task('gitlab:backup:restore') }.to(
- raise_error SystemExit
- )
- end
-
- it 'should invoke restoration on mach' do
- YAML.stub load_file: {gitlab_version: gitlab_version}
- expect(Rake::Task["gitlab:backup:db:restore"]).to receive :invoke
- expect(Rake::Task["gitlab:backup:repo:restore"]).to receive :invoke
- expect(Rake::Task["gitlab:shell:setup"]).to receive :invoke
- expect { run_rake_task('gitlab:backup:restore') }.to_not raise_error
- end
- end
-
- end # backup_restore task
-
- describe 'backup_create' do
- def tars_glob
- Dir.glob(File.join(Gitlab.config.backup.path, '*_gitlab_backup.tar'))
- end
-
- before :all do
- # Record the existing backup tars so we don't touch them
- existing_tars = tars_glob
-
- # Redirect STDOUT and run the rake task
- orig_stdout = $stdout
- $stdout = StringIO.new
- run_rake_task('gitlab:backup:create')
- $stdout = orig_stdout
-
- @backup_tar = (tars_glob - existing_tars).first
- end
-
- after :all do
- FileUtils.rm(@backup_tar)
- end
-
- it 'should set correct permissions on the tar file' do
- expect(File.exist?(@backup_tar)).to be_truthy
- expect(File::Stat.new(@backup_tar).mode.to_s(8)).to eq('100600')
- end
-
- it 'should set correct permissions on the tar contents' do
- tar_contents, exit_status = Gitlab::Popen.popen(
- %W{tar -tvf #{@backup_tar} db uploads repositories}
- )
- expect(exit_status).to eq(0)
- expect(tar_contents).to match('db/')
- expect(tar_contents).to match('uploads/')
- expect(tar_contents).to match('repositories/')
- expect(tar_contents).not_to match(/^.{4,9}[rwx].* (db|uploads|repositories)\/$/)
- end
-
- it 'should delete temp directories' do
- temp_dirs = Dir.glob(
- File.join(Gitlab.config.backup.path, '{db,repositories,uploads}')
- )
-
- expect(temp_dirs).to be_empty
- end
- end # backup_create task
-
- describe "Skipping items" do
- def tars_glob
- Dir.glob(File.join(Gitlab.config.backup.path, '*_gitlab_backup.tar'))
- end
-
- before :all do
- @origin_cd = Dir.pwd
-
- Rake::Task["gitlab:backup:db:create"].reenable
- Rake::Task["gitlab:backup:repo:create"].reenable
- Rake::Task["gitlab:backup:uploads:create"].reenable
-
- # Record the existing backup tars so we don't touch them
- existing_tars = tars_glob
-
- # Redirect STDOUT and run the rake task
- orig_stdout = $stdout
- $stdout = StringIO.new
- ENV["SKIP"] = "repositories"
- run_rake_task('gitlab:backup:create')
- $stdout = orig_stdout
-
- @backup_tar = (tars_glob - existing_tars).first
- end
-
- after :all do
- FileUtils.rm(@backup_tar)
- Dir.chdir @origin_cd
- end
-
- it "does not contain skipped item" do
- tar_contents, exit_status = Gitlab::Popen.popen(
- %W{tar -tvf #{@backup_tar} db uploads repositories}
- )
-
- expect(tar_contents).to match('db/')
- expect(tar_contents).to match('uploads/')
- expect(tar_contents).not_to match('repositories/')
- end
-
- it 'does not invoke repositories restore' do
- Rake::Task["gitlab:shell:setup"].stub invoke: true
- allow($stdout).to receive :write
-
- expect(Rake::Task["gitlab:backup:db:restore"]).to receive :invoke
- expect(Rake::Task["gitlab:backup:repo:restore"]).not_to receive :invoke
- expect(Rake::Task["gitlab:shell:setup"]).to receive :invoke
- expect { run_rake_task('gitlab:backup:restore') }.to_not raise_error
- end
- end
-end # gitlab:app namespace
diff --git a/spec/tasks/gitlab/mail_google_schema_whitelisting.rb b/spec/tasks/gitlab/mail_google_schema_whitelisting.rb
deleted file mode 100644
index 22e746870dc..00000000000
--- a/spec/tasks/gitlab/mail_google_schema_whitelisting.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-require 'spec_helper'
-require 'rake'
-
-describe 'gitlab:mail_google_schema_whitelisting rake task' do
- before :all do
- Rake.application.rake_require "tasks/gitlab/task_helpers"
- Rake.application.rake_require "tasks/gitlab/mail_google_schema_whitelisting"
- # empty task as env is already loaded
- Rake::Task.define_task :environment
- end
-
- describe 'call' do
- before do
- # avoid writing task output to spec progress
- allow($stdout).to receive :write
- end
-
- let :run_rake_task do
- Rake::Task["gitlab:mail_google_schema_whitelisting"].reenable
- Rake.application.invoke_task "gitlab:mail_google_schema_whitelisting"
- end
-
- it 'should run the task without errors' do
- expect { run_rake_task }.to_not raise_error
- end
- end
-end
diff --git a/spec/workers/fork_registration_worker_spec.rb b/spec/workers/fork_registration_worker_spec.rb
deleted file mode 100644
index cc6f574b29c..00000000000
--- a/spec/workers/fork_registration_worker_spec.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-
-require 'spec_helper'
-
-describe ForkRegistrationWorker do
- context "as a resque worker" do
- it "reponds to #perform" do
- expect(ForkRegistrationWorker.new).to respond_to(:perform)
- end
- end
-end
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
deleted file mode 100644
index df1a2b84a53..00000000000
--- a/spec/workers/post_receive_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-require 'spec_helper'
-
-describe PostReceive do
- let(:changes) { "123456 789012 refs/heads/tést\n654321 210987 refs/tags/tag" }
- let(:wrongly_encoded_changes) { changes.encode("ISO-8859-1").force_encoding("UTF-8") }
- let(:base64_changes) { Base64.encode64(wrongly_encoded_changes) }
-
- context "as a resque worker" do
- it "reponds to #perform" do
- expect(PostReceive.new).to respond_to(:perform)
- end
- end
-
- context "web hook" do
- let(:project) { create(:project) }
- let(:key) { create(:key, user: project.owner) }
- let(:key_id) { key.shell_id }
-
- it "fetches the correct project" do
- expect(Project).to receive(:find_with_namespace).with(project.path_with_namespace).and_return(project)
- PostReceive.new.perform(pwd(project), key_id, base64_changes)
- end
-
- it "does not run if the author is not in the project" do
- allow(Key).to receive(:find_by).with(hash_including(id: anything())) { nil }
-
- expect(project).not_to receive(:execute_hooks)
-
- expect(PostReceive.new.perform(pwd(project), key_id, base64_changes)).to be_falsey
- end
-
- it "asks the project to trigger all hooks" do
- Project.stub(find_with_namespace: project)
- expect(project).to receive(:execute_hooks).twice
- expect(project).to receive(:execute_services).twice
- expect(project).to receive(:update_merge_requests)
-
- PostReceive.new.perform(pwd(project), key_id, base64_changes)
- end
- end
-
- def pwd(project)
- File.join(Gitlab.config.gitlab_shell.repos_path, project.path_with_namespace)
- end
-end
diff --git a/spec/workers/repository_archive_worker_spec.rb b/spec/workers/repository_archive_worker_spec.rb
deleted file mode 100644
index c2362058cfd..00000000000
--- a/spec/workers/repository_archive_worker_spec.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-require 'spec_helper'
-
-describe RepositoryArchiveWorker do
- let(:project) { create(:project) }
- subject { RepositoryArchiveWorker.new }
-
- before do
- allow(Project).to receive(:find).and_return(project)
- end
-
- describe "#perform" do
- it "cleans old archives" do
- expect(project.repository).to receive(:clean_old_archives)
-
- subject.perform(project.id, "master", "zip")
- end
-
- context "when the repository doesn't have an archive file path" do
- before do
- allow(project.repository).to receive(:archive_file_path).and_return(nil)
- end
-
- it "doesn't archive the repo" do
- expect(project.repository).not_to receive(:archive_repo)
-
- subject.perform(project.id, "master", "zip")
- end
- end
-
- context "when the repository has an archive file path" do
- let(:file_path) { "/archive.zip" }
- let(:pid_file_path) { "/archive.zip.pid" }
-
- before do
- allow(project.repository).to receive(:archive_file_path).and_return(file_path)
- allow(project.repository).to receive(:archive_pid_file_path).and_return(pid_file_path)
- end
-
- context "when the archive file already exists" do
- before do
- allow(File).to receive(:exist?).with(file_path).and_return(true)
- end
-
- it "doesn't archive the repo" do
- expect(project.repository).not_to receive(:archive_repo)
-
- subject.perform(project.id, "master", "zip")
- end
- end
-
- context "when the archive file doesn't exist yet" do
- before do
- allow(File).to receive(:exist?).with(file_path).and_return(false)
- allow(File).to receive(:exist?).with(pid_file_path).and_return(true)
- end
-
- context "when the archive pid file doesn't exist yet" do
- before do
- allow(File).to receive(:exist?).with(pid_file_path).and_return(false)
- end
-
- it "archives the repo" do
- expect(project.repository).to receive(:archive_repo)
-
- subject.perform(project.id, "master", "zip")
- end
- end
-
- context "when the archive pid file already exists" do
- it "doesn't archive the repo" do
- expect(project.repository).not_to receive(:archive_repo)
-
- subject.perform(project.id, "master", "zip")
- end
- end
- end
- end
- end
-end
-