File: auto_merge_process_worker_spec.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (113 lines) | stat: -rw-r--r-- 3,342 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe AutoMergeProcessWorker, feature_category: :continuous_delivery do
  let(:merge_request) { create(:merge_request) }

  describe '#perform' do
    subject { described_class.new.perform(args) }

    let(:args) { { 'merge_request_id' => merge_request.id } }

    context 'when merge request is found' do
      it 'executes AutoMergeService' do
        expect_next_instance_of(AutoMergeService) do |auto_merge|
          expect(auto_merge).to receive(:process).with(merge_request)
        end

        subject
      end
    end

    context 'when merge request is not found' do
      let(:args) { { 'merge_request_id' => -1 } }

      it 'does not execute AutoMergeService' do
        expect(AutoMergeService).not_to receive(:new)

        subject
      end
    end

    context 'when a pipeline is passed with auto mergeable MRs', :aggregate_failures do
      let(:merge_service) { instance_double(AutoMergeService, process: true) }
      let(:mwps_merge_request) { create(:merge_request, :with_head_pipeline, :merge_when_pipeline_succeeds) }
      let(:mwcp_merge_request) { create(:merge_request, :with_head_pipeline, :merge_when_checks_pass) }

      let(:args) do
        {
          'merge_request_id' => merge_request.id,
          'pipeline_id' => [mwps_merge_request.head_pipeline.id, mwcp_merge_request.head_pipeline.id]
        }
      end

      it 'initializes and executes AutoMergeService for the passed MR and those attached to the passed pipeline' do
        expect(AutoMergeService).to receive(:new).exactly(3).times.and_return(merge_service)

        expect(merge_service).to receive(:process).with(merge_request)
        expect(merge_service).to receive(:process).with(mwps_merge_request)
        expect(merge_service).to receive(:process).with(mwcp_merge_request)

        subject
      end
    end

    context 'when pipeline is not found' do
      let(:args) { { 'pipeline_id' => -1 } }

      it 'does not execute AutoMergeService' do
        expect(AutoMergeService).not_to receive(:new)

        subject
      end
    end

    context 'when merge request id is nil' do
      let(:args) { { 'merge_request_id' => nil } }

      it 'does not execute AutoMergeService' do
        expect(AutoMergeService).not_to receive(:new)

        subject
      end
    end

    # Integer args are deprecated as of 17.5. IDs should be passed
    # as a hash with  merge_request_id and pipeline_id keys.
    # https://gitlab.com/gitlab-org/gitlab/-/issues/497247
    context 'with integer args' do
      let(:args) { merge_request.id }

      context 'when merge request is found' do
        it 'executes AutoMergeService' do
          expect_next_instance_of(AutoMergeService) do |auto_merge|
            expect(auto_merge).to receive(:process)
          end

          subject
        end
      end

      context 'when merge request is not found' do
        let(:args) { -1 }

        it 'does not execute AutoMergeService' do
          expect(AutoMergeService).not_to receive(:new)

          subject
        end
      end

      context 'when merge request id is nil' do
        let(:args) { nil }

        it 'does not execute AutoMergeService' do
          expect(AutoMergeService).not_to receive(:new)

          subject
        end
      end
    end
  end
end