kono_epp_client 0.0.3 → 0.1.1

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 (40) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +16 -0
  4. data/Rakefile +6 -0
  5. data/kono_epp_client.gemspec +39 -0
  6. data/lib/epp/epp_command/check_contacts.rb +17 -0
  7. data/lib/epp/epp_command/create_domain.rb +4 -2
  8. data/lib/epp/epp_command/kono_epp_check_domains.rb +18 -0
  9. data/lib/epp/epp_command/transfer_domain.rb +22 -5
  10. data/lib/epp/epp_command/update_domain.rb +60 -44
  11. data/lib/epp/exceptions.rb +10 -0
  12. data/lib/epp/server.rb +116 -84
  13. data/lib/epp/transport/http.rb +10 -5
  14. data/lib/kono_epp_client/VERSION +1 -0
  15. data/lib/kono_epp_client/version.rb +3 -0
  16. data/lib/kono_epp_client.rb +5 -14
  17. data/spec/epp/epp_command/kono_epp_check_contacts_spec.rb +25 -0
  18. data/spec/epp/epp_command/kono_epp_check_domains_spec.rb +16 -0
  19. data/spec/epp/epp_command/kono_epp_create_domain_spec.rb +37 -0
  20. data/spec/epp/epp_command/kono_epp_transfer_domain_spec.rb +33 -0
  21. data/spec/epp/epp_command/kono_epp_update_domain_spec.rb +125 -0
  22. data/spec/epp/kono_epp_command_spec.rb +16 -0
  23. data/spec/epp/server_spec.rb +69 -0
  24. data/spec/fixtures/snapshots/kono_epp_check_contacts/_construct.xml.snap +13 -0
  25. data/spec/fixtures/snapshots/kono_epp_check_domains/_construct.xml.snap +11 -0
  26. data/spec/fixtures/snapshots/kono_epp_create_domain/_create.xml.snap +29 -0
  27. data/spec/fixtures/snapshots/kono_epp_transfer_domain/_con_extension_construct.xml.snap +23 -0
  28. data/spec/fixtures/snapshots/kono_epp_transfer_domain/_construct.xml.snap +13 -0
  29. data/spec/fixtures/snapshots/kono_epp_update_domain/_restore_esiste_l'estensione_di_restore.xml.snap +15 -0
  30. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_auth_info_cambia_AUTH_INFO.xml.snap +15 -0
  31. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_auth_info_con_nuovo_registrant_cambia_REGISTRANT.xml.snap +16 -0
  32. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_contacts_cambia_ADMIN_TECH.xml.snap +18 -0
  33. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_nameservers_aggiunge_e_rimuove_ns.xml.snap +28 -0
  34. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_status_cambia_status.xml.snap +16 -0
  35. data/spec/spec_helper.rb +111 -0
  36. data/spec/support/context.rb +15 -0
  37. data/spec/support/matchers.rb +6 -0
  38. data/spec/support/snapshot.rb +20 -0
  39. data/spec/support/superdiff.rb +1 -0
  40. metadata +159 -6
data/lib/epp/server.rb CHANGED
@@ -5,7 +5,9 @@ module KonoEppClient #:nodoc:
5
5
 
6
6
  require 'nokogiri'
7
7
 
8
- attr_accessor :tag, :password, :server, :port, :old_server, :services, :lang, :extensions, :version, :credit, :timeout
8
+ attr_accessor :tag, :password, :server, :port, :ssl_version, :old_server,
9
+ :services, :lang, :extensions, :version, :credit, :timeout,
10
+ :transport, :transport_options
9
11
 
10
12
  # ==== Required Attrbiutes
11
13
  #
@@ -22,22 +24,30 @@ module KonoEppClient #:nodoc:
22
24
  # * <tt>:services</tt> - Use custom EPP services in the <login> frame. The defaults use the EPP standard domain, contact and host 1.0 services.
23
25
  # * <tt>:extensions</tt> - URLs to custom extensions to standard EPP. Use these to extend the standard EPP (e.g., Nominet uses extensions). Defaults to none.
24
26
  # * <tt>:version</tt> - Set the EPP version. Defaults to "1.0".
