gandi_v5 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/README.md +3 -2
  4. data/lib/gandi_v5.rb +34 -13
  5. data/lib/gandi_v5/domain.rb +2 -8
  6. data/lib/gandi_v5/email/forward.rb +2 -8
  7. data/lib/gandi_v5/email/mailbox.rb +2 -8
  8. data/lib/gandi_v5/live_dns.rb +0 -12
  9. data/lib/gandi_v5/live_dns/domain.rb +313 -29
  10. data/lib/gandi_v5/live_dns/domain/dnssec_key.rb +115 -0
  11. data/lib/gandi_v5/live_dns/domain/record.rb +81 -0
  12. data/lib/gandi_v5/live_dns/domain/snapshot.rb +107 -0
  13. data/lib/gandi_v5/live_dns/domain/tsig_key.rb +71 -0
  14. data/lib/gandi_v5/version.rb +1 -1
  15. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/fetch.yml +1 -2
  16. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/list_tsig.yml +3 -0
  17. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/nameservers.yml +3 -0
  18. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_DnssecKey/fetch.yml +12 -0
  19. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_DnssecKey/list.yml +9 -0
  20. data/spec/fixtures/bodies/{GandiV5_LiveDNS_Zone_Snapshot → GandiV5_LiveDNS_Domain_Snapshot}/fetch.yml +4 -3
  21. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_Snapshot/list.yml +5 -0
  22. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_TsigKey/fetch.yml +9 -0
  23. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_TsigKey/list.yml +4 -0
  24. data/spec/units/gandi_v5/domain_spec.rb +6 -37
  25. data/spec/units/gandi_v5/email/forward_spec.rb +5 -34
  26. data/spec/units/gandi_v5/email/mailbox_spec.rb +4 -34
  27. data/spec/units/gandi_v5/live_dns/domain/dnssec_key_spec.rb +128 -0
  28. data/spec/units/gandi_v5/live_dns/{record_set_spec.rb → domain/record_spec.rb} +1 -1
  29. data/spec/units/gandi_v5/live_dns/domain/snapshot_spec.rb +101 -0
  30. data/spec/units/gandi_v5/live_dns/domain/tsig_key_spec.rb +78 -0
  31. data/spec/units/gandi_v5/live_dns/domain_spec.rb +297 -118
  32. data/spec/units/gandi_v5/live_dns_spec.rb +0 -12
  33. data/spec/units/gandi_v5_spec.rb +111 -14
  34. metadata +18 -24
  35. data/lib/gandi_v5/live_dns/has_zone_records.rb +0 -153
  36. data/lib/gandi_v5/live_dns/record_set.rb +0 -79
  37. data/lib/gandi_v5/live_dns/zone.rb +0 -160
  38. data/lib/gandi_v5/live_dns/zone/snapshot.rb +0 -81
  39. data/spec/features/domain_spec.rb +0 -45
  40. data/spec/features/livedns_domain_spec.rb +0 -8
  41. data/spec/features/livedns_zone_spec.rb +0 -44
  42. data/spec/features/mailbox_spec.rb +0 -18
  43. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone/fetch.yml +0 -11
  44. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone/list.yml +0 -11
  45. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone_Snapshot/list.yml +0 -3
  46. data/spec/fixtures/vcr/Domain_features/List_domains.yml +0 -55
  47. data/spec/fixtures/vcr/Domain_features/Renew_domain.yml +0 -133
  48. data/spec/fixtures/vcr/LiveDNS_Domain_features/List_domains.yml +0 -32
  49. data/spec/fixtures/vcr/LiveDNS_Zone_features/List_zones.yml +0 -42
  50. data/spec/fixtures/vcr/LiveDNS_Zone_features/Make_and_save_snapshot.yml +0 -72
  51. data/spec/fixtures/vcr/LiveDNS_Zone_features/Save_zone_to_file.yml +0 -28
  52. data/spec/fixtures/vcr/Mailbox_features/List_mailboxes.yml +0 -39
  53. data/spec/units/gandi_v5/live_dns/zone/snapshot_spec.rb +0 -66
  54. data/spec/units/gandi_v5/live_dns/zone_spec.rb +0 -347
@@ -0,0 +1,4 @@
1
+ ---
2
+ - id: key-uuid
3
+ key_name: key-name
4
+ secret: key-secret
@@ -5,14 +5,14 @@ describe GandiV5::Domain do
5
5
 
6
6
  describe '.list' do
