dnsimple 2.0.0.alpha2 → 2.0.0.alpha3

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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.markdown +6 -2
  3. data/README.markdown +32 -30
  4. data/dnsimple.gemspec +1 -2
  5. data/lib/dnsimple.rb +2 -13
  6. data/lib/dnsimple/client.rb +164 -53
  7. data/lib/dnsimple/client/certificates_service.rb +98 -0
  8. data/lib/dnsimple/client/client_service.rb +8 -0
  9. data/lib/dnsimple/client/contacts_service.rb +82 -0
  10. data/lib/dnsimple/client/domains_service.rb +333 -0
  11. data/lib/dnsimple/client/name_servers_service.rb +69 -0
  12. data/lib/dnsimple/client/registrars_service.rb +105 -0
  13. data/lib/dnsimple/client/services_service.rb +95 -0
  14. data/lib/dnsimple/client/templates_service.rb +180 -0
  15. data/lib/dnsimple/client/users_service.rb +37 -0
  16. data/lib/dnsimple/compatibility.rb +46 -0
  17. data/lib/dnsimple/default.rb +86 -0
  18. data/lib/dnsimple/error.rb +7 -11
  19. data/lib/dnsimple/extra.rb +54 -0
  20. data/lib/dnsimple/struct.rb +29 -0
  21. data/lib/dnsimple/struct/certificate.rb +56 -0
  22. data/lib/dnsimple/struct/contact.rb +61 -0
  23. data/lib/dnsimple/struct/domain.rb +40 -0
  24. data/lib/dnsimple/struct/email_forward.rb +14 -0
  25. data/lib/dnsimple/struct/extended_attribute.rb +39 -0
  26. data/lib/dnsimple/struct/membership.rb +22 -0
  27. data/lib/dnsimple/struct/price.rb +16 -0
  28. data/lib/dnsimple/struct/record.rb +22 -0
  29. data/lib/dnsimple/struct/service.rb +19 -0
  30. data/lib/dnsimple/struct/template.rb +19 -0
  31. data/lib/dnsimple/struct/template_record.rb +24 -0
  32. data/lib/dnsimple/struct/transfer_order.rb +10 -0
  33. data/lib/dnsimple/struct/user.rb +17 -0
  34. data/lib/dnsimple/struct/whois_privacy.rb +19 -0
  35. data/lib/dnsimple/version.rb +1 -1
  36. data/spec/dnsimple/client/certificates_service_spec.rb +196 -0
  37. data/spec/dnsimple/client/contacts_service_spec.rb +179 -0
  38. data/spec/dnsimple/client/domains_service_spec.rb +662 -0
  39. data/spec/dnsimple/client/name_servers_service_spec.rb +131 -0
  40. data/spec/dnsimple/client/registrars_service_spec.rb +160 -0
  41. data/spec/dnsimple/client/services_service_spec.rb +162 -0
  42. data/spec/dnsimple/client/templates_service_spec.rb +371 -0
  43. data/spec/dnsimple/client/users_service_spec.rb +70 -0
  44. data/spec/dnsimple/client_spec.rb +108 -99
  45. data/spec/dnsimple/compatibility_spec.rb +57 -0
  46. data/spec/files/2fa/exchange-token.http +8 -11
  47. data/spec/files/badgateway.http +14 -0
  48. data/spec/files/certificates/configure/success.http +19 -0
  49. data/spec/files/certificates/index/success.http +1 -1
  50. data/spec/files/certificates/notfound.http +19 -0
  51. data/spec/files/certificates/purchase/success.http +19 -0
  52. data/spec/files/certificates/show/success.http +1 -1
  53. data/spec/files/certificates/submit/success.http +19 -0
  54. data/spec/files/contacts/create/badrequest-missingcontact.http +19 -0
  55. data/spec/files/contacts/create/badrequest-validationerror.http +19 -0
  56. data/spec/files/contacts/create/created.http +22 -0
  57. data/spec/files/contacts/delete/success-204.http +18 -0
  58. data/spec/files/{extended_attributes/com.http → contacts/delete/success.http} +5 -5
  59. data/spec/files/{domains/auto_renewal_enable → contacts/index}/success.http +6 -6
  60. data/spec/files/contacts/notfound.http +19 -0
  61. data/spec/files/contacts/update/success.http +21 -0
  62. data/spec/files/domains/create/created.http +21 -0
  63. data/spec/files/domains/index/success.http +11 -9
  64. data/spec/files/domains/notfound.http +11 -9
  65. data/spec/files/domains/show/success.http +12 -10
  66. data/spec/files/domains_autorenewal/disable/success.http +21 -0
  67. data/spec/files/domains_autorenewal/enable/success.http +21 -0
  68. data/spec/files/domains_autorenewal/notfound-domain.http +19 -0
  69. data/spec/files/domains_forwards/create/created.http +22 -0
  70. data/spec/files/domains_forwards/delete/success.http +17 -0
  71. data/spec/files/domains_forwards/get/success.http +21 -0
  72. data/spec/files/domains_forwards/list/success.http +21 -0
  73. data/spec/files/domains_forwards/notfound-domain.http +19 -0
  74. data/spec/files/domains_forwards/notfound.http +19 -0
  75. data/spec/files/domains_records/create/created.http +21 -0
  76. data/spec/files/domains_records/delete/success-204.http +18 -0
  77. data/spec/files/{contacts/show/notfound.http → domains_records/delete/success.http} +9 -7
  78. data/spec/files/{records → domains_records}/index/success.http +0 -0
  79. data/spec/files/{records/show → domains_records}/notfound.http +1 -1
  80. data/spec/files/{records → domains_records}/show/success.http +0 -0
  81. data/spec/files/domains_records/update/success.http +21 -0
  82. data/spec/files/domains_sharing/create/success.http +21 -0
  83. data/spec/files/domains_sharing/delete/success.http +17 -0
  84. data/spec/files/domains_sharing/list/success.http +21 -0
  85. data/spec/files/domains_sharing/notfound-domain.http +19 -0
  86. data/spec/files/domains_sharing/notfound.http +19 -0
  87. data/spec/files/domains_whois_privacy/disable/success.http +21 -0
  88. data/spec/files/domains_whois_privacy/enable/success.http +22 -0
  89. data/spec/files/domains_zones/get/success.http +21 -0
  90. data/spec/files/domains_zones/notfound-domain.http +19 -0
  91. data/spec/files/{domains/auto_renewal_disable/notfound.http → nameservers/change/success.http} +23 -21
  92. data/spec/files/nameservers/deregister/success.http +17 -0
  93. data/spec/files/{domains/auto_renewal_enable/notfound.http → nameservers/list/success.http} +23 -21
  94. data/spec/files/nameservers/notfound-domain.http +19 -0
  95. data/spec/files/nameservers/register/badrequest-valueerror.http +19 -0
  96. data/spec/files/nameservers/register/success.http +21 -0
  97. data/spec/files/registrars/check/available.http +19 -0
  98. data/spec/files/registrars/check/registered.http +21 -0
  99. data/spec/files/registrars/register/badrequest-missingdomain.http +19 -0
  100. data/spec/files/registrars/register/badrequest-missingregistrant.http +19 -0
  101. data/spec/files/registrars/register/success.http +21 -0
  102. data/spec/files/registrars/renew/badrequest-missingrenewal.http +19 -0
  103. data/spec/files/registrars/renew/badrequest-unable.http +19 -0
  104. data/spec/files/registrars/renew/success.http +21 -0
  105. data/spec/files/registrars/transfer/success.http +21 -0
  106. data/spec/files/registrars_extended_attributes/list/success.http +21 -0
  107. data/spec/files/registrars_prices/list/success.http +21 -0
  108. data/spec/files/services/applied/success.http +21 -0
  109. data/spec/files/services/apply/success.http +21 -0
  110. data/spec/files/services/available/success.http +21 -0
  111. data/spec/files/services/index/success.http +21 -0
  112. data/spec/files/services/notfound.http +19 -0
  113. data/spec/files/services/show/success.http +21 -0
  114. data/spec/files/services/unapply/success.http +21 -0
  115. data/spec/files/subscription/show/success.http +21 -0
  116. data/spec/files/templates/apply/success.http +21 -0
  117. data/spec/files/templates/create/created.http +22 -0
  118. data/spec/files/templates/delete/success-204.http +21 -0
  119. data/spec/files/templates/delete/success.http +21 -0
  120. data/spec/files/templates/index/success.http +21 -0
  121. data/spec/files/templates/notfound.http +19 -0
  122. data/spec/files/templates/show/success.http +12 -10
  123. data/spec/files/templates/update/success.http +21 -0
  124. data/spec/files/templates_records/create/created.http +22 -0
  125. data/spec/files/templates_records/delete/success-204.http +19 -0
  126. data/spec/files/templates_records/delete/success.http +21 -0
  127. data/spec/files/templates_records/index/success.http +21 -0
  128. data/spec/files/templates_records/notfound.http +19 -0
  129. data/spec/files/templates_records/show/success.http +21 -0
  130. data/spec/files/templates_records/update/success.http +21 -0
  131. data/spec/files/users/user/success.http +21 -0
  132. data/spec/spec_helper.rb +0 -2
  133. metadata +206 -73
  134. data/lib/dnsimple/base.rb +0 -10
  135. data/lib/dnsimple/certificate.rb +0 -143
  136. data/lib/dnsimple/contact.rb +0 -157
  137. data/lib/dnsimple/domain.rb +0 -252
  138. data/lib/dnsimple/extended_attribute.rb +0 -52
  139. data/lib/dnsimple/record.rb +0 -94
  140. data/lib/dnsimple/service.rb +0 -42
  141. data/lib/dnsimple/template.rb +0 -65
  142. data/lib/dnsimple/template_record.rb +0 -80
  143. data/lib/dnsimple/transfer_order.rb +0 -34
  144. data/lib/dnsimple/user.rb +0 -50
  145. data/spec/dnsimple/certificate_spec.rb +0 -59
  146. data/spec/dnsimple/contact_spec.rb +0 -45
  147. data/spec/dnsimple/domain_spec.rb +0 -241
  148. data/spec/dnsimple/extended_attributes_spec.rb +0 -54
  149. data/spec/dnsimple/record_spec.rb +0 -51
  150. data/spec/dnsimple/template_spec.rb +0 -31
  151. data/spec/dnsimple/user_spec.rb +0 -70
  152. data/spec/files/account/user/success.http +0 -19
  153. data/spec/files/certificates/show/notfound.http +0 -17
  154. data/spec/files/domains/auto_renewal_disable/success.http +0 -23
  155. data/spec/files/domains/create/success.http +0 -19
  156. data/spec/files/extended_attributes/ca.http +0 -19
  157. data/spec/files/extended_attributes/success.http +0 -19
  158. data/spec/files/templates/show/notfound.http +0 -17
