cardflex-ruby 0.0.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 (48) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +125 -0
  4. data/cardflex.gemspec +14 -0
  5. data/lib/cardflex.rb +32 -0
  6. data/lib/cardflex/base_module.rb +34 -0
  7. data/lib/cardflex/configuration.rb +96 -0
  8. data/lib/cardflex/customer_vault.rb +35 -0
  9. data/lib/cardflex/customer_vault_gateway.rb +26 -0
  10. data/lib/cardflex/error_response.rb +18 -0
  11. data/lib/cardflex/errors.rb +11 -0
  12. data/lib/cardflex/gateway.rb +35 -0
  13. data/lib/cardflex/http.rb +68 -0
  14. data/lib/cardflex/plan.rb +22 -0
  15. data/lib/cardflex/plan_gateway.rb +23 -0
  16. data/lib/cardflex/subscription.rb +24 -0
  17. data/lib/cardflex/subscription_gateway.rb +22 -0
  18. data/lib/cardflex/success_response.rb +15 -0
  19. data/lib/cardflex/test/test_values.rb +26 -0
  20. data/lib/cardflex/three_step.rb +42 -0
  21. data/lib/cardflex/three_step_gateway.rb +41 -0
  22. data/lib/cardflex/transaction.rb +52 -0
  23. data/lib/cardflex/transaction_gateway.rb +23 -0
  24. data/lib/cardflex/version.rb +9 -0
  25. data/lib/cardflex/xml.rb +11 -0
  26. data/lib/cardflex/xml/parser.rb +48 -0
  27. data/lib/cardflex/xml/serializer.rb +70 -0
  28. data/lib/ssl/ca-certificates.ca.crt +4190 -0
  29. data/spec/integration/cardflex/http_spec.rb +72 -0
  30. data/spec/integration/cardflex/plan_spec.rb +24 -0
  31. data/spec/integration/cardflex/three_step_gateway_spec.rb +47 -0
  32. data/spec/integration/cardflex/three_step_spec.rb +37 -0
  33. data/spec/integration/spec_helper.rb +24 -0
  34. data/spec/spec.opts +4 -0
  35. data/spec/spec_helper.rb +45 -0
  36. data/spec/ssl/certificate.crt +21 -0
  37. data/spec/ssl/geotrust_global.crt +20 -0
  38. data/spec/ssl/private_key.pem +30 -0
  39. data/spec/unit/cardflex/base_module_spec.rb +34 -0
  40. data/spec/unit/cardflex/configuration_spec.rb +61 -0
  41. data/spec/unit/cardflex/customer_vault_gateway_spec.rb +10 -0
  42. data/spec/unit/cardflex/errors_spec.rb +8 -0
  43. data/spec/unit/cardflex/gateway_spec.rb +11 -0
  44. data/spec/unit/cardflex/http_spec.rb +18 -0
  45. data/spec/unit/cardflex/three_step_gateway_spec.rb +29 -0
  46. data/spec/unit/cardflex/xml_spec.rb +90 -0
  47. data/spec/unit/spec_helper.rb +1 -0
  48. metadata +103 -0
