project_label_spec.rb 3.43 KB
Newer Older
1 2
require 'spec_helper'

3
describe ProjectLabel do
4 5 6 7 8 9
  describe 'relationships' do
    it { is_expected.to belong_to(:project) }
  end

  describe 'validations' do
    it { is_expected.to validate_presence_of(:project) }
10 11 12

    context 'validates if title must not exist at group level' do
      let(:group) { create(:group, name: 'gitlab-org') }
13
      let(:project) { create(:project, group: group) }
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

      before do
        create(:group_label, group: group, title: 'Bug')
      end

      it 'returns error if title already exists at group level' do
        label = described_class.new(project: project, title: 'Bug')

        label.valid?

        expect(label.errors[:title]).to include 'already exists at group level for gitlab-org. Please choose another one.'
      end

      it 'does not returns error if title does not exist at group level' do
        label = described_class.new(project: project, title: 'Security')

        label.valid?

        expect(label.errors[:title]).to be_empty
      end

      it 'does not returns error if project does not belong to group' do
36
        another_project = create(:project)
37 38 39 40 41 42
        label = described_class.new(project: another_project, title: 'Bug')

        label.valid?

        expect(label.errors[:title]).to be_empty
      end
43 44 45 46 47 48 49 50

      it 'does not returns error when title does not change' do
        project_label = create(:label, project: project, name: 'Security')
        create(:group_label, group: group, name: 'Security')
        project_label.description = 'Security related stuff.'

        project_label.valid?

51 52 53 54 55 56 57 58 59 60 61 62
        expect(project_label.errors[:title]).to be_empty
      end
    end

    context 'when attempting to add more than one priority to the project label' do
      it 'returns error' do
        subject.priorities.build
        subject.priorities.build

        subject.valid?

        expect(subject.errors[:priorities]).to include 'Number of permitted priorities exceeded'
63
      end
64
    end
65
  end
66

67 68
  describe '#subject' do
    it 'aliases project to subject' do
69
      subject = described_class.new(project: build(:project))
70 71 72 73 74

      expect(subject.subject).to be(subject.project)
    end
  end

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
  describe '#to_reference' do
    let(:label) { create(:label) }

    context 'using id' do
      it 'returns a String reference to the object' do
        expect(label.to_reference).to eq "~#{label.id}"
      end
    end

    context 'using name' do
      it 'returns a String reference to the object' do
        expect(label.to_reference(format: :name)).to eq %(~"#{label.name}")
      end

      it 'uses id when name contains double quote' do
        label = create(:label, name: %q{"irony"})
        expect(label.to_reference(format: :name)).to eq "~#{label.id}"
      end
    end

    context 'using invalid format' do
      it 'raises error' do
        expect { label.to_reference(format: :invalid) }
          .to raise_error StandardError, /Unknown format/
      end
    end

    context 'cross project reference' do
103
      let(:project) { create(:project) }
104 105 106 107

      context 'using name' do
        it 'returns cross reference with label name' do
          expect(label.to_reference(project, format: :name))
108
            .to eq %Q(#{label.project.full_path}~"#{label.name}")
109 110 111 112 113 114
        end
      end

      context 'using id' do
        it 'returns cross reference with label id' do
          expect(label.to_reference(project, format: :id))
115
            .to eq %Q(#{label.project.full_path}~#{label.id})
116 117 118 119
        end
      end
    end
  end
120
end