tres_delta 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 578097ac40a7cc64e1263c8777d67bb5da106185
4
- data.tar.gz: 12dfb29a0c45465e36cced8451387645753ef6a8
3
+ metadata.gz: 4c26e3ee095b7862bc852e53230559f3791b900d
4
+ data.tar.gz: 65df9b9ad5b9a8422d92ad7a7f18d8ff63e56bca
5
5
  SHA512:
6
- metadata.gz: 5bdb1907718fea6b0e862330838848744d9b9c65a1eabf2cbfcc5e8ee78dd437f5079b99dcf1505dc769659954426da588f63f0c0127f4d8e81312c011523799
7
- data.tar.gz: f9e25484ef3dbf7290ea0eaa6e2263d025cb54b7f24e32858d987f152592ee93aa5c7b05609682bafb5ce477c43e46a667619382df8a8720e57d6333f62fe806
6
+ metadata.gz: f054f0522ea8fc7b7c79ba7f65d46f6913e0cbba42e790c94abf0a8e9a032df884f08b1191c3de2d725f23a01d7d140ff52fdcbb893fa560b232dcc4b402f0c9
7
+ data.tar.gz: c439e65b3fa0e6ae07f957e0085287427a27b88cb9fa39b232533292969308ae81bd17ad62f533bf9fd4ad722ff5c1d36aec8bea790c033e1b8562b985fd60fe
@@ -2,48 +2,46 @@ require 'savon'
2
2
 
3
3
  module TresDelta
4
4
  class Client
5
- attr_accessor :wsdl
6
-
7
- def initialize(wsdl)
8
- @wsdl = wsdl
9
- end
10
-
11
- def request(action, soap_body)
12
- Response.create_from_action(action, client.call(action, message: soap_body))
13
- end
14
-
15
- def client_credentials
16
- {
17
- "ClientCode" => config["client_code"],
18
- "Password" => config["password"],
19
- "UserName" => config["user_name"]
20
- }
21
- end
22
-
23
- def location_identifier
24
- {
25
- 'LocationCode' => config["location_code"],
26
- 'MerchantCode' => config["merchant_code"]
27
- }
28
- end
29
-
30
- def client
31
- # TODO: Make this configurable via file. Because right now this ain't secure. -_-
32
- @client ||= ::Savon.client(savon_options)
33
- end
34
-
35
- def savon_options
36
- default_savon_options.merge(savon_overrides || {})
37
- end
38
-
39
- def default_savon_options
40
- { wsdl: wsdl, ssl_version: :SSLv3, ssl_verify_mode: :none, log: false }
41
- end
42
-
43
- def savon_overrides; end
44
-
45
- def config
46
- Config.config
5
+ class << self
6
+ attr_accessor :wsdl
7
+
8
+ def request(action, soap_body)
9
+ Response.create_from_action(action, client.call(action, message: soap_body))
10
+ end
11
+
12
+ def client_credentials
13
+ {
14
+ "ClientCode" => config["client_code"],
15
+ "Password" => config["password"],
16
+ "UserName" => config["user_name"]
17
+ }
18
+ end
19
+
20
+ def location_identifier
21
+ {
22
+ 'LocationCode' => config["location_code"],
23
+ 'MerchantCode' => config["merchant_code"]
24
+ }
25
+ end
26
+
27
+ def client
28
+ # TODO: Make this configurable via file. Because right now this ain't secure. -_-
29
+ @client ||= ::Savon.client(savon_options)
30
+ end
31
+
32
+ def savon_options
33
+ default_savon_options.merge(savon_overrides || {})
34
+ end
35
+
36
+ def default_savon_options
37
+ { wsdl: wsdl, ssl_version: :SSLv3, ssl_verify_mode: :none, log: false }
38
+ end
39
+
40
+ def savon_overrides; end
41
+
42
+ def config
43
+ Config.config
44
+ end
47
45
  end
48
46
  end
49
47
  end
@@ -1,9 +1,11 @@
1
1
  module TresDelta
2
2
  class CreditCard
3
- attr_reader :number, :expiration_month, :expiration_year, :token, :name, :billing_address, :type, :nickname
3
+ attr_reader :number, :name, :billing_address, :type, :nickname, :customer, :security_code
4
+
5
+ attr_accessor :token, :expiration_month, :expiration_year
4
6
 
5
7
  def initialize(params = {})
