adyen-admin 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. data/CHANGES.md +3 -1
  2. data/README.md +8 -0
  3. data/VERSION +1 -1
  4. data/lib/adyen-admin/skin.rb +78 -28
  5. data/spec/adyen-admin/skin_spec.rb +121 -30
  6. data/spec/fixtures/cassettes/Adyen_Admin_Client/_get/raises_authenticated_error_when_not_logged_in.yml +9 -9
  7. data/spec/fixtures/cassettes/Adyen_Admin_Client/_login/passes_with_correct_username_password.yml +35 -47
  8. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all/freezes_local_skins.yml +4 -4
  9. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all/returns_the_skins.yml +4 -4
  10. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all_remote/returns_the_skins.yml +4 -4
  11. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all_remote/sets_local_path.yml +4 -4
  12. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_decompile/new_remote_skin/downloads_and_decompiles_skin.yml +133 -58
  13. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_download/gets_the_file.yml +65 -65
  14. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_download/is_a_zipfile.yml +65 -65
  15. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_find/returns_no_skin.yml +4 -4
  16. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_find/returns_the_skin.yml +4 -4
  17. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/{_version → _remote_version}/returns_live_value.yml +5 -5
  18. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/{_version → _remote_version}/returns_test_value.yml +6 -6
  19. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/{_version → _remote_version}/returns_uploaded_value.yml +7 -7
  20. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_test_url/returns_url_to_test.yml +17 -17
  21. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_update/create_skin_yml_file.yml +814 -0
  22. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_upload/valid_set/increases_version.yml +907 -106
  23. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_upload/valid_set/updates_skin_data.yml +6466 -0
  24. data/spec/fixtures/cassettes/login.yml +36 -48
  25. data/spec/fixtures/skins/DV3tf95f/skin.yml +6 -0
  26. metadata +28 -26
  27. data/spec/fixtures/skins/DV3tf95f/metadata.yml +0 -5
  28. data/spec/fixtures/skins/example-7hFAQnmt/metadata.yml +0 -5
data/CHANGES.md CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
  ## vx.x.x - ???
4
4
  * update Docu
5
- * parse metafile
6
5
  * parent (instead of base)
7
6
  * add CLI binaries (to compile + upload) -> read from .adyenrc file
8
7
  * make compatible with Live system
9
8
 
9
+ ## v0.0.8 - ???
10
+ * parse metafile
11
+
10
12
  ## v0.0.7
11
13
  * fix download issue
12
14
  * fix name with multiple - issue
data/README.md CHANGED
@@ -29,6 +29,14 @@ zip_file = skin.download # get zip file
29
29
 
30
30
  skin.decompile(zip_file) # unzip file and move to skin path, backup + overwrite existing files
31
31
 
