summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/changelog/config_spec.rb
blob: 51988acf3d13b011bcdef08234c0f0e6baa87e66 (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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Changelog::Config do
  let(:project) { build_stubbed(:project) }

  describe '.from_git' do
    it 'retrieves the configuration from Git' do
      allow(project.repository)
        .to receive(:changelog_config)
        .and_return("---\ndate_format: '%Y'")

      expect(described_class)
        .to receive(:from_hash)
        .with(project, 'date_format' => '%Y')

      described_class.from_git(project)
    end

    it 'returns the default configuration when no YAML file exists in Git' do
      allow(project.repository)
        .to receive(:changelog_config)
        .and_return(nil)

      expect(described_class)
        .to receive(:new)
        .with(project)

      described_class.from_git(project)
    end
  end

  describe '.from_hash' do
    it 'sets the configuration according to a Hash' do
      config = described_class.from_hash(
        project,
        'date_format' => 'foo',
        'template' => 'bar',
        'categories' => { 'foo' => 'bar' }
      )

      expect(config.date_format).to eq('foo')
      expect(config.template)
        .to be_instance_of(Gitlab::Changelog::AST::Expressions)

      expect(config.categories).to eq({ 'foo' => 'bar' })
    end

    it 'raises Error when the categories are not a Hash' do
      expect { described_class.from_hash(project, 'categories' => 10) }
        .to raise_error(Gitlab::Changelog::Error)
    end
  end

  describe '#contributor?' do
    it 'returns true if a user is a contributor' do
      user = build_stubbed(:author)

      allow(project.team).to receive(:contributor?).with(user).and_return(true)

      expect(described_class.new(project).contributor?(user)).to eq(true)
    end

    it "returns true if a user isn't a contributor" do
      user = build_stubbed(:author)

      allow(project.team).to receive(:contributor?).with(user).and_return(false)

      expect(described_class.new(project).contributor?(user)).to eq(false)
    end
  end

  describe '#category' do
    it 'returns the name of a category' do
      config = described_class.new(project)

      config.categories['foo'] = 'Foo'

      expect(config.category('foo')).to eq('Foo')
    end

    it 'returns the raw category name when no alternative name is configured' do
      config = described_class.new(project)

      expect(config.category('bla')).to eq('bla')
    end
  end

  describe '#format_date' do
    it 'formats a date according to the configured date format' do
      config = described_class.new(project)
      time = Time.utc(2021, 1, 5)

      expect(config.format_date(time)).to eq('2021-01-05')
    end
  end
end