6
- @number = params[:number]
8
+ @number = params[:number] || params[:card_account_number]
7
9
  @expiration_month = params[:expiration_month]
8
10
  @expiration_year = params[:expiration_year]
9
11
  @token = params[:token]
@@ -11,6 +13,37 @@ module TresDelta
11
13
  @billing_address = Address.new(params[:billing_address] || {})
12
14
  @type = params[:type]
13
15
  @nickname = params[:nickname]
16
+ @customer = params[:customer] || Customer.new
17
+ @security_code = params[:security_code]
18
+ end
19
+
20
+ def save
21
+ if token.nil?
22
+ Vault.add_stored_credit_card(customer, self).success?
23
+ else
24
+ Vault.update_stored_credit_card(customer, self).success?
25
+ end
26
+ end
27
+
28
+ class << self
29
+ def create(customer, params = {})
30
+ CreditCard.new(params).tap do |credit_card|
31
+ add_card = Vault.add_stored_credit_card(customer, credit_card)
32
+ raise InvalidCreditCard unless add_card.success?
33
+
34
+ credit_card.token = add_card.token
35
+ end
36
+ end
37
+
38
+ def find(customer, token, load_number = false)
39
+ stored_card_details = Vault.get_stored_credit_card(customer, token, load_number)
40
+ raise CreditCardNotFound unless stored_card_details.success?
41
+
42
+ CreditCard.new(stored_card_details.credit_card.merge(customer: customer))
43
+ end
14
44
  end
15
45
  end
46
+
47
+ class InvalidCreditCard < Exception; end
48
+ class CreditCardNotFound < Exception; end
16
49
  end
@@ -14,7 +14,7 @@ module TresDelta
14
14
  class << self
15
15
  def create(params = {})
16
16
  Customer.new(params).tap do |customer|
17
- unless Vault.new.create_customer(customer).success?
17
+ unless Vault.create_customer(customer).success?
18
18
  raise InvalidCustomer
19
19
  end
20
20
  end
@@ -1,81 +1,84 @@
1
1
  module TresDelta
2
2
  class Gateway < Client
3
- def initialize
4
- @wsdl = Config.config['transaction_wsdl']
5
- end
6
3
 
7
- def authorize(transaction_key, credit_card, amount, order_number, customer)
8
- request :authorize, authorize_params(transaction_key, credit_card, amount, order_number, customer)
9
- end
4
+ class << self
5
+ def wsdl
6
+ Config.config['transaction_wsdl']
7
+ end
8
+
9
+ def authorize(transaction_key, credit_card, amount, order_number, customer)
10
+ request :authorize, authorize_params(transaction_key, credit_card, amount, order_number, customer)
11
+ end
10
12
 
