gpg_key_spec.rb 4.63 KB
Newer Older
Alexis Reigel's avatar
Alexis Reigel committed
1
2
3
4
5
6
7
8
require 'rails_helper'

describe GpgKey do
  describe "associations" do
    it { is_expected.to belong_to(:user) }
  end

  describe "validation" do
9
    it { is_expected.to validate_presence_of(:user) }
Alexis Reigel's avatar
Alexis Reigel committed
10
11
12
13
14
15
16
    it { is_expected.to validate_presence_of(:key) }
    it { is_expected.to validate_uniqueness_of(:key) }
    it { is_expected.to allow_value("-----BEGIN PGP PUBLIC KEY BLOCK-----\nkey").for(:key) }
    it { is_expected.not_to allow_value("-----BEGIN PGP PUBLIC KEY BLOCK-----\nkey\n-----BEGIN PGP PUBLIC KEY BLOCK-----").for(:key) }
    it { is_expected.not_to allow_value('BEGIN PGP').for(:key) }
  end

Alexis Reigel's avatar
Alexis Reigel committed
17
  context 'callbacks' do
Alexis Reigel's avatar
Alexis Reigel committed
18
    describe 'extract_fingerprint' do
19
      it 'extracts the fingerprint from the gpg key' do
Alexis Reigel's avatar
Alexis Reigel committed
20
        gpg_key = described_class.new(key: GpgHelpers::User1.public_key)
Alexis Reigel's avatar
Alexis Reigel committed
21
        gpg_key.valid?
22
        expect(gpg_key.fingerprint).to eq GpgHelpers::User1.fingerprint
Alexis Reigel's avatar
Alexis Reigel committed
23
24
      end
    end
25
26
27
28
29
30
31
32

    describe 'extract_primary_keyid' do
      it 'extracts the primary keyid from the gpg key' do
        gpg_key = described_class.new(key: GpgHelpers::User1.public_key)
        gpg_key.valid?
        expect(gpg_key.primary_keyid).to eq GpgHelpers::User1.primary_keyid
      end
    end
Alexis Reigel's avatar
Alexis Reigel committed
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  end

  describe '#key=' do
    it 'strips white spaces' do
      key = <<~KEY.strip
        -----BEGIN PGP PUBLIC KEY BLOCK-----
        Version: GnuPG v1

        mQENBFMOSOgBCADFCYxmnXFbrDhfvlf03Q/bQuT+nZu46BFGbo7XkUjDowFXJQhP
        -----END PGP PUBLIC KEY BLOCK-----
      KEY

      expect(described_class.new(key: " #{key} ").key).to eq(key)
    end
Alexis Reigel's avatar
Alexis Reigel committed
47
48
49
50

    it 'does not strip when the key is nil' do
      expect(described_class.new(key: nil).key).to be_nil
    end
Alexis Reigel's avatar
Alexis Reigel committed
51
  end
Alexis Reigel's avatar
Alexis Reigel committed
52

53
54
  describe '#user_infos' do
    it 'returns the user infos from the gpg key' do
55
      gpg_key = create :gpg_key, key: GpgHelpers::User1.public_key
56
      expect(Gitlab::Gpg).to receive(:user_infos_from_key).with(gpg_key.key)
Alexis Reigel's avatar
Alexis Reigel committed
57

58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
      gpg_key.user_infos
    end
  end

  describe '#verified_user_infos' do
    it 'returns the user infos if it is verified' do
      user = create :user, email: GpgHelpers::User1.emails.first
      gpg_key = create :gpg_key, key: GpgHelpers::User1.public_key, user: user

      expect(gpg_key.verified_user_infos).to eq([{
        name: GpgHelpers::User1.names.first,
        email: GpgHelpers::User1.emails.first
      }])
    end

    it 'returns an empty array if the user info is not verified' do
      user = create :user, email: 'unrelated@example.com'
      gpg_key = create :gpg_key, key: GpgHelpers::User1.public_key, user: user

      expect(gpg_key.verified_user_infos).to eq([])
Alexis Reigel's avatar
Alexis Reigel committed
78
79
    end
  end
Alexis Reigel's avatar
Alexis Reigel committed
80

Alexis Reigel's avatar
Alexis Reigel committed
81
  describe '#emails_with_verified_status' do
Alexis Reigel's avatar
Alexis Reigel committed
82
83
84
    it 'email is verified if the user has the matching email' do
      user = create :user, email: 'bette.cartwright@example.com'
      gpg_key = create :gpg_key, key: GpgHelpers::User2.public_key, user: user
85

Alexis Reigel's avatar
Alexis Reigel committed
86
87
88
89
      expect(gpg_key.emails_with_verified_status).to eq(
        'bette.cartwright@example.com' => true,
        'bette.cartwright@example.net' => false
      )
90
91
92
    end
  end

93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  describe '#verified?' do
    it 'returns true one of the email addresses in the key belongs to the user' do
      user = create :user, email: 'bette.cartwright@example.com'
      gpg_key = create :gpg_key, key: GpgHelpers::User2.public_key, user: user

      expect(gpg_key.verified?).to be_truthy
    end

    it 'returns false if one of the email addresses in the key does not belong to the user' do
      user = create :user, email: 'someone.else@example.com'
      gpg_key = create :gpg_key, key: GpgHelpers::User2.public_key, user: user

      expect(gpg_key.verified?).to be_falsey
    end
  end

109
110
111
112
113
114
115
116
117
118
119
120
121
  describe 'notification' do
    include EmailHelpers

    let(:user) { create(:user) }

    it 'sends a notification' do
      perform_enqueued_jobs do
        create(:gpg_key, user: user)
      end

      should_email(user)
    end
  end
Alexis Reigel's avatar
Alexis Reigel committed
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148

  describe '#revoke' do
    it 'invalidates all associated gpg signatures and destroys the key' do
      gpg_key = create :gpg_key
      gpg_signature = create :gpg_signature, valid_signature: true, gpg_key: gpg_key

      unrelated_gpg_key = create :gpg_key, key: GpgHelpers::User2.public_key
      unrelated_gpg_signature = create :gpg_signature, valid_signature: true, gpg_key: unrelated_gpg_key

      gpg_key.revoke

      expect(gpg_signature.reload).to have_attributes(
        valid_signature: false,
        gpg_key: nil
      )

      expect(gpg_key.destroyed?).to be true

      # unrelated signature is left untouched
      expect(unrelated_gpg_signature.reload).to have_attributes(
        valid_signature: true,
        gpg_key: unrelated_gpg_key
      )

      expect(unrelated_gpg_key.destroyed?).to be false
    end
  end
Alexis Reigel's avatar
Alexis Reigel committed
149
end