adyen-admin 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/.travis.yml +3 -0
- data/CHANGES.md +16 -0
- data/Gemfile +4 -0
- data/LICENSE +26 -0
- data/README.md +57 -0
- data/Rakefile +24 -0
- data/VERSION +1 -0
- data/adyen-admin.gemspec +25 -0
- data/lib/adyen-admin/client.rb +26 -0
- data/lib/adyen-admin/skin.rb +180 -0
- data/lib/adyen-admin.rb +16 -0
- data/spec/adyen-admin/client_spec.rb +21 -0
- data/spec/adyen-admin/skin_spec.rb +177 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Client/_login/passes_with_correct_username_password.yml +661 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/_all/returns_the_skins.yml +269 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/_download/gets_the_file.yml +275 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/_test_url/returns_url_to_test.yml +941 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/_upload/valid_set/increases_version.yml +7769 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/_version/returns_live_value.yml +77 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/_version/returns_test_value.yml +77 -0
- data/spec/fixtures/cassettes/Adyen_Admin_Skin/_version/returns_uploaded_value.yml +666 -0
- data/spec/fixtures/cassettes/login.yml +668 -0
- data/spec/fixtures/skins/DV3tf95f/css/screen.css +262 -0
- data/spec/fixtures/skins/DV3tf95f/inc/order_data.txt +1 -0
- data/spec/fixtures/skins/JH0815/css/screen.css +262 -0
- data/spec/fixtures/skins/JH0815/skin.html.erb +13 -0
- data/spec/fixtures/skins/base/css/print.css +7 -0
- data/spec/fixtures/skins/base/css/screen_ie6.css +1 -0
- data/spec/fixtures/skins/base/img/Airliner.airjamaica.a340.arp.750pix.jpg +0 -0
- data/spec/fixtures/skins/base/img/Eurofighter.jpg +0 -0
- data/spec/fixtures/skins/base/img/bg_gr.jpg +0 -0
- data/spec/fixtures/skins/base/img/blog_gr.jpg +0 -0
- data/spec/fixtures/skins/base/img/category.gif +0 -0
- data/spec/fixtures/skins/base/img/mig.jpg +0 -0
- data/spec/fixtures/skins/base/img/top1.jpg +0 -0
- data/spec/fixtures/skins/base/img/top2.jpg +0 -0
- data/spec/fixtures/skins/base/img/top3.jpg +0 -0
- data/spec/fixtures/skins/base/inc/cfooter.txt +15 -0
- data/spec/fixtures/skins/base/inc/cheader.txt +11 -0
- data/spec/fixtures/skins/base/inc/pmfooter.txt +1 -0
- data/spec/fixtures/skins/base/inc/pmheader.txt +4 -0
- data/spec/fixtures/skins/base/res/resources.properties +0 -0
- data/spec/fixtures/skins/example-7hFAQnmt/css/print.css +17 -0
- data/spec/fixtures/skins/example-7hFAQnmt/css/screen.css +704 -0
- data/spec/fixtures/skins/example-7hFAQnmt/css/screen_ie6.css +7 -0
- data/spec/fixtures/skins/example-7hFAQnmt/img/banner_top.png +0 -0
- data/spec/fixtures/skins/example-7hFAQnmt/img/bg.gif +0 -0
- data/spec/fixtures/skins/example-7hFAQnmt/img/bg_buttons.png +0 -0
- data/spec/fixtures/skins/example-7hFAQnmt/img/button_template.xcf +0 -0
- data/spec/fixtures/skins/example-7hFAQnmt/img/gradient.png +0 -0
- data/spec/fixtures/skins/example-7hFAQnmt/img/logo.png +0 -0
- data/spec/fixtures/skins/example-7hFAQnmt/img/logo.xcf +0 -0
- data/spec/fixtures/skins/example-7hFAQnmt/inc/cfooter.txt +1 -0
- data/spec/fixtures/skins/example-7hFAQnmt/inc/cheader.txt +2 -0
- data/spec/fixtures/skins/example-7hFAQnmt/inc/pmfooter.txt +1 -0
- data/spec/fixtures/skins/example-7hFAQnmt/inc/pmheader.txt +2 -0
- data/spec/fixtures/skins/example-7hFAQnmt/metadata.yml +5 -0
- data/spec/spec_helper.rb +21 -0
- metadata +228 -0
data/.travis.yml
ADDED
data/CHANGES.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 2012, SoundCloud, Tobias Bielohlawek
|
2
|
+
|
3
|
+
All rights reserved.
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
- Redistributions of source code must retain the above copyright notice, this
|
9
|
+
list of conditions and the following disclaimer.
|
10
|
+
- Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
- Neither the name of the SoundCloud nor the names of its contributors may be
|
14
|
+
used to endorse or promote products derived from this software without
|
15
|
+
specific prior written permission.
|
16
|
+
|
17
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
18
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
19
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
20
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
21
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
22
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
23
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
24
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
25
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Adyen Admin [![](http://travis-ci.org/rngtng/adyen-admin.png)](http://travis-ci.org/rngtng/adyen-admin)
|
2
|
+
|
3
|
+
Adyen Admin Skin API and Command line tool
|
4
|
+
|
5
|
+
A little Gem to make your life easier when dealing with Adyen skins. It offers simple functions to maniu
|
6
|
+
|
7
|
+
## Setup
|
8
|
+
Install gem
|
9
|
+
|
10
|
+
gem install adyen-admin
|
11
|
+
|
12
|
+
Make sure you create a Adyen user with [Technical Setting rights](https://ca-test.adyen.com/ca/ca/config/users.shtml). *Std user rights have to be given as well!*
|
13
|
+
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
Simple usage case to get all Skins:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
require 'adyen/admin'
|
21
|
+
|
22
|
+
Adyen::Admin.login(<accountname>, <username>, <password>)
|
23
|
+
|
24
|
+
Adyen::Admin::Skin.all #returns all remote skins
|
25
|
+
|
26
|
+
```
|
27
|
+
|
28
|
+
### Skins
|
29
|
+
|
30
|
+
By now a Skin can be:
|
31
|
+
|
32
|
+
* downloaded
|
33
|
+
* uploaded
|
34
|
+
* compiled
|
35
|
+
* retrieve versions
|
36
|
+
* retrieve test_url
|
37
|
+
* map to local or remote
|
38
|
+
|
39
|
+
## Dependencies
|
40
|
+
|
41
|
+
Depends on [mechanize](http://mechanize.rubyforge.org/) to access the webinterface
|
42
|
+
|
43
|
+
|
44
|
+
## Contributing
|
45
|
+
|
46
|
+
We'll check out your contribution if you:
|
47
|
+
|
48
|
+
- Provide a comprehensive suite of tests for your fork.
|
49
|
+
- Have a clear and documented rationale for your changes.
|
50
|
+
- Package these up in a pull request.
|
51
|
+
|
52
|
+
We'll do our best to help you out with any contribution issues you may have.
|
53
|
+
|
54
|
+
|
55
|
+
## License
|
56
|
+
|
57
|
+
The license is included as LICENSE in this directory.
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
task :anonym, :tokens do |t, args|
|
9
|
+
replace = args[:tokens].split(" ").map do |token|
|
10
|
+
from, to = token.split(":")
|
11
|
+
"s/#{from}/#{to}/g"
|
12
|
+
end
|
13
|
+
|
14
|
+
`find -E . -regex '^.+\.(rb|yml)$' -exec sed -i "" "#{replace.join(";")}" {} \\;`
|
15
|
+
end
|
16
|
+
|
17
|
+
task :deanonym, :tokens do |t, args|
|
18
|
+
replace = args[:tokens].split(" ").map do |token|
|
19
|
+
from, to = token.split(":")
|
20
|
+
"s/#{to}/#{from}/g"
|
21
|
+
end
|
22
|
+
|
23
|
+
`find -E . -regex '^.+\.(rb|yml)$' -exec sed -i "" "#{replace.join(";")}" {} \\;`
|
24
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/adyen-admin.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "adyen-admin"
|
6
|
+
s.version = File.read("VERSION")
|
7
|
+
s.authors = ["Tobias Bielohlawek"]
|
8
|
+
s.email = ["tobi@soundcloud.com"]
|
9
|
+
s.homepage = "https://github.com/rngtng/adyen-admin"
|
10
|
+
s.summary = %q{Adyen Admin Skin API and Command line tool}
|
11
|
+
s.description = %q{A little Gem to make your life easier when dealing with Adyen skins}
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split("\n")
|
14
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
|
18
|
+
%w(mechanize rubyzip).each do |gem|
|
19
|
+
s.add_runtime_dependency *gem.split(' ')
|
20
|
+
end
|
21
|
+
|
22
|
+
%w(rake rspec vcr webmock debugger).each do |gem|
|
23
|
+
s.add_development_dependency *gem.split(' ')
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "adyen-admin/skin"
|
2
|
+
|
3
|
+
module Adyen
|
4
|
+
module Admin
|
5
|
+
module Client
|
6
|
+
LOGIN = "https://ca-test.adyen.com/ca/ca/login.shtml"
|
7
|
+
DASHBOARD = "https://ca-test.adyen.com/ca/ca/overview/default.shtml"
|
8
|
+
|
9
|
+
def login(accountname, username, password)
|
10
|
+
page = Adyen::Admin.client.get(LOGIN)
|
11
|
+
page = Adyen::Admin.client.submit(page.form.tap do |form|
|
12
|
+
form.j_account = accountname
|
13
|
+
form.j_username = username
|
14
|
+
form.j_password = password
|
15
|
+
end)
|
16
|
+
raise "Wrong username + password combination" if page.uri.to_s != DASHBOARD
|
17
|
+
end
|
18
|
+
|
19
|
+
def client
|
20
|
+
@agent ||= Mechanize.new
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'zip/zip'
|
3
|
+
|
4
|
+
module Adyen
|
5
|
+
module Admin
|
6
|
+
class Skin
|
7
|
+
UPLOAD = "https://ca-test.adyen.com/ca/ca/skin/uploadskin.shtml?skinCode=%s"
|
8
|
+
DOWNLOAD = "https://ca-test.adyen.com/ca/ca/skin/downloadskinsubmit.shtml?skinCode=%s"
|
9
|
+
TEST = "https://ca-test.adyen.com/ca/ca/skin/testpayment.shtml?skinCode=%s"
|
10
|
+
|
11
|
+
VERSION_TEST = "https://test.adyen.com/hpp/version.shtml?skinCode=%s"
|
12
|
+
VERSION_LIVE = "https://live.adyen.com/hpp/version.shtml?skinCode=%s"
|
13
|
+
PUBLISH = "https://ca-test.adyen.com/ca/ca/skin/publishskin.shtml?skinCode=%s"
|
14
|
+
SKINS = "https://ca-test.adyen.com/ca/ca/skin/skins.shtml"
|
15
|
+
|
16
|
+
attr_accessor :code, :name, :path
|
17
|
+
|
18
|
+
def initialize(attributes = {})
|
19
|
+
attributes.each do |key, value|
|
20
|
+
send("#{key}=", value)
|
21
|
+
end
|
22
|
+
|
23
|
+
if !path && code
|
24
|
+
path = skin_path([code,name].join("-"))
|
25
|
+
end
|
26
|
+
|
27
|
+
raise ArgumentError unless code
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.all(path = nil)
|
31
|
+
all_remote + all_local(path)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.all_remote
|
35
|
+
@@skins_remote ||= begin
|
36
|
+
page = Adyen::Admin.client.get(SKINS)
|
37
|
+
page.search(".data tbody tr").map do |node|
|
38
|
+
Skin.new({
|
39
|
+
:code => node.search("a")[0].content.strip,
|
40
|
+
:name => node.search("td")[1].content.strip
|
41
|
+
})
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.all_local(path)
|
47
|
+
Dir[File.join(path.to_s, "*")].map do |path|
|
48
|
+
Skin.new(:path => path) rescue nil
|
49
|
+
end.compact
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.find(skin_code)
|
53
|
+
all.select do |skin|
|
54
|
+
skin.code == skin_code
|
55
|
+
end.first
|
56
|
+
end
|
57
|
+
|
58
|
+
##################################
|
59
|
+
def path=(path)
|
60
|
+
if Skin.is_skin_path?(path)
|
61
|
+
code, name = File.basename(path).split("-").reverse
|
62
|
+
self.code ||= code
|
63
|
+
self.name ||= name
|
64
|
+
raise ArgumentError if code && self.code != code
|
65
|
+
@path = path
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def version(scope = :local)
|
70
|
+
case scope
|
71
|
+
when :test
|
72
|
+
page = Adyen::Admin.client.get(VERSION_TEST % code)
|
73
|
+
page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
|
74
|
+
when :live
|
75
|
+
page = Adyen::Admin.client.get(VERSION_LIVE % code)
|
76
|
+
page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
|
77
|
+
else
|
78
|
+
page = Adyen::Admin.client.get(TEST % code)
|
79
|
+
page.search(".data tr td")[2].content.to_i
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_url(options = {})
|
84
|
+
page = Adyen::Admin.client.get(TEST % code)
|
85
|
+
page = Adyen::Admin.client.submit(page.form.tap do |form|
|
86
|
+
#:amount => 199, :currency => :shopper_locale, :country_code, :merchant_reference, :merchant_account, :system, :skip, :one_page
|
87
|
+
end)
|
88
|
+
Addressable::URI.parse(page.form.action).tap do |uri|
|
89
|
+
uri.query_values = page.form.fields.inject({}) { |hash, node|
|
90
|
+
hash[node.name] = node.value; hash
|
91
|
+
}
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
##########################################
|
96
|
+
|
97
|
+
# http://stackoverflow.com/questions/4360043/using-wwwmechanize-to-download-a-file-to-disk-without-loading-it-all-in-memory
|
98
|
+
# Adyen::Admin.client.pluggable_parser.default = Mechanize::FileSaver
|
99
|
+
def download
|
100
|
+
"#{code}.zip".tap do |filename|
|
101
|
+
Adyen::Admin.client.download(DOWNLOAD % code, filename)
|
102
|
+
|
103
|
+
if path
|
104
|
+
# create backup of current
|
105
|
+
# compile
|
106
|
+
end
|
107
|
+
# unzip
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def compile
|
112
|
+
raise ArgumentError unless path
|
113
|
+
|
114
|
+
File.join(Dir.tmpdir, "#{code}.zip").tap do |filename|
|
115
|
+
`rm -rf #{filename}`
|
116
|
+
Zip::ZipFile.open(filename, 'w') do |zipfile|
|
117
|
+
Dir["#{path}/**/**"].each do |file|
|
118
|
+
next if file.include?(".yml")
|
119
|
+
next if file.include?(".erb")
|
120
|
+
zipfile.add(file.sub(path, code), file)
|
121
|
+
end
|
122
|
+
|
123
|
+
if dir = skin_path("base")
|
124
|
+
Dir["#{dir}/**/**"].each do |file|
|
125
|
+
begin
|
126
|
+
next if file.include?(".yml")
|
127
|
+
next if file.include?(".erb")
|
128
|
+
zipfile.add(file.sub(dir, code), file)
|
129
|
+
rescue Zip::ZipEntryExistsError
|
130
|
+
# NOOP
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# http://stackoverflow.com/questions/3420587/ruby-mechanize-multipart-form-with-file-upload-to-a-mediawiki
|
139
|
+
def upload
|
140
|
+
file = self.compile
|
141
|
+
page = Adyen::Admin.client.get(UPLOAD % code)
|
142
|
+
page = Adyen::Admin.client.submit(page.form.tap do |form|
|
143
|
+
form.file_uploads.first.file_name = file
|
144
|
+
end)
|
145
|
+
form = page.form
|
146
|
+
page = form.submit(page.form.button_with(:name => 'submit'))
|
147
|
+
end
|
148
|
+
|
149
|
+
def publish
|
150
|
+
raise ArgumentError unless code
|
151
|
+
|
152
|
+
page = Adyen::Admin.client.get(PUBLISH % code)
|
153
|
+
page = Adyen::Admin.client.submit(page.form.tap do |form|
|
154
|
+
end)
|
155
|
+
end
|
156
|
+
|
157
|
+
#################################
|
158
|
+
|
159
|
+
def skin_path(skin_code)
|
160
|
+
skin_dir = path ? File.dirname(path) : Adyen::Admin.skin_dir
|
161
|
+
File.join(skin_dir, skin_code).tap do |path|
|
162
|
+
return nil unless File.directory?(path)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def ==(skin)
|
167
|
+
self.code == skin.code
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
def self.is_skin_path?(path)
|
172
|
+
%w(skin.html.erb inc css js).each do |sub_path|
|
173
|
+
return true if File.exists?(File.join(path, sub_path))
|
174
|
+
end
|
175
|
+
false
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
data/lib/adyen-admin.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Copyright (c) 2012, SoundCloud Ltd., Tobias Bielohlawek
|
2
|
+
|
3
|
+
require 'mechanize'
|
4
|
+
require 'adyen-admin/client'
|
5
|
+
require 'debugger'
|
6
|
+
|
7
|
+
module Adyen
|
8
|
+
module Admin
|
9
|
+
extend Adyen::Admin::Client
|
10
|
+
|
11
|
+
def skin_dir
|
12
|
+
"."
|
13
|
+
end
|
14
|
+
module_function :skin_dir
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
require "adyen-admin/client"
|
4
|
+
|
5
|
+
describe Adyen::Admin::Client, :vcr do
|
6
|
+
let(:login) { Adyen::Admin.login("SoundCloud", "skinadmin", "12312311") }
|
7
|
+
|
8
|
+
describe "#login" do
|
9
|
+
it 'passes with correct username + password' do
|
10
|
+
expect do
|
11
|
+
login
|
12
|
+
end.to_not raise_error
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'fails on wrong username + password' do
|
16
|
+
expect do
|
17
|
+
Adyen::Admin.login("Tobi", "fake", "wrong")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
require "adyen-admin/client"
|
4
|
+
require "adyen-admin/skin"
|
5
|
+
|
6
|
+
module Adyen::Admin
|
7
|
+
describe Skin, :vcr do
|
8
|
+
let(:skin_fixtures) { 'spec/fixtures/skins' }
|
9
|
+
let(:skin_code) { "7hFAQnmt" }
|
10
|
+
let(:skin) { Skin.new(:code => skin_code, :name => "example") }
|
11
|
+
|
12
|
+
before(:all) do
|
13
|
+
VCR.use_cassette("login") do
|
14
|
+
Adyen::Admin.login("SoundCloud", "skinadmin", "12312311")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe ".all" do
|
19
|
+
it 'returns the skins' do
|
20
|
+
Skin.all.should == [
|
21
|
+
skin,
|
22
|
+
Skin.new(:code => "Kx9axnRf", :name => "demo")
|
23
|
+
]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".all_local" do
|
28
|
+
it 'returns the skins' do
|
29
|
+
Skin.all_local(skin_fixtures).should == [
|
30
|
+
Skin.new(:code => "base"),
|
31
|
+
Skin.new(:code => "DV3tf95f"),
|
32
|
+
skin,
|
33
|
+
Skin.new(:code => "JH0815"),
|
34
|
+
]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe ".find" do
|
39
|
+
it 'returns the skin' do
|
40
|
+
Skin.find(skin_code).should == skin
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns no skin' do
|
44
|
+
Skin.find("dummy code").should == nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#new" do
|
49
|
+
let(:path) { "#{skin_fixtures}/example-7hFAQnmt" }
|
50
|
+
|
51
|
+
it "sets code attribute" do
|
52
|
+
Skin.new(:code => skin_code).code.should == skin_code
|
53
|
+
end
|
54
|
+
|
55
|
+
it "sets name attribute" do
|
56
|
+
Skin.new(:code => skin_code, :name => "name").name.should == "name"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "sets path attribute" do
|
60
|
+
Skin.new(:path => path).path.should == path
|
61
|
+
end
|
62
|
+
|
63
|
+
it "auto sets code from path" do
|
64
|
+
Skin.new(:path => path).code.should == "7hFAQnmt"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "raises error on wrong code for path" do
|
68
|
+
expect do
|
69
|
+
Skin.new(:code => "different", :path => path).path.should == path
|
70
|
+
end.to raise_error
|
71
|
+
end
|
72
|
+
|
73
|
+
it "raises error on empty code" do
|
74
|
+
expect do
|
75
|
+
Skin.new
|
76
|
+
end.to raise_error
|
77
|
+
end
|
78
|
+
|
79
|
+
# it "auto sets directory when found" do
|
80
|
+
# Skin.new(:code => "7hFAQnmt" , :name => "example").directory.should == "example-7hFAQnmt"
|
81
|
+
# end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#download" do
|
85
|
+
after do
|
86
|
+
`rm -rf #{skin.zip_filename}`
|
87
|
+
end
|
88
|
+
|
89
|
+
it "gets the file" do
|
90
|
+
skin.download
|
91
|
+
File.should be_exists(skin.zip_filename)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#compile" do
|
96
|
+
let(:skin_code) { "DV3tf95f" }
|
97
|
+
let(:skin) { Skin.new(:path => "#{skin_fixtures}/#{skin_code}") }
|
98
|
+
|
99
|
+
def zip_contains(zip_filename, file)
|
100
|
+
Zip::ZipFile.open(zip_filename, 'r') do |zipfile|
|
101
|
+
return true if zipfile.find_entry(File.join(skin_code, file))
|
102
|
+
end
|
103
|
+
false
|
104
|
+
end
|
105
|
+
|
106
|
+
context "without base" do
|
107
|
+
before do
|
108
|
+
`mv #{skin_fixtures}/base #{skin_fixtures}/base2`
|
109
|
+
end
|
110
|
+
|
111
|
+
after do
|
112
|
+
`mv #{skin_fixtures}/base2 #{skin_fixtures}/base`
|
113
|
+
end
|
114
|
+
|
115
|
+
it "includes screen file" do
|
116
|
+
zip_contains(skin.compile, "css/screen.css").should be_true
|
117
|
+
end
|
118
|
+
|
119
|
+
it "excludes print files" do
|
120
|
+
zip_contains(skin.compile, "css/print.css").should_not be_true
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it "includes screen file" do
|
125
|
+
zip_contains(skin.compile, "css/screen.css").should be_true
|
126
|
+
end
|
127
|
+
|
128
|
+
it "includes print file" do
|
129
|
+
zip_contains(skin.compile, "css/print.css").should be_true
|
130
|
+
end
|
131
|
+
|
132
|
+
it "excludes meta file" do
|
133
|
+
zip_contains(skin.compile, "metadata.yml").should_not be_true
|
134
|
+
end
|
135
|
+
|
136
|
+
it "excludes skin file" do
|
137
|
+
zip_contains(skin.compile, "skin.html.erb").should_not be_true
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "#upload" do
|
142
|
+
context "valid set" do
|
143
|
+
it "increases version" do
|
144
|
+
skin.path = "#{skin_fixtures}/example-7hFAQnmt"
|
145
|
+
|
146
|
+
expect do
|
147
|
+
skin.upload
|
148
|
+
end.to change { skin.version }.by(1)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe "#version" do
|
154
|
+
let(:skin) { Skin.new(:code => "Kx9axnRf", :name => "demo") }
|
155
|
+
|
156
|
+
it "returns uploaded value" do
|
157
|
+
skin.version.should == 2
|
158
|
+
end
|
159
|
+
|
160
|
+
it "returns test value" do
|
161
|
+
skin.version(:test).should == 2
|
162
|
+
end
|
163
|
+
|
164
|
+
it "returns live value" do
|
165
|
+
skin.version(:live).should == 0
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe "#test_url" do
|
170
|
+
it "returns url to test" do
|
171
|
+
skin.test_url.to_s.should include("https://test.adyen.com/hpp/select.shtml")
|
172
|
+
end
|
173
|
+
#todo test with options
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|