ljoseppi-paypal 3.0.0pre6

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