cybersourcery_testing 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +94 -0
- data/Rakefile +2 -0
- data/cybersourcery_testing.gemspec +30 -0
- data/lib/cybersourcery_testing.rb +5 -0
- data/lib/cybersourcery_testing/cybersource_proxy.rb +17 -0
- data/lib/cybersourcery_testing/railtie.rb +7 -0
- data/lib/cybersourcery_testing/tasks/cybersourcery_testing.rake +21 -0
- data/lib/cybersourcery_testing/translating_proxy.rb +97 -0
- data/lib/cybersourcery_testing/vcr.rb +32 -0
- data/lib/cybersourcery_testing/version.rb +3 -0
- data/lib/rails/generators/cybersourcery_testing/dotenv_generator.rb +15 -0
- data/lib/rails/generators/cybersourcery_testing/templates/dotenv +7 -0
- metadata +189 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
@@ -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
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.
|
data/README.md
ADDED
@@ -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
|
data/Rakefile
ADDED
@@ -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,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,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,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: []
|