27
+ # * <tt>:transport</tt> - Type of connection (http or tcp). Default to "tcp"
28
+ # * <tt>:transport_options</tt> - Overrides for transport configurations. Default to {}
29
+ # * <tt>:timeout</tt> - Timeou for connections in seconds. Default to "30"
30
+ # * <tt>:ssl_version</tt> - Version of the ssl protocol versione. Default to TLSv1
31
+ # * <tt>:ssl_version</tt> - Version of the ssl protocol versione. Default to TLSv1
32
+ #
25
33
  def initialize(attributes = {})
26
34
  requires!(attributes, :tag, :password, :server)
27
35
 
28
- @tag = attributes[:tag]
29
- @password = attributes[:password]
30
- @server = attributes[:server]
31
- @port = attributes[:port] || 700
36
+ @tag = attributes[:tag]
37
+ @password = attributes[:password]
38
+ @server = attributes[:server]
39
+ @port = attributes[:port] || 700
32
40
  @old_server = attributes[:old_server] || false
33
- @lang = attributes[:lang] || "en"
34
- @services = attributes[:services] || ["urn:ietf:params:xml:ns:domain-1.0", "urn:ietf:params:xml:ns:contact-1.0", "urn:ietf:params:xml:ns:host-1.0"]
41
+ @lang = attributes[:lang] || "en"
42
+ @services = attributes[:services] || ["urn:ietf:params:xml:ns:domain-1.0", "urn:ietf:params:xml:ns:contact-1.0", "urn:ietf:params:xml:ns:host-1.0"]
35
43
  @extensions = attributes[:extensions] || []
36
- @version = attributes[:version] || "1.0"
37
- @transport = attributes[:transport] || :tcp
38
- @timeout = attributes[:timeout] || 30
44
+ @version = attributes[:version] || "1.0"
45
+ @transport = attributes[:transport] || :tcp
46
+ @transport_options = attributes[:transport_options] || {}
47
+ @timeout = attributes[:timeout] || 30
48
+ @ssl_version = attributes[:ssl_version] || :TLSv1
39
49
 
40
- @logged_in = false
50
+ @logged_in = false
41
51
  end
42
52
 
43
53
  def connect_and_hello
@@ -55,13 +65,13 @@ module KonoEppClient #:nodoc:
55
65
  # <tt><login></tt> and <tt><logout></tt> requests are also wrapped
56
66
  # around the request, so we can close the socket immediately after
57
67
  # the request is made.
58
- def request( xml )
68
+ def request(xml)
59
69
  # open_connection
60
70
 
61
71
  # @logged_in = true if login
62
72
 
63
73
  begin
64
- @response = send_request( xml )
74
+ @response = send_request(xml)
65
75
  ensure
66
76
  if @logged_in && !old_server
67
77
  @logged_in = false if logout
@@ -73,7 +83,7 @@ module KonoEppClient #:nodoc:
73
83
 
74
84
  # Sends a standard login request to the EPP server.
75
85
  def login
76
- login = KonoEppLogin.new( tag, password )
86
+ login = KonoEppLogin.new(tag, password)
77
87
 
78
88
  # FIXME: Order matters
79
89
  login.version = version
@@ -82,11 +92,11 @@ module KonoEppClient #:nodoc:
82
92
  login.services = services
83
93
  login.extensions = extensions
84
94
 
85
- send_command( login )
95
+ send_command(login)
86
96
  end
87
97
 
88
- def change_password( new_password )
89
- login = KonoEppLogin.new( tag, password )
98
+ def change_password(new_password)
99
+ login = KonoEppLogin.new(tag, password)
90
100
 
91
101
  # FIXME: Order matters
92
102
  login.new_password = new_password
@@ -97,7 +107,7 @@ module KonoEppClient #:nodoc:
97
107
  login.services = services
98
108
  login.extensions = extensions
99
109
 
100
- send_command( login )
110
+ send_command(login)
101
111
  end
102
112
 
103
113
  def logged_in?
@@ -112,144 +122,166 @@ module KonoEppClient #:nodoc:
112
122
 
113
123
  # FIXME: Remove command wrappers?
114
124
  def hello
115
- response = Hpricot.XML( send_request( KonoEppHello.new.to_s ) )
125
+ send_request(KonoEppHello.new.to_s)
116
126
  end
117
127
 
118
- def poll( id = nil )
119
- poll = KonoEppPoll.new( id ? :ack : :req )
128
+ def poll(id = nil)
129
+ poll = KonoEppPoll.new(id ? :ack : :req)
120
130
 
121
131
  poll.ack_id = id if id
122
132
 
123
- send_command( poll )
133
+ send_command(poll)
124
134
  end