7
7
  let(:body_fixture) { File.expand_path(File.join('spec', 'fixtures', 'bodies', 'GandiV5_Domain', 'list.yml')) }
8
+ let(:url) { 'https://api.gandi.net/v5/domain/domains' }
8
9
 
9
10
  describe 'With default values' do
10
11
  subject { described_class.list }
11
12
 
12
13
  before :each do
13
- headers = { params: { page: 1, per_page: 100 } }
14
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/domain/domains', headers)
15
- .and_return([nil, YAML.load_file(body_fixture)])
14
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: {})
15
+ .and_yield(YAML.load_file(body_fixture))
16
16
  end
17
17
 
18
18
  its('count') { should eq 1 }
@@ -44,42 +44,11 @@ describe GandiV5::Domain do
44
44
  its('first.contacts?') { should be false }
45
45
  end
46
46
 
47
- it 'Keeps fetching until no more to get' do
48
- headers1 = { params: { page: 1, per_page: 1 } }
49
- headers2 = { params: { page: 2, per_page: 1 } }
50
- # https://github.com/rubocop-hq/rubocop/issues/7088
51
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/domain/domains', headers1)
52
- .ordered
53
- .and_return([nil, YAML.load_file(body_fixture)])
54
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/domain/domains', headers2)
55
- .ordered
56
- .and_return([nil, []])
57
-
58
- expect(described_class.list(per_page: 1).count).to eq 1
59
- end
60
-
61
- it 'Given a range as page number' do
62
- headers1 = { params: { page: 1, per_page: 1 } }
63
- headers2 = { params: { page: 2, per_page: 1 } }
64
- # https://github.com/rubocop-hq/rubocop/issues/7088
65
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/domain/domains', headers1)
66
- .ordered
67
- .and_return([nil, YAML.load_file(body_fixture)])
68
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/domain/domains', headers2)
69
- .ordered
70
- .and_return([nil, []])
71
-
72
- expect(described_class.list(page: (1..2), per_page: 1).count).to eq 1
73
- end
74
-
75
47
  describe 'Passes optional query params' do
76
- %i[fqdn page per_page sort_by tld].each do |param|
48
+ %i[fqdn sort_by tld].each do |param|
77
49
  it param.to_s do
78
- param = { param => 5 }
79
- headers = { params: { page: 1, per_page: 100 }.merge(param) }
80
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/domain/domains', headers)
81
- .and_return([nil, []])
82
- expect(described_class.list(**param)).to eq []
50
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: { param => 5 })
51
+ expect(described_class.list(param => 5)).to eq []
83
52
  end
84
53
  end
85
54
  end
@@ -63,14 +63,14 @@ describe GandiV5::Email::Forward do
63
63
  let(:body_fixture) do
64
64
  File.expand_path(File.join('spec', 'fixtures', 'bodies', 'GandiV5_Email_Forward', 'list.yml'))
65
65
  end
66
+ let(:url) { 'https://api.gandi.net/v5/email/forwards/example.com' }
66
67
 
67
68
  describe 'With default values' do
68
69
  subject { described_class.list 'example.com' }
69
70
 
70
71
  before :each do
71
- headers = { params: { page: 1 } }
72
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/forwards/example.com', headers)
73
- .and_return([nil, YAML.load_file(body_fixture)])
72
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: {})
73
+ .and_yield(YAML.load_file(body_fixture))
74
74
  end
75
75
 
76
76
  its('count') { should eq 1 }
@@ -79,40 +79,11 @@ describe GandiV5::Email::Forward do
79
79
  its('first.fqdn') { should eq 'example.com' }
80
80
  end
81
81
 
82
- it 'Keeps fetching until no more to get' do
83
- headers1 = { params: { page: 1, per_page: 1 } }
84
- headers2 = { params: { page: 2, per_page: 1 } }
85
- # https://github.com/rubocop-hq/rubocop/issues/7088
86
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/forwards/example.com', headers1)
87
- .ordered
88
- .and_return([nil, YAML.load_file(body_fixture)])
89
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/forwards/example.com', headers2)
90
- .ordered
91
- .and_return([nil, []])
92
-
93
- expect(described_class.list('example.com', per_page: 1).count).to eq 1
94
- end
95
-
96
- it 'Given a range as page number' do
97
- headers1 = { params: { page: 1, per_page: 1 } }
98
- headers2 = { params: { page: 2, per_page: 1 } }
99
- # https://github.com/rubocop-hq/rubocop/issues/7088
100
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/forwards/example.com', headers1)
101
- .ordered
102
- .and_return([nil, YAML.load_file(body_fixture)])
103
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/forwards/example.com', headers2)
104
- .ordered
105
- .and_return([nil, []])
106
-
107
- expect(described_class.list('example.com', page: (1..2), per_page: 1).count).to eq 1
108
- end
109
-
110
82
  describe 'Passes optional query params' do
