BigW Consortium Gitlab

post_receive_spec.rb 2.81 KB
Newer Older
1 2 3
require 'spec_helper'

describe PostReceive do
4 5 6
  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) }
7 8 9
  let(:project) { create(:project) }
  let(:key) { create(:key, user: project.owner) }
  let(:key_id) { key.shell_id }
10

11 12
  context "as a resque worker" do
    it "reponds to #perform" do
13
      expect(PostReceive.new).to respond_to(:perform)
14 15 16
    end
  end

17 18 19 20
  describe "#process_project_changes" do
    before do
      allow_any_instance_of(Gitlab::GitPostReceive).to receive(:identify).and_return(project.owner)
    end
21

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
    context "branches" do
      let(:changes) { "123456 789012 refs/heads/tést" }

      it "should call GitTagPushService" do
        expect_any_instance_of(GitPushService).to receive(:execute).and_return(true)
        expect_any_instance_of(GitTagPushService).not_to receive(:execute)
        PostReceive.new.perform(pwd(project), key_id, base64_changes)
      end
    end

    context "tags" do
      let(:changes) { "123456 789012 refs/tags/tag" }

      it "should call GitTagPushService" do
        expect_any_instance_of(GitPushService).not_to receive(:execute)
        expect_any_instance_of(GitTagPushService).to receive(:execute).and_return(true)
        PostReceive.new.perform(pwd(project), key_id, base64_changes)
      end
    end

    context "merge-requests" do
      let(:changes) { "123456 789012 refs/merge-requests/123" }

      it "should not call any of the services" do
        expect_any_instance_of(GitPushService).not_to receive(:execute)
        expect_any_instance_of(GitTagPushService).not_to receive(:execute)
        PostReceive.new.perform(pwd(project), key_id, base64_changes)
      end
    end
  end

  context "webhook" do
54
    it "fetches the correct project" do
55
      expect(Project).to receive(:find_with_namespace).with(project.path_with_namespace).and_return(project)
56
      PostReceive.new.perform(pwd(project), key_id, base64_changes)
57
    end
58

59
    it "does not run if the author is not in the project" do
60
      allow(Key).to receive(:find_by).with(hash_including(id: anything())) { nil }
61

62
      expect(project).not_to receive(:execute_hooks)
63

64
      expect(PostReceive.new.perform(pwd(project), key_id, base64_changes)).to be_falsey
65 66
    end

67
    it "asks the project to trigger all hooks" do
68
      allow(Project).to receive(:find_with_namespace).and_return(project)
69 70
      expect(project).to receive(:execute_hooks).twice
      expect(project).to receive(:execute_services).twice
71
      expect(project).to receive(:update_merge_requests)
72

73
      PostReceive.new.perform(pwd(project), key_id, base64_changes)
74 75
    end
  end
76 77

  def pwd(project)
78
    File.join(Gitlab.config.gitlab_shell.repos_path, project.path_with_namespace)
79
  end
80
end