project_hooks_spec.rb 3.62 KB
Newer Older
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
1 2 3
require 'spec_helper'

describe Project, "Hooks" do
4 5 6
  let(:project) { create(:project) }
  before do
    @key = create(:key, user: project.owner)
7
    @user = @key.user
8 9
    @key_id = @key.identifier
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
10

11 12
  describe "Post Receive Event" do
    it "should create push event" do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
13
      oldrev, newrev, ref = '00000000000000000000000000000000', 'newrev', 'refs/heads/master'
14 15 16
      data = project.post_receive_data(oldrev, newrev, ref, @user)

      project.observe_push(data)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
17 18 19 20 21
      event = Event.last

      event.should_not be_nil
      event.project.should == project
      event.action.should == Event::Pushed
22
      event.data.should == data
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
23 24 25
    end
  end

26
  describe "Project hooks" do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
27 28 29
    context "with no web hooks" do
      it "raises no errors" do
        lambda {
30
          project.execute_hooks({})
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
31 32 33 34 35 36
        }.should_not raise_error
      end
    end

    context "with web hooks" do
      before do
37 38
        @project_hook = create(:project_hook)
        @project_hook_2 = create(:project_hook)
39
        project.hooks << [@project_hook, @project_hook_2]
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
40 41 42
      end

      it "executes multiple web hook" do
43 44
        @project_hook.should_receive(:execute).once
        @project_hook_2.should_receive(:execute).once
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
45

46
        project.trigger_post_receive('oldrev', 'newrev', 'refs/heads/master', @user)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
47 48 49 50 51
      end
    end

    context "does not execute web hooks" do
      before do
52
        @project_hook = create(:project_hook)
53
        project.hooks << [@project_hook]
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
54 55 56
      end

      it "when pushing a branch for the first time" do
57
        @project_hook.should_not_receive(:execute)
58
        project.trigger_post_receive('00000000000000000000000000000000', 'newrev', 'refs/heads/master', @user)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
59 60 61
      end

      it "when pushing tags" do
62
        @project_hook.should_not_receive(:execute)
63
        project.trigger_post_receive('oldrev', 'newrev', 'refs/tags/v1.0.0', @user)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
      end
    end

    context "when pushing new branches" do

    end

    context "when gathering commit data" do
      before do
        @oldrev, @newrev, @ref = project.fresh_commits(2).last.sha, project.fresh_commits(2).first.sha, 'refs/heads/master'
        @commit = project.fresh_commits(2).first

        # Fill nil/empty attributes
        project.description = "This is a description"

79
        @data = project.post_receive_data(@oldrev, @newrev, @ref, @user)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
80 81 82 83 84 85 86
      end

      subject { @data }

      it { should include(before: @oldrev) }
      it { should include(after: @newrev) }
      it { should include(ref: @ref) }
87 88
      it { should include(user_id: project.owner.id) }
      it { should include(user_name: project.owner.name) }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

      context "with repository data" do
        subject { @data[:repository] }

        it { should include(name: project.name) }
        it { should include(url: project.web_url) }
        it { should include(description: project.description) }
        it { should include(homepage: project.web_url) }
      end

      context "with commits" do
        subject { @data[:commits] }

        it { should be_an(Array) }
        it { should have(1).element }

        context "the commit" do
          subject { @data[:commits].first }

          it { should include(id: @commit.id) }
          it { should include(message: @commit.safe_message) }
          it { should include(timestamp: @commit.date.xmlschema) }
111
          it { should include(url: "#{Gitlab.config.gitlab.url}/#{project.code}/commit/#{@commit.id}") }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
112 113 114 115 116 117 118 119 120 121 122 123

          context "with a author" do
            subject { @data[:commits].first[:author] }

            it { should include(name: @commit.author_name) }
            it { should include(email: @commit.author_email) }
          end
        end
      end
    end
  end
end