32
+ zip_file = skin.compile # unzip file and move to skin path, backup + overwrite existing files
33
+
34
+ skin.upload(zip_file)
35
+
36
+ skin.update # to get latest version
37
+
38
+ skin.test_url # a URL which you can use to 'live' test you skin
39
+
32
40
  ```
33
41
 
34
42
  ### Skins
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.0.8
@@ -1,5 +1,6 @@
1
1
  require 'tempfile'
2
2
  require 'zip/zip'
3
+ require 'yaml'
3
4
 
4
5
  module Adyen
5
6
  module Admin
@@ -81,44 +82,56 @@ module Adyen
81
82
 
82
83
  def path=(new_path)
83
84
  if Skin.is_skin_path?(new_path)
84
- new_code, *new_name = File.basename(new_path).split("-").reverse
85
- self.code ||= new_code
86
- self.name ||= new_name.reverse.join("-")
87
- raise ArgumentError if self.code && self.code != new_code
88
85
  @path = new_path
86
+ if !skin_data.empty?
87
+ self.code = skin_data["code"]
88
+ self.name = skin_data["name"]
89
+ else
90
+ new_code, *new_name = File.basename(new_path).split("-").reverse
91
+ self.code ||= new_code
92
+ self.name ||= new_name.reverse.join("-")
93
+ raise ArgumentError if self.code && self.code != new_code
94
+ end
89
95
  end
90
96
  end
91
97
 
92
- ##################################
98
+ def skin_data(force_update = false)
99
+ update if force_update
100
+ @skin_data ||= YAML.load_file(skin_data_file) rescue {}
101
+ end
93
102
 
94
- def version(scope = :local)
95
- case scope
96
- when :test
97
- page = Adyen::Admin.get(VERSION_TEST % code)
98
- page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
99
- when :live
100
- page = Adyen::Admin.get(VERSION_LIVE % code)
101
- page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
102
- else
103
- page = Adyen::Admin.get(TEST % code)
104
- page.search(".data tr td")[2].content.to_i
105
- end
103
+ def uploaded_at
104
+ skin_data["uploaded_at"]
106
105
  end
107
106
 
108
- def test_url(options = {})
109
- page = Adyen::Admin.get(TEST % code)
110
- page = Adyen::Admin.client.submit(page.form.tap do |form|
111
- #:amount => 199, :currency => :shopper_locale, :country_code, :merchant_reference, :merchant_account, :system, :skip, :one_page
112
- end)
113
- Addressable::URI.parse(page.form.action).tap do |uri|
114
- uri.query_values = page.form.fields.inject({}) { |hash, node|
115
- hash[node.name] = node.value; hash
116
- }
117
- end
107
+ def version
108
+ skin_data["version"]
109
+ end
110
+
111
+ def version_live
112
+ skin_data["version_live"]
113
+ end
114
+
115
+ def version_test
116
+ skin_data["version_test"]
118
117
  end
119
118
 
120
119
  ##########################################
121
120
 
121
+ def update
122
+ @skin_data = {
123
+ :name => name,
124
+ :code => code,
125
+ :uploaded_at => Time.now,
126
+ :version => remote_version,
127
+ :version_live => remote_version(:live),
128
+ :version_test => remote_version(:test),
129
+ }
130
+ File.open(skin_data_file, "w") do |file|
131
+ file.write @skin_data.to_yaml
132
+ end
133
+ end
134
+
122
135
  # http://stackoverflow.com/questions/4360043/using-wwwmechanize-to-download-a-file-to-disk-without-loading-it-all-in-memory
123
136
  # Adyen::Admin.client.pluggable_parser.default = Mechanize::FileSaver
124
137
  def download
@@ -195,6 +208,7 @@ module Adyen
195
208
  end)
196
209
  form = page.form
197
210
  page = form.submit(page.form.button_with(:name => 'submit'))
211
+ update
198
212
  end
199
213
 
200
214
  def publish
@@ -205,6 +219,18 @@ module Adyen
205
219
 
206
220
  #################################
207
221
 
222
+ def test_url(options = {})
223
+ page = Adyen::Admin.get(TEST % code)
224
+ page = Adyen::Admin.client.submit(page.form.tap do |form|
225
+ #:amount => 199, :currency => :shopper_locale, :country_code, :merchant_reference, :merchant_account, :system, :skip, :one_page
226
+ end)
227
+ Addressable::URI.parse(page.form.action).tap do |uri|
228
+ uri.query_values = page.form.fields.inject({}) { |hash, node|
229
+ hash[node.name] = node.value; hash
230
+ }
231
+ end
232
+ end
233
+
208
234
  def to_s
209
235
  self.code
210
236
  end
@@ -222,12 +248,36 @@ module Adyen
222
248
  @name = n
223
249
  end
224
250
 
251
+ def skin_data_file
252
+ File.join(path, 'skin.yml')
253
+ end
254
+
225
255
  def self.is_skin_path?(path)
226
- %w(skin.html.erb inc css js).each do |sub_path|
256
+ %w(skin.html.erb skin.yml inc css js).each do |sub_path|
227
257
  return true if File.exists?(File.join(path.to_s, sub_path))
228
258
  end
229
259
  false
230
260
  end
261
+
262
+ ##################################
263
+
264
+ def remote_version(scope = nil)
265
+ case scope
266
+ when :test
267
+ @version_local ||= begin
268
+ page = Adyen::Admin.get(VERSION_TEST % code)
269
+ page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
270
+ end
271
+ when :live
272
+ page = Adyen::Admin.get(VERSION_LIVE % code)
273
+ page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
274
+ else
275
+ page = Adyen::Admin.get(TEST % code)
276
+ page.search(".data tr td")[2].content.to_i
277
+ end
278
+ rescue
279
+ nil
280
+ end
231
281
  end
232
282
  end
233
283
  end
@@ -118,6 +118,74 @@ module Adyen::Admin
118
118
  Skin.new(:path => path).name.should == "example-test"
119
119
  end
120
120
  end
121
+
122
+ context "with skin data file" do
123
+ let(:path) { "#{skin_fixtures}/DV3tf95f" }
124
+ let(:skin) { Skin.new(:path => path) }
125
+
126
+ it "sets name" do
127
+ skin.name.should == "from-file"
128
+ end
129
+
130
+ it "sets code" do
131
+ skin.code.should == "customCode"
132
+ end
133
+
134
+ it "sets version" do
135
+ skin.version.should == 12
136
+ end
137
+
138
+ it "sets version_test" do
139
+ skin.version_test.should == 3
140
+ end
141
+
142
+ it "sets version_live" do
143
+ skin.version_live.should == 2
144
+ end
145
+ end
146
+ end
147
+
148
+ describe "#update" do
149
+ let(:path) { "#{skin_fixtures}/example-7hFAQnmt" }
150
+
151
+ before do
152
+ skin.path = path
153
+ end
154
+
155
+ after do
156
+ `rm -f #{path}/skin.yml`
157
+ end
158
+
159
+ it "create skin.yml file" do
160
+ expect do
161
+ skin.update
162
+ end.to change { File.exists?("#{path}/skin.yml") }
163
+ end
164
+
165
+ context "local skin" do
166
+ it "returns version" do
167
+ skin.version.should be_nil
168
+ end
169
+
170
+ it "returns version" do
171
+ skin.version_live.should be_nil
172
+ end
173
+
174
+ it "returns version" do
175
+ skin.version_test.should be_nil
176
+ end
177
+ end
178
+
179
+ context "remote fails" do
180
+ before do
181
+ Adyen::Admin.stub(:get).and_raise(StandardError)
182
+ end
183
+
184
+ it "returns version" do
185
+ skin.update
186
+ skin.version.should be_nil
187
+ end
188
+ end
121
189
  end