@@ -0,0 +1,22 @@
1
+ module Dnsimple
2
+ module Struct
3
+
4
+ class Record < Base
5
+ attr_accessor :id
6
+ attr_accessor :domain_id
7
+ attr_accessor :name
8
+ attr_accessor :type
9
+ attr_accessor :content
10
+ attr_accessor :ttl
11
+ attr_accessor :priority
12
+ attr_accessor :created_at
13
+ attr_accessor :updated_at
14
+
15
+ alias :prio :priority
16
+ alias :prio= :priority=
17
+ alias :record_type :type
18
+ alias :record_type= :type=
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ module Dnsimple
2
+ module Struct
3
+
4
+ class Service < Base
5
+ # @return [Fixnum] The service ID in DNSimple.
6
+ attr_accessor :id
7
+
8
+ # @return [String] The service name.
9
+ attr_accessor :name
10
+
11
+ # @return [String] The URI-compatible slug.
12
+ attr_accessor :short_name
13
+
14
+ # @return [String] The description.
15
+ attr_accessor :description
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Dnsimple
2
+ module Struct
3
+
4
+ class Template < Base
5
+ # @return [Fixnum] The template ID in DNSimple.
6
+ attr_accessor :id
7
+
8
+ # @return [String] The template name.
9
+ attr_accessor :name
10
+
11
+ # @return [String] The URI-compatible slug.
12
+ attr_accessor :short_name
13
+
14
+ # @return [String] The description.
15
+ attr_accessor :description
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module Dnsimple
2
+ module Struct
3
+
4
+ class TemplateRecord < Base
5
+ attr_accessor :id
6
+ attr_accessor :dns_template_id
7
+ attr_accessor :name
8
+ attr_accessor :type
9
+ attr_accessor :content
10
+ attr_accessor :ttl
11
+ attr_accessor :priority
12
+ attr_accessor :created_at
13
+ attr_accessor :updated_at
14
+
15
+ alias :template_id :dns_template_id
16
+ alias :template_id= :dns_template_id=
17
+ alias :prio :priority
18
+ alias :prio= :priority=
19
+ alias :record_type :type
20
+ alias :record_type= :type=
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,10 @@
1
+ module Dnsimple
2
+ module Struct
3
+
4
+ class TransferOrder < Base
5
+ attr_accessor :id
6
+ attr_accessor :status
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ module Dnsimple
2
+ module Struct
3
+
4
+ class User < Base
5
+ attr_accessor :id
6
+ attr_accessor :email
7
+ attr_accessor :api_token
8
+ attr_accessor :domain_count
9
+ attr_accessor :domain_limit
10
+ attr_accessor :login_count
11
+ attr_accessor :failed_login_count
12
+ attr_accessor :created_at
13
+ attr_accessor :updated_at
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module Dnsimple
2
+ module Struct
3
+
4
+ class WhoisPrivacy < Base
5
+ # @return [Fixnum] The WHOIS privacy ID in DNSimple.
6
+ attr_accessor :id
7
+
8
+ # @return [Fixnum] The associated domain ID.
9
+ attr_accessor :domain_id
10
+
11
+ # @return [Bool] Whether the WHOIS privacy is enabled.
12
+ attr_accessor :enabled
13
+
14
+ # @return [String] The date the domain will expire.
15
+ attr_accessor :expires_on
16
+ end
17
+
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module Dnsimple
2
- VERSION = '2.0.0.alpha2'
2
+ VERSION = '2.0.0.alpha3'
3
3
  end
