versapay 0.1.4 → 0.1.5

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.
@@ -0,0 +1,51 @@
1
+ # A gem to help with using VersaPay's API
2
+
3
+ ## Usage
4
+
5
+ Include it in your app's 'Gemfile':
6
+
7
+ ```Ruby
8
+ gem 'versapay'
9
+ ```
10
+
11
+ In the controller you can make sure that all the actions are called with a valid Web Hook signature:
12
+
13
+ ```Ruby
14
+ class VersapayController < ApplicationController
15
+ check_versapay_signatures "MyKey"
16
+ ```
17
+
18
+ There are some Rails view helpers to set up a debit agreement:
19
+
20
+ ```Ruby
21
+ # The first you hear of a new debit agreement is when VersaPay sends a callback. So the reference should be
22
+ # something you can use to identify your user. For example,
23
+ # key = MyApp::Application.config.secret_token
24
+ # verifier = ActiveSupport::MessageVerifier.new(key)
25
+ # @reference = verifier.generate(@user.id)
26
+ = link_to "Setup VersaPay", debit_agreement_link("Set up an agreement", { :reference => @reference, :pref => "ba" })
27
+ ```
28
+
29
+ And of course, you can sent transactions:
30
+
31
+ ```Ruby
32
+ Versapay::Transactions.new do |v|
33
+ begin
34
+ result = v.create(:amount_in_cents => 12345,
35
+ :debit_agreement_token => "RWOCDPSM",
36
+ :transaction_type => "pre_authorized_debit",
37
+ :email => "foo@example.com",
38
+ :message => "A crate of widgets",
39
+ :transaction_reference => "my reference",
40
+ :fund_token => "VersaPayBalanceFundingSource"
41
+ )
42
+ rescue Versapay::VersapayError => e
43
+ logger.error "Transaction failed"
44
+ return false
45
+ end
46
+ end
47
+ ```
48
+
49
+ Pretty much all the parameters to the functions match the way the VersaPay developers API works.
50
+
51
+ See the VersaPay developers API: http://developers.versapay.com
@@ -11,6 +11,8 @@ module Versapay
11
11
  class VersapayError < RuntimeError; end
12
12
 
13
13
  class InvalidInput < VersapayError; end
14
+ class DuplicateTransaction < InvalidInput; end
15
+
14
16
  class InvalidWebhookSignature < VersapayError; end
15
17
  class Unprocessable < VersapayError; end
16
18
  class NotFound < VersapayError; end
@@ -47,7 +49,12 @@ module Versapay
47
49
  when 200,201
48
50
  return JSON.parse(response)
49
51
  when 412
50
- raise Versapay::InvalidInput, response
52
+ result = JSON.parse(response)
53
+ if result.key? "unique_reference"
54
+ raise Versapay::DuplicateTransaction, response
55
+ else
56
+ raise Versapay::InvalidInput, response
57
+ end
51
58
  when 422
52
59
  raise Versapay::Unprocessable, response
53
60
  when 500
@@ -13,7 +13,7 @@ module Versapay
13
13
 
14
14
  def list(page = nil)
15
15
  args = page.nil? ? {} : { :page => page }
16
- Versapay::make_request(:get, "/api/transactions/sent.json", args)
16
+ Versapay::make_request(:get, "/api/transactions.json", args)
17
17
  end
18
18
 
19
19
  def view(token)
