gpg_signature_spec.rb 3.34 KB
Newer Older
1 2 3
require 'rails_helper'

RSpec.describe GpgSignature do
4 5 6 7
  let(:commit_sha) { '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33' }
  let!(:project) { create(:project, :repository, path: 'sample-project') }
  let!(:commit) { create(:commit, project: project, sha: commit_sha) }
  let(:gpg_signature) { create(:gpg_signature, commit_sha: commit_sha) }
8 9 10
  let(:gpg_key) { create(:gpg_key) }
  let(:gpg_key_subkey) { create(:gpg_key_subkey) }

Shinya Maeda's avatar
Shinya Maeda committed
11 12
  it_behaves_like 'having unique enum values'

13 14 15
  describe 'associations' do
    it { is_expected.to belong_to(:project) }
    it { is_expected.to belong_to(:gpg_key) }
16
    it { is_expected.to belong_to(:gpg_key_subkey) }
17 18 19 20 21
  end

  describe 'validation' do
    subject { described_class.new }
    it { is_expected.to validate_presence_of(:commit_sha) }
22
    it { is_expected.to validate_presence_of(:project_id) }
23
    it { is_expected.to validate_presence_of(:gpg_key_primary_keyid) }
24
  end
Alexis Reigel's avatar
Alexis Reigel committed
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
  describe '.safe_create!' do
    let(:attributes) do
      {
        commit_sha: commit_sha,
        project: project,
        gpg_key_primary_keyid: gpg_key.keyid
      }
    end

    it 'finds a signature by commit sha if it existed' do
      gpg_signature

      expect(described_class.safe_create!(commit_sha: commit_sha)).to eq(gpg_signature)
    end

    it 'creates a new signature if it was not found' do
      expect { described_class.safe_create!(attributes) }.to change { described_class.count }.by(1)
    end

    it 'assigns the correct attributes when creating' do
      signature = described_class.safe_create!(attributes)

      expect(signature.project).to eq(project)
      expect(signature.commit_sha).to eq(commit_sha)
      expect(signature.gpg_key_primary_keyid).to eq(gpg_key.keyid)
    end

    it 'does not raise an error in case of a race condition' do
      expect(described_class).to receive(:find_or_create_by).and_raise(ActiveRecord::RecordNotUnique)
      allow(described_class).to receive(:find_or_create_by).and_call_original

      described_class.safe_create!(attributes)
    end
  end

Alexis Reigel's avatar
Alexis Reigel committed
61 62 63 64 65 66 67
  describe '#commit' do
    it 'fetches the commit through the project' do
      expect_any_instance_of(Project).to receive(:commit).with(commit_sha).and_return(commit)

      gpg_signature.commit
    end
  end
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

  describe '#gpg_key=' do
    it 'supports the assignment of a GpgKey' do
      gpg_signature = create(:gpg_signature, gpg_key: gpg_key)

      expect(gpg_signature.gpg_key).to be_an_instance_of(GpgKey)
    end

    it 'supports the assignment of a GpgKeySubkey' do
      gpg_signature = create(:gpg_signature, gpg_key: gpg_key_subkey)

      expect(gpg_signature.gpg_key).to be_an_instance_of(GpgKeySubkey)
    end

    it 'clears gpg_key and gpg_key_subkey_id when passing nil' do
      gpg_signature.update_attribute(:gpg_key, nil)

      expect(gpg_signature.gpg_key_id).to be_nil
      expect(gpg_signature.gpg_key_subkey_id).to be_nil
    end
  end
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106

  describe '#gpg_commit' do
    context 'when commit does not exist' do
      it 'returns nil' do
        allow(gpg_signature).to receive(:commit).and_return(nil)

        expect(gpg_signature.gpg_commit).to be_nil
      end
    end

    context 'when commit exists' do
      it 'returns an instance of Gitlab::Gpg::Commit' do
        allow(gpg_signature).to receive(:commit).and_return(commit)

        expect(gpg_signature.gpg_commit).to be_an_instance_of(Gitlab::Gpg::Commit)
      end
    end
  end
107
end