helper_spec.rb 8.42 KB
Newer Older
Nick Thomas's avatar
Nick Thomas committed
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
# frozen_string_literal: true

require 'fast_spec_helper'
require 'rspec-parameterized'

require 'gitlab/danger/helper'

describe Gitlab::Danger::Helper do
  using RSpec::Parameterized::TableSyntax

  class FakeDanger
    include Gitlab::Danger::Helper

    attr_reader :git

    def initialize(git:)
      @git = git
    end
  end

  let(:fake_git) { double('fake-git') }

  subject(:helper) { FakeDanger.new(git: fake_git) }

  describe '#all_changed_files' do
    subject { helper.all_changed_files }

    it 'interprets a list of changes from the danger git plugin' do
      expect(fake_git).to receive(:added_files) { %w[a b c.old] }
      expect(fake_git).to receive(:modified_files) { %w[d e] }
      expect(fake_git)
        .to receive(:renamed_files)
        .at_least(:once)
        .and_return([{ before: 'c.old', after: 'c.new' }])

      is_expected.to contain_exactly('a', 'b', 'c.new', 'd', 'e')
    end
  end

  describe '#ee?' do
    subject { helper.ee? }

    it 'returns true if CI_PROJECT_NAME if set to gitlab-ee' do
      stub_env('CI_PROJECT_NAME', 'gitlab-ee')
      expect(File).not_to receive(:exist?)

      is_expected.to be_truthy
    end

    it 'delegates to CHANGELOG-EE.md existence if CI_PROJECT_NAME is set to something else' do
      stub_env('CI_PROJECT_NAME', 'something else')
      expect(File).to receive(:exist?).with('../../CHANGELOG-EE.md') { true }

      is_expected.to be_truthy
    end

    it 'returns true if CHANGELOG-EE.md exists' do
      stub_env('CI_PROJECT_NAME', nil)
      expect(File).to receive(:exist?).with('../../CHANGELOG-EE.md') { true }

      is_expected.to be_truthy
    end

    it "returns false if CHANGELOG-EE.md doesn't exist" do
      stub_env('CI_PROJECT_NAME', nil)
      expect(File).to receive(:exist?).with('../../CHANGELOG-EE.md') { false }

      is_expected.to be_falsy
    end
  end

  describe '#project_name' do
    subject { helper.project_name }

    it 'returns gitlab-ee if ee? returns true' do
      expect(helper).to receive(:ee?) { true }

      is_expected.to eq('gitlab-ee')
    end

    it 'returns gitlab-ce if ee? returns false' do
      expect(helper).to receive(:ee?) { false }

      is_expected.to eq('gitlab-ce')
    end
  end

88 89 90 91 92 93 94 95 96 97 98 99 100 101
  describe '#markdown_list' do
    it 'creates a markdown list of items' do
      items = %w[a b]

      expect(helper.markdown_list(items)).to eq("* `a`\n* `b`")
    end

    it 'wraps items in <details> when there are more than 10 items' do
      items = ('a'..'k').to_a

      expect(helper.markdown_list(items)).to match(%r{<details>[^<]+</details>})
    end
  end

Nick Thomas's avatar
Nick Thomas committed
102 103
  describe '#changes_by_category' do
    it 'categorizes changed files' do
104
      expect(fake_git).to receive(:added_files) { %w[foo foo.md foo.rb foo.js db/migrate/foo lib/gitlab/database/foo.rb qa/foo ee/changelogs/foo.yml] }
Nick Thomas's avatar
Nick Thomas committed
105 106 107 108 109
      allow(fake_git).to receive(:modified_files) { [] }
      allow(fake_git).to receive(:renamed_files) { [] }

      expect(helper.changes_by_category).to eq(
        backend: %w[foo.rb],
110
        database: %w[db/migrate/foo lib/gitlab/database/foo.rb],
Nick Thomas's avatar
Nick Thomas committed
111
        frontend: %w[foo.js],
112
        none: %w[ee/changelogs/foo.yml foo.md],
Nick Thomas's avatar
Nick Thomas committed
113 114 115 116 117 118 119 120
        qa: %w[qa/foo],
        unknown: %w[foo]
      )
    end
  end

  describe '#category_for_file' do
    where(:path, :expected_category) do
121 122 123 124 125 126 127
      'doc/foo'         | :none
      'CONTRIBUTING.md' | :none
      'LICENSE'         | :none
      'MAINTENANCE.md'  | :none
      'PHILOSOPHY.md'   | :none
      'PROCESS.md'      | :none
      'README.md'       | :none
Nick Thomas's avatar
Nick Thomas committed
128 129 130 131 132 133 134 135

      'ee/doc/foo'      | :unknown
      'ee/README'       | :unknown

      'app/assets/foo'       | :frontend
      'app/views/foo'        | :frontend
      'public/foo'           | :frontend
      'spec/javascripts/foo' | :frontend
136
      'spec/frontend/bar'    | :frontend
Nick Thomas's avatar
Nick Thomas committed
137 138 139 140 141 142 143 144
      'vendor/assets/foo'    | :frontend
      'jest.config.js'       | :frontend
      'package.json'         | :frontend
      'yarn.lock'            | :frontend

      'ee/app/assets/foo'       | :frontend
      'ee/app/views/foo'        | :frontend
      'ee/spec/javascripts/foo' | :frontend