111
83
  %i[source sort_by].each do |param|
112
84
  it param.to_s do
113
- headers = { params: { page: 1 }.merge(param => 'value') }
114
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/forwards/example.com', headers)
115
- .and_return([nil, []])
85
+ headers = { params: { param => 'value' } }
86
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, **headers)
116
87
  expect(described_class.list('example.com', param => 'value')).to eq []
117
88
  end
118
89
  end
@@ -395,14 +395,14 @@ describe GandiV5::Email::Mailbox do
395
395
  let(:body_fixture) do
396
396
  File.expand_path(File.join('spec', 'fixtures', 'bodies', 'GandiV5_Email_Mailbox', 'list.yml'))
397
397
  end
398
+ let(:url) { 'https://api.gandi.net/v5/email/mailboxes/example.com' }
398
399
 
399
400
  describe 'With default values' do
400
401
  subject { described_class.list 'example.com' }
401
402
 
402
403
  before :each do
403
- headers = { params: { page: 1 } }
404
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/mailboxes/example.com', headers)
405
- .and_return([nil, YAML.load_file(body_fixture)])
404
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: {})
405
+ .and_yield(YAML.load_file(body_fixture))
406
406
  end
407
407
 
408
408
  its('count') { should eq 1 }
@@ -414,43 +414,13 @@ describe GandiV5::Email::Mailbox do
414
414
  its('first.quota_used') { should eq 1_000_000 }
415
415
  end
416
416
 
417
- it 'Keeps fetching until no more to get' do
418
- headers1 = { params: { page: 1, per_page: 1 } }
419
- headers2 = { params: { page: 2, per_page: 1 } }
420
- # https://github.com/rubocop-hq/rubocop/issues/7088
421
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/mailboxes/example.com', headers1)
422
- .ordered
423
- .and_return([nil, YAML.load_file(body_fixture)])
424
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/mailboxes/example.com', headers2)
425
- .ordered
426
- .and_return([nil, []])
427
-
428
- expect(described_class.list('example.com', per_page: 1).count).to eq 1
429
- end
430
-
431
- it 'Given a range as page number' do
432
- headers1 = { params: { page: 1, per_page: 1 } }
433
- headers2 = { params: { page: 2, per_page: 1 } }
434
- # https://github.com/rubocop-hq/rubocop/issues/7088
435
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/mailboxes/example.com', headers1)
436
- .ordered
437
- .and_return([nil, YAML.load_file(body_fixture)])
438
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/mailboxes/example.com', headers2)
439
- .ordered
440
- .and_return([nil, []])
441
-
442
- expect(described_class.list('example.com', page: (1..2), per_page: 1).count).to eq 1
443
- end
444
-
445
417
  describe 'Passes optional query params' do
446
418
  {
447
419
  login: '~login',
448
420
  sort_by: :sort_by
449
421
  }.each do |param, query_param|
450
422
  it param.to_s do
451
- headers = { params: { page: 1 }.merge(query_param => 'value') }
452
- expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/email/mailboxes/example.com', headers)
453
- .and_return([nil, []])
423
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: { query_param => 'value' })
454
424
  expect(described_class.list('example.com', param => 'value')).to eq []
455
425
  end
