ljoseppi-paypal 3.0.0pre6

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,19 @@
1
+ module Paypal
2
+ module Helpers
3
+ module Rails
4
+ # Convenience helper. Can replace <%= form_tag Paypal::Notification.ipn_url %>
5
+ # takes optional url parameter, default is Paypal::Notification.ipn_url
6
+ def paypal_form_tag(url = Paypal::Config.ipn_url, options = {})
7
+ form_tag(url, options)
8
+ end
9
+
10
+ def paypal_form_tag(url = Paypal::Config.ipn_url, options = {}, &block)
11
+ if block
12
+ concat(form_tag(url, options)+capture(&block)+"</form>", block.binding)
13
+ else
14
+ form_tag(url, options)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,188 @@
1
+ require 'rack'
2
+ require 'net/http'
3
+
4
+ module Paypal
5
+ class NoDataError < StandardError; end
6
+
7
+ # Parser and handler for incoming Instant payment notifications from paypal.
8
+ # The Example shows a typical handler in a rails application. Note that this
9
+ # is an example, please read the Paypal API documentation for all the details
10
+ # on creating a safe payment controller.
11
+ #
12
+ # Example (Sinatra)
13
+ # def raw_post
14
+ # request.env["rack.input"].read
15
+ # end
16
+ #
17
+ # post "/paypal_ipn" do
18
+ # notify = Paypal::Notification.new(raw_post)
19
+ #
20
+ # order = Order.find(notify.item_id)
21
+ #
22
+ # if notify.acknowledge
23
+ # begin
24
+ # if notify.complete? and order.total == notify.amount and notify.business == 'sales@myshop.com'
25
+ # order.status = 'success'
26
+ #
27
+ # shop.ship(order)
28
+ # else
29
+ # logger.error("Failed to verify Paypal's notification, please investigate")
30
+ # end
31
+ #
32
+ # rescue => e
33
+ # order.status = 'failed'
34
+ # raise
35
+ # ensure
36
+ # order.save
37
+ # end
38
+ # end
39
+ #
40
+ # nil
41
+ # end
42
+ # end
43
+ #
44
+ # Example (Rails)
45
+ #
46
+ # class BackendController < ApplicationController
47
+ #
48
+ # def paypal_ipn
49
+ # notify = Paypal::Notification.new(request.raw_post)
50
+ #
51
+ # order = Order.find(notify.item_id)
52
+ #
53
+ # if notify.acknowledge
54
+ # begin
55
+ #
56
+ # if notify.complete? and order.total == notify.amount and notify.business == 'sales@myshop.com'
57
+ # order.status = 'success'
58
+ #
59
+ # shop.ship(order)
60
+ # else
61
+ # logger.error("Failed to verify Paypal's notification, please investigate")
62
+ # end
63
+ #
64
+ # rescue => e
65
+ # order.status = 'failed'
66
+ # raise
67
+ # ensure
68
+ # order.save
69
+ # end
70
+ # end
71
+ #
72
+ # render :nothing
73
+ # end
74
+ # end
75
+ class Notification
76
+ attr_accessor :params
77
+ attr_accessor :raw
78
+
79
+ # Creates a new paypal object. Pass the raw html you got from paypal in.
80
+ # In a rails application this looks something like this
81
+ #
82
+ # def paypal_ipn
83
+ # paypal = Paypal::Notification.new(request.raw_post)
84
+ # ...
85
+ # end
86
+ def initialize(post)
87
+ raise NoDataError if post.to_s.empty?
88
+
89
+ @params = {}
90
+ @raw = ""
91
+
92
+ parse(post)
93
+ end
94
+
95
+ # Transaction statuses
96
+ def canceled_reversal?
97
+ status == :Canceled_Reversal
98
+ end
99
+
100
+ def completed?
101
+ status == :Completed
102
+ end
103
+
104
+ def denied?
105
+ status == :Denied
106
+ end
107
+
108
+ def expired?
109
+ status == :Expired
110
+ end
111
+
112
+ def failed?
113
+ status == :Failed
114
+ end
115
+
116
+ def pending?
117
+ status == :Pending
118
+ end
119
+
120
+ def processed?
121
+ status == :Processed
122
+ end
123
+
124
+ def refunded?
125
+ status == :Refunded
126
+ end
127
+
128
+ def reversed?
129
+ status == :Reversed
130
+ end
131
+
132
+ def voided?
133
+ status == :Voided
134
+ end
135
+
136
+ # Acknowledge the transaction to paypal. This method has to be called after a new
137
+ # ipn arrives. Paypal will verify that all the information we received are correct and will return a
138
+ # ok or a fail.
139
+ #
140
+ # Example:
141
+ #
142
+ # def paypal_ipn
143
+ # notify = PaypalNotification.new(request.raw_post)
144
+ #
145
+ # if notify.acknowledge
146
+ # ... process order ... if notify.complete?
147
+ # else
148
+ # ... log possible hacking attempt ...
149
+ # end
150
+ def acknowledge
151
+ payload = raw
152
+
153
+ uri = URI.parse(Paypal::Config.ipn_url)
154
+ request = Net::HTTP::Post.new(Paypal::Config.ipn_validation_path)
155
+ request['Content-Length'] = "#{payload.size}"
156
+ request['User-Agent'] = "paypal ruby -- http://github.com/JonathanTron/paypal"
157
+
158
+ http = Net::HTTP.new(uri.host, uri.port)
159
+
160
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless @ssl_strict
161
+ http.use_ssl = true
162
+
163
+ request = http.request(request, payload)
164
+
165
+ raise StandardError.new("Faulty paypal result: #{request.body}") unless ["VERIFIED", "INVALID"].include?(request.body)
166
+
167
+ request.body == "VERIFIED"
168
+ end
169
+
170
+ def method_missing(method, *args)
171
+ params[method.to_s] || super
172
+ end
173
+
174
+ private
175
+
176
+ def status
177
+ @status ||= (params['payment_status'] ? params['payment_status'].to_sym : nil)
178
+ end
179
+
180
+ # Take the posted data and move the relevant data into a hash
181
+ def parse(post)
182
+ @raw = post
183
+ self.params = Rack::Utils.parse_query(post)
184
+ # Rack allows duplicate keys in queries, we need to use only the last value here
185
+ self.params.each{|k,v| self.params[k] = v.last if v.is_a?(Array)}
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,6 @@
1
+ require 'active_support'
2
+ require File.join(File.dirname(__FILE__),'helpers', '/common')
3
+ require File.join(File.dirname(__FILE__),'helpers', '/rails')
4
+
5
+ ActionView::Base.send(:include, Paypal::Helpers::Common)
6
+ ActionView::Base.send(:include, Paypal::Helpers::Rails)
@@ -0,0 +1,3 @@
1
+ module Paypal
2
+ VERSION = "3.0.0pre6"
3
+ end
data/lib/paypal.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'cgi'
2
+ require 'net/http'
3
+ require 'net/https'
4
+
5
+ require "paypal/version"
6
+ require "paypal/config"
7
+ require "paypal/notification"
8
+ require "paypal/helpers/common"
data/misc/multiruby.sh ADDED
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ for i in 1.9.2-head 1.9.1 ree 1.8.7; do
4
+ rvm use $i && echo `ruby -v` && bundle install > /dev/null && bundle exec rake spec && bundle show
5
+ done
data/misc/paypal.psd ADDED
Binary file
data/paypal.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "paypal/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "ljoseppi-paypal"
7
+ s.version = Paypal::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Lairton Borges","Jonathan TRON", "Joseph HALTER", "Tobias LUETKE"]
10
+ s.email = "ljoseppi@gmail.com"
11
+ s.homepage = "https://github.com/ljoseppi/paypal"
12
+ s.summary = %q{Integrate Paypal Express}
13
+ s.description = %q{Paypal Express Integration}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.rdoc_options = ["--charset=UTF-8"]
21
+ s.extra_rdoc_files = [
22
+ "LICENSE",
23
+ "README.md"
24
+ ]
25
+
26
+ s.add_runtime_dependency(%q<rack>, [">= 1.0.0"])
27
+
28
+ s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
29
+ s.add_development_dependency(%q<rcov>, [">= 0.9.8"])
30
+ s.add_development_dependency(%q<nokogiri>, [">= 0"])
31
+ s.add_development_dependency(%q<bluecloth>, [">= 0"])
32
+ s.add_development_dependency(%q<yard>, [">= 0"])
33
+ s.add_development_dependency(%q<fakeweb>, [">= 0"])
34
+ end
@@ -0,0 +1,168 @@
1
+ require "spec_helper"
2
+
3
+ describe Paypal::Config do
4
+ after do
5
+ Paypal.class_eval do
6
+ remove_const :Config if const_defined?(:Config)
7
+ end
8
+ load "paypal/config.rb"
9
+ end
10
+
11
+ describe "ipn_urls" do
12
+ it "should define url for :production" do
13
+ Paypal::Config.ipn_urls[:production].should eql("https://www.paypal.com/cgi-bin/webscr")
14
+ end
15
+ it "should define url for :sandbox" do
16
+ Paypal::Config.ipn_urls[:sandbox].should eql("https://www.sandbox.paypal.com/cgi-bin/webscr")
17
+ end
18
+ it "should allow changing urls" do
19
+ url = "https://myownsandbox.com"
20
+ Paypal::Config.ipn_urls[:sandbox] = url
21
+ Paypal::Config.ipn_urls[:sandbox].should eql(url)
22
+ end
23
+ end
24
+
25
+ describe "mode" do
26
+ it "should be :sandbox by default" do
27
+ Paypal::Config.mode.should eql(:sandbox)
28
+ end
29
+
30
+ it "should accept :sandbox" do
31
+ lambda {
32
+ Paypal::Config.mode = :sandbox
33
+ }.should_not raise_error
34
+ end
35
+
36
+ it "should accept :production" do
37
+ lambda {
38
+ Paypal::Config.mode = :production
39
+ }.should_not raise_error
40
+ end
41
+
42
+ it "should not accept something different than :production or :sandbox" do
43
+ lambda {
44
+ Paypal::Config.mode = :demo
45
+ }.should raise_error(ArgumentError)
46
+ end
47
+ end
48
+
49
+ describe "when setting mode to sandbox" do
50
+ before do
51
+ Paypal::Config.mode = :sandbox
52
+ end
53
+
54
+ it "should be in :sandbox mode" do
55
+ Paypal::Config.mode.should eql(:sandbox)
56
+ end
57
+
58
+ it "should have ipn url for sandbox" do
59
+ Paypal::Config.ipn_url.should eql("https://www.sandbox.paypal.com/cgi-bin/webscr")
60
+ end
61
+
62
+ it "should have the ipn validation path for sandbox" do
63
+ Paypal::Config.ipn_validation_path.should eql("/cgi-bin/webscr?cmd=_notify-validate")
64
+ end
65
+
66
+ it "should have the ipn validation url for sandbox" do
67
+ Paypal::Config.ipn_validation_url.should eql("https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate")
68
+ end
69
+
70
+ it "should have paypal cert for sandbox" do
71
+ Paypal::Config.paypal_cert.should eql(
72
+ "-----BEGIN CERTIFICATE-----
73
+ MIIDoTCCAwqgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBmDELMAkGA1UEBhMCVVMx
74
+ EzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCFNhbiBKb3NlMRUwEwYDVQQK
75
+ EwxQYXlQYWwsIEluYy4xFjAUBgNVBAsUDXNhbmRib3hfY2VydHMxFDASBgNVBAMU
76
+ C3NhbmRib3hfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMB4XDTA0
77
+ MDQxOTA3MDI1NFoXDTM1MDQxOTA3MDI1NFowgZgxCzAJBgNVBAYTAlVTMRMwEQYD
78
+ VQQIEwpDYWxpZm9ybmlhMREwDwYDVQQHEwhTYW4gSm9zZTEVMBMGA1UEChMMUGF5
79
+ UGFsLCBJbmMuMRYwFAYDVQQLFA1zYW5kYm94X2NlcnRzMRQwEgYDVQQDFAtzYW5k
80
+ Ym94X2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbTCBnzANBgkqhkiG
81
+ 9w0BAQEFAAOBjQAwgYkCgYEAt5bjv/0N0qN3TiBL+1+L/EjpO1jeqPaJC1fDi+cC
82
+ 6t6tTbQ55Od4poT8xjSzNH5S48iHdZh0C7EqfE1MPCc2coJqCSpDqxmOrO+9QXsj
83
+ HWAnx6sb6foHHpsPm7WgQyUmDsNwTWT3OGR398ERmBzzcoL5owf3zBSpRP0NlTWo
84
+ nPMCAwEAAaOB+DCB9TAdBgNVHQ4EFgQUgy4i2asqiC1rp5Ms81Dx8nfVqdIwgcUG
85
+ A1UdIwSBvTCBuoAUgy4i2asqiC1rp5Ms81Dx8nfVqdKhgZ6kgZswgZgxCzAJBgNV
86
+ BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMREwDwYDVQQHEwhTYW4gSm9zZTEV
87
+ MBMGA1UEChMMUGF5UGFsLCBJbmMuMRYwFAYDVQQLFA1zYW5kYm94X2NlcnRzMRQw
88
+ EgYDVQQDFAtzYW5kYm94X2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNv
89
+ bYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAFc288DYGX+GX2+W
90
+ P/dwdXwficf+rlG+0V9GBPJZYKZJQ069W/ZRkUuWFQ+Opd2yhPpneGezmw3aU222
91
+ CGrdKhOrBJRRcpoO3FjHHmXWkqgbQqDWdG7S+/l8n1QfDPp+jpULOrcnGEUY41Im
92
+ jZJTylbJQ1b5PBBjGiP0PpK48cdF
93
+ -----END CERTIFICATE-----")
94
+ end
95
+
96
+ it "should allow setting a new sandbox cert" do
97
+ lambda {
98
+ Paypal::Config.paypal_sandbox_cert = "TEST"
99
+ }.should_not raise_error
100
+ Paypal::Config.paypal_cert.should eql("TEST")
101
+ end
102
+ end
103
+
104
+ describe "when setting mode to :production" do
105
+ before do
106
+ Paypal::Config.mode = :production
107
+ end
108
+
109
+ it "should be in :production mode" do
110
+ Paypal::Config.mode.should eql(:production)
111
+ end
112
+
113
+ it "should have ipn url for production" do
114
+ Paypal::Config.ipn_url.should eql("https://www.paypal.com/cgi-bin/webscr")
115
+ end
116
+
117
+ it "should have the ipn validation path for production" do
118
+ Paypal::Config.ipn_validation_path.should eql("/cgi-bin/webscr?cmd=_notify-validate")
119
+ end
120
+
121
+ it "should have the ipn validation url for production" do
122
+ Paypal::Config.ipn_validation_url.should eql("https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate")
123
+ end
124
+
125
+ describe "when paypal_production_cert was not set" do
126
+ before do
127
+ @old_cert, Paypal::Config.paypal_production_cert = Paypal::Config.paypal_production_cert, nil
128
+ end
129
+
130
+ after do
131
+ Paypal::Config.paypal_production_cert = @old_cert
132
+ end
133
+
134
+ it "should raise an error" do
135
+ lambda {
136
+ Paypal::Config.paypal_cert
137
+ }.should raise_error(StandardError)
138
+ end
139
+ end
140
+
141
+ describe "when paypal_production_cert was set" do
142
+ before do
143
+ @old_cert, Paypal::Config.paypal_production_cert = Paypal::Config.paypal_production_cert, "TEST"
144
+ end
145
+
146
+ after do
147
+ Paypal::Config.paypal_production_cert = @old_cert
148
+ end
149
+
150
+ it "should not raise an error" do
151
+ lambda {
152
+ Paypal::Config.paypal_cert
153
+ }.should_not raise_error(StandardError)
154
+ end
155
+
156
+ it "should use the paypal production certificate" do
157
+ Paypal::Config.paypal_cert.should eql("TEST")
158
+ end
159
+ end
160
+
161
+ it "should allow setting a new production cert" do
162
+ lambda {
163
+ Paypal::Config.paypal_production_cert = "TEST"
164
+ }.should_not raise_error
165
+ Paypal::Config.paypal_cert.should eql("TEST")
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC/jCCAmegAwIBAgIJAPlQUrHaPFrXMA0GCSqGSIb3DQEBBQUAMF4xCzAJBgNV
3
+ BAYTAkZSMRMwEQYDVQQIEwpTb21lLVN0YXRlMR4wHAYDVQQKExVPcGVuaG9vZCAt
4
+ IFBheXBhbCBnZW0xGjAYBgNVBAMTEU9wZW5ob29kUGF5cGFsR2VtMB4XDTEwMDMy
5
+ ODE1MjgwM1oXDTIwMDMyNTE1MjgwM1owXjELMAkGA1UEBhMCRlIxEzARBgNVBAgT
6
+ ClNvbWUtU3RhdGUxHjAcBgNVBAoTFU9wZW5ob29kIC0gUGF5cGFsIGdlbTEaMBgG
7
+ A1UEAxMRT3Blbmhvb2RQYXlwYWxHZW0wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
8
+ AoGBAMaHlHZGjccN7p2xV6ro+TWc34EnRWhXRe1g9z/YwxhKA3Iu9etrU8m8Bbdh
9
+ EpBQTv/IOp7EG7kiUWcdyZp5gEQn6vX/+VIyvIJEDIiyWbxk2TBr6ofb0N8dwebh
10
+ M1T4Z7RvpqSAQWjbqFnN32IWR8SzmnZ5Hl/omfOsII14rWmDAgMBAAGjgcMwgcAw
11
+ HQYDVR0OBBYEFDDSdBbUWCfW8kVhoIkjEQm0a5P1MIGQBgNVHSMEgYgwgYWAFDDS
12
+ dBbUWCfW8kVhoIkjEQm0a5P1oWKkYDBeMQswCQYDVQQGEwJGUjETMBEGA1UECBMK
13
+ U29tZS1TdGF0ZTEeMBwGA1UEChMVT3Blbmhvb2QgLSBQYXlwYWwgZ2VtMRowGAYD
14
+ VQQDExFPcGVuaG9vZFBheXBhbEdlbYIJAPlQUrHaPFrXMAwGA1UdEwQFMAMBAf8w
15
+ DQYJKoZIhvcNAQEFBQADgYEAtnLucD1VU50JDcS/uuerhsBCHYwYUyrksYd43Stz
16
+ LaFLEhNXlciWvAanfMp182F1b5SLQdE9WqGZ4bDHWlgVeFa6zqcbmu7O9Z7xi0pS
17
+ f6lx3qllyjbn1zPbuiPOImM81dvXODYXD8fRvBc4+uTy4Xqin5rlwTvsM5TxJgHw
18
+ sSc=
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXgIBAAKBgQDGh5R2Ro3HDe6dsVeq6Pk1nN+BJ0VoV0XtYPc/2MMYSgNyLvXr
3
+ a1PJvAW3YRKQUE7/yDqexBu5IlFnHcmaeYBEJ+r1//lSMryCRAyIslm8ZNkwa+qH
4
+ 29DfHcHm4TNU+Ge0b6akgEFo26hZzd9iFkfEs5p2eR5f6JnzrCCNeK1pgwIDAQAB
5
+ AoGBAKI289K0kXHc62TEG/rVQ5NP67vPB8Ja1RNB0KTFi5uUFj69KklCuAK09ALD
6
+ eXSbegE7bNJ/MJvT86mKyEjFEEyvpupEy7uzqZtWJUWHkDZTN2nyiz+kyRvhzldi
7
+ DlMOA0S3sNF6il94Chjb+F6/b+8d6cd8zi86tN5NJ0RLBiJ5AkEA6RrJxclKjPIb
8
+ GEtQ7W/hvhne2fx+F/mXdUg4TXBzupk9G5fgFpB05NDrLVs8gIJisBf7h/9OQ69B
9
+ Qvps9V4GxwJBANoHbtGQDBZDka1RSOsRubSqRMDWOYiE0KJcGmEdwoOz/zH0YcWI
10
+ iYQRv0k/sGITDAUQW+cqMEd82zME/XR0W2UCQQCgc98FdNwLDq+V1mn7NfMGPpqG
11
+ I+XLrPMTOMYAj/IpNEe60ZzfC0pbIm9vRgjsUFOL8MYjw5nkvyLF7sjHUJSLAkEA
12
+ k0IB7zjDcSYh9lW4UkyeiQ+XcEdAhJxv7bkXeBCJmDqyWiMdBjW566Gw+OAzWYpT
13
+ y/fImtE72ozR4Bu2tDkCoQJAHWVaDrzDANnUP8/xGoPxbWI8lYE+kKpyZtyTOgWm
14
+ mXbXCGjqKRA5HcDMoNmd0+pY/3pXx5VjHOiL2UsKrSnTaQ==
15
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,68 @@
1
+ require "spec_helper"
2
+
3
+ describe Paypal::Helpers::Common do
4
+ include Paypal::Helpers::Common
5
+
6
+ describe ".paypal_setup(item_number, amount, business, options = {})" do
7
+ describe "with default options" do
8
+ before do
9
+ @result = paypal_setup(1, "10.00", "trash@openhood.com")
10
+ end
11
+
12
+ {
13
+ "item_number" => "1",
14
+ "amount" => "10.00",
15
+ "currency_code" => "USD",
16
+ "business" => "trash@openhood.com",
17
+ "cmd" => "_xclick",
18
+ "quantity" => "1",
19
+ "item_number" => "1",
20
+ "item_name" => "Store purchase",
21
+ "no_shipping" => "1",
22
+ "no_note" => "1",
23
+ "charset" => "utf-8"
24
+ }.each do |key, value|
25
+ it "should include #{key} with #{value}" do
26
+ @result.should have_css("input[type=hidden][name=\"#{key}\"][value=\"#{value}\"]")
27
+ end
28
+ end
29
+ end
30
+
31
+ describe "with :enable_encryption set to true" do
32
+ context "with Paypal::Config.business_cert business_key and business_cert_id not set" do
33
+ it "should raise an error" do
34
+ lambda {
35
+ paypal_setup(1, "10.00", "trash@openhood.com", {:enable_encryption => true})
36
+ }.should raise_error ArgumentError, "Paypal::Config.business_key, Paypal::Config.business_cert and Paypal::Config.business_cert_id should be set if you use :enable_encryption"
37
+ end
38
+ end
39
+
40
+ context "with Paypal::Config.business_cert business_key and business_cert_id set" do
41
+ before do
42
+ Paypal::Config.business_cert = File.read(File.expand_path("../../fixtures/business_cert.pem", __FILE__))
43
+ Paypal::Config.business_key = File.read(File.expand_path("../../fixtures/business_key.pem", __FILE__))
44
+ Paypal::Config.business_cert_id = "CERTID"
45
+ @result = paypal_setup(1, "10.00", "trash@openhood.com", {
46
+ :enable_encryption => true
47
+ })
48
+ end
49
+
50
+ it "should include cmd with _s-xclick" do
51
+ @result.should have_css("input[type=hidden][name=cmd][value=_s-xclick]")
52
+ end
53
+ it "should include cmd with encrypted datas" do
54
+ @result.should have_css("input[type=hidden][name=encrypted][value*=PKCS7]")
55
+ @result.should_not have_css("input[type=hidden][name=encrypted][value*='\n']")
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "with unknown options" do
61
+ it "should raise an error" do
62
+ lambda do
63
+ paypal_setup(1, "10.00", "trash@openhood.com", :unknown_option => "unknown")
64
+ end.should raise_error(ArgumentError, "Unknown option #{[:unknown_option].inspect}")
65
+ end
66
+ end
67
+ end
68
+ end