145
      'ee/spec/frontend/bar'    | :frontend
Nick Thomas's avatar
Nick Thomas committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165

      'app/models/foo' | :backend
      'bin/foo'        | :backend
      'config/foo'     | :backend
      'danger/foo'     | :backend
      'lib/foo'        | :backend
      'rubocop/foo'    | :backend
      'scripts/foo'    | :backend
      'spec/foo'       | :backend
      'spec/foo/bar'   | :backend

      'ee/app/foo'      | :backend
      'ee/bin/foo'      | :backend
      'ee/spec/foo'     | :backend
      'ee/spec/foo/bar' | :backend

      'generator_templates/foo' | :backend
      'vendor/languages.yml'    | :backend
      'vendor/licenses.csv'     | :backend

166 167 168 169 170 171
      'Dangerfile'     | :backend
      'Gemfile'        | :backend
      'Gemfile.lock'   | :backend
      'Procfile'       | :backend
      'Rakefile'       | :backend
      'FOO_VERSION'    | :backend
Nick Thomas's avatar
Nick Thomas committed
172

173 174 175 176 177
      '.gitlab-ci.yml'                                        | :engineering_productivity
      '.gitlab/ci/cng.gitlab-ci.yml'                          | :engineering_productivity
      '.gitlab/ci/ee-specific-checks.gitlab-ci.yml'           | :engineering_productivity
      'lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml'   | :backend

Nick Thomas's avatar
Nick Thomas committed
178 179
      'ee/FOO_VERSION' | :unknown

180 181 182 183 184 185 186
      'db/schema.rb'                                              | :database
      'db/migrate/foo'                                            | :database
      'db/post_migrate/foo'                                       | :database
      'ee/db/migrate/foo'                                         | :database
      'ee/db/post_migrate/foo'                                    | :database
      'ee/db/geo/migrate/foo'                                     | :database
      'ee/db/geo/post_migrate/foo'                                | :database
187 188 189 190 191 192 193 194 195 196 197 198
      'app/models/project_authorization.rb'                       | :database
      'app/services/users/refresh_authorized_projects_service.rb' | :database
      'lib/gitlab/background_migration.rb'                        | :database
      'lib/gitlab/background_migration/foo'                       | :database
      'ee/lib/gitlab/background_migration/foo'                    | :database
      'lib/gitlab/database.rb'                                    | :database
      'lib/gitlab/database/foo'                                   | :database
      'ee/lib/gitlab/database/foo'                                | :database
      'lib/gitlab/github_import.rb'                               | :database
      'lib/gitlab/github_import/foo'                              | :database
      'lib/gitlab/sql/foo'                                        | :database
      'rubocop/cop/migration/foo'                                 | :database
Nick Thomas's avatar
Nick Thomas committed
199

200 201 202
      'db/fixtures/foo.rb'                                 | :backend
      'ee/db/fixtures/foo.rb'                              | :backend

203
      'qa/foo' | :qa
Nick Thomas's avatar
Nick Thomas committed
204 205
      'ee/qa/foo' | :qa

206 207
      'changelogs/foo'    | :none
      'ee/changelogs/foo' | :none
Nick Thomas's avatar
Nick Thomas committed
208
      'locale/gitlab.pot' | :none
209

Nick Thomas's avatar
Nick Thomas committed
210 211 212 213 214
      'FOO'          | :unknown
      'foo'          | :unknown

      'foo/bar.rb'  | :backend
      'foo/bar.js'  | :frontend
215 216
      'foo/bar.txt' | :none
      'foo/bar.md'  | :none
Nick Thomas's avatar
Nick Thomas committed
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
    end

    with_them do
      subject { helper.category_for_file(path) }

      it { is_expected.to eq(expected_category) }
    end
  end

  describe '#label_for_category' do
    where(:category, :expected_label) do
      :backend   | '~backend'
      :database  | '~database'
      :docs      | '~Documentation'
      :foo       | '~foo'
      :frontend  | '~frontend'
233
      :none      | ''
Nick Thomas's avatar
Nick Thomas committed
234 235 236 237 238 239 240 241 242
      :qa        | '~QA'
    end

    with_them do
      subject { helper.label_for_category(category) }

      it { is_expected.to eq(expected_label) }
    end
  end
243 244 245 246 247 248 249 250 251 252

  describe '#new_teammates' do
    it 'returns an array of Teammate' do
      usernames = %w[filipa iamphil]

      teammates = helper.new_teammates(usernames)

      expect(teammates.map(&:username)).to eq(usernames)
    end
  end
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268

  describe '#missing_database_labels' do
    subject { helper.missing_database_labels(current_mr_labels) }

    context 'when current merge request has ~database::review pending' do
      let(:current_mr_labels) { ['database::review pending', 'feature'] }

      it { is_expected.to match_array(['database']) }
    end

    context 'when current merge request does not have ~database::review pending' do
      let(:current_mr_labels) { ['feature'] }

      it { is_expected.to match_array(['database', 'database::review pending']) }
    end
  end
Nick Thomas's avatar
Nick Thomas committed
269
end