gandi_v5 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +20 -0
  5. data/.travis.yml +23 -0
  6. data/CHANGELOG.md +3 -0
  7. data/Gemfile +6 -0
  8. data/Guardfile +40 -0
  9. data/LICENSE.md +32 -0
  10. data/README.md +94 -0
  11. data/Rakefile +3 -0
  12. data/TODO.md +29 -0
  13. data/bin/console +13 -0
  14. data/gandi_v5.gemspec +41 -0
  15. data/lib/gandi_v5/billing/info/prepaid.rb +33 -0
  16. data/lib/gandi_v5/billing/info.rb +26 -0
  17. data/lib/gandi_v5/billing.rb +28 -0
  18. data/lib/gandi_v5/data/converter/array_of.rb +35 -0
  19. data/lib/gandi_v5/data/converter/symbol.rb +26 -0
  20. data/lib/gandi_v5/data/converter/time.rb +28 -0
  21. data/lib/gandi_v5/data/converter.rb +41 -0
  22. data/lib/gandi_v5/data.rb +244 -0
  23. data/lib/gandi_v5/domain/auto_renew.rb +64 -0
  24. data/lib/gandi_v5/domain/contact.rb +102 -0
  25. data/lib/gandi_v5/domain/contract.rb +22 -0
  26. data/lib/gandi_v5/domain/dates.rb +44 -0
  27. data/lib/gandi_v5/domain/renewal_information.rb +41 -0
  28. data/lib/gandi_v5/domain/restore_information.rb +18 -0
  29. data/lib/gandi_v5/domain/sharing_space.rb +21 -0
  30. data/lib/gandi_v5/domain.rb +431 -0
  31. data/lib/gandi_v5/email/mailbox/responder.rb +36 -0
  32. data/lib/gandi_v5/email/mailbox.rb +236 -0
  33. data/lib/gandi_v5/email/offer.rb +27 -0
  34. data/lib/gandi_v5/email/slot.rb +134 -0
  35. data/lib/gandi_v5/email.rb +11 -0
  36. data/lib/gandi_v5/error/gandi_error.rb +21 -0
  37. data/lib/gandi_v5/error.rb +9 -0
  38. data/lib/gandi_v5/live_dns/domain.rb +211 -0
  39. data/lib/gandi_v5/live_dns/record_set.rb +79 -0
  40. data/lib/gandi_v5/live_dns/zone/snapshot.rb +62 -0
  41. data/lib/gandi_v5/live_dns/zone.rb +301 -0
  42. data/lib/gandi_v5/live_dns.rb +30 -0
  43. data/lib/gandi_v5/organization.rb +66 -0
  44. data/lib/gandi_v5/version.rb +5 -0
  45. data/lib/gandi_v5.rb +178 -0
  46. data/spec/.rubocop.yml +4 -0
  47. data/spec/features/domain_spec.rb +45 -0
  48. data/spec/features/livedns_domain_spec.rb +8 -0
  49. data/spec/features/livedns_zone_spec.rb +45 -0
  50. data/spec/features/mailbox_spec.rb +18 -0
  51. data/spec/fixtures/bodies/GandiV5_Billing/info.yaml +10 -0
  52. data/spec/fixtures/bodies/GandiV5_Domain/availability.yaml +15 -0
  53. data/spec/fixtures/bodies/GandiV5_Domain/fetch_contacts.yaml +8 -0
  54. data/spec/fixtures/bodies/GandiV5_Domain/get.yaml +37 -0
  55. data/spec/fixtures/bodies/GandiV5_Domain/list.yaml +20 -0
  56. data/spec/fixtures/bodies/GandiV5_Domain/renewal_info.yaml +12 -0
  57. data/spec/fixtures/bodies/GandiV5_Domain/restore_info.yaml +5 -0
  58. data/spec/fixtures/bodies/GandiV5_Domain/tld.yaml +10 -0
  59. data/spec/fixtures/bodies/GandiV5_Domain/tlds.yaml +7 -0
  60. data/spec/fixtures/bodies/GandiV5_Email_Mailbox/get.yaml +16 -0
  61. data/spec/fixtures/bodies/GandiV5_Email_Mailbox/list.yaml +8 -0
  62. data/spec/fixtures/bodies/GandiV5_Email_Slot/get.yaml +10 -0
  63. data/spec/fixtures/bodies/GandiV5_Email_Slot/list.yaml +8 -0
  64. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/get.yaml +4 -0
  65. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/list.yaml +2 -0
  66. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone/get.yaml +11 -0
  67. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone/list.yaml +11 -0
  68. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone_Snapshot/get.yaml +9 -0
  69. data/spec/fixtures/bodies/GandiV5_Organization/get.yaml +17 -0
  70. data/spec/fixtures/vcr/Domain_features/List_domains.yml +54 -0
  71. data/spec/fixtures/vcr/Domain_features/Renew_domain.yml +133 -0
  72. data/spec/fixtures/vcr/LiveDNS_Domain_features/List_domains.yml +32 -0
  73. data/spec/fixtures/vcr/LiveDNS_Zone_features/List_zones.yml +42 -0
  74. data/spec/fixtures/vcr/LiveDNS_Zone_features/Make_and_save_snapshot.yml +72 -0
  75. data/spec/fixtures/vcr/LiveDNS_Zone_features/Save_zone_to_file.yml +28 -0
  76. data/spec/fixtures/vcr/Mailbox_features/List_mailboxes.yml +39 -0
  77. data/spec/spec_helper.rb +60 -0
  78. data/spec/test.env +1 -0
  79. data/spec/units/gandi_v5/billing/info/prepaid_spec.rb +20 -0
  80. data/spec/units/gandi_v5/billing/info_spec.rb +4 -0
  81. data/spec/units/gandi_v5/billing_spec.rb +41 -0
  82. data/spec/units/gandi_v5/data/converter/array_of_spec.rb +18 -0
  83. data/spec/units/gandi_v5/data/converter/symbol_spec.rb +16 -0
  84. data/spec/units/gandi_v5/data/converter/time_spec.rb +16 -0
  85. data/spec/units/gandi_v5/data/converter_spec.rb +31 -0
  86. data/spec/units/gandi_v5/data_spec.rb +340 -0
  87. data/spec/units/gandi_v5/domain/auto_renew_spec.rb +70 -0
  88. data/spec/units/gandi_v5/domain/contact_spec.rb +36 -0
  89. data/spec/units/gandi_v5/domain/contract_spec.rb +4 -0
  90. data/spec/units/gandi_v5/domain/dates_spec.rb +4 -0
  91. data/spec/units/gandi_v5/domain/renewal_information_spec.rb +81 -0
  92. data/spec/units/gandi_v5/domain/restore_information_spec.rb +4 -0
  93. data/spec/units/gandi_v5/domain/sharing_space_spec.rb +4 -0
  94. data/spec/units/gandi_v5/domain_spec.rb +451 -0
  95. data/spec/units/gandi_v5/email/mailbox/responder_spec.rb +131 -0
  96. data/spec/units/gandi_v5/email/mailbox_spec.rb +384 -0
  97. data/spec/units/gandi_v5/email/offer_spec.rb +17 -0
  98. data/spec/units/gandi_v5/email/slot_spec.rb +102 -0
  99. data/spec/units/gandi_v5/error/gandi_error_spec.rb +30 -0
  100. data/spec/units/gandi_v5/error_spec.rb +4 -0
  101. data/spec/units/gandi_v5/live_dns/domain_spec.rb +247 -0
  102. data/spec/units/gandi_v5/live_dns/record_set_spec.rb +74 -0
  103. data/spec/units/gandi_v5/live_dns/zone/snapshot_spec.rb +37 -0
  104. data/spec/units/gandi_v5/live_dns/zone_spec.rb +329 -0
  105. data/spec/units/gandi_v5/live_dns_spec.rb +17 -0
  106. data/spec/units/gandi_v5/organization_spec.rb +30 -0
  107. data/spec/units/gandi_v5_spec.rb +204 -0
  108. metadata +406 -0