125
135
 
126
- def create_contact( options )
136
+ def create_contact(options)
127
137
  contact = KonoEppCreateContact.new options
128
- send_command( contact )
138
+ send_command(contact)
139
+ end
140
+
141
+ def check_contacts(ids)
142
+ send_command(KonoEppCheckContacts.new(ids))
129
143
  end
130
144
 
131
- def delete_contact( id )
145
+ def delete_contact(id)
132
146
  contact = KonoEppDeleteContact.new id
133
- send_command( contact )
147
+ send_command(contact)
134
148
  end
135
149
 
136
- def update_contact( options )
150
+ def update_contact(options)
137
151
  contact = KonoEppUpdateContact.new options
138
- send_command( contact )
152
+ send_command(contact)
139
153
  end
140
154
 
141
- def create_domain( options )
155
+ def create_domain(options)
142
156
  domain = KonoEppCreateDomain.new options
143
- send_command( domain )
157
+ send_command(domain)
144
158
  end
145
159
 
146
- def update_domain( options )
160
+ def check_domains(*domains)
161
+ send_command(KonoEppCheckDomains.new *domains)
162
+ end
163
+
164
+ def update_domain(options)
147
165
  domain = KonoEppUpdateDomain.new options
148
- send_command( domain )
166
+ send_command(domain)
149
167
  end
150
168
 
151
- def delete_domain( name )
169
+ def delete_domain(name)
152
170
  domain = KonoEppDeleteDomain.new name
153
- send_command( domain )
171
+ send_command(domain)
154
172
  end
155
173
 
156
- def info_contact( id )
174
+ def info_contact(id)
157
175
  contact = KonoEppInfoContact.new id
158
- send_command( contact )
176
+ send_command(contact)
159
177
  end
160
178
 
161
- def info_domain( name )
179
+ def info_domain(name)
162
180
  info = KonoEppInfoDomain.new name
163
- send_command( info )
181
+ send_command(info)
164
182
  end
165
183
 
166
- def transfer_domain( name, authinfo, op )
167
- transfer = KonoEppTransferDomain.new name, authinfo, op
168
- send_command( transfer )
184
+ def transfer_domain(name, authinfo, op, extension: nil)
185
+ send_command(KonoEppTransferDomain.new(name, authinfo, op, extension: extension))
169
186
  end
170
187
 
171
188
  # Sends a standard logout request to the EPP server.
172
189
  def logout
173
- send_command( KonoEppLogout.new, 1500 )
190
+ send_command(KonoEppLogout.new, 1500)
174
191
  end
175
192
 
176
- # private
193
+ # private
177
194
  # Wrapper which sends XML to the server, and receives
178
195
  # the response in return.
179
- def send_request( xml )
180
- write( xml )
196
+ def send_request(xml)
197
+ write(xml)
181
198
  read
182
199
  end
183
200
 
184
- def send_command( command, expected_result = 1000..1999 )
185
- namespaces = { 'extepp' => 'http://www.nic.it/ITNIC-EPP/extepp-2.0',
186
- 'xmlns' => "urn:ietf:params:xml:ns:epp-1.0" }
201
+ def send_command(command, expected_result = 1000..1999)
202
+ namespaces = {'extepp' => 'http://www.nic.it/ITNIC-EPP/extepp-2.0',
203
+ 'xmlns' => "urn:ietf:params:xml:ns:epp-1.0"}
187
204
 
188
- xml = Nokogiri.XML( send_request( command.to_s ) )
205
+ xml = Nokogiri.XML(send_request(command.to_s))
189
206
 
190
207
  # TODO: multiple <response> RFC 3730 §2.6
191
- result = xml.at_xpath( "/xmlns:epp/xmlns:response[1]/xmlns:result",
192
- namespaces )
193
- raise KonoEppErrorResponse.new( :message => 'Malformed response' ) if result.nil?
208
+ result = xml.at_xpath("/xmlns:epp/xmlns:response[1]/xmlns:result",
209
+ namespaces)
210
+ raise KonoEppErrorResponse.new(:message => 'Malformed response') if result.nil?
194
211
 
195
- xmlns_code = result.at_xpath( "@code" )
196
- raise KonoEppErrorResponse.new( :message => 'Malformed response' ) if xmlns_code.nil?
212
+ xmlns_code = result.at_xpath("@code")
213
+ raise KonoEppErrorResponse.new(:message => 'Malformed response') if xmlns_code.nil?
197
214
 