@@ -1,3 +1,3 @@
1
1
  module Versapay
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
@@ -0,0 +1,67 @@
1
+ require 'test_helper'
2
+
3
+ class TransactionsTest < ActionView::TestCase
4
+
5
+ def setup
6
+ Versapay.key = "mykey"
7
+ Versapay.token = "mytoken"
8
+ @v = Versapay::Transactions.new
9
+ FakeWeb.allow_net_connect = false
10
+ end
11
+
12
+ test "submitting a duplicate transaction" do
13
+ body = '{"unique_reference":"Already created transaction for supplied unique reference"}'
14
+ FakeWeb.register_uri(:post, "https://mytoken:mykey@demo.versapay.com/api/transactions.json", :body => body, :status => ["412", "Invalid input"])
15
+ assert_raises Versapay::DuplicateTransaction do
16
+ @v.create(:amount_in_cents => 12345,
17
+ :transaction_type => "direct_credit",
18
+ :message => "Have some cash!",
19
+ :transaction_reference => "Hello",
20
+ :unique_reference => 42,
21
+ :first_name => "Joe",
22
+ :last_name => "Blow",
23
+ :institution_number => "004",
24
+ :branch_number => "96610",
25
+ :account_number => "12345",
26
+ :fund_token => "123"
27
+ )
28
+ end
29
+
30
+ end
31
+
32
+ test "viewing a transaction's details" do
33
+ body = '{"from_account":"wavepayrolltest","type":"transaction","transaction_type":"direct_credit","to_account":"Mitch G.","unique_reference":null,"transaction_reference":"myreference","state":"completed","token":"83F2W2K2FJFV","link_url":null,"message":null,"from_fund":"VersaPay Balance","email":null,"created_by_user":"11111","amount_in_cents":128105}'
34
+ FakeWeb.register_uri(:get, "https://mytoken:mykey@demo.versapay.com/api/transactions/83F2W2K2FJFV.json", :body => body)
35
+ results = @v.view("83F2W2K2FJFV")
36
+
37
+ assert_equal Hash, results.class
38
+ assert_equal "transaction", results["type"]
39
+ assert_equal "VersaPay Balance", results["from_fund"]
40
+ end
41
+
42
+ test "viewing an invalid transaction's details" do
43
+ body = "Not found"
44
+ FakeWeb.register_uri(:get, "https://mytoken:mykey@demo.versapay.com/api/transactions/83F2W2K2FXXX.json", :body => body, :status => ["500", "Not found"])
45
+ assert_raises Versapay::NotFound do
46
+ @v.view("83F2W2K2FXXX")
47
+ end
48
+ end
49
+
50
+ test "listing transactions when there are none" do
51
+ body = "[]"
52
+ FakeWeb.register_uri(:get, "https://mytoken:mykey@demo.versapay.com/api/transactions.json", :body => body)
53
+ results = @v.list
54
+ assert_equal Array, results.class
55
+ assert_equal 0, results.size
56
+
57
+ end
58
+
59
+ test "listing sent transactions when there are some" do
60
+ body = '[{"from_account":"wavepayrolltest","type":"transaction","transaction_type":"direct_credit","to_account":"Sean Walberg","unique_reference":"2","transaction_reference":"BAhpBw==--31ff18bce30e92ef2d9d4753a2c3c748e1fb8544","state":"completed","token":"8UB8QUMRJA8M","link_url":null,"message":null,"from_fund":"VersaPay Balance","email":null,"created_by_user":"1kkOYn_uA6KWNjejFka1","amount_in_cents":100},{"from_account":"wavepayrolltest","type":"transaction","transaction_type":"direct_credit","to_account":"Leia Organa","unique_reference":null,"transaction_reference":"BAhpAdA=--193ef4be953db212508b80802511ef21319c293b","state":"completed","token":"3FJRHSUKP4N2","link_url":null,"message":null,"from_fund":"VersaPay Balance","email":null,"created_by_user":"1kkOYn_uA6KWNjejFka1","amount_in_cents":15645},{"from_account":"wavepayrolltest","type":"transaction","transaction_type":"direct_credit","to_account":"J.T. Hutt","unique_reference":null,"transaction_reference":"BAhpAc8=--75cb17f2a52ab3518123ed091343d67104c0a929","state":"completed","token":"2RUPSUBFLH3G","link_url":null,"message":null,"from_fund":"VersaPay Balance","email":null,"created_by_user":"1kkOYn_uA6KWNjejFka1","amount_in_cents":131984},{"from_account":"wavepayrolltest","type":"transaction","transaction_type":"direct_credit","to_account":"Leia Organa","unique_reference":null,"transaction_reference":"BAhpAc0=--ab5d0a1b7976cd482f99dc708bee45ecc546d267","state":"completed","token":"5BV48XZ4CEHC","link_url":null,"message":null,"from_fund":"VersaPay Balance","email":null,"created_by_user":"1kkOYn_uA6KWNjejFka1","amount_in_cents":86087},{"from_account":"wavepayrolltest","type":"transaction","transaction_type":"direct_credit","to_account":"J.T. Hutt","unique_reference":null,"transaction_reference":"BAhpAcw=--0b2dabdaf965b6edbd4cf91ff2bb41724faa4822","state":"completed","token":"9TUHM13V1K4K","link_url":null,"message":null,"from_fund":"VersaPay Balance","email":null,"created_by_user":"1kkOYn_uA6KWNjejFka1","amount_in_cents":131895},{"from_account":"wavepayrolltest","type":"transaction","transaction_type":"direct_credit","to_account":"Leia Organa","unique_reference":null,"transaction_reference":"BAhpAco=--07bb3b7ae35affc7b6210daed6a0747318e4bfd3","state":"completed","token":"21WREVF394XH","link_url":null,"message":null,"from_fund":"VersaPay Balance","email":null,"created_by_user":"1kkOYn_uA6KWNjejFka1","amount_in_cents":45492},{"from_account":"wavepayrolltest","type":"transaction","transaction_type":"direct_credit","to_account":"J.T. Hutt","unique_reference":null,"transaction_reference":"BAhpAck=--bc8994974fc1ca3295c455800855e6df7cfb8504","state":"completed","token":"3AMV3SIL5UKF","link_url":null,"message":null,"from_fund":"VersaPay Balance","email":null,"created_by_user":"1kkOYn_uA6KWNjejFka1","amount_in_cents":131808}]'
61
+ FakeWeb.register_uri(:get, "https://mytoken:mykey@demo.versapay.com/api/transactions.json", :body => body)
62
+ results = @v.list
63
+ assert_equal Array, results.class
64
+ assert_equal 7, results.size
65
+ end
66
+
67
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: versapay
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 4
10
- version: 0.1.4
9
+ - 5
10
+ version: 0.1.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sean Walberg
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-13 00:00:00 -06:00
19
- default_executable:
18
+ date: 2012-03-05 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: rails
@@ -119,6 +118,7 @@ files:
119
118
  - .gitignore
