pg_recurrence 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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