Welcome to mirror list, hosted at ThFree Co, Russian Federation.

record_target_platforms_worker_spec.rb « projects « workers « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 01852f252b701a5828400b97c18bc1938e8f1de2 (plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Projects::RecordTargetPlatformsWorker do
  include ExclusiveLeaseHelpers

  let_it_be(:swift) { create(:programming_language, name: 'Swift') }
  let_it_be(:objective_c) { create(:programming_language, name: 'Objective-C') }
  let_it_be(:java) { create(:programming_language, name: 'Java') }
  let_it_be(:kotlin) { create(:programming_language, name: 'Kotlin') }
  let_it_be(:project) { create(:project, :repository, detected_repository_languages: true) }

  let(:worker) { described_class.new }
  let(:lease_key) { "#{described_class.name.underscore}:#{project.id}" }
  let(:lease_timeout) { described_class::LEASE_TIMEOUT }

  subject(:perform) { worker.perform(project.id) }

  before do
    stub_exclusive_lease(lease_key, timeout: lease_timeout)
  end

  shared_examples 'performs detection' do |detector_service_class|
    let(:service_double) { instance_double(detector_service_class, execute: service_result) }

    it "creates and executes a #{detector_service_class} instance for the project", :aggregate_failures do
      expect(Projects::RecordTargetPlatformsService).to receive(:new)
        .with(project, detector_service_class) { service_double }
      expect(service_double).to receive(:execute)

      perform
    end

    it 'logs extra metadata on done', :aggregate_failures do
      expect(Projects::RecordTargetPlatformsService).to receive(:new)
        .with(project, detector_service_class) { service_double }
      expect(worker).to receive(:log_extra_metadata_on_done).with(:target_platforms, service_result)

      perform
    end
  end

  shared_examples 'does nothing' do
    it 'does nothing' do
      expect(Projects::RecordTargetPlatformsService).not_to receive(:new)

      perform
    end
  end

  def create_language(language)
    create(:repository_language, project: project, programming_language: language)
  end

  context 'when project uses programming language for Apple platform' do
    let(:service_result) { %w(ios osx watchos) }

    context 'when project uses Swift programming language' do
      before do
        create_language(swift)
      end

      it_behaves_like 'performs detection', Projects::AppleTargetPlatformDetectorService
    end

    context 'when project uses Objective-C programming language' do
      before do
        create_language(objective_c)
      end

      it_behaves_like 'performs detection', Projects::AppleTargetPlatformDetectorService
    end
  end

  context 'when project uses programming language for Android platform' do
    let(:feature_enabled) { true }
    let(:service_result) { %w(android) }

    before do
      stub_feature_flags(detect_android_projects: feature_enabled)
    end

    context 'when project uses Java' do
      before do
        create_language(java)
      end

      it_behaves_like 'performs detection', Projects::AndroidTargetPlatformDetectorService

      context 'when feature flag is disabled' do
        let(:feature_enabled) { false }

        it_behaves_like 'does nothing'
      end
    end

    context 'when project uses Kotlin' do
      before do
        create_language(kotlin)
      end

      it_behaves_like 'performs detection', Projects::AndroidTargetPlatformDetectorService

      context 'when feature flag is disabled' do
        let(:feature_enabled) { false }

        it_behaves_like 'does nothing'
      end
    end
  end

  context 'when the project does not use programming languages for Apple or Android platforms' do
    it_behaves_like 'does nothing'
  end

  context 'when project is not found' do
    it 'does nothing' do
      expect(Projects::RecordTargetPlatformsService).not_to receive(:new)

      worker.perform(non_existing_record_id)
    end
  end

  context 'when exclusive lease cannot be obtained' do
    before do
      stub_exclusive_lease_taken(lease_key)
    end

    it_behaves_like 'does nothing'
  end

  it 'has the `until_executed` deduplicate strategy' do
    expect(described_class.get_deduplicate_strategy).to eq(:until_executed)
  end

  it 'overrides #lease_release? to return false' do
    expect(worker.send(:lease_release?)).to eq false
  end
end