@@ -0,0 +1,340 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::Data do
4
+ around(:each) do |example|
5
+ # Class used for testing GandiV5::Data by including it.
6
+ class DataTestClass
7
+ include GandiV5::Data
8
+
9
+ members :basic
10
+ member :str_to_sym, converter: GandiV5::Data::Converter::Symbol
11
+ member :arr_of_str_to_sym, converter: GandiV5::Data::Converter::Symbol, array: true
12
+ member :diff_name, gandi_key: 'DiffName'
13
+ end
14
+
15
+ example.run
16
+
17
+ Object.send(:remove_const, :DataTestClass)
18
+ end
19
+
20
+ subject { DataTestClass.new }
21
+
22
+ describe '#initialize' do
23
+ describe 'Given expected data' do
24
+ subject { DataTestClass.new basic: :a, str_to_sym: :b, arr_of_str_to_sym: [:c], diff_name: :d }
25
+
26
+ its('basic') { should be :a }
27
+ its('str_to_sym') { should be :b }
28
+ its('arr_of_str_to_sym') { should match_array [:c] }
29
+ its('diff_name') { should be :d }
30
+ end
31
+
32
+ it 'Given unexpected data' do
33
+ expect { DataTestClass.new no_member_by_this_name: :a }.to raise_error(
34
+ ArgumentError,
35
+ 'unknown keyword: no_member_by_this_name'
36
+ )
37
+ end
38
+ end
39
+
40
+ describe '#to_h' do
41
+ it 'Everything is blank' do
42
+ expect(subject.to_h).to eq basic: nil, str_to_sym: nil, arr_of_str_to_sym: nil, diff_name: nil
43
+ end
44
+
45
+ it ':basic contains an enumerable with #transform_keys' do
46
+ subject = DataTestClass.new basic: { a: 'a' }
47
+ expect(subject.to_h).to include(basic: { a: 'a' })
48
+ end
49
+
50
+ it ':basic contains an enumerable with #map' do
51
+ subject = DataTestClass.new basic: ['a']
52
+ expect(subject.to_h).to include(basic: ['a'])
53
+ end
54
+
55
+ it ':basic contains an enumerable with values with #to_h' do
56
+ value = double Object
57
+ expect(value).to receive(:to_h).and_return('a' => 'a')
58
+ subject = DataTestClass.new basic: [value]
59
+ expect(subject.to_h).to include(basic: [{ 'a' => 'a' }])
60
+ end
61
+
62
+ it ':basic contains an enumerable with values without #to_h' do
63
+ subject = DataTestClass.new basic: ['a']
64
+ expect(subject.to_h).to include(basic: ['a'])
65
+ end
66
+
67
+ it ':basic contains a value with #to_h' do
68
+ value = double Object
69
+ expect(value).to receive(:to_h).and_return('a' => 'a')
70
+ subject = DataTestClass.new basic: value
71
+ expect(subject.to_h).to include(basic: { 'a' => 'a' })
72
+ end
73
+
74
+ it ':str_to_sym is not converted' do
75
+ subject = DataTestClass.new str_to_sym: :a
76
+ expect(subject.to_h).to include(str_to_sym: :a)
77
+ end
78
+
79
+ it ':arr_of_str_to_sym is not converted' do
80
+ subject = DataTestClass.new arr_of_str_to_sym: [:a]
81
+ expect(subject.to_h).to include(arr_of_str_to_sym: [:a])
82
+ end
83
+
84
+ it ':diff_name has correct key' do
85
+ subject = DataTestClass.new diff_name: 'a'
86
+ expect(subject.to_h).to include(diff_name: 'a')
87
+ end
88
+ end
89
+
90
+ describe '#to_gandi' do
91
+ it 'Everything is blank' do
92
+ expect(subject.to_gandi).to eq 'basic' => nil, 'str_to_sym' => nil, 'arr_of_str_to_sym' => nil, 'DiffName' => nil
93
+ end
94
+
95
+ it ':basic contains an enumerable with #transform_keys' do
96
+ subject = DataTestClass.new basic: { a: 'a' }
97
+ expect(subject.to_gandi).to include('basic' => { a: 'a' })
98
+ end
99
+
100
+ it ':basic contains an enumerable with #map' do
101
+ subject = DataTestClass.new basic: ['a']
102
+ expect(subject.to_gandi).to include('basic' => ['a'])
103
+ end
104
+
105
+ it ':basic contains a value with #to_gandi' do
106
+ value = double Object
107
+ expect(value).to receive(:to_gandi).and_return('a' => 'a')
108
+ subject = DataTestClass.new basic: value
109
+ expect(subject.to_gandi).to include('basic' => { 'a' => 'a' })
110
+ end
111
+
112
+ it ':str_to_sym is converted' do
113
+ subject = DataTestClass.new str_to_sym: :a
114
+ expect(subject.to_gandi).to include('str_to_sym' => 'a')
115
+ end
116
+
117
+ it ':arr_of_str_to_sym is converted' do
118
+ subject = DataTestClass.new arr_of_str_to_sym: [:a]
119
+ expect(subject.to_gandi).to include('arr_of_str_to_sym' => ['a'])
120
+ end
121
+
122
+ it ':diff_name has correct key' do
123
+ subject = DataTestClass.new diff_name: 'a'
124
+ expect(subject.to_gandi).to include('DiffName' => 'a')
125
+ end
126
+ end
127
+
128
+ describe '#values_at' do
129
+ let(:basic) { DataTestClass.new basic: :basic }
130
+ subject { DataTestClass.new basic: basic, arr_of_str_to_sym: [:a] }
131
+
132
+ it 'basic' do
133
+ expect(subject.basic).to be basic
134
+ end
135
+
136
+ it 'basic.basic' do
137
+ expect(subject.basic.basic).to be :basic
138
+ end
139
+
140
+ it 'no_member_by_this_name' do
141
+ expect { subject.values_at(:no_member_by_this_name) }.to raise_error(
142
+ ArgumentError,
143
+ 'no_member_by_this_name is not a member.'
144
+ )
145
+ end
146
+
147
+ it 'basic.no_member_by_this_name' do
148
+ expect { subject.values_at('basic.no_member_by_this_name') }.to raise_error(
149
+ ArgumentError,
150
+ 'no_member_by_this_name is not a member.'
151
+ )
152
+ end
153
+ end
154
+
155
+ describe '#from_gandi' do
156
+ describe 'Everything is blank' do
157
+ subject { DataTestClass.new.from_gandi({}) }
158
+
159
+ its('basic') { should be nil }
160
+ its('str_to_sym') { should be nil }
161
+ its('arr_of_str_to_sym') { should be nil }
162
+ its('diff_name') { should be nil }
163
+ end
164
+
165
+ it ':basic is left alone' do
166
+ subject.from_gandi 'basic' => 'left_alone'
167
+ expect(subject.basic).to be 'left_alone'
168
+ end
169
+
170
+ it ':str_to_sym is converted' do
171
+ subject.from_gandi 'str_to_sym' => 'converted'
172
+ expect(subject.str_to_sym).to be :converted
173
+ end
174
+
175
+ it ':arr_of_str_to_sym is converted' do
176
+ subject.from_gandi 'arr_of_str_to_sym' => ['converted']
177
+ expect(subject.arr_of_str_to_sym).to match_array [:converted]
178
+ end
179
+
180
+ it ':diff_name has correct key' do
181
+ subject.from_gandi 'DiffName' => 'left_alone'
182
+ expect(subject.diff_name).to be 'left_alone'
183
+ end
184
+
185
+ it 'returns self' do
186
+ expect(subject.from_gandi({})).to be subject
187
+ end
188
+ end
189
+
190
+ describe '.from_gandi' do
191
+ it 'Given nothing' do
192
+ expect(DataTestClass.from_gandi(nil)).to be nil
193
+ end
194
+
195
+ describe 'Everything is blank' do
196
+ subject { DataTestClass.from_gandi({}) }
197
+
198
+ its('basic') { should be nil }
199
+ its('str_to_sym') { should be nil }
200
+ its('arr_of_str_to_sym') { should be nil }
201
+ its('diff_name') { should be nil }
202
+ end
203
+
204
+ it ':basic is left alone' do
205
+ subject = DataTestClass.from_gandi 'basic' => 'left_alone'
206
+ expect(subject.basic).to be 'left_alone'
207
+ end
208
+
209
+ it ':str_to_sym is converted' do
210
+ subject = DataTestClass.from_gandi 'str_to_sym' => 'converted'
211
+ expect(subject.str_to_sym).to be :converted
212
+ end
213
+
214
+ it ':arr_of_str_to_sym is converted' do
215
+ subject = DataTestClass.from_gandi 'arr_of_str_to_sym' => ['converted']
216
+ expect(subject.arr_of_str_to_sym).to match_array [:converted]
217
+ end
218
+
219
+ it ':diff_name has correct key' do
220
+ subject = DataTestClass.from_gandi 'DiffName' => 'left_alone'
221
+ expect(subject.diff_name).to be 'left_alone'
222
+ end
223
+
224
+ it 'returns a DataTestClass' do
225
+ expect(DataTestClass.from_gandi({})).to be_a DataTestClass
226
+ end
227
+ end
228
+
229
+ describe 'Attribute methods' do
230
+ it '#basic=' do
231
+ expect(subject.instance_variable_get(:@basic)).to be nil
232
+ subject.send :basic=, :a
233
+ expect(subject.instance_variable_get(:@basic)).to be :a
234
+ end
235
+
236
+ describe 'Is nil' do
237
+ before(:each) { subject.send :basic=, nil }
238
+
239
+ it('#basic?') { expect(subject.basic?).to be false }
240
+ it('#basic') { expect(subject.basic).to be nil }
241
+ end
242
+
243
+ describe 'Is something' do
244
+ let(:value) { double Object }
245
+ before(:each) { subject.send :basic=, value }
246
+
247
+ it('#basic?') { expect(subject.basic?).to be true }
248
+ it('#basic') { expect(subject.basic).to be value }
249
+ end
250
+ end
251
+
252
+ describe 'Internal API methods' do
253
+ it '#data_members' do
254
+ expect(subject.send(:data_members)).to match_array %i[basic str_to_sym arr_of_str_to_sym diff_name]
255
+ end
256
+
257
+ it '#data_member?' do
258
+ expect(subject.send(:data_member?, :basic)).to be true
259
+ expect(subject.send(:data_member?, :no_member_by_this_name)).to be false
260
+ end
261
+
262
+ it '#data_gandi_key_to_member' do
263
+ expect(subject.send(:data_gandi_key_to_member, 'basic')).to be :basic
264
+ expect(subject.send(:data_gandi_key_to_member, 'DiffName')).to be :diff_name
265
+ expect { subject.send(:data_gandi_key_to_member, 'no_member_by_this_name') }.to raise_error KeyError
266
+ end
267
+
268
+ it '#data_member_to_gandi_key' do
269
+ expect(subject.send(:data_member_to_gandi_key, :basic)).to eq 'basic'
270
+ expect(subject.send(:data_member_to_gandi_key, :diff_name)).to eq 'DiffName'
271
+ expect { subject.send(:data_member_to_gandi_key, :no_member_by_this_name) }.to raise_error KeyError
272
+ end
273
+
274
+ it '#data_converter_for' do
275
+ expect(subject.send(:data_converter_for, :basic)).to be nil
276
+ expect(subject.send(:data_converter_for, :str_to_sym)).to be GandiV5::Data::Converter::Symbol
277
+ expect(subject.send(:data_converter_for, :no_member_by_this_name)).to be nil
278
+ end
279
+
280
+ it '#data_converter_for?' do
281
+ expect(subject.send(:data_converter_for?, :basic)).to be false
282
+ expect(subject.send(:data_converter_for?, :str_to_sym)).to be true
283
+ expect(subject.send(:data_converter_for?, :no_member_by_this_name)).to be false
284
+ end
285
+
286
+ it '.data_members' do
287
+ expect(DataTestClass.send(:data_members)).to match_array %i[basic str_to_sym arr_of_str_to_sym diff_name]
288
+ end
289
+
290
+ it '.data_member?' do
291
+ expect(DataTestClass.send(:data_member?, :basic)).to be true
292
+ expect(DataTestClass.send(:data_member?, :no_member_by_this_name)).to be false
293
+ end
294
+
295
+ it '.data_gandi_key_to_member' do
296
+ expect(DataTestClass.send(:data_gandi_key_to_member, 'basic')).to be :basic
297
+ expect(DataTestClass.send(:data_gandi_key_to_member, 'DiffName')).to be :diff_name
298
+ expect { DataTestClass.send(:data_gandi_key_to_member, 'no_member_by_this_name') }.to raise_error KeyError
299
+ end
300
+
301
+ it '.data_member_to_gandi_key' do
302
+ expect(DataTestClass.send(:data_member_to_gandi_key, :basic)).to eq 'basic'
303
+ expect(DataTestClass.send(:data_member_to_gandi_key, :diff_name)).to eq 'DiffName'
304
+ expect { DataTestClass.send(:data_member_to_gandi_key, :no_member_by_this_name) }.to raise_error KeyError
305
+ end
306
+
307
+ it '.data_converter_for' do
308
+ expect(DataTestClass.send(:data_converter_for, :basic)).to be nil
309
+ expect(DataTestClass.send(:data_converter_for, :str_to_sym)).to be GandiV5::Data::Converter::Symbol
310
+ expect(DataTestClass.send(:data_converter_for, :no_member_by_this_name)).to be nil
311
+ end
312
+
313
+ it '.data_converter_for?' do
314
+ expect(DataTestClass.send(:data_converter_for?, :basic)).to be false
315
+ expect(DataTestClass.send(:data_converter_for?, :str_to_sym)).to be true
316
+ expect(DataTestClass.send(:data_converter_for?, :no_member_by_this_name)).to be false
317
+ end
318
+
319
+ describe '.translate_gandi' do
320
+ it 'Not given a Hash' do
321
+ expect(DataTestClass.send(:translate_gandi, [])).to be_nil
322
+ end
323
+
324
+ it 'Does name mapping' do
325
+ data = { 'basic' => 'a', 'DiffName' => 'b' }
326
+ expect(DataTestClass.send(:translate_gandi, data).keys).to match_array %i[basic diff_name]
327
+ end
328
+
329
+ it 'Does value conversion' do
330
+ data = { 'basic' => 'a', 'str_to_sym' => 'b', 'arr_of_str_to_sym' => ['c'] }
331
+ expect(DataTestClass.send(:translate_gandi, data).values).to match_array ['a', :b, [:c]]
332
+ end
333
+
334
+ it 'Has worked on a clone' do
335
+ data = {}
336
+ expect(DataTestClass.send(:translate_gandi, data)).to_not be hash
337
+ end
338
+ end
339
+ end
340
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::Domain::AutoRenew do
4
+ before(:each) { subject.domain = double GandiV5::Domain, fqdn: 'example.com' }
5
+ let(:url) { 'https://api.gandi.net/v5/domain/domains/example.com/autorenew' }
6
+
7
+ it '#disable' do
8
+ expect(GandiV5).to receive(:patch).with(url, '{"enabled":false}')
9
+ .and_return('message' => 'Confirmation message.')
10
+ expect(subject.disable).to eq 'Confirmation message.'
11
+ expect(subject.enabled).to be false
12
+ end
13
+
14
+ describe '#enable' do
15
+ it 'Success' do
16
+ expect(GandiV5).to receive(:patch).with(url, '{"enabled":true,"duration":1,"org_id":"org-uuid"}')
17
+ .and_return('message' => 'Confirmation message.')
18
+ expect(subject.enable(org_id: 'org-uuid', duration: 1)).to eq 'Confirmation message.'
19
+ expect(subject.enabled).to be true
20
+ end
21
+
22
+ it 'Duration too low' do
23
+ expect(GandiV5).to_not receive(:patch)
24
+ expect { subject.enable(org_id: 'org-uuid', duration: 0) }.to raise_error ArgumentError,
25
+ 'duration can not be less than 1'
26
+ expect(subject.enabled).to be nil
27
+ end
28
+
29
+ it 'Duration too high' do
30
+ expect(GandiV5).to_not receive(:patch)
31
+ expect { subject.enable(org_id: 'org-uuid', duration: 10) }.to raise_error ArgumentError,
32
+ 'duration can not be more than 9'
33
+ expect(subject.enabled).to be nil
34
+ end
35
+
36
+ describe 'Missing duration' do
37
+ it 'Uses #duration if present' do
38
+ expect(GandiV5).to receive(:patch).with(url, '{"enabled":true,"duration":5,"org_id":"org-uuid"}')
39
+ .and_return('message' => 'Confirmation message.')
40
+ expect(subject).to receive(:duration).and_return(5)
41
+ expect(subject.enable(org_id: 'org-uuid')).to eq 'Confirmation message.'
42
+ expect(subject.enabled).to be true
43
+ end
44
+
45
+ it 'Uses 1 if #duration not present' do
46
+ expect(GandiV5).to receive(:patch).with(url, '{"enabled":true,"duration":1,"org_id":"org-uuid"}')
47
+ .and_return('message' => 'Confirmation message.')
48
+ expect(subject.enable(org_id: 'org-uuid')).to eq 'Confirmation message.'
49
+ expect(subject.enabled).to be true
50
+ end
51
+ end
52
+
53
+ describe 'Missing org_id' do
54
+ it 'Uses #org_id if present' do
55
+ expect(GandiV5).to receive(:patch).with(url, '{"enabled":true,"duration":1,"org_id":"org-uuid"}')
56
+ .and_return('message' => 'Confirmation message.')
57
+ expect(subject).to receive(:org_id).and_return('org-uuid')
58
+ expect(subject.enable).to eq 'Confirmation message.'
59
+ expect(subject.enabled).to be true
60
+ end
61
+
62
+ it 'Errors if #org_id not present' do
63
+ expect(GandiV5).to_not receive(:patch)
64
+ expect { subject.enable }.to raise_error ArgumentError,
65
+ 'org_id is required'
66
+ expect(subject.enabled).to be nil
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::Domain::Contact do
4
+ subject { described_class.new type: :person, reachability: :yes, validation: :yes }
5
+
6
+ describe '#name' do
7
+ it 'Joins given and family for a person' do
8
+ subject = described_class.new type: :person, given: 'John', family: 'Smith'
9
+ expect(subject.name).to eq 'John Smith'
10
+ end
11
+
12
+ describe 'Gives organisation name for other types' do
13
+ described_class::TYPES.keys.reject { |type| type == :person }.each do |type|
14
+ it type.to_s.capitalize do
15
+ subject = described_class.new type: type, organisation_name: 'Organisation Name'
16
+ expect(subject.name).to eq 'Organisation Name'
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ describe '#to_s' do
23
+ it 'Joins type and name' do
24
+ subject = described_class.new type: :person, given: 'Jane', family: 'Doe'
25
+ expect(subject.to_s).to eq "Person\tJane Doe"
26
+ end
27
+ end
28
+
29
+ describe '#to_gandi' do
30
+ it('Is a person') { expect(described_class.new(type: :person).to_gandi['type']).to eq 0 }
31
+ it('Is a company') { expect(described_class.new(type: :company).to_gandi['type']).to eq 1 }
32
+ it('Is an association') { expect(described_class.new(type: :association).to_gandi['type']).to eq 2 }
33
+ it('Is a public body') { expect(described_class.new(type: :'public body').to_gandi['type']).to eq 3 }
34
+ it('Is a reseller') { expect(described_class.new(type: :reseller).to_gandi['type']).to eq 4 }
35
+ end
36
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::Domain::Contract do
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::Domain::Dates do
4
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::Domain::RenewalInformation do
4
+ describe '#renewable?' do
5
+ before(:each) { Timecop.travel Time.new(2000, 1, 2, 12, 0, 0) }
6
+ let(:future) { Time.new 2000, 1, 3, 0, 0, 0, 0 }
7
+ let(:past) { Time.new 2000, 1, 1, 0, 0, 0, 0 }
8
+
9
+ describe 'Is prohibited' do
10
+ describe 'Begins in the future' do
11
+ it 'Ends in the future' do
12
+ info = described_class.new prohibited: true, begins_at: future, ends_at: future
13
+ expect(info.renewable?).to be false
14
+ end
15
+
16
+ it 'Ends in the past' do
17
+ info = described_class.new prohibited: true, begins_at: future, ends_at: past
18
+ expect(info.renewable?).to be false
19
+ end
20
+
21
+ it 'No end set' do
22
+ info = described_class.new prohibited: true, begins_at: future
23
+ expect(info.renewable?).to be false
24
+ end
25
+ end
26
+
27
+ describe 'Begins in the past' do
28
+ it 'Ends in the future' do
29
+ info = described_class.new prohibited: true, begins_at: past, ends_at: future
30
+ expect(info.renewable?).to be false
31
+ end
32
+
33
+ it 'Ends in the past' do
34
+ info = described_class.new prohibited: true, begins_at: past, ends_at: past
35
+ expect(info.renewable?).to be false
36
+ end
37
+
38
+ it 'No end set' do
39
+ info = described_class.new prohibited: true, begins_at: past
40
+ expect(info.renewable?).to be false
41
+ end
42
+ end
43
+ end
44
+
45
+ describe 'Is not prohibited' do
46
+ describe 'Begins in the future' do
47
+ it 'Ends in the future' do
48
+ info = described_class.new prohibited: false, begins_at: future, ends_at: future
49
+ expect(info.renewable?).to be false
50
+ end
51
+
52
+ it 'Ends in the past' do
53
+ info = described_class.new prohibited: false, begins_at: future, ends_at: past
54
+ expect(info.renewable?).to be false
55
+ end
56
+
57
+ it 'No end set' do
58
+ info = described_class.new prohibited: false, begins_at: future
59
+ expect(info.renewable?).to be false
60
+ end
61
+ end
62
+
63
+ describe 'Begins in the past' do
64
+ it 'Ends in the future' do
65
+ info = described_class.new prohibited: false, begins_at: past, ends_at: future
66
+ expect(info.renewable?).to be true
67
+ end
68
+
69
+ it 'Ends in the past' do
70
+ info = described_class.new prohibited: false, begins_at: past, ends_at: past
71
+ expect(info.renewable?).to be false
72
+ end
73
+
74
+ it 'No end set' do
75
+ info = described_class.new prohibited: false, begins_at: past
76
+ expect(info.renewable?).to be true
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::Domain::RestoreInformation do
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe GandiV5::Domain::SharingSpace do
4
+ end