456
426
  end
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::LiveDNS::Domain::DnssecKey do
4
+ subject do
5
+ described_class.new(
6
+ uuid: 'key-uuid',
7
+ status: 'status',
8
+ fqdn: 'example.com',
9
+ algorithm_id: 2,
10
+ algorithm_name: 'Diffie-Hellman',
11
+ deleted: false,
12
+ ds: 'ds-record',
13
+ flags: 256,
14
+ fingerprint: 'fp',
15
+ public_key: 'pub-key',
16
+ tag: 'tag'
17
+ )
18
+ end
19
+
20
+ it '#delete' do
21
+ expect(GandiV5).to receive(:delete).with('https://api.gandi.net/v5/livedns/domains/example.com/keys/key-uuid')
22
+ .and_return([nil, { 'message' => 'Confirmation message.' }])
23
+ expect(subject.delete).to eq 'Confirmation message.'
24
+ expect(subject.deleted).to be true
25
+ end
26
+
27
+ it '#undelete' do
28
+ subject = described_class.new deleted: true, uuid: 'key-uuid', fqdn: 'example.com'
29
+ url = 'https://api.gandi.net/v5/livedns/domains/example.com/keys/key-uuid'
30
+ expect(GandiV5).to receive(:patch).with(url, '{"deleted":false}')
31
+ .and_return([nil, { 'message' => 'Confirmation message.' }])
32
+ expect(subject.undelete).to eq 'Confirmation message.'
33
+ expect(subject.deleted).to be false
34
+ end
35
+
36
+ describe 'flags helper methods' do
37
+ describe '256 (zone signing key)' do
38
+ before(:each) { subject.instance_exec { @flags = 256 } }
39
+ its('zone_signing_key?') { should be true }
40
+ its('key_signing_key?') { should be false }
41
+ end
42
+
43
+ describe '257 (key signing key)' do
44
+ before(:each) { subject.instance_exec { @flags = 257 } }
45
+ its('zone_signing_key?') { should be false }
46
+ its('key_signing_key?') { should be true }
47
+ end
48
+ end
49
+
50
+ describe '.create' do
51
+ let(:url) { 'https://api.gandi.net/v5/livedns/domains/example.com/keys' }
52
+ let(:response) do
53
+ double RestClient::Response, headers: {
54
+ location: 'https://api.gandi.net/v5/livedns/domains/example.com/keys/created-key-uuid'
55
+ }
56
+ end
57
+
58
+ it 'Accepts integer for flags' do
59
+ returns = double described_class
60
+ expect(GandiV5).to receive(:post).with(url, '{"flags":256}').and_return([response, nil])
61
+ expect(described_class).to receive(:fetch).with('example.com', 'created-key-uuid')
62
+ .and_return(returns)
63
+ expect(described_class.create('example.com', :zone_signing_key)).to be returns
64
+ end
65
+
66
+ it 'Accepts :zone_signing_key for flags' do
67
+ expect(GandiV5).to receive(:post).with(url, '{"flags":256}').and_return([response, nil])
68
+ expect(described_class).to receive(:fetch)
69
+ described_class.create('example.com', :zone_signing_key)
70
+ end
71
+
72
+ it 'Accepts :key_signing_key for flags' do
73
+ expect(GandiV5).to receive(:post).with(url, '{"flags":257}').and_return([response, nil])
74
+ expect(described_class).to receive(:fetch)
75
+ described_class.create('example.com', :key_signing_key)
76
+ end
77
+
78
+ it 'Fails on invalid flags' do
79
+ expect { described_class.create('example.com', :invalid) }.to raise_error ArgumentError, 'flags is invalid'
80
+ expect { described_class.create('example.com', '0') }.to raise_error ArgumentError, 'flags is invalid'
81
+ end
82
+ end
83
+
84
+ it '.list' do
85
+ body_fixture = File.expand_path(
86
+ File.join('spec', 'fixtures', 'bodies', 'GandiV5_LiveDNS_Domain_DnssecKey', 'list.yml')
87
+ )
88
+ url = 'https://api.gandi.net/v5/livedns/domains/example.com/keys'
89
+
90
+ expect(GandiV5).to receive(:get).with(url).and_return([nil, YAML.load_file(body_fixture)])
91
+ results = described_class.list('example.com')
92
+ result = results.first
93
+ expect(results.count).to eq 1
94
+ expect(result.uuid).to eq 'key-uuid'
95
+ expect(result.status).to eq 'status'
96
+ expect(result.fqdn).to eq 'example.com'
97
+ expect(result.algorithm_id).to eq 2
98
+ expect(result.algorithm_name).to eq 'Diffie-Hellman'
99
+ expect(result.deleted).to be false
100
+ expect(result.ds).to eq 'ds-record'
101
+ expect(result.flags).to eq 256
102
+ end
103
+
104
+ describe '.fetch' do
105
+ subject { described_class.fetch 'example.com', 'key-uuid' }
106
+
107
+ before :each do
108
+ body_fixture = File.expand_path(
109
+ File.join('spec', 'fixtures', 'bodies', 'GandiV5_LiveDNS_Domain_DnssecKey', 'fetch.yml')
110
+ )
111
+ url = 'https://api.gandi.net/v5/livedns/domains/example.com/keys/key-uuid'
112
+ expect(GandiV5).to receive(:get).with(url)
113
+ .and_return([nil, YAML.load_file(body_fixture)])
114
+ end
115
+
116
+ its('uuid') { should eq 'key-uuid' }
117
+ its('status') { should eq 'status' }
118
+ its('fqdn') { should eq 'example.com' }
119
+ its('algorithm_id') { should eq 2 }
120
+ its('algorithm_name') { should eq 'Diffie-Hellman' }
121
+ its('deleted') { should be false }
122
+ its('ds') { should eq 'ds-record' }
123
+ its('flags') { should eq 256 }
124
+ its('fingerprint') { should eq 'fp' }
125
+ its('public_key') { should eq 'pub-key' }
126
+ its('tag') { should eq 'tag' }
127
+ end
128
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe GandiV5::LiveDNS::RecordSet do
3
+ describe GandiV5::LiveDNS::Domain::Record do
4
4
  subject do
