docdata 0.0.2 → 0.0.5

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: c5ff4754891764a2fadf457caa3103234ab0ff66
4
- data.tar.gz: 4a88eccbd3b38ca964800661cbff4f8caa01d856
3
+ metadata.gz: a577d283c7f93fc19f187e15e7582a0c2ea26936
4
+ data.tar.gz: b738e8b917421d056fc1b1e1c2e71ffecdab50ae
5
5
  SHA512:
6
- metadata.gz: 14bb38e8034b1b17ce035e0e2a49637491622a699556b1886aa803bedd78e52685de32fa2cb4110c975cea5c8bb52d29d7e46af219b200f0ad1f4e0911042ab3
7
- data.tar.gz: bf6a93bb98864ffb8a576bf6c9e4ef07e6832fc3221d1cd5805302dcd21bc0fd0da042f11ef17dcdff66b25d9ee3017775ec4dfcfd7328cbe24c04e9be7cbff7
6
+ metadata.gz: 963f7a409ce0eb4f3cfb2e0b7c78f319e268dca66e0d0024e41bee56f7f5a5b9cff974a769fa201490c709b205195ae3e4e4193c19fc350ac422ac1360f407ad
7
+ data.tar.gz: df5db9ad1135f3bd6801667ec005bb367dcd954b3228e17c6743023cdc03dc920afb11d716db435998c279c5a7e02036773b834d14761b003db1d26b5d53a779
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ --markup-provider=redcarpet
2
+ --markup=markdown
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ ## v0.0.2 - v0.0.5
2
+
3
+ Version 0.0.5 is used in production environmints and works.
4
+
5
+ * added method 'Payment.find'
6
+ * added method 'Payment.cancel'
7
+ * much better response messages
8
+
9
+ ## v0.0.1
10
+
11
+ * initial release
data/README.md CHANGED
@@ -1,12 +1,15 @@
1
1
  # Docdata
