cybersourcery_testing 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7d691ed4729b44202aae717e8b195a5f240601ec
4
+ data.tar.gz: 2a9653b278588a6c6a0bccfcf8cb973f2e4246bd
5
+ SHA512:
6
+ metadata.gz: af13df4dad192f1e90633c7f3e78cc74a54b48a2b9d43030562a2f31fc5b0b3acae9bec7c26c0918b45981082e3ba7275cdef0bf74a69fea7a7346475e8c0410
7
+ data.tar.gz: 4126546a2cfdfbdd9c3d0aa24f93b1032c045fdafa8912e7f4cbb2ce97d0e10c43f17278d7a6f4b4ac8a87dc3a66dea0d461a51eb3a2092e832a9af4bfc5f644
@@ -0,0 +1,24 @@
1
+ .idea
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ *.bundle
20
+ *.so
21
+ *.o
22
+ *.a
23
+ mkmf.log
24
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cybersourcery_testing.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 PromptWorks
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,94 @@
1
+ # Cybersourcery Testing
2
+
3
+ The Cybersourcery Testing gem is designed for use with Rails projects, and supports feature/integration testing of the Cybersource Silent Order POST (SOP) service. It can be used with [the Cybersourcery gem](https://github.com/promptworks/cybersourcery) or as a stand-alone testing service. It uses a Sinatra proxy server and [VCR](https://github.com/vcr/vcr), to avoid the need for repeated requests to the Cybersource SOP test server.
4
+
5
+ ## Features
6
+
7
+ Automated testing with Cybersource SOP is more difficult than typical 3rd party services. When a transaction is submitted, Cybersource dynamically generates a hidden form in the user's browser, which it then automatically submits to the Cybersource Profile's "Customer Response Page URL." This URL may not correspond to your local testing environment. The Cybersourcery Testing gem uses middleware to rewrite these responses, so they can be handled in your local testing environment. It also hooks into VCR for recording transactions, and handles known but undocumented Cybersource errors.
8
+
9
+ It includes:
10
+
11
+ * A proxy server to stand-in for the Cybersource SOP test server. It runs on Sinatra, and includes a middleware translating proxy which directs both requests to, and responses from, the Cybersource SOP test server to the Sinatra server.
12
+ * Detection and alerts for undocumented Cybersource SOP error conditions, where Cybersource returns only a general server error message. The proxy server will detect these conditions and raise exceptions that include clear explanations.
13
+ * A VCR implementation to record your test transactions, for re-use in future test runs.
14
+ * Support for defining your own VCR custom matchers, to detect variations in the data in test submissions. The gem comes with a check for changes in the credit card number. You can add checks for other fields as needed for your business requirements.
15
+
16
+ When a test is run that shows a change against any of the defined matchers, the proxy server will forward the transaction to the actual Cybersource SOP test server, and VCR will record the transaction. Subsequent runs of the same test will rely on the VCR recording. This means you can do repeated feature/integration testing without requiring ongoing contact with the Cybersource SOP test server.
17
+
18
+ ## Installation
19
+
20
+ 1. Add it to your Gemfile and run bundle:
21
+
22
+ ```ruby
23
+ gem 'cybersourcery_testing'
24
+ ```
25
+
26
+ ```console
27
+ bundle
28
+ ```
29
+
30
+ 2. Run the generator for creating a sample .env file, and update your .env file:
31
+
32
+ ```console
33
+ rails generate cybersourcery_testing:dotenv
34
+ ```
35
+
36
+ This generates a file in your Rails root directory named `.env.cybersourcery_testing_sample`. If you do not have a `.env` file already, rename it to `.env`. If you do have a `.env` file, copy the contents of the sample file and paste them to the end of your .env file. You can then delete the sample file.
37
+
38
+ 3. Update your .env settings as needed:
39
+
40
+ * CYBERSOURCERY_SOP_TEST_URL: the URL of the Cybersource Silent Order Post (SOP) test server. You should not need to change this.
41
+ * CYBERSOURCERY_SOP_PROXY_URL: the base URL the Sinatra proxy will use.
42
+ * CYBERSOURCERY_SOP_PROXY_RUNNER: `ruby` by default, which means it will start Sinatra. You can change this to `shotgun`, etc if you setup a different runner you prefer.
43
+ * CYBERSOURCERY_RESPONSE_PAGE_URL: this must match the "Customer Response Page" URL you have set in the Cybersource Business Center for the profile you will use when testing.
44
+ * CYBERSOURCERY_LOCAL_RESPONSE_PAGE_PATH: the path to the local equivalent of the "Customer Response Page" (should be in URI path format, e.g. `/confirm`)
45
+ * CYBERSOURCERY_USE_VCR_IN_TESTS: `true` or `false`. This should be `true` unless you have a special reason to change it. If you do not set this to `true` the Sinatra proxy will always forward all requests to the actual Cybersource SOP test server.
46
+ * CYBERSOURCERY_VCR_CASSETTE_DIR: the relative path to where your VCR cassette file should be stored.
47
+
48
+ ## Usage
49
+
50
+ ### Optional: Define matchers for VCR
51
+
52
+ When you submit a transaction through the proxy server, it will forward the request to the Cybersource SOP test sever only if there is a change in a field that VCR has a matcher for. VCR checks its existing cassettes to see if the request has changes to any of the fields it has matchers for. So it's up to you to decide which fields are important for detecting and testing changes in.
53
+
54
+ A matcher for detecting changes in the credit card number is included. If that's all you need, then you can skip the rest of this step.
55
+
56
+ To set up your own matchers:
57
+
58
+ 1. Create a file to put your matchers in. Here is an example for detecting changes to the card type:
59
+
60
+ ```ruby
61
+ require 'sinatra'
62
+ require 'cybersourcery_testing/cybersource_proxy'
63
+
64
+ VCR.configure do |c|
65
+ c.register_request_matcher :card_type_equality do |request_1, request_2|
66
+ pattern = /\&card_type=(\d+)\&/i
67
+ CybersourceryTesting::Vcr.did_it_change?(pattern, request_1.body, request_2.body)
68
+ end
69
+ end
70
+ ```
71
+
72
+ The two `require` statements are important! Also, you can make as many `register_request_matcher` calls as you need.
73
+
74
+ 2. Add the relative path to this file to your .env file, with the variable name `CYBERSOURCERY_SOP_PROXY_RB_PATH`. For example:
75
+
76
+ ```console
77
+ CYBERSOURCERY_SOP_PROXY_RB_PATH = 'spec/cybersource_proxy_custom.rb'
78
+ ```
79
+
80
+ ### Start the proxy server
81
+
82
+ The gem comes with a rake task for starting the proxy server, which is exported for use in your Rails project:
83
+
84
+ ```console
85
+ rake cybersourcery:proxy
86
+ ```
87
+
88
+ ## Contributing
89
+
90
+ 1. Fork it ( https://github.com/[my-github-username]/cybersourcery_testing/fork )
91
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
92
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
93
+ 4. Push to the branch (`git push origin my-new-feature`)
94
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,30 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+
3
+ # Maintain your gem's version:
4
+ require 'cybersourcery_testing/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'cybersourcery_testing'
8
+ spec.version = CybersourceryTesting::VERSION
9
+ spec.authors = ['Michael Toppa']
10
+ spec.email = ['public@toppa.com']
11
+ spec.summary = %q{For developing feature tests with Cybersourcery}
12
+ spec.description = %q{The Cybersourcery Testing gem is designed for use with Rails projects, and supports feature/integration testing of the Cybersource Silent Order POST (SOP) service. It can be used with the Cybersourcery gem or as a stand-alone testing service. It uses a Sinatra proxy server and VCR, to avoid the need for repeated requests to the Cybersource SOP test server.}
13
+ spec.homepage = 'https://github.com/promptworks/cybersourcery_testing'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'rack-translating_proxy', '~> 0.1.1'
22
+ spec.add_dependency 'sinatra', '~> 1.4'
23
+ spec.add_dependency 'nokogiri', '~> 1.6'
24
+ spec.add_dependency 'webmock', '~> 1.19'
25
+ spec.add_dependency 'vcr', '~> 2.9'
26
+ spec.add_dependency 'rakeup', '~> 1.2'
27
+ spec.add_dependency 'dotenv', '~> 0.11'
28
+ spec.add_development_dependency 'bundler', '~> 1.6'
29
+ spec.add_development_dependency 'rake', '~> 10.3'
30
+ end
@@ -0,0 +1,5 @@
1
+ require "cybersourcery_testing/version"
2
+
3
+ module CybersourceryTesting
4
+ require 'cybersourcery_testing/railtie' if defined?(Rails)
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'sinatra'
2
+ require 'base64'
3
+ require 'json'
4
+ require 'vcr'
5
+ require 'nokogiri'
6
+ require 'webmock'
7
+ require 'cybersourcery'
8
+ require 'cybersourcery_testing/vcr'
9
+ require 'cybersourcery_testing/translating_proxy'
10
+
11
+ use CybersourceryTesting::TranslatingProxy
12
+
13
+ CybersourceryTesting::Vcr.configure
14
+
15
+ get('/') do
16
+ [200, {'Content-Type' => 'text/html'}, ["It's not a trick it's an illusion"]]
17
+ end
@@ -0,0 +1,7 @@
1
+ module CybersourceryTesting
2
+ class Railtie < Rails::Railtie
3
+ rake_tasks do
4
+ Dir[File.join(File.dirname(__FILE__),'/tasks/*.rake')].each { |f| load f }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ namespace :cybersourcery do
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'rakeup'
5
+
6
+ desc 'Start the Cybersource SOP proxy server'
7
+ task :proxy do
8
+ if ENV['CYBERSOURCERY_SOP_PROXY_RB_PATH'].present?
9
+ proxy_path = ENV['CYBERSOURCERY_SOP_PROXY_RB_PATH']
10
+ else
11
+ proxy_path = "#{File.expand_path File.dirname(__FILE__)}/../cybersource_proxy.rb"
12
+ end
13
+
14
+ RakeUp::ServerTask.new('cybersource_proxy') do |t|
15
+ proxy_uri = URI ENV['CYBERSOURCERY_SOP_PROXY_URL']
16
+ t.run_command = "#{ENV['CYBERSOURCERY_SOP_PROXY_RUNNER']} #{proxy_path} -p #{proxy_uri.port}"
17
+ end
18
+
19
+ Rake::Task['cybersource_proxy'].invoke
20
+ end
21
+ end
@@ -0,0 +1,97 @@
1
+ require 'rack/translating_proxy'
2
+
3
+ module CybersourceryTesting
4
+ class TranslatingProxy < Rack::TranslatingProxy
5
+ alias :super_call :call
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ if proxy?(env)
13
+ request = Rack::Request.new(env)
14
+ set_referrer(request)
15
+ check_for_cryptic_cybersource_errors(request)
16
+ maybe_use_vcr(env)
17
+ else
18
+ @app.call(env)
19
+ end
20
+ end
21
+
22
+ def proxy?(env)
23
+ # The browser keeps requesting favicon.ico, which throws errors when the request is forwarded
24
+ # to the Cybersource server. So ony forward POST requests.
25
+ env['REQUEST_METHOD'] == 'POST'
26
+ end
27
+
28
+ def set_referrer(request)
29
+ # We are making @referrer an instance variable for convenience. We need it since the port of
30
+ # the test server can change with every test run. Conceptually, http_referrer should be part
31
+ # of env, but env is not an instance variable. We would have to rewrite multiple method
32
+ # signatures and a bunch of calls in the parent translating_proxy.rb if we put the referrer in
33
+ # env (we need it in request_mapping(), which is at the end of a chain of calls).
34
+ @referrer = request.referrer ? URI(request.referrer) : nil
35
+ end
36
+
37
+ def check_for_cryptic_cybersource_errors(request)
38
+ request.params.each do |k,v|
39
+ if v.class != String
40
+ raise "You are attempting to pass a value that is not a String to Cybersource. This will cause Cybersource to throw a generic server error. You passed: #{k}: #{v.to_s}"
41
+ end
42
+
43
+ if k == 'signed_field_names' && v.length >= 700
44
+ raise "You are attempting to pass a signed_fields value to Cybersource that is 700 characters or greater. This will cause Cybersource to throw a generic server error. You passed: #{k}: #{v}"
45
+ end
46
+ end
47
+ end
48
+
49
+ def maybe_use_vcr(env)
50
+ if ENV['CYBERSOURCERY_USE_VCR_IN_TESTS']
51
+ VCR.use_cassette(
52
+ 'cybersourcery',
53
+ record: :new_episodes,
54
+ match_requests_on: CybersourceryTesting::Vcr.match_requests_on
55
+ ) do
56
+ super_call(env)
57
+ end
58
+ else
59
+ super_call(env)
60
+ end
61
+ end
62
+
63
+ def target_host
64
+ ENV['CYBERSOURCERY_SOP_TEST_URL']
65
+ end
66
+
67
+ def request_mapping
68
+ mappings = {
69
+ # our proxy the actual Cybersource test server
70
+ #ENV['CYBERSOURCERY_SOP_PROXY_URL'] => ENV['CYBERSOURCERY_SOP_TEST_URL'],
71
+ }
72
+
73
+ if @referrer
74
+ local_response_url = "#{@referrer.scheme}://#{@referrer.host}:#{@referrer.port}#{ENV['CYBERSOURCERY_LOCAL_RESPONSE_PAGE_PATH']}"
75
+
76
+ # local resp page page where Cybersource redirects
77
+ mappings[local_response_url] = ENV['CYBERSOURCERY_RESPONSE_PAGE_URL']
78
+ end
79
+
80
+ mappings
81
+ end
82
+
83
+ # override parent
84
+ def rewrite_response_body(body)
85
+ # to_s on an array gives a version that has brackets, escape characters, etc. I don't know why
86
+ # it worked outside the middleware context (as I didn't have this problem with it before).
87
+ #str = rewrite_string(body.to_s, _response_mapping)
88
+ str = rewrite_string(body.first, _response_mapping)
89
+ rewrite_string(str, _response_mapping, URI.method(:encode_www_form_component))
90
+ end
91
+
92
+ # override parent - we need this refreshed with each request, since the test server port changes
93
+ def _response_mapping
94
+ request_mapping.invert
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,32 @@
1
+ module CybersourceryTesting
2
+ class Vcr
3
+ def self.configure
4
+ VCR.configure do |c|
5
+ c.cassette_library_dir = ENV['CYBERSOURCERY_VCR_CASSETTE_DIR']
6
+ c.hook_into :webmock
7
+ c.allow_http_connections_when_no_cassette = true
8
+ c.register_request_matcher :card_number_equality do |request_1, request_2|
9
+ pattern = /\&card_number=(\d+)\&/i
10
+ self.did_it_change?(pattern, request_1.body, request_2.body)
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.did_it_change?(pattern, body1, body2)
16
+ if body1 =~ pattern && body2 =~ pattern
17
+ one = pattern.match(body1).captures[0]
18
+ two = pattern.match(body2).captures[0]
19
+ one == two
20
+ else
21
+ body1 !~ pattern && body2 !~ pattern
22
+ end
23
+ end
24
+
25
+ def self.match_requests_on
26
+ exclude = %i(body headers host path query body_as_json)
27
+ # @registry is private, but we really need it: all your encapsulation are belong to us
28
+ all = VCR.request_matchers.instance_variable_get(:@registry).keys
29
+ all - exclude # :method, :uri, and any custom matchers
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module CybersourceryTesting
2
+ VERSION = '0.0.2'
3
+ end
@@ -0,0 +1,15 @@
1
+ module CybersourceryTesting
2
+ module Generators
3
+ class DotenvGenerator < Rails::Generators::Base
4
+ desc 'Creates a sample .env file for the Cybersourcery Testing gem'
5
+
6
+ def self.source_root
7
+ @source_root ||= File.expand_path('../templates', __FILE__)
8
+ end
9
+
10
+ def create_dotenv_file
11
+ template 'dotenv', File.join('.env.cybersourcery_testing_sample')
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ CYBERSOURCERY_SOP_TEST_URL = 'https://testsecureacceptance.cybersource.com'
2
+ CYBERSOURCERY_SOP_PROXY_URL = 'http://localhost:5556'
3
+ CYBERSOURCERY_SOP_PROXY_RUNNER = ruby
4
+ CYBERSOURCERY_RESPONSE_PAGE_URL = 'http://your_cybersource_response_page.com/confirm'
5
+ CYBERSOURCERY_LOCAL_RESPONSE_PAGE_PATH = '/confirm'
6
+ CYBERSOURCERY_USE_VCR_IN_TESTS = true
7
+ CYBERSOURCERY_VCR_CASSETTE_DIR = 'spec/cassettes'
metadata ADDED
@@ -0,0 +1,189 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cybersourcery_testing
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Michael Toppa
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack-translating_proxy
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: sinatra
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.19'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.19'
69
+ - !ruby/object:Gem::Dependency
70
+ name: vcr
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '2.9'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '2.9'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rakeup
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.2'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: dotenv
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '0.11'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '0.11'
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '1.6'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: '1.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: '10.3'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: '10.3'
139
+ description: The Cybersourcery Testing gem is designed for use with Rails projects,
140
+ and supports feature/integration testing of the Cybersource Silent Order POST (SOP)
141
+ service. It can be used with the Cybersourcery gem or as a stand-alone testing service.
142
+ It uses a Sinatra proxy server and VCR, to avoid the need for repeated requests
143
+ to the Cybersource SOP test server.
144
+ email:
145
+ - public@toppa.com
146
+ executables: []
147
+ extensions: []
148
+ extra_rdoc_files: []
149
+ files:
150
+ - .gitignore
151
+ - Gemfile
152
+ - LICENSE
153
+ - README.md
154
+ - Rakefile
155
+ - cybersourcery_testing.gemspec
156
+ - lib/cybersourcery_testing.rb
157
+ - lib/cybersourcery_testing/cybersource_proxy.rb
158
+ - lib/cybersourcery_testing/railtie.rb
159
+ - lib/cybersourcery_testing/tasks/cybersourcery_testing.rake
160
+ - lib/cybersourcery_testing/translating_proxy.rb
161
+ - lib/cybersourcery_testing/vcr.rb
162
+ - lib/cybersourcery_testing/version.rb
163
+ - lib/rails/generators/cybersourcery_testing/dotenv_generator.rb
164
+ - lib/rails/generators/cybersourcery_testing/templates/dotenv
165
+ homepage: https://github.com/promptworks/cybersourcery_testing
166
+ licenses:
167
+ - MIT
168
+ metadata: {}
169
+ post_install_message:
170
+ rdoc_options: []
171
+ require_paths:
172
+ - lib
173
+ required_ruby_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - '>='
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ required_rubygems_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - '>='
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ requirements: []
184
+ rubyforge_project:
185
+ rubygems_version: 2.4.1
186
+ signing_key:
187
+ specification_version: 4
188
+ summary: For developing feature tests with Cybersourcery
189
+ test_files: []