198
215
  response_code = xmlns_code.value.to_i
199
216
 
200
- xmlns_msg = result.xpath( "xmlns:msg/text ()",
201
- namespaces )
202
- raise KonoEppErrorResponse.new( :message => 'Malformed response' ) if xmlns_msg.empty?
217
+ xmlns_msg = result.xpath("xmlns:msg/text ()",
218
+ namespaces)
219
+ raise KonoEppErrorResponse.new(:message => 'Malformed response') if xmlns_msg.empty?
203
220
 
204
221
  result_message = xmlns_msg.text.strip
205
222
 
206
223
  # TODO: value
207
224
 
208
- xmlns_ext_reason = result.xpath( "xmlns:extValue/xmlns:reason",
209
- namespaces)
225
+ xmlns_ext_reason = result.xpath("xmlns:extValue/xmlns:reason",
226
+ namespaces)
210
227
  result_message += ": #{xmlns_ext_reason.text.strip}" unless xmlns_ext_reason.empty?
211
228
 
212
- xmlns_reason_code = result.xpath( "xmlns:extValue/xmlns:value/extepp:reasonCode",
213
- namespaces )
229
+ xmlns_reason_code = result.xpath("xmlns:extValue/xmlns:value/extepp:reasonCode",
230
+ namespaces)
214
231
  reason_code = xmlns_reason_code.text.strip.to_i unless xmlns_reason_code.empty?
215
232
 
216
- credit_msg = xml.xpath( "//extepp:credit/text ()",
217
- namespaces )
233
+ credit_msg = xml.xpath("//extepp:credit/text ()",
234
+ namespaces)
218
235
  @credit = credit_msg.text.to_f unless credit_msg.empty?
219
236
 
220
237
  if expected_result === response_code
221
238
  return xml
222
239
  end
223
240
 
224
- args = { :xml => xml,
225
- :response_code => response_code,
226
- :reason_code => reason_code,
227
- :message => result_message }
228
-
229
- case [ response_code, reason_code ]
230
- when [2200, 6004]
231
- raise KonoEppAuthenticationPasswordExpired.new( args )
232
- when [2002, 4015]
233
- raise KonoEppLoginNeeded.new( args )
234
- else
235
- raise KonoEppErrorResponse.new( args )
241
+ args = {:xml => xml,
242
+ :response_code => response_code,
243
+ :reason_code => reason_code,
244
+ :message => result_message}
245
+
246
+ case [response_code, reason_code]
247
+ when [2200, 6004]
248
+ raise KonoEppAuthenticationPasswordExpired.new(args)
249
+ when [2002, 4015]
250
+ raise KonoEppLoginNeeded.new(args)
251
+ when [2304, 9022]
252
+ raise KonoEppDomainHasStatusCliTransProhibited.new(args)
253
+ when [2304, 9026]
254
+ raise KonoEppDomainHasStatusClientUpdateProhibited.new(args)
255
+ else
256
+ raise KonoEppErrorResponse.new(args)
236
257
  end
237
258
  end
238
259
 
239
260
  # Establishes the connection to the server. If the connection is
240
- # established, then this method will call read and return
241
- # the EPP <tt><greeting></tt> which is sent by the
242
- # server upon connection.
261
+ # established, then this method will call read and return
262
+ # the EPP <tt><greeting></tt> which is sent by the
263
+ # server upon connection.
243
264
  def open_connection
265
+ # FIXME il timeout serve solamente nella versione tcp
266
+ # FIXME perchè utilizzare un'istanza di classe? non sarebbe meglio avere un metodo che genera il transport
267
+ # e successivamente viene utilizzato sempre quello?
244
268
  Timeout.timeout @timeout do
245
- @connection = case @transport
246
- when :tcp then KonoEppClient::Transport::TcpTransport.new( server, port )
247
- when :http then KonoEppClient::Transport::HttpTransport.new( server, port )
269
+ case @transport
270
+ when :tcp
271
+ @connection = KonoEppClient::Transport::TcpTransport.new(server, port)
272
+ when :http
273
+
274
+ options = {
275
+ ssl_version: ssl_version,
276
+ cookie_file: "#{@tag.downcase}.cookies.pstore"
277
+ }.merge(@transport_options)
278
+
279
+ @connection = KonoEppClient::Transport::HttpTransport.new(server, port, **options)
280
+
248
281
  end
