summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-11-26 04:40:49 -0800
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-11-26 04:40:49 -0800
commite750efd9fc5b50fc8bed0bc73ba121c03c8b58a4 (patch)
tree657dbf3d32f883f09c25ba0c1b87cb0eb0b20382 /spec
parent2d5a6fc850844fb30c94c749fed5564f54052b77 (diff)
parent79a4ed15cefc4f70919a8a0b5059816f823d69d2 (diff)
downloadgitlab-ce-e750efd9fc5b50fc8bed0bc73ba121c03c8b58a4.tar.gz
Merge pull request #2067 from riyad/diff-and-patch-for-commits-and-merge-requests
Diff and patch for commits and merge requests
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/commit_controller_spec.rb74
-rw-r--r--spec/controllers/merge_requests_controller_spec.rb84
-rw-r--r--spec/factories.rb15
-rw-r--r--spec/routing/project_routing_spec.rb11
4 files changed, 179 insertions, 5 deletions
diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb
new file mode 100644
index 00000000000..5aef4c676ee
--- /dev/null
+++ b/spec/controllers/commit_controller_spec.rb
@@ -0,0 +1,74 @@
+require 'spec_helper'
+
+describe CommitController do
+ let(:project) { create(:project) }
+ let(:user) { create(:user) }
+ let(:commit) { project.last_commit_for("master") }
+
+ before do
+ sign_in(user)
+
+ project.add_access(user, :read, :admin)
+ end
+
+ describe "#show" do
+ shared_examples "export as" do |format|
+ it "should generally work" do
+ get :show, project_id: project.code, id: commit.id, format: format
+
+ expect(response).to be_success
+ end
+
+ it "should generate it" do
+ Commit.any_instance.should_receive(:"to_#{format}")
+
+ get :show, project_id: project.code, id: commit.id, format: format
+ end
+
+ it "should render it" do
+ get :show, project_id: project.code, id: commit.id, format: format
+
+ expect(response.body).to eq(commit.send(:"to_#{format}"))
+ end
+
+ it "should not escape Html" do
+ Commit.any_instance.stub(:"to_#{format}").and_return('HTML entities &<>" ')
+
+ get :show, project_id: project.code, 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, project_id: project.code, 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, project_id: project.code, id: commit.id, format: format
+
+ expect(response.body).to start_with("From #{commit.id}")
+ end
+
+ it "should contain a git diff" do
+ get :show, project_id: project.code, id: commit.id, format: format
+
+ expect(response.body).to match(/^diff --git/)
+ end
+ end
+ end
+end
diff --git a/spec/controllers/merge_requests_controller_spec.rb b/spec/controllers/merge_requests_controller_spec.rb
new file mode 100644
index 00000000000..7cd1285fab4
--- /dev/null
+++ b/spec/controllers/merge_requests_controller_spec.rb
@@ -0,0 +1,84 @@
+require 'spec_helper'
+
+describe MergeRequestsController do
+ let(:project) { create(:project) }
+ let(:user) { create(:user) }
+ let(:merge_request) { create(:merge_request_with_diffs, project: project) }
+
+ before do
+ sign_in(user)
+
+ project.add_access(user, :read, :admin)
+ end
+
+ describe "#show" do
+ shared_examples "export as" do |format|
+ it "should generally work" do
+ get :show, project_id: project.code, id: merge_request.id, format: format
+
+ expect(response).to be_success
+ end
+
+ it "should generate it" do
+ MergeRequest.any_instance.should_receive(:"to_#{format}")
+
+ get :show, project_id: project.code, id: merge_request.id, format: format
+ end
+
+ it "should render it" do
+ get :show, project_id: project.code, id: merge_request.id, format: format
+
+ expect(response.body).to eq(merge_request.send(:"to_#{format}"))
+ end
+
+ it "should not escape Html" do
+ MergeRequest.any_instance.stub(:"to_#{format}").and_return('HTML entities &<>" ')
+
+ get :show, project_id: project.code, id: merge_request.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, project_id: project.code, id: merge_request.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 with commit" do
+ get :show, project_id: project.code, id: merge_request.id, format: format
+
+ expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}")
+ end
+
+ it "should contain as many patches as there are commits" do
+ get :show, project_id: project.code, id: merge_request.id, format: format
+
+ patch_count = merge_request.commits.count
+ merge_request.commits.each_with_index do |commit, patch_num|
+ expect(response.body).to match(/^From #{commit.id}/)
+ expect(response.body).to match(/^Subject: \[PATCH #{patch_num}\/#{patch_count}\]/)
+ end
+ end
+
+ it "should contain git diffs" do
+ get :show, project_id: project.code, id: merge_request.id, format: format
+
+ expect(response.body).to match(/^diff --git/)
+ end
+ end
+ end
+end
diff --git a/spec/factories.rb b/spec/factories.rb
index c673606b984..a26a77dd860 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -70,7 +70,22 @@ FactoryGirl.define do
closed true
end
+ # pick 3 commits "at random" (from bcf03b5d~3 to bcf03b5d)
+ trait :with_diffs do
+ target_branch "bcf03b5d~3"
+ source_branch "bcf03b5d"
+ st_commits do
+ [Commit.new(project.repo.commit('bcf03b5d')),
+ Commit.new(project.repo.commit('bcf03b5d~1')),
+ Commit.new(project.repo.commit('bcf03b5d~2'))]
+ end
+ st_diffs do
+ project.repo.diff("bcf03b5d~3", "bcf03b5d")
+ end
+ end
+
factory :closed_merge_request, traits: [:closed]
+ factory :merge_request_with_diffs, traits: [:with_diffs]
end
factory :note do
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
index dc687d2a7ac..25db2f91d4d 100644
--- a/spec/routing/project_routing_spec.rb
+++ b/spec/routing/project_routing_spec.rb
@@ -208,7 +208,6 @@ end
# diffs_project_merge_request GET /:project_id/merge_requests/:id/diffs(.:format) merge_requests#diffs
# automerge_project_merge_request GET /:project_id/merge_requests/:id/automerge(.:format) merge_requests#automerge
# automerge_check_project_merge_request GET /:project_id/merge_requests/:id/automerge_check(.:format) merge_requests#automerge_check
-# raw_project_merge_request GET /:project_id/merge_requests/:id/raw(.:format) merge_requests#raw
# branch_from_project_merge_requests GET /:project_id/merge_requests/branch_from(.:format) merge_requests#branch_from
# branch_to_project_merge_requests GET /:project_id/merge_requests/branch_to(.:format) merge_requests#branch_to
# project_merge_requests GET /:project_id/merge_requests(.:format) merge_requests#index
@@ -231,10 +230,6 @@ describe MergeRequestsController, "routing" do
get("/gitlabhq/merge_requests/1/automerge_check").should route_to('merge_requests#automerge_check', project_id: 'gitlabhq', id: '1')
end
- it "to #raw" do
- get("/gitlabhq/merge_requests/1/raw").should route_to('merge_requests#raw', project_id: 'gitlabhq', id: '1')
- end
-
it "to #branch_from" do
get("/gitlabhq/merge_requests/branch_from").should route_to('merge_requests#branch_from', project_id: 'gitlabhq')
end
@@ -243,6 +238,11 @@ describe MergeRequestsController, "routing" do
get("/gitlabhq/merge_requests/branch_to").should route_to('merge_requests#branch_to', project_id: 'gitlabhq')
end
+ it "to #show" do
+ get("/gitlabhq/merge_requests/1.diff").should route_to('merge_requests#show', project_id: 'gitlabhq', id: '1', format: 'diff')
+ get("/gitlabhq/merge_requests/1.patch").should route_to('merge_requests#show', project_id: 'gitlabhq', id: '1', format: 'patch')
+ end
+
it_behaves_like "RESTful project resources" do
let(:controller) { 'merge_requests' }
end
@@ -285,6 +285,7 @@ end
describe CommitController, "routing" do
it "to #show" do
get("/gitlabhq/commit/4246fb").should route_to('commit#show', project_id: 'gitlabhq', id: '4246fb')
+ get("/gitlabhq/commit/4246fb.diff").should route_to('commit#show', project_id: 'gitlabhq', id: '4246fb', format: 'diff')
get("/gitlabhq/commit/4246fb.patch").should route_to('commit#show', project_id: 'gitlabhq', id: '4246fb', format: 'patch')
get("/gitlabhq/commit/4246fbd13872934f72a8fd0d6fb1317b47b59cb5").should route_to('commit#show', project_id: 'gitlabhq', id: '4246fbd13872934f72a8fd0d6fb1317b47b59cb5')
end