5
5
  described_class.new type: 'A', ttl: 900, name: 'www', values: %w[192.168.0.1 192.168.0.2]
6
6
  end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::LiveDNS::Domain::Snapshot do
4
+ subject do
5
+ described_class.new(
6
+ created_at: Time.new(2016, 12, 16, 16, 51, 26, 0),
7
+ uuid: 'snapshot-uuid',
8
+ name: 'snapshot-name',
9
+ automatic: false,
10
+ records: [],
11
+ fqdn: 'example.com'
12
+ )
13
+ end
14
+
15
+ it '#update' do
16
+ url = 'https://api.gandi.net/v5/livedns/domains/example.com/snapshots/snapshot-uuid'
17
+ body = '{"name":"NEW NAME"}'
18
+ expect(GandiV5).to receive(:patch).with(url, body)
19
+ .and_return([nil, { 'message' => 'Confirmation message.' }])
20
+ expect(subject.update(name: 'NEW NAME')).to eq 'Confirmation message.'
21
+ expect(subject.name).to eq 'NEW NAME'
22
+ end
23
+
24
+ it '#delete' do
25
+ expect(GandiV5).to receive(:delete).with('https://api.gandi.net/v5/livedns/domains/example.com/snapshots/snapshot-uuid')
26
+ .and_return([nil, { 'message' => 'Confirmation message.' }])
27
+ expect(subject.delete).to eq 'Confirmation message.'
28
+ end
29
+
30
+ describe '#records' do
31
+ it 'Returns existing if present' do
32
+ expect(GandiV5).to_not receive(:get)
33
+ expect(subject.records).to eq []
34
+ end
35
+
36
+ it 'Fetches and saves if not present' do
37
+ subject = described_class.new fqdn: 'example.com', uuid: 'snapshot-uuid'
38
+ expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/livedns/domains/example.com/snapshots/snapshot-uuid')
39
+ .and_return([nil, { 'zone_data' => [{ 'rrset_name' => 'HELLO' }] }])
40
+ expect(subject.records.count).to eq 1
41
+ expect(subject.records.first.name).to eq 'HELLO'
42
+ end
43
+ end
44
+
45
+ describe '.list' do
46
+ let :body_fixture do
47
+ File.expand_path(File.join('spec', 'fixtures', 'bodies', 'GandiV5_LiveDNS_Domain_Snapshot', 'list.yml'))
48
+ end
49
+ let(:url) { 'https://api.gandi.net/v5/livedns/domains/example.com/snapshots' }
50
+
51
+ it 'With default parameters' do
52
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: {})
53
+ .and_yield(YAML.load_file(body_fixture))
54
+ results = described_class.list('example.com')
55
+ result = results.first
56
+ expect(results.count).to eq 1
57
+ expect(result.name).to eq 'snapshot-name'
58
+ expect(result.created_at).to eq Time.new(2016, 12, 16, 16, 51, 26, 0)
59
+ expect(result.uuid).to eq 'snapshot-uuid'
60
+ expect(result.automatic).to be true
61
+ expect(result.fqdn).to eq 'example.com'
62
+ end
63
+
64
+ describe 'Passes optional query params' do
65
+ describe 'automatic' do
66
+ it 'true' do
67
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: { automatic: true })
68
+ described_class.list('example.com', automatic: true)
69
+ end
70
+
71
+ it 'false' do
72
+ expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: { automatic: false })
73
+ described_class.list('example.com', automatic: false)
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '.fetch' do
80
+ subject { described_class.fetch 'example.com', 'snapshot-uuid' }
81
+
82
+ before :each do
83
+ body_fixture = File.expand_path(
84
+ File.join('spec', 'fixtures', 'bodies', 'GandiV5_LiveDNS_Domain_Snapshot', 'fetch.yml')
85
+ )
86
+ expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/livedns/domains/example.com/snapshots/snapshot-uuid')
87
+ .and_return([nil, YAML.load_file(body_fixture)])
88
+ end
89
+
90
+ its('created_at') { should eq Time.new(2016, 12, 16, 16, 51, 26, 0) }
91
+ its('uuid') { should eq 'snapshot-uuid' }
92
+ its('name') { should eq 'snapshot-name' }
93
+ its('automatic') { should be true }
94
+ its('fqdn') { should eq 'example.com' }
95
+ its('records.count') { should eq 1 }
96
+ its('records.first.type') { should eq 'A' }
97
+ its('records.first.ttl') { should eq 10_800 }
98
+ its('records.first.name') { should eq 'www' }
99
+ its('records.first.values') { should match_array ['10.0.1.42'] }
100
+ end
101
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::LiveDNS::Domain::TsigKey do
4
+ subject do
5
+ described_class.new(
6
+ uuid: 'key-uuid',
7
+ name: 'key-name',
8
+ secret: 'key-secret',
9
+ config_examples: { test: 'test config sample' }
10
+ )
11
+ end
12
+
13
+ describe '.create' do
14
+ it 'Without sharing_id' do
15
+ url = 'https://api.gandi.net/v5/livedns/axfr/tsig'
16
+ created = { 'href' => '', 'id' => 'created-key-uuid', 'key_name' => 'based on id' }
17
+ returns = double described_class
18
+
19
+ expect(GandiV5).to receive(:post).with(url).and_return([nil, created])
20
+ expect(described_class).to receive(:fetch).with('created-key-uuid')
21
+ .and_return(returns)
22
+ expect(described_class.create).to be returns
23
+ end
24
+
25
+ it 'With sharing_id' do
26
+ url = 'https://api.gandi.net/v5/livedns/axfr/tsig?sharing_id=sharing-id'
27
+ created = { 'href' => '', 'id' => 'created-key-uuid', 'key_name' => 'based on id' }
28
+ returns = double described_class
29
+
30
+ expect(GandiV5).to receive(:post).with(url).and_return([nil, created])
31
+ expect(described_class).to receive(:fetch).with('created-key-uuid')
32
+ .and_return(returns)
33
+ expect(described_class.create('sharing-id')).to be returns
34
+ end
35
+ end
36
+
37
+ it '.list' do
38
+ body_fixture = File.expand_path(
39
+ File.join('spec', 'fixtures', 'bodies', 'GandiV5_LiveDNS_Domain_TsigKey', 'list.yml')
40
+ )
41
+ url = 'https://api.gandi.net/v5/livedns/axfr/tsig'
42
+
43
+ expect(GandiV5).to receive(:get).with(url).and_return([nil, YAML.load_file(body_fixture)])
44
+ results = described_class.list
45
+ result = results.first
46
+ expect(results.count).to eq 1
47
+ expect(result.uuid).to eq 'key-uuid'
48
+ expect(result.name).to eq 'key-name'
49
+ expect(result.secret).to eq 'key-secret'
50
+ end
51
+
52
+ describe '.fetch' do
53
+ subject { described_class.fetch 'key-uuid' }
54
+
55
+ before :each do
56
+ body_fixture = File.expand_path(
57
+ File.join('spec', 'fixtures', 'bodies', 'GandiV5_LiveDNS_Domain_TsigKey', 'fetch.yml')
58
+ )
59
+ url = 'https://api.gandi.net/v5/livedns/axfr/tsig/key-uuid'
60
+ expect(GandiV5).to receive(:get).with(url)
61
+ .and_return([nil, YAML.load_file(body_fixture)])
62
+ end
63
+
64
+ its('uuid') { should eq 'key-uuid' }
65
+ its('name') { should eq 'key-name' }
66
+ its('secret') { should eq 'key-secret' }
67
+ its('config_examples') do
68
+ should eq(
69
+ {
70
+ bind: 'bind-sample',
71
+ knot: 'knot-sample',
72
+ nsd: 'nsd-sample',
73
+ powerdns: 'powerdns-sample'
74
+ }
75
+ )
76
+ end
77
+ end
78
+ end