249
282
  end
250
283
  end
251
284
 
252
-
253
285
  # Receive an EPP response from the server. Since the connection is blocking,
254
286
  # this method will wait until the connection becomes available for use. If
255
287
  # the connection is broken, a SocketError will be raised. Otherwise,
@@ -262,9 +294,9 @@ module KonoEppClient #:nodoc:
262
294
 
263
295
  # Send XML to the server. If the socket returns EOF,
264
296
  # the connection has closed and a SocketError is raised.
265
- def write( xml )
297
+ def write(xml)
266
298
  Timeout.timeout @timeout do
267
- @connection.write( xml )
299
+ @connection.write(xml)
268
300
  end
269
301
  end
270
302
  end
@@ -6,20 +6,24 @@ module KonoEppClient::Transport
6
6
 
7
7
  require 'pstore'
8
8
 
9
- def initialize( server, port )
9
+ # @param [String] server
10
+ # @param [Integer] port
11
+ # @param [Symbol] ssl_version -> Versione ssl
12
+ # @param [String] cookie_file -> identifica il nome del file del cookie-store
13
+ def initialize(server, port, ssl_version: :TLSv1, cookie_file: "cookies.pstore")
10
14
  @net_http = Net::HTTP.new( server, port )
11
15
 
12
16
  @net_http.use_ssl = true
13
- @net_http.ssl_version = :TLSv1
17
+ @net_http.ssl_version = ssl_version
14
18
  @net_http.verify_mode = OpenSSL::SSL::VERIFY_PEER
15
-
19
+
16
20
  #FIXME: Commented because not work on MacOS (dev machine), is necessary for Linux machine?
17
21
  #@net_http.ca_path = '/etc/ssl/certs'
18
-
22
+
19
23
  # @net_http.set_debug_output $stderr
20
24
  #@net_http.set_debug_output File.open( "/tmp/net.log", "a")
21
25
 
22
- @store = PStore.new( "cookies.pstore" )
26
+ @store = PStore.new( cookie_file )
23
27
  end
24
28
 
25
29
  def read
@@ -43,6 +47,7 @@ module KonoEppClient::Transport
43
47
  end
44
48
 
45
49
  def close
50
+ FileUtils.rm_rf(@store.path)
46
51
  end
47
52
 
48
53
  private
@@ -0,0 +1 @@
1
+ 0.1.1
@@ -0,0 +1,3 @@
1
+ module KonoEppClient
2
+ VERSION = File.read(File.join(File.dirname(__FILE__), "./VERSION")).strip
3
+ end
@@ -4,7 +4,6 @@ require 'openssl'
4
4
  require 'socket'
5
5
  require 'active_support'
6
6
  require 'rexml/document'
7
- require 'hpricot'
8
7
 
9
8
  # Package files
10
9
  require File.dirname(__FILE__) + '/require_parameters.rb'
@@ -16,19 +15,11 @@ require File.dirname(__FILE__) + '/epp/transport/tcp.rb'
16
15
  require File.dirname(__FILE__) + '/epp/transport/http.rb'
17
16
 
18
17
  require File.dirname(__FILE__) + '/epp/epp_command.rb'
19
- require File.dirname(__FILE__) + '/epp/epp_command/hello.rb'
20
- require File.dirname(__FILE__) + '/epp/epp_command/login.rb'
21
- require File.dirname(__FILE__) + '/epp/epp_command/logout.rb'
22
- require File.dirname(__FILE__) + '/epp/epp_command/poll.rb'
23
- require File.dirname(__FILE__) + '/epp/epp_command/create_contact.rb'
24
- require File.dirname(__FILE__) + '/epp/epp_command/create_domain.rb'
25
- require File.dirname(__FILE__) + '/epp/epp_command/info_contact.rb'
26
- require File.dirname(__FILE__) + '/epp/epp_command/info_domain.rb'
27
- require File.dirname(__FILE__) + '/epp/epp_command/delete_contact.rb'
28
- require File.dirname(__FILE__) + '/epp/epp_command/delete_domain.rb'
29
- require File.dirname(__FILE__) + '/epp/epp_command/transfer_domain.rb'
30
- require File.dirname(__FILE__) + '/epp/epp_command/update_contact.rb'
31
- require File.dirname(__FILE__) + '/epp/epp_command/update_domain.rb'
18
+
19
+ # load di tutti i comandi presenti in epp_command
20
+ Dir.glob(File.dirname(__FILE__) + '/epp/epp_command/*.rb').each do |f|
21
+ require f
22
+ end
32
23
 