122
190
 
123
191
  describe "#download" do
@@ -193,59 +261,70 @@ module Adyen::Admin
193
261
 
194
262
  describe "#compile" do
195
263
  let(:skin_code) { "DV3tf95f" }
196
- let(:skin) { Skin.new(:path => "#{skin_fixtures}/#{skin_code}") }
264
+ let(:path) { "#{skin_fixtures}/#{skin_code}" }
265
+ let(:skin) { Skin.new(:path => path) }
197
266
  let(:zip_filename) { skin.compile }
198
267
 
199
268
  def zip_contains(file)
200
269
  Zip::ZipFile.open(zip_filename) do |zipfile|
201
- return true if zipfile.find_entry(File.join(skin_code, file))
270
+ return true if zipfile.find_entry(File.join(skin.code, file))
202
271
  end
203
272
  false
204
273
  end
205
274
 
206
275
  after do
207
- `rm -f #{skin_code}.zip`
276
+ `rm -f #{skin.code}.zip`
208
277
  end
209
278
 
210
- context "without base" do
279
+ context "no skin.yml" do
211
280
  before do
212
- `mv #{skin_fixtures}/base #{skin_fixtures}/base2`
281
+ `mv #{path}/skin.yml #{path}/skin2.yml`
213
282
  end
214
283
 
215
284
  after do
216
- `mv #{skin_fixtures}/base2 #{skin_fixtures}/base`
285
+ `mv #{path}/skin2.yml #{path}/skin.yml`
286
+ end
287
+
288
+ context "without base" do
289
+ before do
290
+ `mv #{skin_fixtures}/base #{skin_fixtures}/base2`
291
+ end
292
+
293
+ after do
294
+ `mv #{skin_fixtures}/base2 #{skin_fixtures}/base`
295
+ end
296
+
297
+ it "includes screen file" do
298
+ zip_contains("css/screen.css").should be_true
299
+ end
300
+
301
+ it "excludes print files" do
302
+ zip_contains("css/print.css").should_not be_true
303
+ end
217
304
  end
218
305
 
219
306
  it "includes screen file" do
220
307
  zip_contains("css/screen.css").should be_true
221
308
  end
222
309
 
223
- it "excludes print files" do
224
- zip_contains("css/print.css").should_not be_true
310
+ it "includes print file" do
311
+ zip_contains("css/print.css").should be_true
225
312
  end
226
- end
227
-
228
- it "includes screen file" do
229
- zip_contains("css/screen.css").should be_true
230
- end
231
313
 
232
- it "includes print file" do
233
- zip_contains("css/print.css").should be_true
234
- end
235
-
236
- it "excludes meta file" do
237
- zip_contains("metadata.yml").should_not be_true
238
- end
314
+ it "excludes meta file" do
315
+ zip_contains("skin2.yml").should_not be_true
316
+ end
239
317
 
240
- it "excludes skin file" do
241
- zip_contains("skin.html.erb").should_not be_true
318
+ it "excludes skin file" do
319
+ zip_contains("skin.html.erb").should_not be_true
320
+ end
242
321
  end
243
322
 
244
323
  context "no exlusion" do
245
324
  let(:zip_filename) { skin.compile(nil) }
246
325
 
247
326
  it "excludes meta file" do
248
- zip_contains("metadata.yml").should be_true
327
+ zip_contains("skin.yml").should be_true
249
328
  end
250
329
 
251
330
  it "excludes skin file" do
@@ -255,34 +334,46 @@ module Adyen::Admin
255
334
  end
256
335
 
257
336
  describe "#upload" do
337
+ let(:path) { "#{skin_fixtures}/example-7hFAQnmt" }
338
+
258
339
  after do
259
340
  `rm -f #{skin_code}.zip`
341
+ `rm -f #{path}/skin.yml`
260
342
  end
261
343
 
262
344
  context "valid set" do
