post_receive_spec.rb 3.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
    context "branches" do
      let(:changes) { "123456 789012 refs/heads/tést" }

25
      it "calls GitTagPushService" do
26 27 28 29 30 31 32 33 34
        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" }

35
      it "calls GitTagPushService" do
36 37 38 39 40 41 42 43 44
        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" }

45
      it "does not call any of the services" do
46 47 48 49 50
        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
51 52 53 54

    context "gitlab-ci.yml" do
      subject { PostReceive.new.perform(pwd(project), key_id, base64_changes) }

55
      context "creates a Ci::Pipeline for every change" do
56
        before { stub_ci_pipeline_to_return_yaml_file }
57

58
        it { expect{ subject }.to change{ Ci::Pipeline.count }.by(2) }
59 60
      end

61
      context "does not create a Ci::Pipeline" do
62
        before { stub_ci_pipeline_yaml_file(nil) }
63

64
        it { expect{ subject }.not_to change{ Ci::Pipeline.count } }
65 66
      end
    end
67 68 69
  end

  context "webhook" do
70
    it "fetches the correct project" do
71
      expect(Project).to receive(:find_with_namespace).with(project.path_with_namespace).and_return(project)
72
      PostReceive.new.perform(pwd(project), key_id, base64_changes)
73
    end
74

75
    it "triggers wiki index update" do
Valery Sizov's avatar
Valery Sizov committed
76
      expect(Project).to receive(:find_with_namespace).with("#{project.path_with_namespace}.wiki").and_return(nil)
77
      expect(Project).to receive(:find_with_namespace).with(project.path_with_namespace).and_return(project)
78
      stub_application_setting(elasticsearch_search: true, elasticsearch_indexing: true)
79 80 81 82 83 84 85
      expect_any_instance_of(ProjectWiki).to receive(:index_blobs)

      repo_path = "#{pwd(project)}.wiki"

      PostReceive.new.perform(repo_path, key_id, base64_changes)
    end

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

89
      expect(project).not_to receive(:execute_hooks)
90

91
      expect(PostReceive.new.perform(pwd(project), key_id, base64_changes)).to be_falsey
92 93
    end

94
    it "asks the project to trigger all hooks" do
95
      allow(Project).to receive(:find_with_namespace).and_return(project)
96 97
      expect(project).to receive(:execute_hooks).twice
      expect(project).to receive(:execute_services).twice
98
      expect(project).to receive(:update_merge_requests)
99

100
      PostReceive.new.perform(pwd(project), key_id, base64_changes)
101 102
    end
  end
103 104

  def pwd(project)
105
    File.join(Gitlab.config.repositories.storages.default, project.path_with_namespace)
106
  end
107
end