33
24
  module KonoEppClient #:nodoc:
34
25
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ RSpec.describe KonoEppCheckContacts do
3
+
4
+ let(:ids){
5
+ ["mm001",
6
+ "mb001",
7
+ "cl001",
8
+ "bb001"]
9
+ }
10
+
11
+ include_context "like epp command"
12
+
13
+ let(:instance) {
14
+ described_class.new(ids)
15
+ }
16
+
17
+ it "construct", snapshot: 'xml' do
18
+ expect(rendered.to_s).to have_tag("epp>command>check>check") do
19
+ ids.each do |t|
20
+ with_tag("id", text: t)
21
+ end
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe KonoEppCheckDomains do
4
+ include_context "like epp command"
5
+
6
+ let(:instance) do
7
+ described_class.new("test.it","wow.it")
8
+ end
9
+
10
+ it "construct", snapshot: "xml" do
11
+ expect(rendered.to_s).to have_tag("epp>command>check>check") do
12
+ with_tag("name", text: "test.it")
13
+ with_tag("name", text: "wow.it")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe KonoEppCreateDomain do
4
+ include_context "like epp command"
5
+
6
+ let(:instance) {
7
+ KonoEppCreateDomain.new(
8
+ {name: 'architest.it',
9
+ period: 1,
10
+ nameservers:
11
+ [["ns.test.it", "192.168.100.10"],
12
+ ["ns2.test.it", "192.168.100.20"],
13
+ ["ns3.foo.com"]],
14
+ # contacts
15
+ registrant: "RRR12",
16
+ admin: "AAAA12",
17
+ tech: "TTT12",
18
+ authinfo: "WWW-test-it"
19
+ }
20
+ )
21
+ }
22
+
23
+ it "create", snapshot: "xml" do
24
+ expect(rendered.to_s).to have_tag("ns")
25
+ expect(rendered.to_s.downcase).to have_tag("hostattr")
26
+ expect(rendered.to_s.downcase).to have_tag("ns hostattr" ) do
27
+ with_tag("hostname",text:"ns2.test.it")
28
+ with_tag("hostaddr",text:"192.168.100.20",with:{ip:"v4"})
29
+ end
30
+ expect(rendered.to_s.downcase).to have_tag("ns hostattr" ) do
31
+ with_tag("hostname",text:"ns.test.it")
32
+ with_tag("hostaddr",text:"192.168.100.10",with:{ip:"v4"})
33
+ end
34
+ expect(rendered.to_s.downcase).not_to have_tag("ns hostaddr", with: {ip: 'v4'},text:"" )
35
+ end
36
+
37
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe KonoEppTransferDomain do
4
+
5
+ include_context "like epp command"
6
+
7
+ let(:instance) do
8
+ described_class.new("test.it", "wee-12-sd", 'request')
9
+ end
10
+
11
+ it "construct", snapshot: 'xml' do
12
+ expect(rendered.to_s).to have_tag("epp>command>transfer", with: {op: "request"}, count: 1) do
13
+ with_tag("transfer>name", text: "test.it")
14
+ with_tag("transfer>authinfo>pw", text: "wee-12-sd")
15
+ end
16
+ end
17
+
18
+ context "con extension" do
19
+
20
+ let(:instance) do
21
+ described_class.new("test.it", "wee-12-sd", 'request',
22
+ extension: {new_registrant: "xx123fd", new_auth_info: "abc-sd934-sd"})
23
+ end
24
+
25
+ it "construct", snapshot: 'xml' do
26
+ expect(rendered.to_s).to have_tag("epp>command>extension>trade>transfertrade") do
27
+ with_tag("newregistrant", text: "xx123fd")
28
+ with_tag("newauthinfo>pw", text: "abc-sd934-sd")
29
+ end
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe KonoEppUpdateDomain do
4
+
5
+ let(:options) do
6
+ {
7
+ name: 'example.com',
8
+ # add_nameservers: [['ns1.example.com', '192.168.1.1']],
9
+ # add_admin: 'admin_contact',
10
+ # add_tech: 'tech_contact',
11
+ # remove_nameservers: ['ns2.example.com'],
12
+ # remove_admin: 'admin_contact_to_remove',
13
+ # remove_tech: 'tech_contact_to_remove',
14
+ # auth_info: 'my_auth_info',
15
+ # registrant: 'new_registrant'
16
+ }
17
+ end
18
+
19
+ include_context "like epp command"
20
+
21
+ let(:instance) {
22
+ KonoEppUpdateDomain.new(options)
23
+ }
24
+
25
+ it "contiene il nome del dominio" do
26
+ expect(rendered.to_s).to have_tag("update>name", text: options[:name])
27
+ end
28
+
29
+ context "update nameservers" do
30
+ let(:options) {
31
+ super().merge({
32
+ add_nameservers: [
33
+ ['ns1.example.com', '192.168.1.1'],
34
+ ['ns3.example.com']
35
+ ],
36
+ remove_nameservers: ['ns2.example.com'],
37
+ })
38
+ }
39
+ it "aggiunge e rimuove ns", snapshot: 'xml' do
40
+ expect(rendered.to_s.downcase).to have_tag("update>add>ns") do
41
+ with_tag("hostattr") do
42
+ with_tag("hostname", text: 'ns1.example.com')
43
+ with_tag("hostaddr", text: '192.168.1.1')
44
+ end
45
+ end
46
+ expect(rendered.to_s.downcase).to have_tag("update>add>ns") do
47
+ with_tag("hostattr") do
48
+ with_tag("hostname", text: 'ns3.example.com')
49
+ without_tag("hostaddr",text:"")
50
+ end
51
+ end
52
+ expect(rendered.to_s.downcase).to have_tag("update>rem>ns") do
53
+ with_tag("hostattr") do
54
+ with_tag("hostname", text: 'ns2.example.com')
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ context "update contacts", snapshot: 'xml' do
61
+ let(:options) {
62
+ super().merge({
63
+ add_admin: "AAA1",
64
+ add_tech: "TTT1",
65
+ remove_admin: "AAA2",
66
+ remove_tech: "TTT2"
67
+ })
68
+ }
69
+ it "cambia ADMIN_TECH", snapshot: 'xml' do
70
+ expect(rendered.to_s.downcase).to have_tag("update>add>contact", with: {type: "admin"}, text: options[:add_admin].downcase)
71
+ expect(rendered.to_s.downcase).to have_tag("update>rem>contact", with: {type: "admin"}, text: options[:remove_admin].downcase)
72
+ expect(rendered.to_s.downcase).to have_tag("update>add>contact", with: {type: "tech"}, text: options[:add_tech].downcase)
73
+ expect(rendered.to_s.downcase).to have_tag("update>rem>contact", with: {type: "tech"}, text: options[:remove_tech].downcase)
74
+ end
75
+ end
76
+ context "update status" do
77
+ let(:options) {
78
+ super().merge({
79
+ add_status: "clientTransferProhibited",
80
+ remove_status: "clientHold",
81
+ })
82
+ }
83
+ it "cambia status", snapshot: 'xml' do
84
+ expect(rendered.to_s.downcase).to have_tag("update>add>status", with: {s: options[:add_status].downcase})
85
+ expect(rendered.to_s.downcase).to have_tag("update>rem>status", with: {s: options[:remove_status].downcase})
86
+ end
87
+ end
88
+
89
+ context "restore" do
90
+ let(:options) {
91
+ super().merge({
92
+ restore: true
93
+ })
94
+ }
95
+ it "esiste l'estensione di restore",snapshot: 'xml' do
96
+ expect(rendered.to_s.downcase).to have_tag("extension>update>restore", with: {op: "request"})
97
+ end
98
+ end
99
+
100
+ context "update auth_info" do
101
+ let(:options) {
102
+ super().merge({
103
+ auth_info: "AUTH12-!DSRTG"
104
+ })
105
+ }
106
+ it "cambia AUTH_INFO", snapshot: "xml" do
107
+ expect(rendered.to_s.downcase).to have_tag("update>chg") do
108
+ with_tag("authinfo>pw", text: options[:auth_info].downcase)
109
+ without_tag("registrant")
110
+ end
111
+ end
112
+
113
+ context "con nuovo registrant" do
114
+ let(:options) {
115
+ super().merge({
116
+ registrant: "R0001"
117
+ })
118
+ }
119
+ it "cambia REGISTRANT", snapshot: "xml" do
120
+ expect(rendered.to_s.downcase).to have_tag("update>chg>registrant", text: options[:registrant].downcase)
121
+ end
122
+ end
123
+ end
124
+
125
+ end