120
119
  - .rvmrc
121
120
  - Gemfile
121
+ - README.md
122
122
  - Rakefile
123
123
  - lib/versapay.rb
124
124
  - lib/versapay/debit_agreement.rb
@@ -131,10 +131,9 @@ files:
131
131
  - test/fund_sources_test.rb
132
132
  - test/helper_test.rb
133
133
  - test/test_helper.rb
134
- - test/transactions.test.rb
134
+ - test/transactions_test.rb
135
135
  - test/webhook_test.rb
136
136
  - versapay.gemspec
137
- has_rdoc: true
138
137
  homepage: ""
139
138
  licenses: []
140
139
 
@@ -164,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
163
  requirements: []
165
164
 
166
165
  rubyforge_project: versapay
167
- rubygems_version: 1.6.2
166
+ rubygems_version: 1.8.15
168
167
  signing_key:
169
168
  specification_version: 3
170
169
  summary: A gem to use the Versapay API
@@ -173,5 +172,5 @@ test_files:
173
172
  - test/fund_sources_test.rb
174
173
  - test/helper_test.rb
175
174
  - test/test_helper.rb
176
- - test/transactions.test.rb
175
+ - test/transactions_test.rb
177
176
  - test/webhook_test.rb
@@ -1,49 +0,0 @@
1
- require 'test_helper'
2
-
3
- class TransactionsTest < ActionView::TestCase
4
-
5
- def setup
6
- Versapay.key = "mykey"
7
- Versapay.token = "mytoken"
8
- @v = Versapay::DebitAgreement.new
9
- FakeWeb.register_uri(:any, "https://demo.versapay.com", :body => "response for any HTTP method", :status => ["500", "bad test"])
10
- end
11
-
12
- test "viewing a transaction's details" do
13
- body = "{\"type\":\"debit_agreement\",\"state\":\"approved\",\"created_by_account\":\"wavepayrolltest\",\"token\":\"83F2W2K2FJFV\",\"message\":\"blah\",\"created_by_user\":\"1kkOYn_uA6KWNjejFka1\",\"reference\":\"BAhpBg==--7e0a441bda1b04f5b985fa654d357071bb9b32d1\",\"email\":\"jimbob@smallpayroll.ca\",\"name\":\"Jim Bob\"}"
14
- FakeWeb.register_uri(:get, "https://mytoken:mykey@demo.versapay.com/api/debit_agreements/83F2W2K2FJFV.json", :body => body)
15
- results = @v.view("83F2W2K2FJFV")
16
-
17
- assert_equal Hash, results.class
18
- assert_equal "debit_agreement", results["type"]
19
- end
20
-
21
- test "viewing an invalid transaction's details" do
22
- body = "Not found"
23
- FakeWeb.register_uri(:get, "https://mytoken:mykey@demo.versapay.com/api/debit_agreements/83F2W2K2FXXX.json", :body => body, :status => ["500", "Not found"])
24
- assert_raises Versapay::NotFound do
25
- @v.view("83F2W2K2FXXX")
26
- end
27
- end
28
-
29
- test "listing sent transactions when there are none" do
30
- body = "[]"
31
- FakeWeb.register_uri(:get, "https://mytoken:mykey@demo.versapay.com/api/debit_agreements/sent.json", :body => body)
32
- results = @v.list_sent
33
- assert_equal Array, results.class
34
- assert_equal 0, results.size
35
-
36
- end
37
-
38
- test "listing sent transactions when there are some" do
39
- body = "[{\"type\":\"debit_agreement\",\"state\":\"approved\",\"created_by_account\":\"wavepayrolltest\",\"token\":\"83F2W2K2FJFV\",\"message\":\"blah\",\"created_by_user\":\"1kkOYn_uA6KWNjejFka1\",\"reference\":\"BAhpBg==--7e0a441bda1b04f5b985fa654d357071bb9b32d1\",\"email\":\"jimbob@smallpayroll.ca\",\"name\":\"Jim Bob\"},{\"type\":\"debit_agreement\",\"state\":\"approved\",\"created_by_account\":\"wavepayrolltest\",\"token\":\"6DCKWXXF1A51\",\"message\":\"blah\",\"created_by_user\":\"1kkOYn_uA6KWNjejFka1\",\"reference\":\"BAhpBg==--7e0a441bda1b04f5b985fa654d357071bb9b32d1\",\"email\":\"jimbob@smallpayroll.ca\",\"name\":\"Jim Bob\"},{\"type\":\"debit_agreement\",\"state\":\"revoked\",\"created_by_account\":\"wavepayrolltest\",\"token\":\"7VBJRS7TKLIL\",\"message\":\"blah\",\"created_by_user\":\"1kkOYn_uA6KWNjejFka1\",\"reference\":\"BAhpBg==--7e0a441bda1b04f5b985fa654d357071bb9b32d1\",\"email\":\"fredsmith@smallpayroll.ca\",\"name\":\"Fred Smith\"},{\"type\":\"debit_agreement\",\"state\":\"revoked\",\"created_by_account\":\"wavepayrolltest\",\"token\":\"6YI3MTVMY918\",\"message\":\"blah\",\"created_by_user\":\"1kkOYn_uA6KWNjejFka1\",\"reference\":null,\"email\":\"fredsmith@smallpayroll.ca\",\"name\":\"Fred Smith\"},{\"type\":\"debit_agreement\",\"state\":\"revoked\",\"created_by_account\":\"wavepayrolltest\",\"token\":\"1AYAG5T762TJ\",\"message\":\"blah\",\"created_by_user\":\"1kkOYn_uA6KWNjejFka1\",\"reference\":null,\"email\":\"fredsmith@smallpayroll.ca\",\"name\":\"Fred Smith\"},{\"type\":\"debit_agreement\",\"state\":\"cancelled\",\"created_by_account\":\"wavepayrolltest\",\"token\":\"7IN4ALWCXKJG\",\"message\":\"blah\",\"created_by_user\":\"1kkOYn_uA6KWNjejFka1\",\"reference\":null,\"email\":\"fredsmith@smallpayroll.ca\",\"name\":\"Fred Smith\"},{\"type\":\"debit_agreement\",\"state\":\"revoked\",\"created_by_account\":\"wavepayrolltest\",\"token\":\"4RQ58W5B4M1W\",\"message\":\"blah\",\"created_by_user\":\"1kkOYn_uA6KWNjejFka1\",\"reference\":null,\"email\":\"fredsmith@smallpayroll.ca\",\"name\":\"Fred Smith\"}]"
40
- FakeWeb.register_uri(:get, "https://mytoken:mykey@demo.versapay.com/api/debit_agreements/sent.json", :body => body)
41
- results = @v.list_sent
42
- assert_equal Array, results.class
43
- assert_equal 7, results.size
44
- end
45
-
46
- end
47
-
48
- ########
49
- # When testing a transaction involving a post, ensure the data is in json and the content-type is application/json