triggers_spec.rb 3.04 KB
Newer Older
1 2
require 'spec_helper'

3
describe Ci::API::Triggers do
4 5
  describe 'POST /projects/:project_id/refs/:ref/trigger' do
    let!(:trigger_token) { 'secure token' }
6 7
    let!(:project) { create(:project, :repository, ci_id: 10) }
    let!(:project2) { create(:empty_project, ci_id: 11) }
8 9 10 11 12 13 14 15

    let!(:trigger) do
      create(:ci_trigger,
             project: project,
             token: trigger_token,
             owner: create(:user))
    end

Valery Sizov's avatar
Valery Sizov committed
16
    let(:options) do
17 18 19
      {
        token: trigger_token
      }
Valery Sizov's avatar
Valery Sizov committed
20
    end
21

Kamil Trzcinski's avatar
Kamil Trzcinski committed
22
    before do
23
      stub_ci_pipeline_to_return_yaml_file
24 25

      project.add_developer(trigger.owner)
Kamil Trzcinski's avatar
Kamil Trzcinski committed
26 27
    end

28
    context 'Handles errors' do
29
      it 'returns bad request if token is missing' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
30
        post ci_api("/projects/#{project.ci_id}/refs/master/trigger")
31
        expect(response).to have_http_status(400)
32 33
      end

34
      it 'returns not found if project is not found' do
Valery Sizov's avatar
Valery Sizov committed
35
        post ci_api('/projects/0/refs/master/trigger'), options
36
        expect(response).to have_http_status(404)
37 38
      end

39
      it 'returns unauthorized if token is for different project' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
40
        post ci_api("/projects/#{project2.ci_id}/refs/master/trigger"), options
41
        expect(response).to have_http_status(401)
42 43 44 45
      end
    end

    context 'Have a commit' do
46
      let(:pipeline) { project.pipelines.last }
47

48
      it 'creates builds' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
49
        post ci_api("/projects/#{project.ci_id}/refs/master/trigger"), options
50
        expect(response).to have_http_status(201)
51
        pipeline.builds.reload
52 53
        expect(pipeline.builds.pending.size).to eq(2)
        expect(pipeline.builds.size).to eq(5)
54 55
      end

56
      it 'returns bad request with no builds created if there\'s no commit for that ref' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
57
        post ci_api("/projects/#{project.ci_id}/refs/other-branch/trigger"), options
58
        expect(response).to have_http_status(400)
59 60
        expect(json_response['message']['base'])
          .to contain_exactly('Reference not found')
61 62 63
      end

      context 'Validates variables' do
Valery Sizov's avatar
Valery Sizov committed
64 65 66
        let(:variables) do
          { 'TRIGGER_KEY' => 'TRIGGER_VALUE' }
        end
67

68
        it 'validates variables to be a hash' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
69
          post ci_api("/projects/#{project.ci_id}/refs/master/trigger"), options.merge(variables: 'value')
70
          expect(response).to have_http_status(400)
71 72

          expect(json_response['error']).to eq('variables is invalid')
73 74
        end

75
        it 'validates variables needs to be a map of key-valued strings' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
76
          post ci_api("/projects/#{project.ci_id}/refs/master/trigger"), options.merge(variables: { key: %w(1 2) })
77
          expect(response).to have_http_status(400)
78
          expect(json_response['message']).to eq('variables needs to be a map of key-valued strings')
79 80
        end

81
        it 'creates trigger request with variables' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
82
          post ci_api("/projects/#{project.ci_id}/refs/master/trigger"), options.merge(variables: variables)
83
          expect(response).to have_http_status(201)
84 85
          pipeline.builds.reload
          expect(pipeline.builds.first.trigger_request.variables).to eq(variables)
86 87 88 89 90
        end
      end
    end
  end
end