263
- it "increases version" do
264
- skin.path = "#{skin_fixtures}/example-7hFAQnmt"
345
+ before do
346
+ skin.path = path
347
+ end
265
348
 
349
+ it "increases version" do
266
350
  expect do
267
351
  skin.upload
268
- end.to change { skin.version }.by(1)
352
+ end.to change { skin.send(:remote_version) }.by(1)
353
+ end
354
+
355
+ it "updates skin data" do
356
+ skin.should_receive(:update)
357
+
358
+ skin.upload
269
359
  end
270
360
  end
271
361
  end
272
362
 
273
- describe "#version" do
363
+ describe "#remote_version" do
274
364
  let(:skin) { Skin.new(:code => "Kx9axnRf", :name => "demo") }
365
+ let(:version) { 15 }
275
366
 
276
367
  it "returns uploaded value" do
277
- skin.version.should == 14
368
+ skin.send(:remote_version).should == version
278
369
  end
279
370
 
280
371
  it "returns test value" do
281
- skin.version(:test).should == 14
372
+ skin.send(:remote_version, :test).should == version
282
373
  end
283
374
 
284
375
  it "returns live value" do
285
- skin.version(:live).should == 0
376
+ skin.send(:remote_version, :live).should == 0
286
377
  end
287
378
  end
288
379
 
@@ -29,13 +29,13 @@ http_interactions:
29
29
  message: Moved Temporarily
30
30
  headers:
31
31
  Date:
32
- - Thu, 12 Apr 2012 15:59:55 GMT
32
+ - Thu, 19 Apr 2012 17:35:02 GMT
33
33
  Server:
34
34
  - Apache
35
35
  Set-Cookie:
36
- - JSESSIONID=84F73E1B4FA287BC6827EC39280ADAF8.test5e; Path=/ca/; Secure; HttpOnly
36
+ - JSESSIONID=E9721CF1DF5254FC2788EDBE60AD5D5C.test5e; Path=/ca/; Secure; HttpOnly
37
37
  Location:
38
- - https://ca-test.adyen.com/ca/ca/login.shtml;jsessionid=84F73E1B4FA287BC6827EC39280ADAF8.test5e
38
+ - https://ca-test.adyen.com/ca/ca/login.shtml;jsessionid=E9721CF1DF5254FC2788EDBE60AD5D5C.test5e
39
39
  Content-Length:
40
40
  - "0"
41
41
  Keep-Alive:
@@ -48,10 +48,10 @@ http_interactions:
48
48
  encoding: US-ASCII
49
49
  string: ""
50
50
  http_version:
51
- recorded_at: Thu, 12 Apr 2012 15:59:55 GMT
51
+ recorded_at: Thu, 19 Apr 2012 17:35:02 GMT
52
52
  - request:
53
53
  method: get
54
- uri: https://ca-test.adyen.com/ca/ca/login.shtml;jsessionid=84F73E1B4FA287BC6827EC39280ADAF8.test5e
54
+ uri: https://ca-test.adyen.com/ca/ca/login.shtml;jsessionid=E9721CF1DF5254FC2788EDBE60AD5D5C.test5e
55
55
  body:
56
56
  encoding: US-ASCII
57
57
  string: ""
@@ -67,7 +67,7 @@ http_interactions:
67
67
  Accept-Language:
68
68
  - en-us,en;q=0.5
69
69
  Cookie:
70
- - JSESSIONID=84F73E1B4FA287BC6827EC39280ADAF8.test5e
70
+ - JSESSIONID=E9721CF1DF5254FC2788EDBE60AD5D5C.test5e
71
71
  Host:
72
72
  - ca-test.adyen.com
73
73
  Connection:
@@ -80,7 +80,7 @@ http_interactions:
80
80
  message: OK
81
81
  headers:
82
82
  Date:
83
- - Thu, 12 Apr 2012 15:59:56 GMT
83
+ - Thu, 19 Apr 2012 17:35:02 GMT
84
84
  Server:
85
85
  - Apache
86
86
  Cache-Control:
@@ -242,7 +242,7 @@ http_interactions:
242
242
 
243
243
  <tr>
244
244
  <td colspan="2"><br />
245
- <input type="hidden" name="j_formHash" value="994jn5V6LNqMGPZwB9TZTQnwIKRgsw=" />
245
+ <input type="hidden" name="j_formHash" value="964GlK7lxwq1iYLRIK2WHfvux9CXBM=" />
246
246
  <input type="submit" class="button" value="Submit" /></td>
247
247
  </tr>
248
248
  </table>
@@ -267,5 +267,5 @@ http_interactions:
267
267
  </html>
268
268
 
269
269
  http_version:
270
- recorded_at: Thu, 12 Apr 2012 15:59:55 GMT
270
+ recorded_at: Thu, 19 Apr 2012 17:35:02 GMT
271
271
  recorded_with: VCR 2.0.1