adyen-admin 0.0.2 → 0.0.3
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.
- data/CHANGES.md +10 -4
- data/README.md +1 -1
- data/VERSION +1 -1
- data/lib/adyen-admin.rb +3 -0
- data/lib/adyen-admin/client.rb +11 -0
- data/lib/adyen-admin/skin.rb +57 -32
- data/spec/adyen-admin/client_spec.rb +12 -0
- data/spec/adyen-admin/skin_spec.rb +137 -112
- data/spec/fixtures/cassettes/Adyen_Admin_Client/_get/raises_authenticated_error_when_not_logged_in.yml +271 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Client/_login/passes_with_correct_username_password.yml +35 -35
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all/freezes_local_skins.yml +292 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/{_all → authenticated/_all}/returns_the_skins.yml +27 -4
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all_remote/returns_the_skins.yml +292 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/{_download → authenticated/_download}/gets_the_file.yml +7 -7
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_find/returns_no_skin.yml +292 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_find/returns_the_skin.yml +292 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/{_test_url → authenticated/_test_url}/returns_url_to_test.yml +17 -17
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/{_upload → authenticated/_upload}/valid_set/increases_version.yml +119 -96
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/{_version → authenticated/_version}/returns_live_value.yml +4 -4
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/{_version → authenticated/_version}/returns_test_value.yml +5 -5
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/{_version → authenticated/_version}/returns_uploaded_value.yml +8 -8
- data/spec/fixtures/cassettes/login.yml +38 -45
- data/spec/spec_helper.rb +1 -0
- metadata +40 -30
data/CHANGES.md
CHANGED
@@ -2,12 +2,18 @@
|
|
2
2
|
|
3
3
|
## vx.x.x - ???
|
4
4
|
* update Docu
|
5
|
-
* metafile
|
6
|
-
* parent
|
7
|
-
*
|
5
|
+
* parse metafile
|
6
|
+
* parent (instead of base)
|
7
|
+
* add CLI binaries (to compile + upload) -> read from .adyenrc file
|
8
8
|
* make compatible with Live system
|
9
9
|
|
10
|
-
## v0.0.2
|
10
|
+
## v0.0.2
|
11
|
+
* force update remote
|
12
|
+
* .all unions remote + local (no more duplicates)
|
13
|
+
* freeze locals to indicate missing remote endpoint
|
14
|
+
* raise exception when page could not be loaded
|
15
|
+
|
16
|
+
## v0.0.2
|
11
17
|
* cleanup
|
12
18
|
* dep. fix
|
13
19
|
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/lib/adyen-admin.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Copyright (c) 2012, SoundCloud Ltd., Tobias Bielohlawek
|
2
|
+
|
2
3
|
require 'adyen-admin/client'
|
3
4
|
require 'adyen-admin/skin'
|
4
5
|
|
@@ -6,6 +7,8 @@ module Adyen
|
|
6
7
|
module Admin
|
7
8
|
extend Adyen::Admin::Client
|
8
9
|
|
10
|
+
class AuthenticationError < StandardError; end
|
11
|
+
|
9
12
|
def skin_dir
|
10
13
|
"."
|
11
14
|
end
|
data/lib/adyen-admin/client.rb
CHANGED
@@ -7,6 +7,7 @@ module Adyen
|
|
7
7
|
DASHBOARD = "https://ca-test.adyen.com/ca/ca/overview/default.shtml"
|
8
8
|
|
9
9
|
def login(accountname, username, password)
|
10
|
+
@authenticated = false
|
10
11
|
page = Adyen::Admin.client.get(LOGIN)
|
11
12
|
page = Adyen::Admin.client.submit(page.form.tap do |form|
|
12
13
|
form.j_account = accountname
|
@@ -14,12 +15,22 @@ module Adyen
|
|
14
15
|
form.j_password = password
|
15
16
|
end)
|
16
17
|
raise "Wrong username + password combination" if page.uri.to_s != DASHBOARD
|
18
|
+
@authenticated = true
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(url)
|
22
|
+
client.get(url).tap do |page|
|
23
|
+
raise AuthenticationError unless page.uri.to_s.include?(url)
|
24
|
+
end
|
17
25
|
end
|
18
26
|
|
19
27
|
def client
|
20
28
|
@agent ||= Mechanize.new
|
21
29
|
end
|
22
30
|
|
31
|
+
def authenticated?
|
32
|
+
@authenticated
|
33
|
+
end
|
23
34
|
end
|
24
35
|
end
|
25
36
|
end
|
data/lib/adyen-admin/skin.rb
CHANGED
@@ -13,27 +13,35 @@ module Adyen
|
|
13
13
|
PUBLISH = "https://ca-test.adyen.com/ca/ca/skin/publishskin.shtml?skinCode=%s"
|
14
14
|
SKINS = "https://ca-test.adyen.com/ca/ca/skin/skins.shtml"
|
15
15
|
|
16
|
-
|
16
|
+
attr_reader :code, :name, :path
|
17
17
|
|
18
18
|
def initialize(attributes = {})
|
19
19
|
attributes.each do |key, value|
|
20
20
|
send("#{key}=", value)
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
path = skin_path([code,name].join("-"))
|
25
|
-
end
|
23
|
+
path ||= File.join(Adyen::Admin.skin_dir, [code,name].compact.join("-"))
|
26
24
|
|
27
25
|
raise ArgumentError unless code
|
28
26
|
end
|
29
27
|
|
28
|
+
# union remote and local skins. Local skins are frozen to
|
29
|
+
# indicate no availble remote counter part which avoid update
|
30
30
|
def self.all(path = nil)
|
31
|
-
|
31
|
+
{}.tap do |hash|
|
32
|
+
self.all_remote.each do |skin|
|
33
|
+
hash[skin.code] = skin unless hash[skin.code]
|
34
|
+
end
|
35
|
+
self.all_local(path).each do |skin|
|
36
|
+
hash[skin.code] = skin.freeze unless hash[skin.code]
|
37
|
+
end
|
38
|
+
end.values
|
32
39
|
end
|
33
40
|
|
41
|
+
# fetch all remote skins
|
34
42
|
def self.all_remote
|
35
43
|
@@skins_remote ||= begin
|
36
|
-
page = Adyen::Admin.
|
44
|
+
page = Adyen::Admin.get(SKINS)
|
37
45
|
page.search(".data tbody tr").map do |node|
|
38
46
|
Skin.new({
|
39
47
|
:code => node.search("a")[0].content.strip,
|
@@ -43,45 +51,54 @@ module Adyen
|
|
43
51
|
end
|
44
52
|
end
|
45
53
|
|
54
|
+
# fetch all local skins
|
46
55
|
def self.all_local(path)
|
47
56
|
Dir[File.join(path.to_s, "*")].map do |path|
|
48
57
|
Skin.new(:path => path) rescue nil
|
49
58
|
end.compact
|
50
59
|
end
|
51
60
|
|
61
|
+
# find a skin within remote + local ones
|
52
62
|
def self.find(skin_code)
|
53
|
-
all.select do |skin|
|
63
|
+
self.all.select do |skin|
|
54
64
|
skin.code == skin_code
|
55
65
|
end.first
|
56
66
|
end
|
57
67
|
|
68
|
+
def self.purge_cache
|
69
|
+
@@skins_remote = nil
|
70
|
+
end
|
71
|
+
|
58
72
|
##################################
|
73
|
+
|
59
74
|
def path=(path)
|
60
75
|
if Skin.is_skin_path?(path)
|
61
|
-
|
62
|
-
self.code ||=
|
63
|
-
self.name ||=
|
64
|
-
raise ArgumentError if code && self.code !=
|
76
|
+
new_code, new_name = File.basename(path).split("-").reverse
|
77
|
+
self.code ||= new_code
|
78
|
+
self.name ||= new_name
|
79
|
+
raise ArgumentError if self.code && self.code != new_code
|
65
80
|
@path = path
|
66
81
|
end
|
67
82
|
end
|
68
83
|
|
84
|
+
##################################
|
85
|
+
|
69
86
|
def version(scope = :local)
|
70
87
|
case scope
|
71
88
|
when :test
|
72
|
-
page = Adyen::Admin.
|
89
|
+
page = Adyen::Admin.get(VERSION_TEST % code)
|
73
90
|
page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
|
74
91
|
when :live
|
75
|
-
page = Adyen::Admin.
|
92
|
+
page = Adyen::Admin.get(VERSION_LIVE % code)
|
76
93
|
page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
|
77
94
|
else
|
78
|
-
page = Adyen::Admin.
|
95
|
+
page = Adyen::Admin.get(TEST % code)
|
79
96
|
page.search(".data tr td")[2].content.to_i
|
80
97
|
end
|
81
98
|
end
|
82
99
|
|
83
100
|
def test_url(options = {})
|
84
|
-
page = Adyen::Admin.
|
101
|
+
page = Adyen::Admin.get(TEST % code)
|
85
102
|
page = Adyen::Admin.client.submit(page.form.tap do |form|
|
86
103
|
#:amount => 199, :currency => :shopper_locale, :country_code, :merchant_reference, :merchant_account, :system, :skip, :one_page
|
87
104
|
end)
|
@@ -120,25 +137,28 @@ module Adyen
|
|
120
137
|
zipfile.add(file.sub(path, code), file)
|
121
138
|
end
|
122
139
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
end
|
140
|
+
dir = File.join(File.dirname(path), parent_skin_code)
|
141
|
+
Dir["#{dir}/**/**"].each do |file|
|
142
|
+
begin
|
143
|
+
next if file.include?(".yml")
|
144
|
+
next if file.include?(".erb")
|
145
|
+
zipfile.add(file.sub(dir, code), file)
|
146
|
+
rescue Zip::ZipEntryExistsError
|
147
|
+
# NOOP
|
132
148
|
end
|
133
149
|
end
|
134
150
|
end
|
135
151
|
end
|
136
152
|
end
|
137
153
|
|
154
|
+
def parent_skin_code
|
155
|
+
"base"
|
156
|
+
end
|
157
|
+
|
138
158
|
# http://stackoverflow.com/questions/3420587/ruby-mechanize-multipart-form-with-file-upload-to-a-mediawiki
|
139
159
|
def upload
|
140
160
|
file = self.compile
|
141
|
-
page = Adyen::Admin.
|
161
|
+
page = Adyen::Admin.get(UPLOAD % code)
|
142
162
|
page = Adyen::Admin.client.submit(page.form.tap do |form|
|
143
163
|
form.file_uploads.first.file_name = file
|
144
164
|
end)
|
@@ -149,25 +169,30 @@ module Adyen
|
|
149
169
|
def publish
|
150
170
|
raise ArgumentError unless code
|
151
171
|
|
152
|
-
page = Adyen::Admin.
|
172
|
+
page = Adyen::Admin.get(PUBLISH % code)
|
153
173
|
page = Adyen::Admin.client.submit(page.form.tap do |form|
|
154
174
|
end)
|
155
175
|
end
|
156
176
|
|
157
177
|
#################################
|
158
178
|
|
159
|
-
def
|
160
|
-
|
161
|
-
File.join(skin_dir, skin_code).tap do |path|
|
162
|
-
return nil unless File.directory?(path)
|
163
|
-
end
|
179
|
+
def to_s
|
180
|
+
self.code
|
164
181
|
end
|
165
182
|
|
166
183
|
def ==(skin)
|
167
184
|
self.code == skin.code
|
168
185
|
end
|
169
186
|
|
170
|
-
|
187
|
+
protected
|
188
|
+
def code=(c)
|
189
|
+
@code = c
|
190
|
+
end
|
191
|
+
|
192
|
+
def name=(n)
|
193
|
+
@name = n
|
194
|
+
end
|
195
|
+
|
171
196
|
def self.is_skin_path?(path)
|
172
197
|
%w(skin.html.erb inc css js).each do |sub_path|
|
173
198
|
return true if File.exists?(File.join(path, sub_path))
|
@@ -5,6 +5,10 @@ require "adyen-admin/client"
|
|
5
5
|
describe Adyen::Admin::Client, :vcr do
|
6
6
|
let(:login) { Adyen::Admin.login("SoundCloud", "skinadmin", "12312311") }
|
7
7
|
|
8
|
+
before do
|
9
|
+
Adyen::Admin.client.cookie_jar.clear!
|
10
|
+
end
|
11
|
+
|
8
12
|
describe "#login" do
|
9
13
|
it 'passes with correct username + password' do
|
10
14
|
expect do
|
@@ -18,4 +22,12 @@ describe Adyen::Admin::Client, :vcr do
|
|
18
22
|
end
|
19
23
|
end
|
20
24
|
end
|
25
|
+
|
26
|
+
describe "#get" do
|
27
|
+
it 'raises authenticated error when not logged in' do
|
28
|
+
expect do
|
29
|
+
Adyen::Admin.get(Adyen::Admin::Skin::SKINS)
|
30
|
+
end.to raise_error Adyen::Admin::AuthenticationError
|
31
|
+
end
|
32
|
+
end
|
21
33
|
end
|
@@ -9,166 +9,191 @@ module Adyen::Admin
|
|
9
9
|
let(:skin_code) { "7hFAQnmt" }
|
10
10
|
let(:skin) { Skin.new(:code => skin_code, :name => "example") }
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
context "authenticated" do
|
13
|
+
before(:all) do
|
14
|
+
VCR.use_cassette("login") do
|
15
|
+
Adyen::Admin.client.cookie_jar.clear!
|
16
|
+
Adyen::Admin.login("SoundCloud", "skinadmin", "12312311")
|
17
|
+
end
|
15
18
|
end
|
16
|
-
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
Skin.all.should == [
|
21
|
-
skin,
|
22
|
-
Skin.new(:code => "Kx9axnRf", :name => "demo")
|
23
|
-
]
|
20
|
+
before do
|
21
|
+
Adyen::Admin::Skin.purge_cache
|
24
22
|
end
|
25
|
-
end
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
24
|
+
describe ".all_remote" do
|
25
|
+
it 'returns the skins' do
|
26
|
+
Skin.all.should == [
|
27
|
+
skin,
|
28
|
+
Skin.new(:code => "Kx9axnRf", :name => "demo"),
|
29
|
+
Skin.new(:code => "vQW0fEo8", :name => "test"),
|
30
|
+
]
|
31
|
+
end
|
35
32
|
end
|
36
|
-
end
|
37
33
|
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
describe ".all_local" do
|
35
|
+
it 'returns the skins' do
|
36
|
+
Skin.all_local(skin_fixtures).should == [
|
37
|
+
Skin.new(:code => "base"),
|
38
|
+
Skin.new(:code => "DV3tf95f"),
|
39
|
+
skin,
|
40
|
+
Skin.new(:code => "JH0815"),
|
41
|
+
]
|
42
|
+
end
|
41
43
|
end
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
+
describe ".all" do
|
46
|
+
it 'returns the skins' do
|
47
|
+
Skin.all(skin_fixtures).should == [
|
48
|
+
skin,
|
49
|
+
Skin.new(:code => "Kx9axnRf", :name => "demo"),
|
50
|
+
Skin.new(:code => "vQW0fEo8", :name => "test"),
|
51
|
+
Skin.new(:code => "base"),
|
52
|
+
Skin.new(:code => "DV3tf95f"),
|
53
|
+
Skin.new(:code => "JH0815")
|
54
|
+
]
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'freezes local skins' do
|
58
|
+
Skin.all(skin_fixtures).last.should be_frozen
|
59
|
+
end
|
45
60
|
end
|
46
|
-
end
|
47
61
|
|
48
|
-
describe "#new" do
|
49
|
-
let(:path) { "#{skin_fixtures}/example-7hFAQnmt" }
|
50
62
|
|
51
|
-
|
52
|
-
|
53
|
-
|
63
|
+
describe ".find" do
|
64
|
+
it 'returns the skin' do
|
65
|
+
Skin.find(skin_code).should == skin
|
66
|
+
end
|
54
67
|
|
55
|
-
|
56
|
-
|
68
|
+
it 'returns no skin' do
|
69
|
+
Skin.find("dummy code").should == nil
|
70
|
+
end
|
57
71
|
end
|
58
72
|
|
59
|
-
|
60
|
-
|
61
|
-
end
|
73
|
+
describe "#new" do
|
74
|
+
let(:path) { "#{skin_fixtures}/example-7hFAQnmt" }
|
62
75
|
|
63
|
-
|
64
|
-
|
65
|
-
|
76
|
+
it "sets code attribute" do
|
77
|
+
Skin.new(:code => skin_code).code.should == skin_code
|
78
|
+
end
|
66
79
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end.to raise_error
|
71
|
-
end
|
80
|
+
it "sets name attribute" do
|
81
|
+
Skin.new(:code => skin_code, :name => "name").name.should == "name"
|
82
|
+
end
|
72
83
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end.to raise_error
|
77
|
-
end
|
78
|
-
end
|
84
|
+
it "sets path attribute" do
|
85
|
+
Skin.new(:path => path).path.should == path
|
86
|
+
end
|
79
87
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
`rm -rf #{zip_filename}`
|
84
|
-
end
|
88
|
+
it "auto sets code from path" do
|
89
|
+
Skin.new(:path => path).code.should == "7hFAQnmt"
|
90
|
+
end
|
85
91
|
|
86
|
-
|
87
|
-
|
88
|
-
|
92
|
+
it "raises error on wrong code for path" do
|
93
|
+
expect do
|
94
|
+
Skin.new(:code => "different", :path => path).path.should == path
|
95
|
+
end.to raise_error
|
96
|
+
end
|
97
|
+
|
98
|
+
it "raises error on empty code" do
|
99
|
+
expect do
|
100
|
+
Skin.new
|
101
|
+
end.to raise_error
|
102
|
+
end
|
89
103
|
end
|
90
|
-
end
|
91
104
|
|
92
|
-
|
93
|
-
|
94
|
-
|
105
|
+
describe "#download" do
|
106
|
+
let(:zip_filename) { "#{skin.code}.zip"}
|
107
|
+
after do
|
108
|
+
`rm -rf #{zip_filename}`
|
109
|
+
end
|
95
110
|
|
96
|
-
|
97
|
-
|
98
|
-
|
111
|
+
it "gets the file" do
|
112
|
+
skin.download
|
113
|
+
File.should be_exists(zip_filename)
|
99
114
|
end
|
100
|
-
false
|
101
115
|
end
|
102
116
|
|
103
|
-
|
104
|
-
|
105
|
-
|
117
|
+
describe "#compile" do
|
118
|
+
let(:skin_code) { "DV3tf95f" }
|
119
|
+
let(:skin) { Skin.new(:path => "#{skin_fixtures}/#{skin_code}") }
|
120
|
+
|
121
|
+
def zip_contains(zip_filename, file)
|
122
|
+
Zip::ZipFile.open(zip_filename, 'r') do |zipfile|
|
123
|
+
return true if zipfile.find_entry(File.join(skin_code, file))
|
124
|
+
end
|
125
|
+
false
|
106
126
|
end
|
107
127
|
|
108
|
-
|
109
|
-
|
128
|
+
context "without base" do
|
129
|
+
before do
|
130
|
+
`mv #{skin_fixtures}/base #{skin_fixtures}/base2`
|
131
|
+
end
|
132
|
+
|
133
|
+
after do
|
134
|
+
`mv #{skin_fixtures}/base2 #{skin_fixtures}/base`
|
135
|
+
end
|
136
|
+
|
137
|
+
it "includes screen file" do
|
138
|
+
zip_contains(skin.compile, "css/screen.css").should be_true
|
139
|
+
end
|
140
|
+
|
141
|
+
it "excludes print files" do
|
142
|
+
zip_contains(skin.compile, "css/print.css").should_not be_true
|
143
|
+
end
|
110
144
|
end
|
111
145
|
|
112
146
|
it "includes screen file" do
|
113
147
|
zip_contains(skin.compile, "css/screen.css").should be_true
|
114
148
|
end
|
115
149
|
|
116
|
-
it "
|
117
|
-
zip_contains(skin.compile, "css/print.css").
|
150
|
+
it "includes print file" do
|
151
|
+
zip_contains(skin.compile, "css/print.css").should be_true
|
118
152
|
end
|
119
|
-
end
|
120
|
-
|
121
|
-
it "includes screen file" do
|
122
|
-
zip_contains(skin.compile, "css/screen.css").should be_true
|
123
|
-
end
|
124
153
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
it "excludes meta file" do
|
130
|
-
zip_contains(skin.compile, "metadata.yml").should_not be_true
|
131
|
-
end
|
154
|
+
it "excludes meta file" do
|
155
|
+
zip_contains(skin.compile, "metadata.yml").should_not be_true
|
156
|
+
end
|
132
157
|
|
133
|
-
|
134
|
-
|
158
|
+
it "excludes skin file" do
|
159
|
+
zip_contains(skin.compile, "skin.html.erb").should_not be_true
|
160
|
+
end
|
135
161
|
end
|
136
|
-
end
|
137
162
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
163
|
+
describe "#upload" do
|
164
|
+
context "valid set" do
|
165
|
+
it "increases version" do
|
166
|
+
skin.path = "#{skin_fixtures}/example-7hFAQnmt"
|
142
167
|
|
143
|
-
|
144
|
-
|
145
|
-
|
168
|
+
expect do
|
169
|
+
skin.upload
|
170
|
+
end.to change { skin.version }.by(1)
|
171
|
+
end
|
146
172
|
end
|
147
173
|
end
|
148
|
-
end
|
149
174
|
|
150
|
-
|
151
|
-
|
175
|
+
describe "#version" do
|
176
|
+
let(:skin) { Skin.new(:code => "Kx9axnRf", :name => "demo") }
|
152
177
|
|
153
|
-
|
154
|
-
|
155
|
-
|
178
|
+
it "returns uploaded value" do
|
179
|
+
skin.version.should == 14
|
180
|
+
end
|
156
181
|
|
157
|
-
|
158
|
-
|
159
|
-
|
182
|
+
it "returns test value" do
|
183
|
+
skin.version(:test).should == 14
|
184
|
+
end
|
160
185
|
|
161
|
-
|
162
|
-
|
186
|
+
it "returns live value" do
|
187
|
+
skin.version(:live).should == 0
|
188
|
+
end
|
163
189
|
end
|
164
|
-
end
|
165
190
|
|
166
|
-
|
167
|
-
|
168
|
-
|
191
|
+
describe "#test_url" do
|
192
|
+
it "returns url to test" do
|
193
|
+
skin.test_url.to_s.should include("https://test.adyen.com/hpp/select.shtml")
|
194
|
+
end
|
195
|
+
#todo test with options
|
169
196
|
end
|
170
|
-
#todo test with options
|
171
197
|
end
|
172
|
-
|
173
198
|
end
|
174
199
|
end
|