2
2
  [![Build Status](https://secure.travis-ci.org/henkm/docdata.png)](http://travis-ci.org/henkm/docdata)
3
3
  [![Gem Version](https://badge.fury.io/rb/docdata.svg)](http://badge.fury.io/rb/docdata)
4
+ [![Dependency Status](https://gemnasium.com/henkm/docdata.svg)](https://gemnasium.com/henkm/docdata)
4
5
  [![Code Climate](https://codeclimate.com/github/henkm/docdata/badges/gpa.svg)](https://codeclimate.com/github/henkm/docdata)
5
6
  [![Coverage Status](https://coveralls.io/repos/henkm/docdata/badge.png?branch=master)](https://coveralls.io/r/henkm/docdata)
6
7
 
7
- Docdata is a Ruby binder for Docdata Payments. Current status: **in progress, not stable**.
8
+ Docdata is a Ruby implementation for using Docdata Payments.
8
9
 
9
- This gem relies on the awesom Savon gem to communicate with Docdata Payments' SOAP API.
10
+ Here you can find the [Documentation](http://rdoc.info/gems/docdata)
11
+
12
+ This gem relies on the awesom [Savon](http://savonrb.com/) gem to communicate with Docdata Payments' SOAP API.
10
13
 
11
14
  ## Installation
12
15
 
@@ -61,12 +64,15 @@ All the payment details that Docdata Payments requires, are - obviously - also r
61
64
  | amount | Integer (amount in cents) | Yes |
62
65
  | currency | String (ISO currency code) | Yes |
63
66
  | order_reference | String (your own unique reference) | Yes |
67
+ | description | String | No |
64
68
  | profile | String (name of your Docdata Payment profile)| Yes |
65
69
  | shopper | Docdata::Shopper | Yes |
66
70
  | line_items | Array (of Docdata::LineItem objects) | No |
67
71
  | bank_id | String | No |
68
72
  | prefered_payment_method | String | No |
69
- | key | String (is availabel after successful 'create' action) | No (readonly)
73
+ | default_act | Boolean (should consumer skip docdata page?) | No |
74
+ | key | String (is available after successful 'create') | readonly |
75
+ | url | String (redirect URI is available after 'create') | readonly |
70
76
 
71
77
 
72
78
  ## Default values
@@ -76,8 +82,9 @@ If you use `GIROPAY`, `SEPA` and `AFTERPAY` this is the case. (Maybe also in oth
76
82
 
77
83
  ## Example usage in Rails application
78
84
  The example below assumes you have your application set up with a Order model, which contains the information needed for this transaction (amount, name, etc.).
85
+
79
86
  ```ruby
80
- # orders_controller.rb
87
+
81
88
  def start_transaction
82
89
  # find the order from your database
83
90
  @order = Order.find(params[:id])
@@ -106,6 +113,7 @@ def start_transaction
106
113
  # TODO: Display the error and warn the user that something went wrong.
107
114
  end
108
115
  end
116
+
109
117
  ```
110
118
 
111
119
  ## Ideal
@@ -115,8 +123,9 @@ For transactions in the Netherlands, iDeal is the most common option. To redirec
115
123
  In `Docdata::Payment` you can set `bank_id` to any value. If you do, the redirect URI will redirect your user directly to the bank page.
116
124
 
117
125
  Example code:
126
+
118
127
  ```ruby
119
- # orders_controller.rb
128
+
120
129
  def ideal_checkout
121
130
  @order = Order.find(params[:order_id])
122
131
  @banks = Docdata::Ideal.banks
@@ -151,17 +160,20 @@ def start_ideal_transaction
151
160
  # TODO: Display the error and warn the user that something went wrong.
152
161
  end
153
162
  end
163
+
154
164
  ```
155
165
 
156
166
  View template (ideal_checkout.html.erb):
157
167
 
158
- ```erb
168
+ ```html
169
+
159
170
  <h2>Choose your bank</h2>
160
171
  <%= form_tag start_ideal_transaction_path, method: :post, target: "_blank" do %>
161
172
  <%= select_tag "bank_id", options_from_collection_for_select(@banks, "id", "name") %>
162
173
  <%= hidden_field_tag :order_id, @order.id %>
163
174
  <%= submit_tag "Proceed to checkout" %>
164
175
  <% end %>
176
+
165
177
  ```
166
178
 
167
179
  ## Tips and samples
@@ -170,26 +182,30 @@ View template (ideal_checkout.html.erb):
170
182
  When making a new `Docdata::Payment`, use the `default_act` parameter to redirect consumers directly to the acquirers website. Example:
171
183
 
172
184
  ```ruby
173
- @payment = Docdata::Payment.new(
174
- amount: @order.total,
175
- currency: @order.currency,
176
- shopper: shopper,
177
- profile: "My Default Profile",
178
- order_reference: "order ##{@order.id}",
179
- bank_id: params[:bank_id],
180
- default_act: true # redirect directly to the bank, skipping the Docdata web menu
181
- )
185
+
186
+ @payment = Docdata::Payment.new(
187
+ amount: @order.total,
188
+ currency: @order.currency,
189
+ shopper: shopper,
190
+ profile: "My Default Profile",
191
+ order_reference: "order ##{@order.id}",
192
+ bank_id: params[:bank_id],
193
+ default_act: true # redirect directly to the bank, skipping the Docdata web menu
194
+ )
195
+
182
196
  ```
183
197
 
184
198
  #### Retrieve a list of iDeal banks to show
185
199
  `Docata::Ideal.banks` returns an Array.
186
200
 
187
201
  ## Contributing
202
+ Want to contribute? Greate!
203
+
188
204
 
189
205
  1. Fork it
190
206
  2. Create your feature branch (`git checkout -b my-new-feature`)
191
207
  3. Make changes, document them and add tests (rspec)
192
- 4. Run the entire test suite and make sure all tests pass
208
+ 4. Run the entire test suite and make sure all tests pass (`rake`)
193
209
  5. Commit your changes (`git commit -am 'Add some feature'`)
194
210
  6. Push to the branch (`git push origin my-new-feature`)
195
211
  7. Create new Pull Request
data/docdata.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler" #, "~> 1.3"
21
+ spec.add_development_dependency "bundler"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
24
  spec.add_development_dependency "vcr"
@@ -26,12 +26,13 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency "coveralls"
27
27
  spec.add_development_dependency "simplecov"
28
28
  spec.add_development_dependency "yard"
29
- spec.add_development_dependency "rubyntlm"
29
+ spec.add_development_dependency "redcarpet", "~> 1" # for documentation
30
+ spec.add_development_dependency "github-markup"
30
31
 
31
- # spec.add_runtime_dependency 'savon', git: 'savonrb/savon'
32
32
  spec.add_dependency 'savon', '~> 2.0'
33
33
  spec.add_dependency 'nori'
34
34
  spec.add_dependency 'veto'
35
+ spec.add_dependency 'rubyntlm'
35
36
  spec.add_dependency 'nokogiri'
36
- spec.add_dependency("railties")
37
+ spec.add_dependency 'railties'
37
38
  end
data/lib/docdata.rb CHANGED
@@ -11,6 +11,8 @@ require 'veto'
11
11
 
12
12
  # Files
13
13
  require "docdata/version"
14
+ require "docdata/config"
15
+ require "docdata/engine" if defined?(Rails) && Rails::VERSION::MAJOR.to_i >= 3
14
16
  require "docdata/docdata_error"
15
17
  require "docdata/shopper"
16
18
  require "docdata/payment"
@@ -27,22 +29,22 @@ include Savon
27
29
  module Docdata
28
30
  API_VERSION = 1
29
31
 
30
- # @return [String] Your DocData username
31
- # @note The is a required parameter.
32
- mattr_accessor :username
33
- @@username = nil
32
+ # # @return [String] Your DocData username
33
+ # # @note The is a required parameter.
34
+ # mattr_accessor :username
35
+ # @@username = nil
34
36
 
35
- # @return [String] Your DocData password
36
- mattr_accessor :password
37
- @@password = nil
37
+ # # @return [String] Your DocData password
38
+ # mattr_accessor :password
39
+ # @@password = nil
38
40
 
39
- # @return [Boolean] Test mode switch
40
- mattr_accessor :test_mode
41
- @@test_mode = true
41
+ # # @return [Boolean] Test mode switch
42
+ # mattr_accessor :test_mode
43
+ # @@test_mode = true
42
44
 
43
- # @param [String] Set the url of your website where docdata can send messages to
44
- mattr_accessor :return_url
45
- @@return_url = nil
45
+ # # @param [String] Set the url of your website where docdata can send messages to
46
+ # mattr_accessor :return_url
47
+ # @@return_url = nil
46
48
 
47
49
  # returns the version number
48
50
  def self.version
@@ -55,7 +57,7 @@ module Docdata
55
57
  end
56
58
 
57
59
  def self.url
58
- if test_mode
60
+ if Docdata::Config.test_mode
59
61
  "https://test.docdatapayments.com/ps/services/paymentservice/1_1?wsdl"
60
62
  else
61
63
  "https://www.docdatapayments.com/ps/services/paymentservice/1_1?wsdl"
@@ -66,9 +68,9 @@ module Docdata
66
68
  # in environment variables to make the tests pass with your test
67
69
  # credentials.
68
70
  def self.set_credentials_from_environment
69
- self.password = ENV["DOCDATA_PASSWORD"]
70
- self.username = ENV["DOCDATA_USERNAME"]
71
- self.return_url = ENV["DOCDATA_RETURN_URL"]
71
+ Docdata::Config.password = ENV["DOCDATA_PASSWORD"]
72
+ Docdata::Config.username = ENV["DOCDATA_USERNAME"]
73
+ Docdata::Config.return_url = ENV["DOCDATA_RETURN_URL"]
72
74
  end
73
75
 
74
76
  def self.client
@@ -10,15 +10,18 @@ module Docdata::Config
10
10
  attr_accessor :password
11
11
  # @return [Boolean] Test mode switch
12
12
  attr_accessor :test_mode
13
+ # @return [String] Base return URL
14
+ attr_accessor :return_url
13
15
 
14
16
 
15
17
  # Set's the default value's to nil and false
16
18
  # @return [Hash] configuration options
17
19
  def init!
18
20
  @defaults = {
19
- :@username => nil,
20
- :@password => nil,
21
- :@test_mode => true
21
+ :@username => nil,
22
+ :@password => nil,
23
+ :@test_mode => true,
24
+ :@return_url => nil
22
25
  }
23
26
  end
24
27
 
@@ -5,9 +5,11 @@ module Docdata
5
5
  #
6
6
  # @example default
7
7
  # # /config/environments/development.rb
8
- # config.ideal_mollie.partner_id = 123456
8
+ # config.docata.username = "myapp_com"
9
+ # config.docata.password = "pa55w0rd"
10
+ # config.docata.test_mode = "true"
9
11
  #
10
12
  class Engine < Rails::Engine
11
- config.docdata = Docdata
13
+ config.docdata = Docdata::Config
12
14
  end
13
15
  end
@@ -53,7 +53,7 @@ module Docdata
53
53
  attr_accessor :line_items
54
54
  attr_accessor :key
55
55
  attr_accessor :default_act
56
-
56
+ attr_accessor :canceled
57
57
 
58
58
 
59
59
  #
@@ -84,23 +84,42 @@ module Docdata
84
84
  # if there are any line items, they should all be valid.
85
85
  validate_line_items
86
86
 
87
- # puts
88
-
89
87
  # make the SOAP API call
90
- response = Docdata.client.call(:create, xml: xml)
88
+ response = Docdata.client.call(:create, xml: create_xml)
91
89
  response_object = Docdata::Response.parse(:create, response)
92
90
  if response_object.success?
93
91
  self.key = response_object.key
94
92
  end
93
+
94
+ # set `self` as the value of the `payment` attribute in the response object
95
+ response_object.payment = self
96
+ response_object.url = redirect_url
97
+
95
98
  return response_object
96
99
  end
97
100
 
98
- # @return [String] the xml to send in the SOAP API
99
- def xml
100
- xml_file = "#{File.dirname(__FILE__)}/xml/create.xml.erb"
101
- template = File.read(xml_file)
102
- namespace = OpenStruct.new(payment: self, shopper: shopper)
103
- xml = ERB.new(template).result(namespace.instance_eval { binding })
101
+ #
102
+ # This calls the 'cancel' method of the SOAP API
103
+ # It cancels the payment and returns a Docdata::Response object
104
+ def cancel
105
+ # make the SOAP API call
106
+ response = Docdata.client.call(:cancel, xml: cancel_xml)
107
+ response_object = Docdata::Response.parse(:cancel, response)
108
+ if response_object.success?
109
+ self.key = response_object.key
110
+ end
111
+
112
+ # set `self` as the value of the `payment` attribute in the response object
113
+ response_object.payment = self
114
+ self.canceled = true
115
+ return true
116
+ end
117
+
118
+ # This method makes it possible to find and cancel a payment with only the key
119
+ # It combines
120
+ def self.cancel(api_key)
121
+ p = self.find(api_key)
122
+ p.cancel
104
123
  end
105
124
 
106
125
  # Initialize a Payment object with the key set
@@ -135,15 +154,15 @@ module Docdata
135
154
  def redirect_url
136
155
  url = {}
137
156
 
138
- base_url = Docdata.return_url
139
- if Docdata.test_mode
157
+ base_url = Docdata::Config.return_url
158
+ if Docdata::Config.test_mode
140
159
  redirect_base_url = 'https://test.docdatapayments.com/ps/menu'
141
160
  else
142
161
  redirect_base_url = 'https://secure.docdatapayments.com/ps/menu'
143
162
  end
144
163
  url[:command] = "show_payment_cluster"
145
164
  url[:payment_cluster_key] = key
146
- url[:merchant_name] = Docdata.username
165
+ url[:merchant_name] = Docdata::Config.username
147
166
  # only include return URL if present
148
167
  if base_url.present?
149
168
  url[:return_url_success] = "#{base_url}/success?key=#{url[:payment_cluster_key]}"
@@ -151,9 +170,11 @@ module Docdata
151
170
  url[:return_url_canceled] = "#{base_url}/canceled?key=#{url[:payment_cluster_key]}"
152
171
  url[:return_url_error] = "#{base_url}/error?key=#{url[:payment_cluster_key]}"
153
172
  end
154
- url[:client_language] = shopper.language_code
173
+ if shopper && shopper.language_code
174
+ url[:client_language] = shopper.language_code
175
+ end
155
176
  if default_act
156
- url[:default_act] = true
177
+ url[:default_act] = "yes"
157
178
  end
158
179
  if bank_id.present?
159
180
  url[:ideal_issuer_id] = bank_id
@@ -162,10 +183,30 @@ module Docdata
162
183
  params = URI.encode_www_form(url)
163
184
  uri = "#{redirect_base_url}?#{params}"
164
185
  end
186
+ alias_method :url, :redirect_url
165
187
 
166
188
 
167
189
  private
168
190
 
191
+
192
+ # @return [String] the xml to send in the SOAP API
193
+ def create_xml
194
+ xml_file = "#{File.dirname(__FILE__)}/xml/create.xml.erb"
195
+ template = File.read(xml_file)
196
+ namespace = OpenStruct.new(payment: self, shopper: shopper)
197
+ xml = ERB.new(template).result(namespace.instance_eval { binding })
198
+ end
199
+
200
+
201
+ # @return [String] the xml to send in the SOAP API
202
+ def cancel_xml
203
+ xml_file = "#{File.dirname(__FILE__)}/xml/cancel.xml.erb"
204
+ template = File.read(xml_file)
205
+ namespace = OpenStruct.new(payment: self)
206
+ xml = ERB.new(template).result(namespace.instance_eval { binding })
207
+ end
208
+
209
+
169
210
  # In case there are any line_items, validate them all and
170
211
  # raise an error for the first invalid LineItem
171
212
  def validate_line_items
@@ -28,6 +28,23 @@ module Docdata
28
28
  # @return [String] The raw XML returned by the API
29
29
  attr_accessor :xml
30
30
 
31
+ # @return [Boolean]
32
+ attr_accessor :paid
33
+
34
+ # @return [Integer] the captured amount in cents
35
+ attr_accessor :amount
36
+
37
+ # @return [String] the status of this response (capture response)
38
+ attr_accessor :status
39
+
40
+ # @return [String] Currency ("EUR", "GBP", "USD", etc.)
41
+ attr_accessor :currency
42
+
43
+ # @return [Docdata::Payment] object
44
+ attr_accessor :payment
45
+
46
+ # @return [String] the return URL
47
+ attr_accessor :url
31
48
 
32
49
  #
33
50
  # Initializer to transform a +Hash+ into an Response object
@@ -41,6 +58,13 @@ module Docdata
41
58
  end
42
59
  end
43
60
 
61
+ # Set the attributes based on the API response
62
+ def set_attributes
63
+ self.paid = is_paid?
64
+ self.amount = report[:payment][:authorization][:amount].to_i if report && report[:payment] && report[:payment][:authorization]
65
+ self.status = capture_status if capture_status
66
+ self.currency = currency_to_set
67
+ end
44
68
 
45
69
  #
46
70
  # Parses the returned response hash and turns it
@@ -59,6 +83,7 @@ module Docdata
59
83
  if m[:report]
60
84
  r.report = m[:report]
61
85
  end
86
+ r.set_attributes
62
87
  return r
63
88
  end
64
89
  end
@@ -95,7 +120,11 @@ module Docdata
95
120
 
96
121
  # @return [String] the status string provided by the API. One of [AUTHORIZED, CANCELED]
97
122
  def payment_status
98
- report[:payment][:authorization][:status]
123
+ if report[:payment]
124
+ report[:payment][:authorization][:status]
125
+ else
126
+ nil
127
+ end
99
128
  end
100
129
 
101
130
  # @return [Boolean] true/false, depending wether this payment is considered paid.
@@ -105,7 +134,7 @@ module Docdata
105
134
  # a different 'paid'.
106
135
  # @note This method is never 100% reliable. If you need to finetune this, please implement your own method, using
107
136
  # the available data (total_captured, total_registered, etc.)
108
- def paid
137
+ def is_paid?
109
138
  if payment_method
110
139
  case payment_method
111
140
  # ideal (dutch)
@@ -136,23 +165,28 @@ module Docdata
136
165
 
137
166
  # @return [Boolean]
138
167
  def canceled
139
- payment_status == "CANCELED" || capture_status == "CANCELED"
168
+ (payment_status && payment_status == "CANCELED") ||
169
+ (capture_status && capture_status == "CANCELED")
140
170
  end
141
171
  alias_method :canceled?, :canceled
142
172
 
143
173
  # @return [String] the status of the capture, if exists
144
174
  def capture_status
145
- report[:payment][:authorization][:capture][:status]
175
+ if report && report[:payment] && report[:payment][:authorization] && report[:payment][:authorization][:capture]
176
+ report[:payment][:authorization][:capture][:status]
177
+ else
178
+ nil
179
+ end
146
180
  end
147
181
 
148
- # @return [Integer] the caputred amount in cents
149
- def amount
150
- report[:payment][:authorization][:amount].to_i
151
- end
152
182
 
153
183
  # @return [String] the currency if this transaction
154
- def currency
155
- status_xml.xpath("//amount").first.attributes["currency"].value
184
+ def currency_to_set
185
+ if status_xml && status_xml.xpath("//amount").any?
186
+ status_xml.xpath("//amount").first.attributes["currency"].value
187
+ else
188
+ nil
189
+ end
156
190
  end
157
191
 
158
192
  # @return [Nokogiri::XML::Document] object
@@ -29,6 +29,7 @@ module Docdata
29
29
  # @param format [String] The shopper ID
30
30
  # @param format [String] Shopper first name
31
31
  # @param format [String] Shopper last name
32
+ # @param format [String] Gender ['M','F']
32
33
  # @param format [String] Shopper street address
33
34
  # @param format [String] Shopper house number
34
35
  # @param format [String] Shopper postal code
@@ -43,6 +44,7 @@ module Docdata
43
44
  attr_accessor :id
44
45
  attr_accessor :first_name
45
46
  attr_accessor :last_name
47
+ attr_accessor :gender
46
48
  attr_accessor :street
47
49
  attr_accessor :house_number
48
50
  attr_accessor :postal_code
@@ -87,6 +89,7 @@ module Docdata
87
89
  @city = "City"
88
90
  @country_code = "NL"
89
91
  @language_code = "nl"
92
+ @gender = "M"
90
93
  @email = "random@example.com"
91
94
  end
92
95
 
@@ -1,3 +1,3 @@
1
1
  module Docdata
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -2,7 +2,7 @@
2
2
  <soapenv:Header/>
3
3
  <soapenv:Body>
4
4
  <_1:cancelRequest version="1.1">
5
- <_1:merchant name="<%=Docdata.username%>" password="Docdata.password"/>
5
+ <_1:merchant name="<%=Docdata::Config.username%>" password="<%= Docdata::Config.password%>"/>
6
6
  <_1:paymentOrderKey><%= payment.key %></_1:paymentOrderKey>
7
7
  </_1:cancelRequest>
8
8
  </soapenv:Body>
@@ -2,7 +2,7 @@
2
2
  <soapenv:Header/>
3
3
  <soapenv:Body>
4
4
  <_1:createRequest version="1.1">
5
- <_1:merchant name="<%= Docdata.username %>" password="<%= Docdata.password %>"/>
5
+ <_1:merchant name="<%= Docdata::Config.username %>" password="<%= Docdata::Config.password %>"/>
6
6
  <_1:merchantOrderReference><%= payment.order_reference %></_1:merchantOrderReference>
7
7
  <_1:paymentPreferences>
8
8
  <_1:profile><%= payment.profile %></_1:profile>
@@ -16,7 +16,7 @@
16
16
  </_1:name>
17
17
  <_1:email><%= shopper.email %></_1:email>
18
18
  <_1:language code="<%= shopper.language_code %>"/>
19
- <_1:gender>M</_1:gender>
19
+ <_1:gender><%= shopper.gender.upcase %></_1:gender>
20
20
 
21
21
  </_1:shopper>
22
22
  <_1:totalGrossAmount currency="<%= payment.currency %>"><%= payment.amount %></_1:totalGrossAmount>
@@ -2,7 +2,7 @@
2
2
  <soapenv:Header/>
3
3
  <soapenv:Body>
4
4
  <_1:statusRequest version="1.1">
5
- <_1:merchant name="<%=Docdata.username%>" password="<%= Docdata.password %>"/>
5
+ <_1:merchant name="<%=Docdata::Config.username%>" password="<%= Docdata::Config.password %>"/>
6
6
  <_1:paymentOrderKey><%= payment.key %></_1:paymentOrderKey>
7
7
  </_1:statusRequest>
8
8
  </soapenv:Body>
data/spec/config_spec.rb CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Docdata do
4
4
  before(:each) do
5
- Docdata.test_mode = true
5
+ Docdata::Config.test_mode = true
6
6
  end
7
7
 
8
8
  it "returns correct version number" do
@@ -11,30 +11,30 @@ describe Docdata do
11
11
 
12
12
  context "settings" do
13
13
  it "is in test mode by default" do
14
- expect(Docdata.test_mode).to eq(true)
14
+ expect(Docdata::Config.test_mode).to eq(true)
15
15
  end
16
16
 
17
17
  # it "should have the correct default values" do
18
- # expect(Docdata.test_mode).to be_truthy
19
- # expect(Docdata.username).to be_nil
20
- # expect(Docdata.password).to be_nil
18
+ # expect(Docdata::Config.test_mode).to be_truthy
19
+ # expect(Docdata::Config.username).to be_nil
20
+ # expect(Docdata::Config.password).to be_nil
21
21
  # end
22
22
 
23
23
  it "is able to update and set settings" do
24
- Docdata.test_mode = false
25
- Docdata.username = "abcd"
26
- Docdata.password = "321zyx12"
24
+ Docdata::Config.test_mode = false
25
+ Docdata::Config.username = "abcd"
26
+ Docdata::Config.password = "321zyx12"
27
27
 
28
- expect(Docdata.test_mode).to be_falsey
29
- expect(Docdata.username).to match "abcd"
30
- expect(Docdata.password).to match "321zyx12"
28
+ expect(Docdata::Config.test_mode).to be_falsey
29
+ expect(Docdata::Config.username).to match "abcd"
30
+ expect(Docdata::Config.password).to match "321zyx12"
31
31
  end
32
32
  end
33
33
 
34
34
  context "SOAP configuration" do
35
35
 
36
36
  it "should have the proper test URL" do
37
- expect(Docdata.test_mode).to eq(true)
37
+ expect(Docdata::Config.test_mode).to eq(true)
38
38
  expect(Docdata.url).to eq("https://test.docdatapayments.com/ps/services/paymentservice/1_1?wsdl")
39
39
  end
40
40
 
data/spec/payment_spec.rb CHANGED
@@ -6,7 +6,7 @@ describe Docdata::Payment do
6
6
  @payment = Docdata::Payment.new
7
7
  @payment.amount = 500
8
8
  @payment.profile = ENV["DOCDATA_PAYMENT_PROFILE"]
9
- @payment.order_reference = rand(500)
9
+ @payment.order_reference = rand(500) + Time.now.to_i
10
10
  @payment.currency = "EUR"
11
11
  @payment.description = "Description of my order"
12
12
  @payment.shopper = @shopper
@@ -45,20 +45,21 @@ describe Docdata::Payment do
45
45
  expect(@payment.shopper).to be_kind_of(Docdata::Shopper)
46
46
  expect(@payment.shopper.first_name).to eq("John")
47
47
  end
48
+
48
49
  end
49
50
 
50
51
  describe "#create" do
51
52
 
52
53
  it "raises error when credentials are wrong" do
53
54
  # puts @payment.xml
54
- Docdata.password = "1234"
55
+ Docdata::Config.password = "1234"
55
56
  VCR.use_cassette("payments-xml-create-without-credentials") do
56
57
  expect { @payment.create }.to raise_error(DocdataError, "Login failed.")
57
58
  end
58
59
  end
59
60
 
60
61
  it "raises error when password is blank" do
61
- Docdata.password = ""
62
+ Docdata::Config.password = ""
62
63
  VCR.use_cassette("payments-xml-create-without-password") do
63
64
  expect { @payment.create }.to raise_error(DocdataError, /The value '' of attribute 'password' on element '_1:merchant' is not valid with respect to its type/)
64
65
  end
@@ -87,6 +88,26 @@ describe Docdata::Payment do
87
88
  end
88
89
  end
89
90
 
91
+ it "has a payment" do
92
+ Docdata.set_credentials_from_environment
93
+ VCR.use_cassette("payments-successful-create") do
94
+ @response = @payment.create
95
+ end
96
+ expect(@response.payment).to be_kind_of(Docdata::Payment)
97
+ end
98
+
99
+ it "has a `url` property" do
100
+ Docdata.set_credentials_from_environment
101
+ VCR.use_cassette("payments-successful-create") do
102
+ @response = @payment.create
103
+ end
104
+ # puts @payment.redirect_url
105
+ # puts @payment.inspect
106
+ # puts @response.payment.inspect
107
+ # puts @response.url
108
+ expect(@response.url).to be_present
109
+ end
110
+
90
111
  it "redirect directly to the bank if bank_id && default_act is given" do
91
112
  Docdata.set_credentials_from_environment
92
113
  @payment.bank_id = "0031" # ABN AMRO
@@ -94,7 +115,7 @@ describe Docdata::Payment do
94
115
  VCR.use_cassette("payments-successful-create") do
95
116
  @payment.create
96
117
  # puts @payment.redirect_url
97
- expect(@payment.redirect_url).to include("&default_act=true&ideal_issuer_id=0031&default_pm=IDEAL")
118
+ expect(@payment.redirect_url).to include("&default_act=yes&ideal_issuer_id=0031&default_pm=IDEAL")
98
119
  end
99
120
  end
100
121
 
@@ -159,4 +180,34 @@ describe Docdata::Payment do
159
180
  expect(@payment).to be_kind_of(Docdata::Payment)
160
181
  end
161
182
  end
183
+
184
+ describe "#cancel" do
185
+ before(:each) do
186
+ Docdata.set_credentials_from_environment
187
+ VCR.use_cassette("payments-successful-create") do
188
+ @payment.create
189
+ end
190
+ end
191
+
192
+ it "returns a response object" do
193
+ VCR.use_cassette("payments-successful-cancel") do
194
+ @response = @payment.cancel
195
+ end
196
+ expect(@response).to be(true)
197
+ end
198
+
199
+ it "has attribute 'canceled' to true" do
200
+ VCR.use_cassette("payments-successful-cancel") do
201
+ @response = @payment.cancel
202
+ end
203
+ expect(@payment.canceled).to eq(true)
204
+ end
205
+
206
+ it "combines find and cancel in one call" do
207
+
208
+ VCR.use_cassette("payments-find-and-cancel") do
209
+ @payment = Docdata::Payment.cancel(@payment.key)
210
+ end
211
+ end
212
+ end
162
213
  end
@@ -26,6 +26,7 @@ describe Docdata::Response do
26
26
  end
27
27
 
28
28
  it "has 'total_registered' method" do
29
+ # puts @response.inspect
29
30
  expect(@response.total_registered).to eq(500)
30
31
  end
31
32
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docdata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henk Meijer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-08-05 00:00:00.000000000 Z
12
+ date: 2014-08-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -124,7 +124,21 @@ dependencies:
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
- name: rubyntlm
127
+ name: redcarpet
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ~>
131
+ - !ruby/object:Gem::Version
132
+ version: '1'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ~>
138
+ - !ruby/object:Gem::Version
139
+ version: '1'
140
+ - !ruby/object:Gem::Dependency
141
+ name: github-markup
128
142
  requirement: !ruby/object:Gem::Requirement
129
143
  requirements:
130
144
  - - '>='
@@ -179,6 +193,20 @@ dependencies:
179
193
  - - '>='
180
194
  - !ruby/object:Gem::Version
181
195
  version: '0'
196
+ - !ruby/object:Gem::Dependency
197
+ name: rubyntlm
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - '>='
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ type: :runtime
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - '>='
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
182
210
  - !ruby/object:Gem::Dependency
183
211
  name: nokogiri
184
212
  requirement: !ruby/object:Gem::Requirement
@@ -217,6 +245,8 @@ files:
217
245
  - .coveralls.yml
218
246
  - .gitignore
219
247
  - .travis.yml
248
+ - .yardopts
249
+ - CHANGELOG.md
220
250
  - Gemfile
221
251
  - LICENSE
222
252
  - README.md