@@ -0,0 +1,72 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Cardflex::Http do
4
+ original_env = Cardflex::Configuration.environment
5
+
6
+ describe 'logging' do
7
+ it 'should log the start of a request' do
8
+ begin
9
+ old_logger = Cardflex::Configuration.logger
10
+ the_time = Time.utc(2014, 1, 1)
11
+
12
+ SpecHelper.stub_now(the_time) do
13
+ new_output = StringIO.new
14
+ Cardflex::Configuration.logger = Logger.new(new_output)
15
+ Cardflex::Configuration.logger.level = Logger::DEBUG
16
+ Cardflex::Configuration.instantiate.http._do_http(Net::HTTP::Get, '/')
17
+ expect(new_output.string).to include("[Cardflex] [01/Jan/2014 00:00:00 UTC] GET")
18
+ expect(new_output.string).to include("[Cardflex] [01/Jan/2014 00:00:00 UTC] GET 200")
19
+ end
20
+ ensure
21
+ Cardflex::Configuration.logger = old_logger
22
+ end
23
+ end
24
+
25
+ it 'should log an ssl error' do
26
+ begin
27
+ old_logger = Cardflex::Configuration.logger
28
+ the_time = Time.utc(2014, 1, 1)
29
+ context = OpenSSL::X509::StoreContext.new(OpenSSL::X509::Store.new)
30
+
31
+ SpecHelper.stub_now(the_time) do
32
+ new_output = StringIO.new
33
+ Cardflex::Configuration.logger = Logger.new(new_output)
34
+ Cardflex::Configuration.logger.level = Logger::DEBUG
35
+ Cardflex::Configuration.instantiate.http._verify_ssl_certificate(0, context)
36
+ expect(new_output.string).to include("SSL Verification failed --")
37
+ end
38
+ ensure
39
+ Cardflex::Configuration.logger = old_logger
40
+ end
41
+ end
42
+ end
43
+
44
+ describe 'invalid certificate rejection' do
45
+ before do
46
+ @config = Cardflex::Configuration.instantiate
47
+ @fake_certs_dir = File.expand_path(File.dirname(__FILE__) + '/../../ssl/')
48
+ end
49
+
50
+ it 'should reject a self-signed certificate' do
51
+ expect(@config).to receive(:ca_file).and_return(@fake_certs_dir + 'certificate.crt')
52
+
53
+ expect do
54
+ @config.http._do_http(Net::HTTP::Get, '/')
55
+ end.to raise_error Cardflex::SSLCertificateError
56
+ end
57
+ end
58
+
59
+ describe 'certificate verification' do
60
+ it 'should verify the ceritificate' do
61
+ begin
62
+ Cardflex::Configuration.environment = :test
63
+
64
+ expect do
65
+ Cardflex::Configuration.instantiate.http._do_http(Net::HTTP::Get, '/')
66
+ end.to_not raise_error
67
+ ensure
68
+ Cardflex::Configuration.environment = original_env
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Cardflex::Plan do
4
+ it 'should create plan' do
5
+ # have to give a plan id unique to the test account. Since this account is shared by all testers of the api,
6
+ # it's possible that this will conflict. so we'll accept a conflicting plan-id as a success.
7
+ plan_id = ('a'..'z').to_a.shuffle.take(10).join
8
+ req = { :plan => {
9
+ :payments => 0,
10
+ :amount => 1.5,
11
+ :name => 'test_plan',
12
+ :plan_id => plan_id,
13
+ :day_frequency => 30
14
+ }
15
+ }
16
+
17
+ res = Cardflex::Plan.create(req)
18
+ if defined? res.result_code
19
+ expect(res.result_code.to_i).to eq 300
20
+ else
21
+ expect(res.plan.plan[:plan_id]).to eq plan_id
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Cardflex::ThreeStepGateway do
4
+ it 'should fail step 1 in testing env (missing amount)' do
5
+ res = Cardflex::Configuration.gateway.three_step.get_form_url({
6
+ :sale => { :redirect_url => 'http://example.com' }
7
+ })
8
+
9
+ expect(res.success?).to eq false
10
+ end
11
+
12
+ it 'should pass step 1 in testing env' do
13
+ res = Cardflex::Configuration.gateway.three_step.get_form_url({
14
+ :sale => { :redirect_url => 'http://example.com', :amount => 1.5 }
15
+ })
16
+
17
+ expect(res.success?).to eq true
18
+ expect(res.three_step.form_url).to match "secure.cardflexonline.com"
19
+ end
20
+
21
+ it 'should complete a transaction in testing env' do
22
+ res = Cardflex::Configuration.gateway.three_step.get_form_url({
23
+ :sale => { :redirect_url => 'http://example.com', :amount => 1.5 }
24
+ })
25
+
26
+ form_url = res.three_step.form_url
27
+ token_id = SpecHelper.step_two(form_url)
28
+
29
+ complete_result = Cardflex::Configuration.gateway.three_step.complete(token_id)
30
+
31
+ expect(complete_result.success?).to be true
32
+ expect(complete_result.transaction.transaction_id).to_not be nil
33
+ end
34
+
35
+ it 'should decline a transaction in testing env' do
36
+ res = Cardflex::Configuration.gateway.three_step.get_form_url({
37
+ :sale => { :redirect_url => 'http://example.com', :amount => 0.5 }
38
+ })
39
+
40
+ form_url = res.three_step.form_url
41
+ token_id = SpecHelper.step_two(form_url)
42
+
43
+ res = Cardflex::Configuration.gateway.three_step.complete(token_id)
44
+ expect(res.success?).to be false
45
+ expect(res.result_code.to_i).to eq 200
46
+ end
47
+ end
@@ -0,0 +1,37 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Cardflex::CustomerVault do
4
+ it 'should pass step 1 (customer vault)' do
5
+ res = Cardflex::ThreeStep.add_customer(:redirect_url => "http://example.com")
6
+
7
+ expect(res.success?).to be true
8
+ expect(res.three_step.form_url).to match('secure.cardflexonline.com')
9
+ end
10
+
11
+ it 'should complete the operation (customer vault)' do
12
+ form_url = Cardflex::ThreeStep.add_customer(:redirect_url => 'http://example.com').three_step.form_url
13
+ token_id = SpecHelper.step_two(form_url)
14
+ res = Cardflex::ThreeStep.complete(token_id)
15
+
16
+ expect(res.success?).to be true
17
+ expect(res.transaction.customer_vault_id).to_not be nil
18
+ end
19
+
20
+ it 'should pass step 1 (subscription)' do
21
+ # ensure a plan exists. this assumes the Plan code works, check there first if errors arise
22
+ req = { :plan => {
23
+ :payments => 0,
24
+ :amount => 1.5,
25
+ :name => 'test_plan',
26
+ :plan_id => 1,
27
+ :day_frequency => 30
28
+ }
29
+ }
30
+
31
+ Cardflex::Plan.create(req)
32
+
33
+ res = Cardflex::ThreeStep.add_subscription({ :redirect_url => 'http://example.com', :plan => { :plan_id => 1 }})
34
+ expect(res.success?).to be true
35
+ expect(res.three_step.form_url).to match('secure.cardflexonline.com')
36
+ end
37
+ end
@@ -0,0 +1,24 @@
1
+ unless defined?(INTEGRATION_SPEC_HELPER_LOADED)
2
+ require File.dirname(__FILE__) + '/../spec_helper'
3
+ require 'cgi'
4
+
5
+ Cardflex::Configuration.environment = :test
6
+ # use the testing api key
7
+ Cardflex::Configuration.api_key = ENV['CARDFLEX_API_KEY'] || "2F822Rw39fx762MaV7Yy86jXGTC7sCDy"
8
+ INTEGRATION_SPEC_HELPER_LOADED = true
9
+
10
+ module SpecHelper
11
+ # takes care of step 2, the form posting to the form_url
12
+ # parses out the token_id and returns it
13
+ def self.step_two(form_url, attrs={})
14
+ uri = URI(form_url)
15
+ attrs.merge!({
16
+ 'billing-cc-number' => Cardflex::Test::Cards::Visa,
17
+ 'billing-cc-exp' => Cardflex::Test::Cards::Expiration
18
+ })
19
+
20
+ res = Net::HTTP.post_form(uri, attrs)
21
+ CGI::parse(URI(res.header["Location"]).query)['token-id'][0]
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,4 @@
1
+ --format progress
2
+ --loadby mtime
3
+ --reverse
4
+ --backtrace
@@ -0,0 +1,45 @@
1
+ unless defined?(SPEC_HELPER_LOADED)
2
+ SPEC_HELPER_LOADED = true
3
+ project_root = File.expand_path(File.dirname(__FILE__) + "/..")
4
+
5
+ require "rubygems"
6
+
7
+ cardflex_lib = "#{project_root}/lib"
8
+ $LOAD_PATH << cardflex_lib
9
+
10
+ require "cardflex"
11
+
12
+ Cardflex::Configuration.api_key = 'fake_api_key'
13
+ Cardflex::Configuration.environment = :development
14
+ logger = Logger.new("/dev/null")
15
+ logger.level = Logger::INFO
16
+ Cardflex::Configuration.logger = logger
17
+
18
+ module SpecHelper
19
+ def self.stub_now(time)
20
+ Time.class_eval do
21
+ class << self
22
+ alias original_now now
23
+ end
24
+ end
25
+
26
+ (class << Time; self; end).class_eval do
27
+ define_method(:now) { time }
28
+ end
29
+ yield
30
+ ensure
31
+ Time.class_eval do
32
+ class << self
33
+ alias now original_now
34
+ end
35
+ end
36
+ end
37
+
38
+ class FakeResponse
39
+ attr_reader :body
40
+ def initialize(body)
41
+ @body = body
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDfTCCAmWgAwIBAgIJAN/0qja6lF3KMA0GCSqGSIb3DQEBCwUAMFUxCzAJBgNV
3
+ BAYTAlVTMREwDwYDVQQIDAhJbGxpbm9pczEQMA4GA1UEBwwHQ2hpY2FnbzEhMB8G
4
+ A1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMB4XDTE0MTIxNzE1MDkxM1oX
5
+ DTE3MDkxMTE1MDkxM1owVTELMAkGA1UEBhMCVVMxETAPBgNVBAgMCElsbGlub2lz
6
+ MRAwDgYDVQQHDAdDaGljYWdvMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0
7
+ eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMicqyz6IsAEDz
8
+ IUi2i8GXQxNh06P5j5VOr/4EtDwSjRfIIJfT0sA6IlPHl2kzToMrpuPTj9wU78JZ
9
+ Prn1yX9CBEh2liDfStsuu7I4tIpK5hhpXTKztGpSoxaqSmulk9Mhr/sxuEiq/ySm
10
+ 8V/VByql9Wzx9dYjZBUEsRmti2kxDQMPXEoqy4nLOt4Y/S+0cjyD3Np7jzzxcNbS
11
+ Z5GkFMl9SC+DY8BkKb7NfRzq0+Vhmdj5c8CoO4sJh21H1cfwwJiQCN6Ik931ZWsI
12
+ zppGBuwSpWO+lB7aoE8mXmPsP4xRVAi8YSTr6n9Xpc8rlpB6gnBzCfNGC+YS8RH/
13
+ zZ25gjfjAgMBAAGjUDBOMB0GA1UdDgQWBBRGTZNwKA8VaENdBjn+a/cwl6P9AzAf
14
+ BgNVHSMEGDAWgBRGTZNwKA8VaENdBjn+a/cwl6P9AzAMBgNVHRMEBTADAQH/MA0G
15
+ CSqGSIb3DQEBCwUAA4IBAQBLrRCtztpruUTCxRmhZFjLMTQPtAdUiXgGsBkbEVOM
16
+ xmXB7fiNaYFLZw9i2XYr6DqKdlFSksP505y3JYbl2MrGnalrva/XYtMudMe6B0KG
17
+ vwKYLYuMdRczWRH0vOH/exgxqhXYbA3JUzcdYf1ukDCtSJuvIM285gozIzUg06E4
18
+ pzYLxfxeIJlcZGI0KpFqXTmAZkkjgvK2zC5LGdzLhbUvHy2nXQUEw59FHyVgX1RZ
19
+ 3tHO3ziBMxT1lvfVsPviSAIVk/n14w4uRnf+3VKxoEpOPgrNlBMsrntOWcCMxS3B
20
+ ry0G9OOw/cxEWnEx7oplzZhviAdNkMx5iCZmE7U0DlUf
21
+ -----END CERTIFICATE-----
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
3
+ MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
4
+ YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
5
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
6
+ R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
7
+ 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
8
+ fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
9
+ iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
10
+ 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
11
+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
12
+ MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
13
+ ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
14
+ uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
15
+ Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
16
+ tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
17
+ PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
18
+ hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
19
+ 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,30 @@
1
+ -----BEGIN ENCRYPTED PRIVATE KEY-----
2
+ MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIZdWUZQH9Xn4CAggA
3
+ MBQGCCqGSIb3DQMHBAiTOnspw5DQJASCBMj3x5iJa0tIJGDl4r0eqvVkOOtzB8FF
4
+ DEcyOntmzUx/hjcf1gTZkS3k8PuPmef4+mX+RS6zzs3kPn+cOpEGcofAwBtY5NOE
5
+ UV1grB5dU30TZMsfQhEs0IE2DGyWXwx2qxaiOCIvonUtaGWBaDogPfKL22DxRwqb
6
+ cHs+pOj7EYprBUxJ8Ba34LR1EtYa/yJbod6qsxQeAlmAXksEeNm7Giang7f9mz4/
7
+ au8NAB6+/06jJScsPAxwttBEFqxJKLKP9f5GvxseXSdyxceWoihHvvlr9xSbI2Fr
8
+ IGrkj8lKnJBnFab87PGQWjyNRQVuocnIbcCd0Ql9rLjmk52Zw7nDYaKAzXGTNgPV
9
+ y1o0VK2Uczbor+k973I8llotYNd/1hRwpcujFrk61riFGNa4rEckg1TkBYrTanKB
10
+ 8BDf+lEO7CeDSPwZDKxUhb6pw1P57MJ4ZoyzkJld+UfFJGv9d9d5ZdTZ07r0pC9q
11
+ 0FyeqVNvLy54kgsQdyjkk1ikcAYS5RGoSh0Ko5rBvZ3xAFyvlzTIdMDhXe7+/UBV
12
+ i2rbQLvVbivxvVqI9F5XjK2kcydSxWi43TVZ51Xfd9vfxPQLoDVVx1DCaaUvak7n
13
+ Bs0O7wzY13bA0FV2abOrGLQe73xQyk0nCLRGpaNh6H++CaviobzD6TkHu3q5JQl0
14
+ Akg+eUnsgDELItRBUS7GqL+IW8DnefxwRZDrkmAtxJy/ZUuSMLggYKMGwEejK71/
15
+ SGHSr9wu9w4Fh/4YcFhtL2nbtN4Kw4xd3Mh6B/tBqlJ/ymiHGoy6BvXOW16Ool4l
16
+ Ph5IFccWmahEa2LcsGgIv0+llmnPSMOOXh9Ig3DOzdP6wZNnSBfjQtpDkn5FoXMv
17
+ 2f57hNG1giJOFsETjQBBsMGAMajlirMmTFchw0NeoT+Qzo9vKuOBYCKqrygj+sXx
18
+ Kcd5DHMogr8LBxNKFinAbqOv0Ly3h0WQoE/Oh0N0FbrVDWoxgeNfdnxfIO7O4WvI
19
+ Yymtp54xXk1CphF7+9sbVg9sRs56oBhOwHghS5KBVG9h9NXPBL26LcjAj04wkgBG
20
+ ZFyoRXfV3sJTh01wH44Kdi4Z3cpwhN3w83pknmIFMY6scmISAVOyv6h3CZ36EX7i
21
+ T+HJNlzQBKmI7f45InikZtLXApsxuDP+ZnphDRQMGqAKIyPUyeIBDebMQ2LQLKxZ
22
+ txu85pVvx5e6yiSi3ICGPw+ZtcaqsVdSPGiUDiCFVoeyD+9mAi+e0cBfL+uhJDem
23
+ NewZVDJ0g4HohEs5dBfNJXHhrFVdzWpfskGEzDLjOlMIT2SWo+DdwsWw5EXvtKco
24
+ 5+AqnQGwSZjEP06C+RIakJI/1tjCzm13z2fa4Y2UZFzFJmImq8wWmawISEJJrv/3
25
+ cOS25875q6id/QhPOTFKdbVs4YZpDZv4m0uZF+rsgOWPOzwBKG3bAXrR9tfqW+jo
26
+ AX43ieIGQsn+gbLMU5mEyxPpCfGobqTRoZjGOqBd0PK3QNKOt+UrHW7xcOO8f1GS
27
+ TgTPb0QwQRsxyxiJNDeo0X93VDtk0997CdXyinrte5F8VUTxlBQX/Nrsya0nKUkF
28
+ /k/v6VEJYmOq/VhtU1x01MkvFBOfMlzwi31PAknzAl4PO+fJHnOqRP7E161rMn+6
29
+ Xgg=
30
+ -----END ENCRYPTED PRIVATE KEY-----
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Cardflex::BaseModule do
4
+ class TestClass
5
+ include Cardflex::BaseModule
6
+ module Type
7
+ A = 'a'
8
+ B = 'b'
9
+ C = 'c'
10
+ end
11
+ end
12
+
13
+ it 'should assign instance variables from a hash' do
14
+ TestClass.set_instance_variables_from_hash({ :test => 'value' })
15
+
16
+ expect(TestClass.instance_variables).to include :@test
17
+ expect(TestClass.instance_variable_get("@test")).to eq 'value'
18
+ end
19
+
20
+ it 'should preserve nested hashes' do
21
+ TestClass.set_instance_variables_from_hash({ :test => { :nest => 'nested' }})
22
+
23
+ expect(TestClass.instance_variable_get("@test")).to eq({ :nest => 'nested' })
24
+ end
25
+
26
+ it 'should snake case a string' do
27
+ expect(TestClass.snakecase('dash-case-variable')).to eq('dash_case_variable')
28
+ end
29
+
30
+ it 'should create helper methods' do
31
+ TestClass.__send__(:create_helper_methods, TestClass::Type)
32
+ expect(TestClass.methods).to include(:a, :b, :c)
33
+ end
34
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Cardflex::Configuration do
4
+ it 'only sets environment, logger, api_key, and/or endpoint' do
5
+ sut = Cardflex::Configuration.new({
6
+ :environment => 'test',
7
+ :logger => 'test',
8
+ :api_key => '123',
9
+ :endpoint => 'test' })
10
+ expect(sut.api_key).to eq '123'
11
+ end
12
+
13
+ it 'should require api_key' do
14
+ expect { Cardflex::Configuration.new }.not_to raise_error
15
+ end
16
+
17
+ it 'should set environment' do
18
+ Cardflex::Configuration.environment = :test
19
+ expect(Cardflex::Configuration.environment).to eq :test
20
+ end
21
+
22
+ it 'should throw an ArgumentError if environment is set wrong' do
23
+ expect { Cardflex::Configuration.environment = :invalid }.to raise_error ArgumentError
24
+ end
25
+
26
+ it 'should use http in development, https otherwise' do
27
+ sut = Cardflex::Configuration.new({ :environment => :test })
28
+ expect(sut.protocol).to eq "https"
29
+ expect(sut.ssl?).to be true
30
+ end
31
+
32
+ it 'should get the certificate file path' do
33
+ sut = Cardflex::Configuration.new
34
+ expect(sut.ca_file).to match "ca-certificates.ca.crt"
35
+ end
36
+
37
+ it 'should get the 3 step base url' do
38
+ sut = Cardflex::Configuration.new({ :environment => :test })
39
+ expect(sut.three_step_path).to match "/api/v2/three-step"
40
+ end
41
+
42
+ it 'should get the api version' do
43
+ sut = Cardflex::Configuration.new
44
+ expect(sut.api_version).to eq 3
45
+ end
46
+
47
+ it 'should get the correct port' do
48
+ sut = Cardflex::Configuration.new({ :environment => :test })
49
+ expect(sut.port).to eq 443
50
+ end
51
+
52
+ it 'should get a logger set to INFO level' do
53
+ sut = Cardflex::Configuration.new
54
+ expect(sut.logger.level).to be Logger::INFO
55
+ end
56
+
57
+ it 'should create a new Http instance out of this config' do
58
+ sut = Cardflex::Configuration.new
59
+ expect(sut.http.config).to be sut
60
+ end
61
+ end
@@ -0,0 +1,10 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Cardflex::CustomerVaultGateway do
4
+ it 'should raise an ArgumentError for missing redirect_url and customer_vault_id' do
5
+ sut = Cardflex::CustomerVaultGateway.new(Cardflex::Configuration.gateway.customer_vault)
6
+
7
+ expect { sut.request({ :root => {} }) }.to raise_error(ArgumentError)
8
+ expect { sut.request({ :root => { :redirect_url => 'test' }}) }.to raise_error(ArgumentError)
9
+ end
10
+ end