11
- def authorize_params(transaction_key, credit_card, amount, order_number, customer)
12
- {
13
- 'clientCredentials' => client_credentials,
14
- 'authorizeParams' => {
15
- 'AddOrUpdateCard' => 'true',
16
- 'CreditCardTransaction' => {
17
- 'CreditCard' => credit_card_params(credit_card),
18
- 'CurrencyCode' => 'USDollars',
19
- 'StoredCardIdentifier' => {
20
- 'CustomerCode' => customer.vault_key
13
+ def authorize_params(transaction_key, credit_card, amount, order_number, customer)
14
+ {
15
+ 'clientCredentials' => client_credentials,
16
+ 'authorizeParams' => {
17
+ 'AddOrUpdateCard' => 'true',
18
+ 'CreditCardTransaction' => {
19
+ 'CreditCard' => credit_card_params(credit_card),
20
+ 'CurrencyCode' => 'USDollars',
21
+ 'StoredCardIdentifier' => {
22
+ 'CustomerCode' => customer.vault_key
23
+ },
24
+ 'TotalAmount' => amount,
25
+ 'TransactionKey' => transaction_key
21
26
  },
22
- 'TotalAmount' => amount,
23
- 'TransactionKey' => transaction_key
24
- },
25
- 'TerminalIdentifier' => terminal_identifier
27
+ 'TerminalIdentifier' => terminal_identifier
28
+ }
26
29
  }
27
- }
28
- end
30
+ end
29
31
 
30
- def card_verification(transaction_key, credit_card)
31
- request(:card_verification, card_verification_params(transaction_key, credit_card))
32
- end
32
+ def card_verification(transaction_key, credit_card)
33
+ request(:card_verification, card_verification_params(transaction_key, credit_card))
34
+ end
33
35
 
34
- def card_verification_params(transaction_key, credit_card)
35
- {
36
- 'clientCredentials' => client_credentials,
37
- 'cardVerificationParams' => {
38
- 'AddOrUpdateCard' => 'false',
39
- 'CreditCard' => credit_card_params(credit_card),
40
- 'TerminalIdentifier' => terminal_identifier,
41
- 'TransactionKey' => transaction_key
36
+ def card_verification_params(transaction_key, credit_card)
37
+ {
38
+ 'clientCredentials' => client_credentials,
39
+ 'cardVerificationParams' => {
40
+ 'AddOrUpdateCard' => 'false',
41
+ 'CreditCard' => credit_card_params(credit_card),
42
+ 'TerminalIdentifier' => terminal_identifier,
43
+ 'TransactionKey' => transaction_key
44
+ }
42
45
  }
43
- }
44
- end
46
+ end
45
47
 
46
- def credit_card_params(credit_card)
47
- {
48
- 'cc:BillingAddress' => billing_address_params(credit_card.billing_address),
49
- 'cc:CardAccountNumber' => credit_card.number,
50
- 'cc:ExpirationMonth' => credit_card.expiration_month,
51
- 'cc:ExpirationYear' => credit_card.expiration_year,
52
- 'NameOnCard' => credit_card.name,
53
- 'CardSecurityCode' => nil,
54
- 'CardSecurityCodeIndicator' => 'None'
55
- }
56
- end
48
+ def credit_card_params(credit_card)
49
+ {
50
+ 'cc:BillingAddress' => billing_address_params(credit_card.billing_address),
51
+ 'cc:CardAccountNumber' => credit_card.number,
52
+ 'cc:ExpirationMonth' => credit_card.expiration_month,
53
+ 'cc:ExpirationYear' => credit_card.expiration_year,
54
+ 'NameOnCard' => credit_card.name,
55
+ 'CardSecurityCode' => credit_card.security_code,
56
+ 'CardSecurityCodeIndicator' => credit_card.security_code.nil? ? 'None' : 'Provided'
57
+ }
58
+ end
57
59
 
58
- def billing_address_params(billing_address)
59
- {
60
- 'cc:AddressLine1' => billing_address.address,
61
- 'cc:PostalCode' => billing_address.zip_code
62
- }
63
- end
60
+ def billing_address_params(billing_address)
61
+ {
62
+ 'cc:AddressLine1' => billing_address.address,
63
+ 'cc:PostalCode' => billing_address.zip_code
64
+ }
65
+ end
64
66
 
65
- def terminal_identifier
66
- {
67
- 'LocationCode' => config['location_code'],
68
- 'MerchantCode' => config['merchant_code'],
69
- 'TerminalCode' => config['terminal_code']
70
- }
71
- end
67
+ def terminal_identifier
68
+ {
69
+ 'LocationCode' => config['location_code'],
70
+ 'MerchantCode' => config['merchant_code'],
71
+ 'TerminalCode' => config['terminal_code']
72
+ }
73
+ end
72
74
 
73
- def savon_overrides
74
- {
75
- namespaces: {
76
- 'xmlns:cc' => 'http://schemas.datacontract.org/2004/07/ThreeDelta.Web.Services.ECLinx.Definitions'
75
+ def savon_overrides
76
+ {
77
+ namespaces: {
78
+ 'xmlns:cc' => 'http://schemas.datacontract.org/2004/07/ThreeDelta.Web.Services.ECLinx.Definitions'
79
+ }
77
80
  }
78
- }
81
+ end
79
82
  end
80
83
  end
81
84
  end
@@ -1,86 +1,114 @@
1
1
  module TresDelta
2
2
  class Vault < Client
3
- def initialize
4
- @wsdl = Config.config['management_wsdl']
5
- end
6
3
 
7
- def create_customer(customer)
8
- request(:create_customer, create_customer_params(customer))
9
- end
4
+ class << self
5
+ def wsdl
6
+ Config.config['management_wsdl']
7
+ end
10
8
 
11
- def create_customer_params(customer)
12
- {
13
- 'clientCredentials' => client_credentials,
14
- 'createCustomerParams' => {
15
- 'Customer' => {
16
- 'Code' => customer.vault_key,
17
- 'Name' => customer.name
18
- },
19
- 'LocationIdentifier' => location_identifier
9
+ def create_customer(customer)
10
+ request(:create_customer, create_customer_params(customer))
11
+ end
12
+
13
+ def create_customer_params(customer)
14
+ {
15
+ 'clientCredentials' => client_credentials,
16
+ 'createCustomerParams' => {
17
+ 'Customer' => {
18
+ 'Code' => customer.vault_key,
19
+ 'Name' => customer.name
20
+ },
21
+ 'LocationIdentifier' => location_identifier
22
+ }
20
23
  }
21
- }
22
- end
24
+ end
23
25
 
24
- def add_stored_credit_card(customer, credit_card)
25
- request(:add_stored_credit_card, add_stored_credit_card_params(customer, credit_card))
26
- end
26
+ def add_stored_credit_card(customer, credit_card)
27
+ request(:add_stored_credit_card, add_stored_credit_card_params(customer, credit_card))
28
+ end
27
29
 
28
- def add_stored_credit_card_params(customer, credit_card)
29
- {
30
- 'clientCredentials' => client_credentials,
31
- 'addStoredCardParams' => {
32
- 'CreditCard' => {
33
- 'CardAccountNumber' => credit_card.number,
34
- 'CardType' => credit_card.type,
35
- 'Cardholder' => {
36
- 'FirstName' => credit_card.name,
37
- 'LastName' => nil
30
+ def add_stored_credit_card_params(customer, credit_card)
31
+ {
32
+ 'clientCredentials' => client_credentials,
33
+ 'addStoredCardParams' => {
34
+ 'CreditCard' => {
35
+ 'CardAccountNumber' => credit_card.number,
36
+ 'CardType' => credit_card.type,
37
+ 'Cardholder' => {
38
+ 'FirstName' => credit_card.name,
39
+ 'LastName' => nil
40
+ },
41
+ 'ExpirationMonth' => credit_card.expiration_month,
42
+ 'ExpirationYear' => credit_card.expiration_year,
43
+ 'NameOnCard' => credit_card.name,
44
+ 'FriendlyName' => credit_card.nickname
38
45
  },
39
- 'ExpirationMonth' => credit_card.expiration_month,
40
- 'ExpirationYear' => credit_card.expiration_year,
41
- 'NameOnCard' => credit_card.name,
42
- 'FriendlyName' => credit_card.nickname
43
- },
44
- 'CustomerIdentifier' => customer_identifier(customer)
46
+ 'CustomerIdentifier' => customer_identifier(customer)
47
+ }
45
48
  }
46
- }
47
- end
49
+ end
48
50
 
49
- def customer_identifier(customer)
50
- {
51
- 'CustomerCode' => customer.vault_key,
52
- 'LocationCode' => config["location_code"],
53
- 'MerchantCode' => config["merchant_code"]
54
- }
55
- end
51
+ def customer_identifier(customer)
52
+ {
53
+ 'CustomerCode' => customer.vault_key,
54
+ 'LocationCode' => config["location_code"],
55
+ 'MerchantCode' => config["merchant_code"]
56
+ }
57
+ end
56
58
 
57
- def get_stored_credit_card(customer, token, include_card_number = false)
58
- request(:get_stored_credit_card, get_stored_credit_card_params(customer, token, include_card_number))
59
- end
59
+ def get_stored_credit_card(customer, token, include_card_number = false)
60
+ request(:get_stored_credit_card, get_stored_credit_card_params(customer, token, include_card_number))
61
+ end
60
62
 
61
- def get_stored_credit_card_params(customer, token, include_card_number)
62
- {
63
- 'clientCredentials' => client_credentials,
64
- 'getStoredCreditCardParams' => {
65
- 'CustomerIdentifier' => customer_identifier(customer),
66
- 'RetrieveCardNumber' => include_card_number ? 'true' : 'false',
67
- 'Token' => token
63
+ def get_stored_credit_card_params(customer, token, include_card_number)
64
+ {
65
+ 'clientCredentials' => client_credentials,
66
+ 'getStoredCreditCardParams' => {
67
+ 'CustomerIdentifier' => customer_identifier(customer),
68
+ 'RetrieveCardNumber' => include_card_number ? 'true' : 'false',
69
+ 'Token' => token
70
+ }
68
71
  }
69
- }
70
- end
72
+ end
71
73
 
72
- def get_token_for_card_number(card_number, customer)
73
- request(:get_token_for_card_number, get_token_for_card_number_params(card_number, customer))
74
- end
74
+ def get_token_for_card_number(card_number, customer)
75
+ request(:get_token_for_card_number, get_token_for_card_number_params(card_number, customer))
76
+ end
75
77
 
76
- def get_token_for_card_number_params(card_number, customer)
77
- {
78
- 'clientCredentials' => client_credentials,
79
- 'getTokenForCardNumberParams' => {
80
- 'AccountNumber' => card_number,
81
- 'CustomerIdentifier' => customer_identifier(customer)
78
+ def get_token_for_card_number_params(card_number, customer)
79
+ {
80
+ 'clientCredentials' => client_credentials,
81
+ 'getTokenForCardNumberParams' => {
82
+ 'AccountNumber' => card_number,
83
+ 'CustomerIdentifier' => customer_identifier(customer)
84
+ }
85
+ }
86
+ end
87
+
88
+ def update_stored_credit_card(customer, credit_card)
89
+ request(:update_stored_credit_card, update_stored_credit_card_params(customer, credit_card))
90
+ end
91
+
92
+ def update_stored_credit_card_params(customer, credit_card)
93
+ {
94
+ 'clientCredentials' => client_credentials,
95
+ 'updateStoredCardParams' => {
96
+ 'CreditCard' => {
97
+ 'CardType' => credit_card.type,
98
+ 'CardHolder' => {
99
+ 'FirstName' => credit_card.name,
100
+ 'Lastname' => nil
101
+ },
102
+ 'ExpirationMonth' => credit_card.expiration_month,
103
+ 'ExpirationYear' => credit_card.expiration_year,
104
+ 'NameOnCard' => credit_card.name,
105
+ 'FriendlyName' => credit_card.nickname,
106
+ 'Token' => credit_card.token
107
+ },
108
+ 'CustomerIdentifier' => customer_identifier(customer)
109
+ }
82
110
  }
83
- }
111
+ end
84
112
  end
85
113
  end
86
114
  end
@@ -1,3 +1,3 @@
1
1
  module TresDelta
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe TresDelta::Client do
4
4
  let(:wsdl) { "http://example.com" }
5
5
 
6
- let(:client) { TresDelta::Client.new(wsdl) }
6
+ let(:client) { TresDelta::Client }
7
7
  let(:config) { TresDelta::Config.config }
8
8
 
9
9
  describe "#client_credentials" do
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ describe TresDelta::CreditCard do
4
+ let(:customer) { TresDelta::Customer.create(name: "Test Customer") }
5
+
6
+ let(:bad_params) do
7
+ {
8
+ number: '4111111111111111',
9
+ expiration_month: '8',
10
+ expiration_year: Time.now.strftime("%Y").to_i + 3,
11
+ name: 'Joe Customer',
12
+ type: 'MasterCard',
13
+ nickname: 'Test Visa, Yo.',
14
+ customer: customer
15
+ }
16
+ end
17
+
18
+ let(:good_params) do
19
+ {
20
+ number: '4111111111111111',
21
+ expiration_month: '8',
22
+ expiration_year: Time.now.strftime("%Y").to_i + 3,
23
+ name: 'Joe Customer',
24
+ type: 'Visa',
25
+ nickname: 'Test Visa, Yo.',
26
+ customer: customer
27
+ }
28
+ end
29
+
30
+ let(:credit_card) { TresDelta::CreditCard.create(customer, good_params) }
31
+
32
+ describe "#create" do
33
+ context "successfully saved to vault" do
34
+ it "doesn't raise an exception" do
35
+ expect { TresDelta::CreditCard.create(customer, good_params) }.to_not raise_exception
36
+ end
37
+
38
+ it "has a token" do
39
+ expect(credit_card.token).to_not be_nil
40
+ end
41
+ end
42
+
43
+ context "fails to save to vault" do
44
+ it "raises an exception" do
45
+ expect { TresDelta::CreditCard.create(customer, bad_params) }.to raise_exception(TresDelta::InvalidCreditCard)
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "#find" do
51
+ context "card exists" do
52
+ let(:token) { credit_card.token }
53
+ let(:found_card) { TresDelta::CreditCard.find(customer, token, true) }
54
+
55
+ it "returns a credit card object" do
56
+ expect(found_card).to be_a(TresDelta::CreditCard)
57
+ expect(found_card.number).to eq(credit_card.number)
58
+ expect(found_card.token).to eq(token)
59
+ expect(found_card.expiration_month).to eq(credit_card.expiration_month)
60
+ expect(found_card.expiration_year.to_i).to eq(credit_card.expiration_year)
61
+ expect(found_card.customer).to eq(customer)
62
+ end
63
+ end
64
+
65
+ context "not found" do
66
+ let(:token) { SecureRandom.hex(6) }
67
+
68
+ it "raises an error" do
69
+ expect { TresDelta::CreditCard.find(customer, token) }.to raise_exception(TresDelta::CreditCardNotFound)
70
+ end
71
+ end
72
+ end
73
+
74
+ describe ".save" do
75
+ let(:credit_card) { TresDelta::CreditCard.new(params) }
76
+ let(:result) { credit_card.save }
77
+ context "card hasn't been tokenized" do
78
+ context "bad data" do
79
+ let(:params) { bad_params }
80
+
81
+ it "returns false" do
82
+ expect(result).to be_false
83
+ end
84
+ end
85
+
86
+ context "good data" do
87
+ let(:params) { good_params }
88
+
89
+ it "returns true" do
90
+ expect(result).to be_true
91
+ end
92
+ end
93
+ end
94
+
95
+ context "card has been tokenized" do
96
+ let(:token) { TresDelta::CreditCard.create(customer, good_params).token }
97
+
98
+ context "good data" do
99
+ let(:params) { good_params.merge(:token => token) }
100
+
101
+ it "returns true" do
102
+ expect(result).to be_true
103
+ end
104
+ end
105
+
106
+ context "bad data" do
107
+ let(:params) { bad_params.merge(:token => token, :expiration_month => 13) }
108
+
109
+ it "returns false" do
110
+ expect(result).to be_false
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -1,10 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe TresDelta::Gateway do
4
- let(:gateway) { TresDelta::Gateway.new }
4
+ let(:gateway) { TresDelta::Gateway }
5
5
  let(:transaction_key) { SecureRandom.hex(6) }
6
6
  let(:customer) { TresDelta::Customer.new(name: 'FOO BAR') }
7
7
  let(:good_address) { "10124 Brentridge Ct" }
8
+ let(:security_code) { nil }
8
9
 
9
10
  # arbitrary: Cisco, TX
10
11
  let(:zip_code_good) { '76437' }
@@ -17,7 +18,8 @@ describe TresDelta::Gateway do
17
18
  name: 'Joe Customer',
18
19
  type: 'Visa',
19
20
  nickname: 'Test Visa, Yo.',
20
- billing_address: address_params
21
+ billing_address: address_params,
22
+ security_code: security_code
21
23
  })
22
24
  end
23
25
 
@@ -44,6 +46,29 @@ describe TresDelta::Gateway do
44
46
 
45
47
  let(:response) { gateway.card_verification(transaction_key, credit_card) }
46
48
 
49
+ context "checking card security code", :wip => true do
50
+ let(:zip_code) { zip_code_good }
51
+ subject { response.card_security_code_response }
52
+
53
+ context "no security code provided" do
54
+ it { should eq('None') }
55
+ end
56
+
57
+ context "security code provided" do
58
+ context "invalid security code" do
59
+ let(:security_code) { 123 } # fails in development mode
60
+
61
+ it { should eq('NotMatched') }
62
+ end
63
+
64
+ context "valid security code" do
65
+ let(:security_code) { 666 }
66
+
67
+ it { should eq('Matched') }
68
+ end
69
+ end
70
+ end
71
+
47
72
  context "good zip code" do
48
73
  let(:zip_code) { zip_code_good }
49
74
 
@@ -110,7 +135,7 @@ describe TresDelta::Gateway do
110
135
  let(:amount) { 13.37 }
111
136
  let(:address_params) { { address: good_address, zip_code: zip_code_good} }
112
137
  let(:response) { gateway.authorize(transaction_key, credit_card, amount, order_number, customer) }
113
- let(:vault) { TresDelta::Vault.new }
138
+ let(:vault) { TresDelta::Vault }
114
139
 
115
140
  before(:each) do
116
141
  vault.create_customer(customer)
@@ -5,17 +5,21 @@ describe TresDelta::Vault do
5
5
  let(:wsdl) { config["management_wsdl"] }
6
6
  let(:customer) { TresDelta::Customer.new(name: name) }
7
7
  let(:name) { SecureRandom.hex(4) }
8
- let(:vault) { TresDelta::Vault.new }
8
+ let(:vault) { TresDelta::Vault }
9
9
 
10
- let(:good_visa) do
11
- TresDelta::CreditCard.new({
10
+ let(:good_visa_params) do
11
+ {
12
12
  number: '4111111111111111',
13
13
  expiration_month: '8',
14
14
  expiration_year: Time.now.strftime("%Y").to_i + 3,
15
15
  name: 'Joe Customer',
16
16
  type: 'Visa',
17
17
  nickname: 'Test Visa, Yo.'
18
- })
18
+ }
19
+ end
20
+
21
+ let(:good_visa) do
22
+ TresDelta::CreditCard.new(good_visa_params)
19
23
  end
20
24
 
21
25
  it "uses the WSDL from the global config" do
@@ -39,7 +43,6 @@ describe TresDelta::Vault do
39
43
 
40
44
  describe ".add_stored_credit_card" do
41
45
  let(:customer) { TresDelta::Customer.new(name: 'Test Customer') }
42
- let(:vault) { TresDelta::Vault.new }
43
46
 
44
47
  before(:each) do
45
48
  vault.create_customer(customer)
@@ -176,4 +179,43 @@ describe TresDelta::Vault do
176
179
  end
177
180
  end
178
181
  end
182
+
183
+ describe "update_stored_credit_card" do
184
+ let(:customer) { TresDelta::Customer.create(name: "Test Customer") }
185
+ let(:stored_card) { TresDelta::CreditCard.create(customer, good_visa_params) }
186
+ let(:token) { stored_card.token }
187
+ let(:new_nickname) { SecureRandom.hex(6) }
188
+ let(:new_name) { SecureRandom.hex(6) }
189
+ let(:new_expiration_month) { 9 }
190
+ let(:new_expiration_year) { Time.now.strftime("%Y").to_i + 5 }
191
+
192
+ let(:updated_params) do
193
+ good_visa_params.merge({
194
+ expiration_month: new_expiration_month,
195
+ expiration_year: new_expiration_year,
196
+ nickname: new_nickname,
197
+ name: new_name,
198
+ token: token
199
+ })
200
+ end
201
+
202
+ let(:updated_card) { TresDelta::CreditCard.new(updated_params) }
203
+
204
+ context "good information" do
205
+ let!(:response) { vault.update_stored_credit_card(customer, updated_card) }
206
+
207
+ it "succeeds" do
208
+ expect(response.success?).to be_true
209
+ end
210
+
211
+ let(:reloaded_card_details) { vault.get_stored_credit_card(customer, token).credit_card }
212
+
213
+ it "updates the card" do
214
+ expect(reloaded_card_details[:expiration_month].to_i).to eq(new_expiration_month)
215
+ expect(reloaded_card_details[:expiration_year].to_i).to eq(new_expiration_year)
216
+ expect(reloaded_card_details[:friendly_name]).to eq(new_nickname)
217
+ expect(reloaded_card_details[:name_on_card]).to eq(new_name)
218
+ end
219
+ end
220
+ end
179
221
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tres_delta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 1000Bulbs
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-20 00:00:00.000000000 Z
12
+ date: 2014-03-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: savon
@@ -94,6 +94,7 @@ files:
94
94
  - lib/tres_delta/version.rb
95
95
  - spec/spec_helper.rb
96
96
  - spec/tres_delta/client_spec.rb
97
+ - spec/tres_delta/credit_card_spec.rb
97
98
  - spec/tres_delta/customer_spec.rb
98
99
  - spec/tres_delta/gateway_spec.rb
99
100
  - spec/tres_delta/vault_spec.rb
@@ -126,6 +127,7 @@ summary: If you need to talk to 3Delta's credit card vault/payment gateway in Ru
126
127
  test_files:
127
128
  - spec/spec_helper.rb
128
129
  - spec/tres_delta/client_spec.rb
130
+ - spec/tres_delta/credit_card_spec.rb
129
131
  - spec/tres_delta/customer_spec.rb
130
132
  - spec/tres_delta/gateway_spec.rb
131
133
  - spec/tres_delta/vault_spec.rb