OSDN Git Service

Add specs for exporting merge requests as diff or patch
authorRiyad Preukschas <riyad@informatik.uni-bremen.de>
Sat, 24 Nov 2012 23:04:13 +0000 (00:04 +0100)
committerRiyad Preukschas <riyad@informatik.uni-bremen.de>
Sat, 24 Nov 2012 23:06:53 +0000 (00:06 +0100)
spec/controllers/merge_requests_controller_spec.rb [new file with mode: 0644]
spec/factories.rb

diff --git a/spec/controllers/merge_requests_controller_spec.rb b/spec/controllers/merge_requests_controller_spec.rb
new file mode 100644 (file)
index 0000000..7cd1285
--- /dev/null
@@ -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
index 7c33f0e..e0b472a 100644 (file)
@@ -63,7 +63,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