sepafm 0.1.0 → 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.
- checksums.yaml +4 -4
- data/lib/sepa/application_request.rb +13 -11
- data/lib/sepa/application_response.rb +23 -23
- data/lib/sepa/attribute_checks.rb +0 -21
- data/lib/sepa/banks/danske/danske_response.rb +40 -14
- data/lib/sepa/banks/danske/soap_danske.rb +127 -125
- data/lib/sepa/banks/nordea/nordea_response.rb +11 -11
- data/lib/sepa/banks/nordea/soap_nordea.rb +2 -2
- data/lib/sepa/client.rb +40 -3
- data/lib/sepa/response.rb +68 -79
- data/lib/sepa/soap_builder.rb +20 -19
- data/lib/sepa/utilities.rb +30 -15
- data/lib/sepa/version.rb +1 -1
- data/lib/sepafm.rb +14 -0
- data/{README.md → readme.md} +1 -1
- data/test/sepa/banks/danske/danske_cert_response_test.rb +28 -14
- data/test/sepa/banks/danske/danske_cert_soap_builder_test.rb +3 -3
- data/test/sepa/banks/danske/danske_generic_soap_builder_test.rb +4 -4
- data/test/sepa/banks/danske/responses/create_cert.xml +14 -37
- data/test/sepa/banks/nordea/nordea_application_request_test.rb +9 -9
- data/test/sepa/banks/nordea/nordea_application_response_test.rb +69 -57
- data/test/sepa/banks/nordea/nordea_cert_application_request_test.rb +2 -2
- data/test/sepa/banks/nordea/nordea_cert_request_soap_builder_test.rb +1 -1
- data/test/sepa/banks/nordea/nordea_generic_soap_builder_test.rb +4 -4
- data/test/sepa/banks/nordea/nordea_response_test.rb +56 -34
- data/test/sepa/client_test.rb +43 -34
- data/test/sepa/fixtures.rb +1 -1
- data/test/sepa/sepa_test.rb +1 -1
- data/test/test_helper.rb +15 -0
- metadata +3 -3
@@ -5,7 +5,7 @@ class NordeaCertApplicationRequestTest < ActiveSupport::TestCase
|
|
5
5
|
|
6
6
|
def setup
|
7
7
|
@get_cert_params = nordea_cert_params
|
8
|
-
ar_cert = Sepa::SoapBuilder.new(@get_cert_params).
|
8
|
+
ar_cert = Sepa::SoapBuilder.new(@get_cert_params).application_request
|
9
9
|
@xml = Nokogiri::XML(ar_cert.to_xml)
|
10
10
|
end
|
11
11
|
|
@@ -13,7 +13,7 @@ class NordeaCertApplicationRequestTest < ActiveSupport::TestCase
|
|
13
13
|
sha1 = OpenSSL::Digest::SHA1.new
|
14
14
|
cert_schema = File.read("#{SCHEMA_PATH}/cert_application_request.xsd")
|
15
15
|
cert_digest = sha1.digest(cert_schema)
|
16
|
-
assert_equal
|
16
|
+
assert_equal encode(cert_digest).strip, "sFwy9Tj+cERTdcmaGhm8WpmJBH4="
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_should_initialize_with_only_get_certificate_params
|
@@ -49,7 +49,7 @@ class NordeaCertRequestSoapBuilderTest < ActiveSupport::TestCase
|
|
49
49
|
"//cer:ApplicationRequest", 'cer' => 'http://bxd.fi/CertificateService'
|
50
50
|
).first
|
51
51
|
|
52
|
-
ar_doc = Nokogiri::XML(
|
52
|
+
ar_doc = Nokogiri::XML(decode(ar_node.content))
|
53
53
|
|
54
54
|
assert ar_doc.respond_to?(:canonicalize)
|
55
55
|
assert_equal ar_doc.at_css("CustomerId").content, @nordea_generic_params[:customer_id]
|
@@ -124,7 +124,7 @@ class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
124
124
|
"//bxd:ApplicationRequest", 'bxd' => 'http://model.bxd.fi'
|
125
125
|
).first
|
126
126
|
|
127
|
-
ar_doc = Nokogiri::XML(
|
127
|
+
ar_doc = Nokogiri::XML(decode(ar_node.content))
|
128
128
|
|
129
129
|
assert ar_doc.respond_to?(:canonicalize)
|
130
130
|
assert_equal ar_doc.at_css("CustomerId").content, @nordea_generic_params[:customer_id]
|
@@ -163,7 +163,7 @@ class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
163
163
|
with_comments = false
|
164
164
|
)
|
165
165
|
|
166
|
-
actual_digest =
|
166
|
+
actual_digest = encode(sha1.digest(body_node)).strip
|
167
167
|
|
168
168
|
assert_equal actual_digest, added_digest
|
169
169
|
end
|
@@ -211,7 +211,7 @@ class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
211
211
|
with_comments = false
|
212
212
|
)
|
213
213
|
|
214
|
-
actual_digest =
|
214
|
+
actual_digest = encode(sha1.digest(timestamp_node)).strip
|
215
215
|
|
216
216
|
assert_equal actual_digest, added_digest
|
217
217
|
end
|
@@ -233,7 +233,7 @@ class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
233
233
|
with_comments = false
|
234
234
|
)
|
235
235
|
|
236
|
-
actual_signature =
|
236
|
+
actual_signature = encode(
|
237
237
|
private_key.sign(sha1, signed_info_node)
|
238
238
|
).gsub(/\s+/, "")
|
239
239
|
|
@@ -4,43 +4,59 @@ class NordeaResponseTest < ActiveSupport::TestCase
|
|
4
4
|
include Sepa::Utilities
|
5
5
|
|
6
6
|
def setup
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
dfl =
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
7
|
+
options = {
|
8
|
+
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/dfl.xml"),
|
9
|
+
command: :download_file_list
|
10
|
+
}
|
11
|
+
@dfl = Sepa::NordeaResponse.new options
|
12
|
+
|
13
|
+
options = {
|
14
|
+
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/uf.xml"),
|
15
|
+
command: :upload_file
|
16
|
+
}
|
17
|
+
@uf = Sepa::NordeaResponse.new options
|
18
|
+
|
19
|
+
options = {
|
20
|
+
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/df_tito.xml"),
|
21
|
+
command: :download_file
|
22
|
+
}
|
23
|
+
@df_tito = Sepa::NordeaResponse.new options
|
24
|
+
|
25
|
+
options = {
|
26
|
+
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/df_ktl.xml"),
|
27
|
+
command: :download_file
|
28
|
+
}
|
29
|
+
@df_ktl = Sepa::NordeaResponse.new options
|
30
|
+
|
31
|
+
options = {
|
32
|
+
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/gui.xml"),
|
33
|
+
command: :get_user_info
|
34
|
+
}
|
35
|
+
@gui = Sepa::NordeaResponse.new options
|
36
|
+
|
37
|
+
options = {
|
38
|
+
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/gc.xml"),
|
39
|
+
command: :get_certificate
|
40
|
+
}
|
41
|
+
@gc = Sepa::NordeaResponse.new options
|
28
42
|
end
|
29
43
|
|
30
44
|
def test_should_be_valid
|
31
|
-
assert @dfl.valid
|
32
|
-
assert @uf.valid
|
33
|
-
assert @df_tito.valid
|
34
|
-
assert @
|
45
|
+
assert @dfl.valid?, @dfl.errors.messages
|
46
|
+
assert @uf.valid?, @uf.errors.messages
|
47
|
+
assert @df_tito.valid?, @df_tito.errors.messages
|
48
|
+
assert @df_ktl.valid?, @df_ktl.errors.messages
|
49
|
+
assert @gui.valid?, @gui.errors.messages
|
50
|
+
assert @gc.valid?, @gc.errors.messages
|
35
51
|
end
|
36
52
|
|
37
53
|
def test_should_fail_with_improper_params
|
38
|
-
a = Sepa::Response.new("Jees", command: 'not')
|
54
|
+
a = Sepa::Response.new({ response: "Jees", command: 'not'})
|
39
55
|
refute a.valid?
|
40
56
|
end
|
41
57
|
|
42
58
|
def test_should_complain_if_ar_not_valid_against_schema
|
43
|
-
a = Sepa::Response.new(
|
59
|
+
a = Sepa::Response.new({ response: "<ar>text</ar>", command: 'notvalid' })
|
44
60
|
refute a.valid?
|
45
61
|
end
|
46
62
|
|
@@ -52,21 +68,26 @@ class NordeaResponseTest < ActiveSupport::TestCase
|
|
52
68
|
end
|
53
69
|
|
54
70
|
def test_cert_check_should_work
|
55
|
-
|
71
|
+
keys_path = File.expand_path('../keys', __FILE__)
|
72
|
+
root_cert = OpenSSL::X509::Certificate.new File.read("#{keys_path}/root_cert.cer")
|
73
|
+
not_root_cert = OpenSSL::X509::Certificate.new File.read("#{keys_path}/nordea.crt")
|
74
|
+
|
75
|
+
assert @dfl.cert_is_trusted(root_cert)
|
56
76
|
assert_raises(SecurityError) do
|
57
|
-
@dfl.cert_is_trusted(
|
77
|
+
@dfl.cert_is_trusted(not_root_cert)
|
58
78
|
end
|
59
79
|
end
|
60
80
|
|
61
81
|
def test_signature_check_should_work
|
62
82
|
assert @dfl.signature_is_valid?
|
63
|
-
@dfl.
|
64
|
-
'xmlns|SignatureValue',
|
65
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
66
|
-
).content = "kissa"
|
83
|
+
@dfl.doc.at('xmlns|SignatureValue', 'xmlns' => DSIG).content = "kissa"
|
67
84
|
refute @dfl.signature_is_valid?
|
68
85
|
end
|
69
86
|
|
87
|
+
test 'to_s works' do
|
88
|
+
assert_equal File.read("#{NORDEA_TEST_RESPONSE_PATH}/dfl.xml"), @dfl.to_s
|
89
|
+
end
|
90
|
+
|
70
91
|
##
|
71
92
|
# Tests for download file command
|
72
93
|
|
@@ -110,7 +131,8 @@ class NordeaResponseTest < ActiveSupport::TestCase
|
|
110
131
|
|
111
132
|
test 'certificate can be extracted from get certificate response' do
|
112
133
|
assert_nothing_raised do
|
113
|
-
OpenSSL::X509::Certificate.new
|
134
|
+
OpenSSL::X509::Certificate.new decode(@gc.own_signing_cert)
|
114
135
|
end
|
115
136
|
end
|
137
|
+
|
116
138
|
end
|
data/test/sepa/client_test.rb
CHANGED
@@ -8,24 +8,10 @@ class ClientTest < ActiveSupport::TestCase
|
|
8
8
|
# Get params hashes from fixtures for different banks and for different request types
|
9
9
|
@nordea_generic_params = nordea_generic_params
|
10
10
|
@nordea_cert_params = nordea_cert_params
|
11
|
-
|
12
11
|
@danske_cert_params = danske_cert_params
|
13
12
|
|
14
13
|
# Namespaces
|
15
14
|
@cor = 'http://bxd.fi/CorporateFileService'
|
16
|
-
|
17
|
-
# Create an observer to fake sending requests to bank
|
18
|
-
observer = Class.new {
|
19
|
-
def notify(operation_name, builder, globals, locals)
|
20
|
-
@operation_name = operation_name
|
21
|
-
@builder = builder
|
22
|
-
@globals = globals
|
23
|
-
@locals = locals
|
24
|
-
HTTPI::Response.new(200, { "Reponse is actually" => "the request, w0000t" }, locals[:xml])
|
25
|
-
end
|
26
|
-
}.new
|
27
|
-
|
28
|
-
Savon.observers << observer
|
29
15
|
end
|
30
16
|
|
31
17
|
test "should initialize class" do
|
@@ -172,75 +158,75 @@ class ClientTest < ActiveSupport::TestCase
|
|
172
158
|
|
173
159
|
# # The response from savon will be the request to check that a proper request
|
174
160
|
# # was made in the following four tests
|
175
|
-
|
161
|
+
test "should_send_proper_request_with_get_user_info" do
|
176
162
|
@nordea_generic_params[:command] = :get_user_info
|
177
163
|
client = Sepa::Client.new(@nordea_generic_params)
|
178
164
|
response = client.send_request
|
179
165
|
|
180
|
-
assert response.
|
166
|
+
assert response.doc.at_css('cor|getUserInfoin', cor: @cor)
|
181
167
|
|
182
168
|
Dir.chdir(SCHEMA_PATH) do
|
183
169
|
xsd = Nokogiri::XML::Schema(IO.read('soap.xsd'))
|
184
|
-
assert xsd.valid?(response.
|
170
|
+
assert xsd.valid?(response.doc)
|
185
171
|
end
|
186
172
|
end
|
187
173
|
|
188
|
-
|
174
|
+
test "should_send_proper_request_with_download_file_list" do
|
189
175
|
@nordea_generic_params[:command] = :download_file_list
|
190
176
|
client = Sepa::Client.new(@nordea_generic_params)
|
191
177
|
response = client.send_request
|
192
178
|
|
193
|
-
assert response.
|
179
|
+
assert response.doc.at_css('cor|downloadFileListin', cor: @cor)
|
194
180
|
|
195
181
|
Dir.chdir(SCHEMA_PATH) do
|
196
182
|
xsd = Nokogiri::XML::Schema(IO.read('soap.xsd'))
|
197
|
-
assert xsd.valid?(response.
|
183
|
+
assert xsd.valid?(response.doc)
|
198
184
|
end
|
199
185
|
end
|
200
186
|
|
201
|
-
|
187
|
+
test "should_send_proper_request_with_download_file" do
|
202
188
|
@nordea_generic_params[:command] = :download_file
|
203
189
|
client = Sepa::Client.new(@nordea_generic_params)
|
204
190
|
response = client.send_request
|
205
191
|
|
206
|
-
assert response.
|
192
|
+
assert response.doc.at_css('cor|downloadFilein', cor: @cor)
|
207
193
|
|
208
194
|
Dir.chdir(SCHEMA_PATH) do
|
209
195
|
xsd = Nokogiri::XML::Schema(IO.read('soap.xsd'))
|
210
|
-
assert xsd.valid?(response.
|
196
|
+
assert xsd.valid?(response.doc)
|
211
197
|
end
|
212
198
|
end
|
213
199
|
|
214
|
-
|
200
|
+
test "should_send_proper_request_with_upload_file" do
|
215
201
|
@nordea_generic_params[:command] = :upload_file
|
216
202
|
client = Sepa::Client.new(@nordea_generic_params)
|
217
203
|
response = client.send_request
|
218
204
|
|
219
|
-
assert response.
|
205
|
+
assert response.doc.at_css('cor|uploadFilein', cor: @cor)
|
220
206
|
|
221
207
|
Dir.chdir(SCHEMA_PATH) do
|
222
208
|
xsd = Nokogiri::XML::Schema(IO.read('soap.xsd'))
|
223
|
-
assert xsd.valid?(response.
|
209
|
+
assert xsd.valid?(response.doc)
|
224
210
|
end
|
225
211
|
end
|
226
212
|
|
227
|
-
|
213
|
+
test "should_initialize_with_proper_cert_params" do
|
228
214
|
assert Sepa::Client.new(@nordea_cert_params)
|
229
215
|
end
|
230
216
|
|
231
|
-
|
217
|
+
test "should_send_proper_request_with_get_certificate" do
|
232
218
|
client = Sepa::Client.new(@nordea_cert_params)
|
233
219
|
response = client.send_request
|
234
220
|
|
235
|
-
assert response.
|
221
|
+
assert response.doc.at_css('cer|getCertificatein')
|
236
222
|
|
237
223
|
Dir.chdir(SCHEMA_PATH) do
|
238
224
|
xsd = Nokogiri::XML::Schema(IO.read('soap.xsd'))
|
239
|
-
assert xsd.valid?(response.
|
225
|
+
assert xsd.valid?(response.doc)
|
240
226
|
end
|
241
227
|
end
|
242
228
|
|
243
|
-
|
229
|
+
test "should_check_signing_cert_request_with_create_certificate" do
|
244
230
|
@danske_cert_params[:command] = :create_certificate
|
245
231
|
@danske_cert_params.delete(:signing_cert_pkcs10)
|
246
232
|
|
@@ -249,7 +235,7 @@ class ClientTest < ActiveSupport::TestCase
|
|
249
235
|
assert_includes sepa.errors.messages.to_s, SIGNING_CERT_REQUEST_ERROR_MESSAGE
|
250
236
|
end
|
251
237
|
|
252
|
-
|
238
|
+
test "should_check_encryption_cert_request_with_create_certificate" do
|
253
239
|
@danske_cert_params[:command] = :create_certificate
|
254
240
|
@danske_cert_params.delete(:encryption_cert_pkcs10)
|
255
241
|
|
@@ -258,7 +244,7 @@ class ClientTest < ActiveSupport::TestCase
|
|
258
244
|
assert_includes sepa.errors.messages.to_s, ENCRYPTION_CERT_REQUEST_ERROR_MESSAGE
|
259
245
|
end
|
260
246
|
|
261
|
-
|
247
|
+
test "should_check_pin_with_create_certificate" do
|
262
248
|
@danske_cert_params[:command] = :create_certificate
|
263
249
|
@danske_cert_params.delete(:pin)
|
264
250
|
|
@@ -267,7 +253,7 @@ class ClientTest < ActiveSupport::TestCase
|
|
267
253
|
assert_includes sepa.errors.messages.to_s, PIN_ERROR_MESSAGE
|
268
254
|
end
|
269
255
|
|
270
|
-
|
256
|
+
test "should_check_encryption_cert_with_create_certificate" do
|
271
257
|
@danske_cert_params[:command] = :create_certificate
|
272
258
|
@danske_cert_params.delete(:enc_cert)
|
273
259
|
|
@@ -276,4 +262,27 @@ class ClientTest < ActiveSupport::TestCase
|
|
276
262
|
assert_includes sepa.errors.messages.to_s, ENCRYPTION_CERT_ERROR_MESSAGE
|
277
263
|
end
|
278
264
|
|
265
|
+
test "response should be invalid on savon exception" do
|
266
|
+
# Create an observer to fake sending requests to bank
|
267
|
+
observer = Class.new {
|
268
|
+
def notify(operation_name, builder, globals, locals)
|
269
|
+
@operation_name = operation_name
|
270
|
+
@builder = builder
|
271
|
+
@globals = globals
|
272
|
+
@locals = locals
|
273
|
+
HTTPI::Response.new(500, {}, 'THE ERROR!')
|
274
|
+
end
|
275
|
+
}.new
|
276
|
+
|
277
|
+
Savon.observers << observer
|
278
|
+
|
279
|
+
client = Sepa::Client.new @nordea_generic_params
|
280
|
+
response = client.send_request
|
281
|
+
|
282
|
+
refute response.valid?, response.errors.messages
|
283
|
+
assert_includes response.errors.messages.to_s, "HTTP error (500): THE ERROR!"
|
284
|
+
|
285
|
+
Savon.observers.pop
|
286
|
+
end
|
287
|
+
|
279
288
|
end
|
data/test/sepa/fixtures.rb
CHANGED
@@ -50,7 +50,7 @@ Sn4Uz7Zjk3UrBIbMYEv0u2mcCypwsb0nGE5/gzDPjGE9cxWW+rXARIs+sNQVClnh
|
|
50
50
|
target_id: '11111111A1',
|
51
51
|
language: 'FI',
|
52
52
|
file_type: 'TITO',
|
53
|
-
content:
|
53
|
+
content: encode("haisuli"),
|
54
54
|
file_reference: "11111111A12006030329501800000014"
|
55
55
|
}
|
56
56
|
end
|
data/test/sepa/sepa_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -20,6 +20,8 @@ end
|
|
20
20
|
require 'sepafm'
|
21
21
|
require 'sepa/fixtures'
|
22
22
|
|
23
|
+
include Sepa::Utilities
|
24
|
+
|
23
25
|
# Test responses
|
24
26
|
NORDEA_TEST_RESPONSE_PATH = "#{ROOT_PATH}/test/sepa/banks/nordea/responses"
|
25
27
|
DANSKE_TEST_RESPONSE_PATH = "#{ROOT_PATH}/test/sepa/banks/danske/responses/"
|
@@ -32,3 +34,16 @@ DANSKE_BANK_ROOT_CERT = File.read "#{DANSKE_TEST_KEYS_PATH}bank_root_cert.pem"
|
|
32
34
|
DANSKE_OWN_ENCRYPTION_CERT = File.read "#{DANSKE_TEST_KEYS_PATH}own_enc_cert.pem"
|
33
35
|
|
34
36
|
I18n.enforce_available_locales = true
|
37
|
+
|
38
|
+
# Create an observer to fake sending requests to bank
|
39
|
+
observer = Class.new {
|
40
|
+
def notify(operation_name, builder, globals, locals)
|
41
|
+
@operation_name = operation_name
|
42
|
+
@builder = builder
|
43
|
+
@globals = globals
|
44
|
+
@locals = locals
|
45
|
+
HTTPI::Response.new(200, { "Reponse is actually" => "the request, w0000t" }, locals[:xml])
|
46
|
+
end
|
47
|
+
}.new
|
48
|
+
|
49
|
+
Savon.observers << observer
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sepafm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joni Kanerva
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-06-
|
13
|
+
date: 2014-06-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: savon
|
@@ -136,7 +136,6 @@ files:
|
|
136
136
|
- ".travis.yml"
|
137
137
|
- Gemfile
|
138
138
|
- LICENSE
|
139
|
-
- README.md
|
140
139
|
- Rakefile
|
141
140
|
- lib/sepa/application_request.rb
|
142
141
|
- lib/sepa/application_response.rb
|
@@ -185,6 +184,7 @@ files:
|
|
185
184
|
- lib/sepa/xml_templates/soap/header.xml
|
186
185
|
- lib/sepa/xml_templates/soap/upload_file.xml
|
187
186
|
- lib/sepafm.rb
|
187
|
+
- readme.md
|
188
188
|
- sepafm.gemspec
|
189
189
|
- test/sepa/banks/danske/danske_cert_response_test.rb
|
190
190
|
- test/sepa/banks/danske/danske_cert_soap_builder_test.rb
|