pg_recurrence 0.1.0

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,20 @@
1
+ module RubyPsigate
2
+ class Credential
3
+
4
+ attr_reader :cid, :userid, :password, :mode, :endpoint
5
+
6
+ def initialize(options)
7
+ @cid = options[:CID]
8
+ @userid = options[:UserID]
9
+ @password = options[:password]
10
+ @mode = options[:mode] || :test
11
+
12
+ if @mode == :test
13
+ @endpoint = "https://dev.psigate.com:8645/Messenger/AMMessenger"
14
+ else
15
+ @endpoint = "https://dev.psigate.com:8645/Messenger/AMMessenger"
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,54 @@
1
+ module RubyPsigate
2
+ class Request
3
+
4
+ attr_reader :params
5
+
6
+ class << self
7
+ def credential
8
+ @@credential
9
+ end
10
+
11
+ def credential=(x)
12
+ raise ArgumentError unless x.is_a?(Credential)
13
+ @@credential = x
14
+ end
15
+
16
+ def storeid
17
+ @@storeid
18
+ end
19
+
20
+ def storeid=(x)
21
+ @@storeid = x
22
+ end
23
+ end
24
+
25
+ def initialize(attributes={})
26
+ @request = {}
27
+ @request[:Request] = {}
28
+
29
+ # Add credentials
30
+ %w( CID UserID Password ).each do |c|
31
+ @request[:Request][c.to_sym] = self.class.credential.send((c.downcase).to_sym)
32
+ end
33
+ end
34
+
35
+ def params=(hash)
36
+ raise ArgumentError unless hash.is_a?(Hash)
37
+ @params = hash
38
+ end
39
+
40
+ def post
41
+ begin
42
+ parameters = RubyPsigate::Serializer.new(params, :header => true).to_xml
43
+ connection = RubyPsigate::Connection.new(self.class.credential.endpoint)
44
+ response = connection.post(parameters)
45
+ response = Response.new(response)
46
+ rescue ConnectionError => e
47
+ response = nil
48
+ end
49
+ response
50
+ end
51
+
52
+
53
+ end
54
+ end
@@ -0,0 +1,99 @@
1
+ module RubyPsigate
2
+ class Response
3
+
4
+ ACCOUNT_SUCCESS_CODES = %w(
5
+ RPA-0000
6
+ RPA-0001
7
+ RPA-0010
8
+ RPA-0015
9
+ RPA-0020
10
+ RPA-0022
11
+ RPA-0025
12
+ RPA-0040
13
+ RPA-0042
14
+ RPA-0046
15
+ RPA-0048
16
+ RPA-0058
17
+ PSI-0000
18
+ RRC-0000
19
+ RRC-0005
20
+ RRC-0050
21
+ RRC-0060
22
+ RRC-0065
23
+ RRC-0072
24
+ RRC-0075
25
+ RRC-0082
26
+ RRC-0090
27
+ RRC-0092
28
+ RRC-0095
29
+ RRC-0098
30
+ RRC-0190
31
+ CTL-0000
32
+ CTL-0005
33
+ CTL-0050
34
+ CTL-0060
35
+ CTL-0065
36
+ CTL-0072
37
+ CTL-0075
38
+ CTL-0082
39
+ CTL-0090
40
+ CTL-0092
41
+ CTL-0098
42
+ CTL-0190
43
+ CTL-0192
44
+ RIV-0050
45
+ RIV-0060
46
+ RIV-0072
47
+ RIV-0090
48
+ RIV-0190
49
+ RIV-0197
50
+ RIV-0198
51
+ EMR-0000
52
+ EMR-0005
53
+ EMR-0050
54
+ EMR-0060
55
+ EMR-0072
56
+ EMR-0082
57
+ EMR-0090
58
+ EMR-0190
59
+ )
60
+
61
+ def initialize(xml_response)
62
+ @xml_response = Crack::XML.parse(xml_response)
63
+ end
64
+
65
+ def response
66
+ @xml_response["Response"]
67
+ end
68
+
69
+ def success?
70
+ return false unless @xml_response
71
+ ACCOUNT_SUCCESS_CODES.include?(self.returncode)
72
+ end
73
+
74
+ private
75
+
76
+ def method_missing(name, *args, &block)
77
+ @result = nil
78
+ name = name.downcase.to_sym
79
+ @result = find_value_in_hash(name, response)
80
+ @result
81
+ end
82
+
83
+ def find_value_in_hash(input_key, hash)
84
+ result = nil
85
+ hash.each_pair do |key, value|
86
+ if value.is_a? Hash
87
+ result = find_value_in_hash(input_key, value)
88
+ else
89
+ key = key.downcase.to_sym
90
+ result = value if input_key == key
91
+ end
92
+
93
+ break unless result.nil?
94
+ end
95
+ result
96
+ end
97
+
98
+ end
99
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,70 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ begin
5
+ Bundler.setup(:default, :development)
6
+ rescue Bundler::BundlerError => e
7
+ $stderr.puts e.message
8
+ $stderr.puts "Run `bundle install` to install missing gems"
9
+ exit e.status_code
10
+ end
11
+ require 'test/unit'
12
+
13
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
14
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
+ require 'pg_recurrence'
16
+
17
+ class Test::Unit::TestCase
18
+
19
+ # Helpers
20
+ def credential
21
+ @credential = RubyPsigate::Credential.new(:CID => "1000001", :UserID => "teststore", :password => "testpass")
22
+ end
23
+
24
+ def credit_card
25
+ @credit_card = PgCreditcard.new(
26
+ :name => "Homer Simpsons",
27
+ :number => "4111111111111111",
28
+ :month => "03",
29
+ :year => "20",
30
+ :cvv => "123"
31
+ )
32
+ end
33
+
34
+ def valid_account_attributes
35
+ {
36
+ :name => "Homer Simpson",
37
+ :email => "homer@simpsons.com",
38
+ :address1 => "1234 Evergrove Drive",
39
+ :address2 => nil,
40
+ :city => "Toronto",
41
+ :province => "ON",
42
+ :postal_code => "M2N3A3",
43
+ :country => "CA",
44
+ :phone => "416-111-1111",
45
+ :credit_card => credit_card
46
+ }
47
+ end
48
+
49
+ def create_account
50
+ @account = RubyPsigate::Account.new(
51
+ :name => "Homer Simpson",
52
+ :email => "homer@simpsons.com",
53
+ :address1 => "1234 Evergrove Drive",
54
+ :address2 => nil,
55
+ :city => "Toronto",
56
+ :province => "ON",
57
+ :postal_code => "M2N3A3",
58
+ :country => "CA",
59
+ :phone => "416-111-1111",
60
+ :credit_card => credit_card
61
+ )
62
+
63
+ @account.save
64
+ @account
65
+ end
66
+
67
+
68
+ end
69
+
70
+ require 'mocha'
@@ -0,0 +1,104 @@
1
+ require 'helper'
2
+
3
+ module RubyPsigate
4
+ class TestAccountRemote < Test::Unit::TestCase
5
+
6
+ def setup
7
+ Request.credential = credential
8
+ @comparison = create_account
9
+ end
10
+
11
+ def test_add_account
12
+ @account = Account.new(valid_account_attributes)
13
+ @account.save
14
+ end
15
+
16
+ def test_saving_account_assigns_accountid
17
+ @account = Account.new(valid_account_attributes)
18
+ assert_nil @account.accountid
19
+ @account.save
20
+ assert_not_nil @account.accountid
21
+ end
22
+
23
+ def test_returns_false_to_new_record_after_save
24
+ @account = Account.new(valid_account_attributes)
25
+ assert @account.new_record?
26
+ @account.save
27
+ @account = Account.find(@account.accountid)
28
+ assert !@account.new_record?
29
+ end
30
+
31
+ def test_failure_adding_account
32
+ @account = Account.new(:accountid => @comparison.accountid)
33
+ assert !@account.save
34
+ assert_not_nil @account.error
35
+ end
36
+
37
+ def test_find_account
38
+ accountid = @comparison.accountid
39
+ @account = Account.find(accountid)
40
+ assert_equal @comparison.accountid, @account.accountid
41
+ end
42
+
43
+ def test_cannot_find_account
44
+ accountid = "somefakeaccountid"
45
+ @account = Account.find(accountid)
46
+ assert_nil @account
47
+ end
48
+
49
+ def test_disables_account
50
+ assert Account.disable(@comparison.accountid)
51
+
52
+ # Tests
53
+ @account = Account.find(@comparison.accountid)
54
+ assert_equal "N", @account.status
55
+ end
56
+
57
+ def test_enable_account
58
+ Account.disable(@comparison.accountid)
59
+ assert Account.enable(@comparison.accountid)
60
+
61
+ # Tests
62
+ @account = Account.find(@comparison.accountid)
63
+ assert_equal "A", @account.status
64
+ end
65
+
66
+ def test_update_attributes
67
+ @account = @comparison
68
+ assert @account.attributes = {
69
+ :name => "Marge Simpson",
70
+ :company => "NBC Corp",
71
+ :address1 => "577 Street",
72
+ :address2 => "Apt 888",
73
+ :city => "Ottawa",
74
+ :province => "ON",
75
+ :country => "Canada",
76
+ :postalcode => "A1A1A1",
77
+ :phone => "1234567890",
78
+ :fax => "1234567890",
79
+ :email => "marge@nbc.com",
80
+ :comments => "Some comment"
81
+ }
82
+ end
83
+
84
+ def test_update_record
85
+ @account = Account.find(@comparison.accountid)
86
+ @account.attributes = {
87
+ :name => "Marge Simpson",
88
+ :company => "NBC Corp",
89
+ :address1 => "577 Street",
90
+ :address2 => "Apt 888",
91
+ :city => "Ottawa",
92
+ :province => "ON",
93
+ :country => "Canada",
94
+ :postalcode => "A1A1A1",
95
+ :phone => "1234567890",
96
+ :fax => "1234567890",
97
+ :email => "marge@nbc.com",
98
+ :comments => "Some comment"
99
+ }
100
+ assert @account.save
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,92 @@
1
+ require 'helper'
2
+
3
+ module RubyPsigate
4
+ class TestChargeRemote < Test::Unit::TestCase
5
+
6
+ def setup
7
+ Request.credential = credential
8
+ Request.storeid = "teststore"
9
+ Charge.serialno = "1"
10
+ @account = create_account
11
+ end
12
+
13
+ def test_add_charge
14
+ @charge = Charge.new(:accountid => @account.accountid, :interval => "M", :rbtrigger => "15", :starttime => "2010.12.25", :endtime => "2011.12.25", :productid => "123456789", :quantity => "1", :price => "99.00")
15
+ assert @charge.save
16
+
17
+ # Example of return response
18
+ # RuntimeError: #<RubyPsigate::Response:0x00000102858ee8 @xml_response={"Response"=>{"CID"=>"1000001", "Action"=>"REGISTER NEW CHARGE(S)", "ReturnCode"=>"RRC-0000", "ReturnMessage"=>"Register Recurring Charges completed successfully.", "Charge"=>{"ReturnCode"=>"RRC-0050", "ReturnMessage"=>"Register Recurring Charge completed successfully.", "RBCID"=>"2010120512535613602", "StoreID"=>"teststore", "RBName"=>nil, "AccountID"=>"2010120518622", "SerialNo"=>"1", "Status"=>"A", "Interval"=>"M", "Trigger"=>"15", "ProcessType"=>"A", "InstallmentNo"=>"0", "StartDate"=>"2010.12.25", "EndDate"=>"2011.12.25", "ItemInfo"=>{"Status"=>"A", "ItemSerialNo"=>"1", "ProductID"=>"123456789", "Description"=>nil, "Quantity"=>"1.00", "Price"=>"99.00", "Tax1"=>"0.00", "Tax2"=>"0.00", "Cost"=>"0.00", "SubTotal"=>"99.00"}}}}>
19
+ end
20
+
21
+ def test_assigns_rbcid_after_save
22
+ @charge = Charge.new(:accountid => @account.accountid, :interval => "M", :rbtrigger => "15", :starttime => "2010.12.25", :endtime => "2011.12.25", :productid => "123456789", :quantity => "1", :price => "99.00")
23
+ @charge.save
24
+ assert_not_nil @charge.rbcid
25
+ end
26
+
27
+ def test_find_charge
28
+ @test_charge = Charge.new(:accountid => @account.accountid, :interval => "M", :rbtrigger => "15", :starttime => "2010.12.25", :endtime => "2011.12.25", :productid => "123456789", :quantity => "1", :price => "99.00")
29
+ @test_charge.save
30
+
31
+ @charge = Charge.find(@test_charge.rbcid)
32
+ assert_not_nil @charge
33
+
34
+ # Example of return response
35
+ # RuntimeError: #<RubyPsigate::Response:0x00000101218188 @xml_response={"Response"=>{"CID"=>"1000001", "Action"=>"RETRIEVE A SUMMARY OF CHARGES", "ReturnCode"=>"RRC-0060", "ReturnMessage"=>"Retrive Recurring Charges Information completed successfully.", "Condition"=>{"RBCID"=>"2010120514303113630"}, "Charge"=>{"RBCID"=>"2010120514303113630", "StoreID"=>"teststore", "RBName"=>nil, "AccountID"=>"2010120518769", "SerialNo"=>"1", "Status"=>"A", "Interval"=>"M", "Trigger"=>"15", "ProcessType"=>"A", "InstallmentNo"=>"1", "StartDate"=>"2010.12.25", "EndDate"=>"2011.12.25"}}}>
36
+ end
37
+
38
+ # Psigate only allows the changing of certain charge elements
39
+ # SerialNo (payment method)
40
+ # Interval
41
+ # RbTrigger
42
+ # Starttime
43
+ # Endtime
44
+ def test_update_charge
45
+ @test_charge = Charge.new(:accountid => @account.accountid, :interval => "M", :rbtrigger => "15", :starttime => "2010.12.25", :endtime => "2011.12.25", :productid => "123456789", :quantity => "1", :price => "99.00")
46
+ @test_charge.save
47
+
48
+ assert = Charge.update(
49
+ :rbcid => @test_charge.rbcid,
50
+ :rbname => "New Name",
51
+ :serialno => "2",
52
+ :interval => "A",
53
+ :RBTrigger => "10",
54
+ :StartTime => "2010.12.30",
55
+ :EndTime => "2011.12.30"
56
+ )
57
+
58
+ # Example of return response
59
+ # RuntimeError: #<RubyPsigate::Response:0x00000100944098 @xml_response={"Response"=>{"CID"=>"1000001", "Action"=>"UPDATE A CHARGE", "ReturnCode"=>"RRC-0072", "ReturnMessage"=>"Update Recurring Charge Information completed successfully.", "Condition"=>{"RBCID"=>"2010120522260613649"}, "Update"=>{"Interval"=>"A", "SerialNo"=>"2", "RBName"=>"New Name"}}}>
60
+ end
61
+
62
+ def test_enable_charge
63
+ @test_charge = Charge.new(:accountid => @account.accountid, :interval => "M", :rbtrigger => "15", :starttime => "2010.12.25", :endtime => "2011.12.25", :productid => "123456789", :quantity => "1", :price => "99.00")
64
+ @test_charge.save
65
+
66
+ assert Charge.enable(@test_charge.rbcid)
67
+ end
68
+
69
+ def test_disable_charge
70
+ @test_charge = Charge.new(:accountid => @account.accountid, :interval => "M", :rbtrigger => "15", :starttime => "2010.12.25", :endtime => "2011.12.25", :productid => "123456789", :quantity => "1", :price => "99.00")
71
+ @test_charge.save
72
+
73
+ assert Charge.disable(@test_charge.rbcid)
74
+ end
75
+
76
+ def test_immediate_charge
77
+ charge = Charge.new(:accountid => @account.accountid, :productid => "123456", :quantity => "1", :price => "10")
78
+ assert charge.immediately
79
+ end
80
+
81
+ def test_response
82
+ charge = Charge.new(:accountid => @account.accountid, :productid => "123456", :quantity => "1", :price => "10")
83
+ charge.immediately
84
+ response = charge.response
85
+ assert response.is_a?(RubyPsigate::Response)
86
+
87
+ # Example of return response
88
+ #RuntimeError: #<RubyPsigate::Response:0x00000101455130 @xml_response={"Response"=>{"CID"=>"1000001", "Action"=>"REGISTER AN IMMEDIATE CHARGE", "ReturnCode"=>"PSI-0000", "ReturnMessage"=>"The transaction completed successfully.", "Invoice"=>{"StoreID"=>"teststore", "PayerName"=>"Homer Simpsons", "Status"=>"Paid", "InvoiceNo"=>"030705", "ReturnCode"=>"Y:123456:0abcdef:M:X:NNN", "ErrMsg"=>nil, "InvoiceDate"=>"2010.12.05", "ExecDate"=>"2010.12.05", "RBCID"=>"2010120511081813577", "AccountID"=>"2010120518355", "SerialNo"=>"1", "CardNumber"=>"411111...1111", "CardExpMonth"=>"03", "CardExpYear"=>"20", "CardType"=>"VISA", "InvoiceTotal"=>"10.00", "ItemInfo"=>{"ItemSerialNo"=>"1", "ProductID"=>"123456", "Description"=>nil, "Quantity"=>"1.00", "Price"=>"10.00", "Tax1"=>"0.00", "Tax2"=>"0.00", "Cost"=>"0.00", "SubTotal"=>"10.00"}}}}>
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,36 @@
1
+ require 'helper'
2
+
3
+ module RubyPsigate
4
+ class TestRequestRemote < Test::Unit::TestCase
5
+
6
+ def setup
7
+ Request.credential = credential
8
+
9
+ @params = {
10
+ :Request => {
11
+ :CID => "1000001",
12
+ :UserID => "teststore",
13
+ :Password => "testpass",
14
+ :Action => "AMA00",
15
+ :Condition => {
16
+ :AccountID => "000000000000000911"
17
+ }
18
+ }
19
+ }
20
+
21
+ @request = Request.new
22
+ @request.params = @params
23
+ @response = @request.post
24
+ end
25
+
26
+ def test_retrieves_remote_information_with_post
27
+ assert @response.success?
28
+ assert_equal "RPA-0020", @response.returncode
29
+ assert_equal "Retrive Payment Accounts Information completed successfully.", @response.returnmessage
30
+ assert_equal "Earl Grey", @response.name
31
+ assert_equal "A", @response.status
32
+ assert_equal "000000000000000911", @response.accountid
33
+ end
34
+
35
+ end
36
+ end