tres_delta 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 42fa12ff320aeb5b1c3e547012cfb12de4750034
4
+ data.tar.gz: 41d94636dc3b346b47eb20a60347944bf837c878
5
+ SHA512:
6
+ metadata.gz: d71952aecaebdd6e3790d2fa9e5bc5555e11a16859aad80ea3bd571b569e8d4cedada9b9a4d08fd47c75ca95c85c0d358fdd6f97a8314e2d8681bdbd45e7c60f
7
+ data.tar.gz: 64e8999d46eef97455ff886b03a3555bca270099615639303ca17f412b95781307b091a62c25e90a6eb437e65a1fef9a9eea555ee96d36db890ed8bcdeffbe88
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ config/three_delta.yml
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ tres_delta
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in tres_delta.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Zachary Danger Campbell
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # TresDelta
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'tres_delta'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install tres_delta
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "rspec/core/rake_task"
4
+
5
+ RSpec::Core::RakeTask.new
6
+
7
+ task :default => :spec
@@ -0,0 +1,9 @@
1
+ ---
2
+ client_code: User
3
+ user_name: Linxtrans
4
+ password: Sample3c0de
5
+ merchant_code: User
6
+ location_code: Location1
7
+ terminal_code: Terminal1
8
+ management_wsdl: https://services.PWSDemo.com/CreditCardManagementService.svc?wsdl
9
+ transaction_wsdl: https://services.PWSDemo.com/CreditCardTransactionService.svc?wsdl
@@ -0,0 +1,49 @@
1
+ require 'savon'
2
+
3
+ module TresDelta
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
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,11 @@
1
+ module TresDelta
2
+ class Config
3
+ def self.config=(new_config)
4
+ @@config = new_config
5
+ end
6
+
7
+ def self.config
8
+ @@config ||= {}
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module TresDelta
2
+ class CreditCard
3
+ class Address
4
+ attr_reader :address, :zip_code
5
+
6
+ def initialize(params = {})
7
+ @address = params[:address]
8
+ @zip_code = params[:zip_code]
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ module TresDelta
2
+ class CreditCard
3
+ attr_reader :number, :expiration_month, :expiration_year, :token, :name, :billing_address, :type, :nickname
4
+
5
+ def initialize(params = {})
6
+ @number = params[:number]
7
+ @expiration_month = params[:expiration_month]
8
+ @expiration_year = params[:expiration_year]
9
+ @token = params[:token]
10
+ @name = params[:name]
11
+ @billing_address = Address.new(params[:billing_address] || {})
12
+ @type = params[:type]
13
+ @nickname = params[:nickname]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ module TresDelta
2
+ class Customer
3
+ attr_reader :name
4
+
5
+ def initialize(params = {})
6
+ @vault_key = params[:vault_key] || nil
7
+ @name = params[:name] || nil
8
+ end
9
+
10
+ def vault_key
11
+ @vault_key ||= SecureRandom.hex(12)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,61 @@
1
+ module TresDelta
2
+ class Gateway < Client
3
+ def initialize
4
+ @wsdl = Config.config['transaction_wsdl']
5
+ end
6
+
7
+ def card_verification(transaction_key, credit_card)
8
+ request(:card_verification, card_verification_params(transaction_key, credit_card))
9
+ end
10
+
11
+ def card_verification_params(transaction_key, credit_card)
12
+ {
13
+ 'clientCredentials' => client_credentials,
14
+ 'cardVerificationParams' => {
15
+ 'AddOrUpdateCard' => 'false',
16
+ 'CreditCard' => credit_card_params(credit_card),
17
+ 'TerminalIdentifier' => terminal_identifier,
18
+ 'TransactionKey' => transaction_key
19
+ }
20
+ }
21
+ end
22
+
23
+ def credit_card_params(credit_card)
24
+ {
25
+ 'cc:BillingAddress' => billing_address_params(credit_card.billing_address),
26
+ 'cc:CardAccountNumber' => credit_card.number,
27
+ 'cc:ExpirationMonth' => credit_card.expiration_month,
28
+ 'cc:ExpirationYear' => credit_card.expiration_year,
29
+ 'NameOnCard' => credit_card.name,
30
+ 'CardSecurityCode' => nil,
31
+ 'CardSecurityCodeIndicator' => 'None'
32
+ }
33
+ end
34
+
35
+ def billing_address_params(billing_address)
36
+ {
37
+ 'cc:AddressLine1' => billing_address.address,
38
+ 'cc:PostalCode' => billing_address.zip_code
39
+ }
40
+ end
41
+
42
+ def terminal_identifier
43
+ {
44
+ 'LocationCode' => config['location_code'],
45
+ 'MerchantCode' => config['merchant_code'],
46
+ 'TerminalCode' => config['terminal_code']
47
+ }
48
+ end
49
+
50
+ def savon_overrides
51
+ {
52
+ namespaces: {
53
+ 'xmlns:cc' => 'http://schemas.datacontract.org/2004/07/ThreeDelta.Web.Services.ECLinx.Definitions'
54
+ }
55
+ }
56
+ end
57
+
58
+ def authorize(transaction_key, credit_card, transaction_total, order_number)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,21 @@
1
+ module TresDelta
2
+ class Response
3
+ attr_reader :response
4
+
5
+ def initialize(response)
6
+ @response = response
7
+ end
8
+
9
+ def success?
10
+ @response[:succeeded]
11
+ end
12
+
13
+ def method_missing(method, *args)
14
+ @response[method]
15
+ end
16
+
17
+ def self.create_from_action(action, response)
18
+ self.new(response.body["#{action}_response".to_sym]["#{action}_result".to_sym])
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,72 @@
1
+ module TresDelta
2
+ class Vault < Client
3
+ def initialize
4
+ @wsdl = Config.config['management_wsdl']
5
+ end
6
+
7
+ def create_customer(customer)
8
+ request(:create_customer, create_customer_params(customer))
9
+ end
10
+
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
20
+ }
21
+ }
22
+ end
23
+
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
27
+
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
38
+ },
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)
45
+ }
46
+ }
47
+ end
48
+
49
+ def customer_identifier(customer)
50
+ {
51
+ 'CustomerCode' => customer.vault_key,
52
+ 'LocationCode' => config["location_code"],
53
+ 'MerchantCode' => config["merchant_code"]
54
+ }
55
+ end
56
+
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
60
+
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
68
+ }
69
+ }
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,3 @@
1
+ module TresDelta
2
+ VERSION = "0.0.1"
3
+ end
data/lib/tres_delta.rb ADDED
@@ -0,0 +1,16 @@
1
+ require "tres_delta/version"
2
+ require "tres_delta/client"
3
+ require "tres_delta/config"
4
+ require "tres_delta/credit_card"
5
+ require "tres_delta/credit_card/address"
6
+ require "tres_delta/customer"
7
+ require "tres_delta/gateway"
8
+ require "tres_delta/response"
9
+ require "tres_delta/vault"
10
+
11
+ module TresDelta
12
+ class Errors
13
+ CARD_NUMBER_IN_USE = "CardNumberInUse"
14
+ VALIDATION_FAILED = "ValidationFailed"
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'tres_delta'
5
+
6
+ config_file = File.expand_path(File.join(File.dirname(__FILE__), '../config/three_delta.yml'))
7
+
8
+ unless File.exists?(config_file)
9
+ puts "You must have a config/three_delta.yml file. See config/three_delta.sample.yml for proper format"
10
+ exit 1
11
+ end
12
+
13
+ require 'yaml'
14
+
15
+ TresDelta::Config.config = YAML.load_file(config_file)
16
+
17
+ RSpec.configure do |config|
18
+ # TODO: CONFIGURE SOME RSPEC
19
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe TresDelta::Client do
4
+ let(:wsdl) { "http://example.com" }
5
+
6
+ let(:client) { TresDelta::Client.new(wsdl) }
7
+ let(:config) { TresDelta::Config.config }
8
+
9
+ describe "#client_credentials" do
10
+ it "uses the credentials passed into it" do
11
+ client.client_credentials.should == {
12
+ "ClientCode" => config["client_code"],
13
+ "Password" => config["password"],
14
+ "UserName" => config["user_name"]
15
+ }
16
+ end
17
+ end
18
+
19
+ describe "#client" do
20
+ it "returns a Savon client for the WSDL" do
21
+ client.client.class.should == Savon::Client
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe TresDelta::Customer do
4
+ describe "initalization" do
5
+ let(:name) { "Johnny B" }
6
+
7
+ context "new customer" do
8
+ let(:customer) { TresDelta::Customer.new(:name => name) }
9
+
10
+ it "generates a random vault key" do
11
+ expect(customer.vault_key.size).to eq(24)
12
+ end
13
+
14
+ it "uses the assigned name" do
15
+ expect(customer.name).to eq(name)
16
+ end
17
+ end
18
+
19
+ context "existing customer" do
20
+ let(:vault_key) { SecureRandom.hex(12) }
21
+ let(:customer) { TresDelta::Customer.new(:vault_key => vault_key) }
22
+
23
+ it "is initialized with a given vault key" do
24
+ expect(customer.vault_key).to eq(vault_key)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe TresDelta::Gateway do
4
+ let(:gateway) { TresDelta::Gateway.new }
5
+ let(:transaction_key) { SecureRandom.hex(6) }
6
+ let(:customer) { TresDelta::Customer.new(name: 'FOO BAR') }
7
+
8
+ let(:credit_card) do
9
+ TresDelta::CreditCard.new({
10
+ number: '4242424242424242',
11
+ expiration_month: '03',
12
+ expiration_year: Time.now.strftime("%Y").to_i + 3,
13
+ name: 'Joe Customer',
14
+ type: 'Visa',
15
+ nickname: 'Test Visa, Yo.',
16
+ billing_address: address_params
17
+ })
18
+ end
19
+
20
+ it "has a goddamn wsdl" do
21
+ expect(gateway.wsdl).to eq(TresDelta::Config.config['transaction_wsdl'])
22
+ end
23
+
24
+ describe "credit card address verification" do
25
+ context "full credit card information" do
26
+ end
27
+
28
+ context "with a token" do
29
+ end
30
+ end
31
+
32
+ describe "credit card zip code verification" do
33
+ # arbitrary: Cisco, TX
34
+ let(:zip_code_good) { '76437' }
35
+
36
+ # magic numbers, see ThreeDelta docs
37
+ let(:zip_code_failure) { '20151' }
38
+ let(:zip_code_unavailable) { '32561' }
39
+ let(:zip_code_error) { '80201' }
40
+
41
+ let(:address_params) { { :zip_code => zip_code } }
42
+
43
+ let(:response) { gateway.card_verification(transaction_key, credit_card) }
44
+
45
+ context "good zip code" do
46
+ let(:zip_code) { zip_code_good }
47
+
48
+ it "passes aip code avs" do
49
+ expect(response.success?).to be_true
50
+ end
51
+ end
52
+
53
+ context "zip code failure" do
54
+ let(:zip_code) { zip_code_failure }
55
+
56
+ it "fails the zip code avs" do
57
+ expect(response.success?).to be_true
58
+ expect(response.postal_code_avs_response).to eq("NotMatched")
59
+ end
60
+ end
61
+
62
+ context "zip code unavailable" do
63
+ let(:zip_code) { zip_code_unavailable }
64
+
65
+ it "doesn't really fail the avs check" do
66
+ expect(response.success?).to be_true
67
+ expect(response.postal_code_avs_response).to eq("Unavailable")
68
+ end
69
+ end
70
+
71
+ context "zip code avs error" do
72
+ let(:zip_code) { zip_code_error }
73
+
74
+ it "doesn't fail per se" do
75
+ expect(response.success?).to be_true
76
+ expect(response.postal_code_avs_response).to eq("Error")
77
+ end
78
+ end
79
+ end
80
+
81
+ describe "credit card address verificaiton" do
82
+ let(:good_address) { "10124 Brentridge Ct" }
83
+ let(:bad_address) { "14151 Brentridge Ct" }
84
+ let(:address_params) { { :address => address } }
85
+
86
+ let(:response) { gateway.card_verification(transaction_key, credit_card) }
87
+
88
+ context "good address" do
89
+ let(:address) { good_address }
90
+
91
+ it "passes avs" do
92
+ expect(response.success?).to be_true
93
+ expect(response.address_avs_response).to eq('Matched')
94
+ end
95
+ end
96
+
97
+ context "bad address" do
98
+ let(:address) { bad_address }
99
+
100
+ it "fails avs" do
101
+ expect(response.success?).to be_true
102
+ expect(response.address_avs_response).to eq('NotMatched')
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+
3
+ describe TresDelta::Vault do
4
+ let(:config) { TresDelta::Config.config }
5
+ let(:wsdl) { config["management_wsdl"] }
6
+ let(:customer) { TresDelta::Customer.new(name: name) }
7
+ let(:name) { SecureRandom.hex(4) }
8
+ let(:vault) { TresDelta::Vault.new }
9
+
10
+ let(:good_visa) do
11
+ TresDelta::CreditCard.new({
12
+ number: '4111111111111111',
13
+ expiration_month: '8',
14
+ expiration_year: Time.now.strftime("%Y").to_i + 3,
15
+ name: 'Joe Customer',
16
+ type: 'Visa',
17
+ nickname: 'Test Visa, Yo.'
18
+ })
19
+ end
20
+
21
+ it "uses the WSDL from the global config" do
22
+ expect(vault.wsdl).to eq(wsdl)
23
+ end
24
+
25
+ describe ".create_customer" do
26
+ let!(:response) { vault.create_customer(customer) }
27
+
28
+ it "is successful" do
29
+ expect(response.success?).to be_true
30
+ end
31
+
32
+ context "try to create a customer again" do
33
+ it "fails horribly" do
34
+ repeat_response = vault.create_customer(customer)
35
+ expect(repeat_response.success?).to be_false
36
+ end
37
+ end
38
+ end
39
+
40
+ describe ".add_stored_credit_card" do
41
+ let(:customer) { TresDelta::Customer.new(name: 'Test Customer') }
42
+ let(:vault) { TresDelta::Vault.new }
43
+
44
+ before(:each) do
45
+ vault.create_customer(customer)
46
+ end
47
+
48
+ context "a good credit card" do
49
+ let(:response) { vault.add_stored_credit_card(customer, good_visa) }
50
+
51
+ it "saves the damn credit card" do
52
+ response.success?.should be_true
53
+ end
54
+
55
+ it "has a token" do
56
+ expect(response.token).to_not be_nil
57
+ end
58
+ end
59
+
60
+ context "a duplicate credit card" do
61
+ let!(:first_response) { vault.add_stored_credit_card(customer, good_visa) }
62
+ let(:response) { vault.add_stored_credit_card(customer, good_visa) }
63
+
64
+ it "fails to save the card probably" do
65
+ expect(response.success?).to be_false
66
+ end
67
+
68
+ it "has a card number in use failure reason" do
69
+ expect(response.failure_reason).to eq(TresDelta::Errors::CARD_NUMBER_IN_USE)
70
+ end
71
+ end
72
+
73
+ context "bad type" do
74
+ let(:bad_visa) do
75
+ TresDelta::CreditCard.new({
76
+ number: '4111111111111111',
77
+ expiration_month: '8',
78
+ expiration_year: Time.now.strftime("%Y").to_i + 3,
79
+ name: 'Joe Customer',
80
+ type: 'MasterCard',
81
+ nickname: 'Test Visa, Yo.'
82
+ })
83
+ end
84
+
85
+ let(:response) { vault.add_stored_credit_card(customer, bad_visa) }
86
+
87
+ it "doesn't save the card" do
88
+ expect(response.success?).to be_false
89
+ end
90
+
91
+ it "has validation errors" do
92
+ expect(response.validation_failures.size).to be > 0
93
+ end
94
+
95
+ it "has a failure reason" do
96
+ expect(response.failure_reason).to eq(TresDelta::Errors::VALIDATION_FAILED)
97
+ end
98
+ end
99
+ end
100
+
101
+ describe "get_stored_credit_card", :focus => true do
102
+ let(:include_card_number) { false }
103
+ let(:response) { vault.get_stored_credit_card(customer, token, include_card_number) }
104
+
105
+ before(:each) do
106
+ vault.create_customer(customer)
107
+ end
108
+
109
+ context "card doesn't exist" do
110
+ let(:token) { SecureRandom.hex(6) } # random, lol
111
+
112
+ it "fails" do
113
+ expect(response.success?).to be_false
114
+ expect(response.failure_reason).to eq('CreditCardDoesNotExist')
115
+ end
116
+ end
117
+
118
+ context "card exists" do
119
+ let(:token) { vault.add_stored_credit_card(customer, good_visa).token }
120
+ let(:card_data) { response.credit_card }
121
+
122
+ context "card number not included" do
123
+ it "is successful" do
124
+ expect(response.success?).to be_true
125
+ end
126
+
127
+ it "contains the details of the credit card" do
128
+ expect(card_data[:expiration_month]).to eq(good_visa.expiration_month.to_s)
129
+ expect(card_data[:expiration_year]).to eq(good_visa.expiration_year.to_s)
130
+ expect(card_data[:name_on_card]).to eq(good_visa.name)
131
+ expect(card_data[:friendly_name]).to eq(good_visa.nickname)
132
+ expect(card_data[:token]).to eq(token)
133
+ end
134
+
135
+ it "doesn't contain the credit card number" do
136
+ expect(card_data[:card_account_number]).to be_nil
137
+ end
138
+ end
139
+
140
+ context "card number included" do
141
+ let(:include_card_number) { true }
142
+
143
+ it "is successful" do
144
+ expect(response.success?).to be_true
145
+ end
146
+
147
+ it "contains the credit card number" do
148
+ expect(card_data[:card_account_number]).to eq(good_visa.number)
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tres_delta/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "tres_delta"
8
+ spec.version = TresDelta::VERSION
9
+ spec.authors = ["1000Bulbs", "Zachary Danger Campbell"]
10
+ spec.email = ["zacharydangercampbell@gmail.com"]
11
+ spec.description = %q{A Ruby client for ThreeDelta's credit card vault and payment gateway.}
12
+ spec.summary = %q{A Ruby client for ThreeDelta's credit card vault and payment gateway.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "savon", "2.3.3"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.4"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+ end
metadata ADDED
@@ -0,0 +1,130 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tres_delta
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - 1000Bulbs
8
+ - Zachary Danger Campbell
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-03-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: savon
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '='
19
+ - !ruby/object:Gem::Version
20
+ version: 2.3.3
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '='
26
+ - !ruby/object:Gem::Version
27
+ version: 2.3.3
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.4'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.4'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description: A Ruby client for ThreeDelta's credit card vault and payment gateway.
71
+ email:
72
+ - zacharydangercampbell@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - ".ruby-gemset"
79
+ - ".ruby-version"
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - config/three_delta.sample.yml
85
+ - lib/tres_delta.rb
86
+ - lib/tres_delta/client.rb
87
+ - lib/tres_delta/config.rb
88
+ - lib/tres_delta/credit_card.rb
89
+ - lib/tres_delta/credit_card/address.rb
90
+ - lib/tres_delta/customer.rb
91
+ - lib/tres_delta/gateway.rb
92
+ - lib/tres_delta/response.rb
93
+ - lib/tres_delta/vault.rb
94
+ - lib/tres_delta/version.rb
95
+ - spec/spec_helper.rb
96
+ - spec/tres_delta/client_spec.rb
97
+ - spec/tres_delta/customer_spec.rb
98
+ - spec/tres_delta/gateway_spec.rb
99
+ - spec/tres_delta/vault_spec.rb
100
+ - tres_delta.gemspec
101
+ homepage: ''
102
+ licenses:
103
+ - MIT
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.1.11
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: A Ruby client for ThreeDelta's credit card vault and payment gateway.
125
+ test_files:
126
+ - spec/spec_helper.rb
127
+ - spec/tres_delta/client_spec.rb
128
+ - spec/tres_delta/customer_spec.rb
129
+ - spec/tres_delta/gateway_spec.rb
130
+ - spec/tres_delta/vault_spec.rb