@@ -0,0 +1,196 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dnsimple::Client, ".certificates" do
4
+
5
+ subject { described_class.new(api_endpoint: "https://api.zone", username: "user", api_token: "token").certificates }
6
+
7
+
8
+ describe "#list" do
9
+ before do
10
+ stub_request(:get, %r[/v1/domains/.+/certificates$]).
11
+ to_return(read_fixture("certificates/index/success.http"))
12
+ end
13
+
14
+ it "builds the correct request" do
15
+ subject.list("example.com")
16
+
17
+ expect(WebMock).to have_requested(:get, "https://api.zone/v1/domains/example.com/certificates").
18
+ with(headers: { 'Accept' => 'application/json' })
19
+ end
20
+
21
+ it "returns the records" do
22
+ results = subject.list("example.com")
23
+
24
+ expect(results).to be_a(Array)
25
+ expect(results.size).to eq(2)
26
+
27
+ results.each do |result|
28
+ expect(result).to be_a(Dnsimple::Struct::Certificate)
29
+ expect(result.id).to be_a(Fixnum)
30
+ end
31
+ end
32
+
33
+ context "when something does not exist" do
34
+ it "raises RecordNotFound" do
35
+ stub_request(:get, %r[/v1]).
36
+ to_return(read_fixture("domains/notfound.http"))
37
+
38
+ expect {
39
+ subject.list("example.com")
40
+ }.to raise_error(Dnsimple::RecordNotFound)
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#find" do
46
+ before do
47
+ stub_request(:get, %r[/v1/domains/.+/certificates/.+$]).
48
+ to_return(read_fixture("certificates/show/success.http"))
49
+ end
50
+
51
+ it "builds the correct request" do
52
+ subject.find("example.com", 2)
53
+
54
+ expect(WebMock).to have_requested(:get, "https://api.zone/v1/domains/example.com/certificates/2").
55
+ with(headers: { 'Accept' => 'application/json' })
56
+ end
57
+
58
+ it "returns the certificate" do
59
+ result = subject.find("example.com", 2)
60
+
61
+ expect(result).to be_a(Dnsimple::Struct::Certificate)
62
+ expect(result.id).to eq(4576)
63
+ expect(result.domain_id).to eq(79569)
64
+ expect(result.contact_id).to eq(11549)
65
+ expect(result.name).to eq("www")
66
+ expect(result.state).to eq("cancelled")
67
+ expect(result.csr).to eq("-----BEGIN NEW CERTIFICATE REQUEST-----\nRHr2akB4KMba6FMAsvlStnO/2ika16hNx+d3smPNsER+HA==\n-----END NEW CERTIFICATE REQUEST-----\n")
68
+ expect(result.ssl_certificate).to eq("-----BEGIN CERTIFICATE-----\nXwTkw5UCPpaVyUYcwHlvaprOe9ZbwIyEHm2AT1rW+70=\n-----END CERTIFICATE-----\n")
69
+ expect(result.private_key).to eq("-----BEGIN RSA PRIVATE KEY-----\nUeXbFi7o+nuPfRhpBFQEKwacKFc3Hnc1hH6UsnC0KY25cUif7yz38A==\n-----END RSA PRIVATE KEY-----\n")
70
+ expect(result.approver_email).to eq("example@example.net")
71
+ expect(result.created_at).to eq("2013-09-17T21:54:42Z")
72
+ expect(result.updated_at).to eq("2013-09-17T22:25:36Z")
73
+ expect(result.configured_at).to eq("2013-09-17T22:25:01Z")
74
+ expect(result.expires_on).to eq("2014-09-17")
75
+ end
76
+
77
+ context "when something does not exist" do
78
+ it "raises RecordNotFound" do
79
+ stub_request(:get, %r[/v1]).
80
+ to_return(read_fixture("certificates/notfound.http"))
81
+
82
+ expect {
83
+ subject.find("example.com", 2)
84
+ }.to raise_error(Dnsimple::RecordNotFound)
85
+ end
86
+ end
87
+ end
88
+
89
+ describe "#purchase" do
90
+ before do
91
+ stub_request(:post, %r[/v1/domains/.+/certificates$]).
92
+ to_return(read_fixture("certificates/purchase/success.http"))
93
+ end
94
+
95
+ it "builds the correct request" do
96
+ subject.purchase("example.com", "www", 100)
97
+
98
+ expect(WebMock).to have_requested(:post, "https://api.zone/v1/domains/example.com/certificates").
99
+ with(body: { certificate: { name: "www", contact_id: "100" } }).
100
+ with(headers: { 'Accept' => 'application/json' })
101
+ end
102
+
103
+ it "merges custom options" do
104
+ subject.purchase("example.com", "www", 100, certificate: { csr: "CUSTOM" }, something: "else")
105
+
106
+ expect(WebMock).to have_requested(:post, "https://api.zone/v1/domains/example.com/certificates").
107
+ with(body: { certificate: { name: "www", contact_id: "100", csr: "CUSTOM" }, something: "else"}).
108
+ with(headers: { 'Accept' => 'application/json' })
109
+ end
110
+
111
+ it "returns the certificate" do
112
+ result = subject.purchase("example.com", "www", 100)
113
+
114
+ expect(result).to be_a(Dnsimple::Struct::Certificate)
115
+ expect(result.id).to be_a(Fixnum)
116
+ end
117
+
118
+ context "when something does not exist" do
119
+ it "raises RecordNotFound" do
120
+ stub_request(:post, %r[/v1]).
121
+ to_return(read_fixture("domains/notfound.http"))
122
+
123
+ expect {
124
+ subject.purchase("example.com", "www", 100)
125
+ }.to raise_error(Dnsimple::RecordNotFound)
126
+ end
127
+ end
128
+ end
129
+
130
+ describe "#configure" do
131
+ before do
132
+ stub_request(:put, %r[/v1/domains/.+/certificates/.+/configure$]).
133
+ to_return(read_fixture("certificates/configure/success.http"))
134
+ end
135
+
136
+ it "builds the correct request" do
137
+ subject.configure("example.com", 2)
138
+
139
+ expect(WebMock).to have_requested(:put, "https://api.zone/v1/domains/example.com/certificates/2/configure").
140
+ with(body: {}).
141
+ with(headers: { 'Accept' => 'application/json' })
142
+ end
143
+
144
+ it "returns the certificate" do
145
+ result = subject.configure("example.com", 2)
146
+
147
+ expect(result).to be_a(Dnsimple::Struct::Certificate)
148
+ expect(result.id).to be_a(Fixnum)
149
+ end
150
+
151
+ context "when something does not exist" do
152
+ it "raises RecordNotFound" do
153
+ stub_request(:put, %r[/v1]).
154
+ to_return(read_fixture("certificates/notfound.http"))
155
+
156
+ expect {
157
+ subject.configure("example.com", 2)
158
+ }.to raise_error(Dnsimple::RecordNotFound)
159
+ end
160
+ end
161
+ end
162
+
163
+ describe "#submit" do
164
+ before do
165
+ stub_request(:put, %r[/v1/domains/.+/certificates/.+/submit]).
166
+ to_return(read_fixture("certificates/submit/success.http"))
167
+ end
168
+
169
+ it "builds the correct request" do
170
+ subject.submit("example.com", 2, "admin@example.com")
171
+
172
+ expect(WebMock).to have_requested(:put, "https://api.zone/v1/domains/example.com/certificates/2/submit").
173
+ with(body: { certificate: { approver_email: "admin@example.com" } }).
174
+ with(headers: { 'Accept' => 'application/json' })
175
+ end
176
+
177
+ it "returns the certificate" do
178
+ result = subject.submit("example.com", 2, "admin@example.com")
179
+
180
+ expect(result).to be_a(Dnsimple::Struct::Certificate)
181
+ expect(result.id).to be_a(Fixnum)
182
+ end
183
+
184
+ context "when something does not exist" do
185
+ it "raises RecordNotFound" do
186
+ stub_request(:put, %r[/v1]).
187
+ to_return(read_fixture("certificates/notfound.http"))
188
+
189
+ expect {
190
+ subject.submit("example.com", 2, "admin@example.com")
191
+ }.to raise_error(Dnsimple::RecordNotFound)
192
+ end
193
+ end
194
+ end
195
+
196
+ end
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dnsimple::Client, ".contacts" do
4
+
5
+ subject { described_class.new(api_endpoint: "https://api.zone", username: "user", api_token: "token").contacts }
6
+
7
+
8
+ describe "#list" do
9
+ before do
10
+ stub_request(:get, %r[/v1/contacts$]).
11
+ to_return(read_fixture("contacts/index/success.http"))
12
+ end
13
+
14
+ it "builds the correct request" do
15
+ subject.list
16
+
17
+ expect(WebMock).to have_requested(:get, "https://api.zone/v1/contacts").
18
+ with(headers: { 'Accept' => 'application/json' })
19
+ end
20
+
21
+ it "returns the contacts" do
22
+ results = subject.list
23
+
24
+ expect(results).to be_a(Array)
25
+ expect(results.size).to eq(1)
26
+
27
+ results.each do |result|
28
+ expect(result).to be_a(Dnsimple::Struct::Contact)
29
+ expect(result.id).to be_a(Fixnum)
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "#create" do
35
+ before do
36
+ stub_request(:post, %r[/v1/contacts]).
37
+ to_return(read_fixture("contacts/create/created.http"))
38
+ end
39
+
40
+ let(:attributes) { { first_name: "Simone", last_name: "Carletti", address1: "", city: "Rome", state_province: "RM", postal_code: "00171", country: "IT", email_address: "", phone: "" } }
41
+
42
+ it "builds the correct request" do
43
+ subject.create(attributes)
44
+
45
+ expect(WebMock).to have_requested(:post, "https://api.zone/v1/contacts").
46
+ with(body: { contact: attributes }).
47
+ with(headers: { 'Accept' => 'application/json' })
48
+ end
49
+
50
+ it "returns the contact" do
51
+ result = subject.create(attributes)
52
+
53
+ expect(result).to be_a(Dnsimple::Struct::Contact)
54
+ expect(result.id).to be_a(Fixnum)
55
+ end
56
+ end
57
+
58
+ describe "#find" do
59
+ before do
60
+ stub_request(:get, %r[/v1/contacts/.+$]).
61
+ to_return(read_fixture("contacts/show/success.http"))
62
+ end
63
+
64
+ it "builds the correct request" do
65
+ subject.find(1)
66
+
67
+ expect(WebMock).to have_requested(:get, "https://api.zone/v1/contacts/1").
68
+ with(headers: { 'Accept' => 'application/json' })
69
+ end
70
+
71
+ it "returns the contact" do
72
+ result = subject.find(1)
73
+
74
+ expect(result).to be_a(Dnsimple::Struct::Contact)
75
+ expect(result.id).to eq(2)
76
+ expect(result.label).to eq("Default")
77
+ expect(result.first_name).to eq("Simone")
78
+ expect(result.last_name).to eq("Carletti")
79
+ expect(result.job_title).to eq("Underwater Programmer")
80
+ expect(result.organization_name).to eq("Dnsimple")
81
+ expect(result.email_address).to eq("example@example.com")
82
+ expect(result.phone).to eq("+1 111 000000")
83
+ expect(result.fax).to eq("+1 222 000000")
84
+ expect(result.address1).to eq("Awesome Street")
85
+ expect(result.address2).to eq("c/o Someone")
86
+ expect(result.city).to eq("Rome")
87
+ expect(result.state_province).to eq("RM")
88
+ expect(result.postal_code).to eq("00171")
89
+ expect(result.country).to eq("IT")
90
+ expect(result.created_at).to eq("2013-11-08T17:23:15Z")
91
+ expect(result.updated_at).to eq("2013-11-08T17:23:15Z")
92
+ end
93
+
94
+ context "when something does not exist" do
95
+ it "raises RecordNotFound" do
96
+ stub_request(:get, %r[/v1]).
97
+ to_return(read_fixture("contacts/notfound.http"))
98
+
99
+ expect {
100
+ subject.find(1)
101
+ }.to raise_error(Dnsimple::RecordNotFound)
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "#update" do
107
+ before do
108
+ stub_request(:put, %r[/v1/contacts/.+$]).
109
+ to_return(read_fixture("contacts/update/success.http"))
110
+ end
111
+
112
+ it "builds the correct request" do
113
+ subject.update(1, { label: "Updated" })
114
+
115
+ expect(WebMock).to have_requested(:put, "https://api.zone/v1/contacts/1").
116
+ with(body: { contact: { label: "Updated" } }).
117
+ with(headers: { 'Accept' => 'application/json' })
118
+ end
119
+
120
+ it "returns the contact" do
121
+ result = subject.update(1, {})
122
+
123
+ expect(result).to be_a(Dnsimple::Struct::Contact)
124
+ expect(result.id).to be_a(Fixnum)
125
+ end
126
+
127
+ context "when something does not exist" do
128
+ it "raises RecordNotFound" do
129
+ stub_request(:put, %r[/v1]).
130
+ to_return(read_fixture("contacts/notfound.http"))
131
+
132
+ expect {
133
+ subject.update(1, {})
134
+ }.to raise_error(Dnsimple::RecordNotFound)
135
+ end
136
+ end
137
+ end
138
+
139
+ describe "#delete" do
140
+ before do
141
+ stub_request(:delete, %r[/v1/contacts/1$]).
142
+ to_return(read_fixture("contacts/delete/success.http"))
143
+ end
144
+
145
+ it "builds the correct request" do
146
+ subject.delete(1)
147
+
148
+ expect(WebMock).to have_requested(:delete, "https://api.zone/v1/contacts/1").
149
+ with(headers: { 'Accept' => 'application/json' })
150
+ end
151
+
152
+ it "returns nothing" do
153
+ result = subject.delete(1)
154
+
155
+ expect(result).to be_truthy
156
+ end
157
+
158
+ it "supports HTTP 204" do
159
+ stub_request(:delete, %r[/v1]).
160
+ to_return(read_fixture("contacts/delete/success-204.http"))
161
+
162
+ result = subject.delete(1)
163
+
164
+ expect(result).to be_truthy
165
+ end
166
+
167
+ context "when something does not exist" do
168
+ it "raises RecordNotFound" do
169
+ stub_request(:delete, %r[/v1]).
170
+ to_return(read_fixture("contacts/notfound.http"))
171
+
172
+ expect {
173
+ subject.delete(1)
174
+ }.to raise_error(Dnsimple::RecordNotFound)
175
+ end
176
+ end
177
+ end
178
+
179
+ end