cloud_door 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/Guardfile +7 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +204 -0
  8. data/Rakefile +11 -0
  9. data/bin/dropbox +133 -0
  10. data/bin/onedrive +133 -0
  11. data/cloud_door.gemspec +38 -0
  12. data/cloud_door_config.yml +12 -0
  13. data/data/.gitkeep +0 -0
  14. data/data/testlist +0 -0
  15. data/lib/cloud_door.rb +114 -0
  16. data/lib/cloud_door/account.rb +27 -0
  17. data/lib/cloud_door/cloud_storage.rb +294 -0
  18. data/lib/cloud_door/cloud_yaml.rb +45 -0
  19. data/lib/cloud_door/config.rb +61 -0
  20. data/lib/cloud_door/console.rb +334 -0
  21. data/lib/cloud_door/dropbox.rb +166 -0
  22. data/lib/cloud_door/exceptions.rb +153 -0
  23. data/lib/cloud_door/file_list.rb +164 -0
  24. data/lib/cloud_door/onedrive.rb +180 -0
  25. data/lib/cloud_door/onedrive_api.rb +169 -0
  26. data/lib/cloud_door/token.rb +67 -0
  27. data/lib/cloud_door/version.rb +3 -0
  28. data/log/.gitkeep +0 -0
  29. data/spec/cloud_door/account_spec.rb +96 -0
  30. data/spec/cloud_door/cloud_storage_spec.rb +10 -0
  31. data/spec/cloud_door/cloud_yaml_spec.rb +32 -0
  32. data/spec/cloud_door/config_spec.rb +95 -0
  33. data/spec/cloud_door/console_spec.rb +633 -0
  34. data/spec/cloud_door/dropbox_spec.rb +625 -0
  35. data/spec/cloud_door/file_list_spec.rb +451 -0
  36. data/spec/cloud_door/onedrive_api_spec.rb +256 -0
  37. data/spec/cloud_door/onedrive_spec.rb +652 -0
  38. data/spec/cloud_door/token_spec.rb +81 -0
  39. data/spec/fabricators/account_fabricator.rb +5 -0
  40. data/spec/fabricators/cloud_yaml_fabricator.rb +5 -0
  41. data/spec/fabricators/config_fabrication.rb +5 -0
  42. data/spec/fabricators/token_fabricator.rb +10 -0
  43. data/spec/spec_helper.rb +55 -0
  44. metadata +380 -0
@@ -0,0 +1,451 @@
1
+ require 'spec_helper'
2
+
3
+ def create_file_list
4
+ file_list = CloudDoor::FileList.new('test_list', './data/')
5
+ file_list
6
+ end
7
+
8
+ describe 'FileList' do
9
+ describe 'load_list' do
10
+ subject { file_list.load_list }
11
+ let(:file_list) { create_file_list }
12
+ let(:list_file) { './data/test_list' }
13
+ let(:list) do
14
+ items = {'id' => 'folder.1234', 'type' => 'folder'}
15
+ [{'id' => 'top', 'name' => 'top', 'items' => items}]
16
+ end
17
+ context 'list file not exists' do
18
+ it { is_expected.to be_truthy }
19
+ it do
20
+ subject
21
+ expect(file_list.list).to eq []
22
+ end
23
+ end
24
+ context 'list file is array' do
25
+ before(:each) do
26
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
27
+ end
28
+ it { is_expected.to be_truthy }
29
+ it do
30
+ subject
31
+ expect(file_list.list).to eq list
32
+ end
33
+ end
34
+ context 'list file is not array' do
35
+ let(:list) { '' }
36
+ before(:each) do
37
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
38
+ end
39
+ it { is_expected.to be_falsey }
40
+ it do
41
+ subject
42
+ expect(file_list.list).to eq nil
43
+ end
44
+ end
45
+ after(:each) do
46
+ File.delete(list_file) if File.exist?(list_file)
47
+ end
48
+ end
49
+
50
+ describe 'add_list_top' do
51
+ subject { file_list.add_list_top(items) }
52
+ let(:file_list) { create_file_list }
53
+ let(:list_file) { './data/test_list' }
54
+ before(:each) do
55
+ File.delete(list_file) if File.exist?(list_file)
56
+ end
57
+ context 'success' do
58
+ let(:items) { {'folder' => {'id' => 'folder.1234', 'type' => 'folder'}} }
59
+ let(:added_list) do
60
+ [{'id' => 'top', 'name' => 'top', 'items' => items}]
61
+ end
62
+ it { is_expected.to be_truthy }
63
+ it do
64
+ subject
65
+ file_list.load_list
66
+ expect(file_list.list).to eq added_list
67
+ end
68
+ end
69
+ context 'fail' do
70
+ context 'items is nil' do
71
+ let(:items) { nil }
72
+ it { is_expected.to be_falsey }
73
+ end
74
+ context 'items is not hash' do
75
+ let(:items) { [] }
76
+ it { is_expected.to be_falsey }
77
+ end
78
+ end
79
+ after(:each) do
80
+ File.delete(list_file) if File.exist?(list_file)
81
+ end
82
+ end
83
+
84
+ describe 'add_list' do
85
+ subject { file_list.add_list(items, file_id, file_name) }
86
+ let(:file_list) { create_file_list }
87
+ let(:list_file) { './data/test_list' }
88
+ let(:list) do
89
+ [{'id' => 'top', 'name' => 'top', 'items' => top_items}]
90
+ end
91
+ let(:file_id) { 'folder.1234' }
92
+ let(:file_name) { 'folder1' }
93
+ let(:items) { {'test2' => {'id' => 'file.5678', 'type' => 'file'}} }
94
+ let(:top_items) { {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}} }
95
+ before(:each) do
96
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
97
+ end
98
+ context 'success' do
99
+ let(:added_list) do
100
+ [
101
+ {'id' => 'top', 'name' => 'top', 'items' => top_items},
102
+ {'id' => file_id, 'name' => file_name, 'items' => items}
103
+ ]
104
+ end
105
+ it { is_expected.to be_truthy }
106
+ it do
107
+ subject
108
+ file_list.load_list
109
+ expect(file_list.list).to eq added_list
110
+ end
111
+ end
112
+ context 'fail' do
113
+ context 'file_id is nil' do
114
+ let(:file_id) { nil }
115
+ it { is_expected.to be_falsey }
116
+ end
117
+ context 'file_id is empty' do
118
+ let(:file_id) { '' }
119
+ it { is_expected.to be_falsey }
120
+ end
121
+ context 'file_name is nil' do
122
+ let(:file_name) { nil }
123
+ it { is_expected.to be_falsey }
124
+ end
125
+ context 'file_name is empty' do
126
+ let(:file_name) { '' }
127
+ it { is_expected.to be_falsey }
128
+ end
129
+ context 'items is nil' do
130
+ let(:items) { nil }
131
+ it { is_expected.to be_falsey }
132
+ end
133
+ context 'items is not hash' do
134
+ let(:items) { [] }
135
+ it { is_expected.to be_falsey }
136
+ end
137
+ context 'list file is not array' do
138
+ let(:list) do
139
+ {'id' => 'top', 'name' => 'top', 'items' => top_items}
140
+ end
141
+ it { is_expected.to be_falsey }
142
+ end
143
+ end
144
+ after(:each) do
145
+ File.delete(list_file) if File.exist?(list_file)
146
+ end
147
+ end
148
+
149
+ describe 'update_list' do
150
+ subject { file_list.update_list(items) }
151
+ let(:file_list) { create_file_list }
152
+ let(:list_file) { './data/test_list' }
153
+ let(:list) do
154
+ items1 = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
155
+ items2 = {'folder2' => {'id' => 'folder.5678', 'type' => 'folder'}}
156
+ items3 = {'file3' => {'id' => 'file.3456', 'type' => 'file'}}
157
+ [
158
+ {'id' => 'top', 'name' => 'top', 'items' => items1},
159
+ {'id' => 'folder.1234', 'name' => 'folder1', 'items' => items2},
160
+ {'id' => 'folder.5678', 'name' => 'folder2', 'items' => items3}
161
+ ]
162
+ end
163
+ let(:items) { {'file4' => {'id' => 'file.7890', 'type' => 'file'}} }
164
+ before(:each) do
165
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
166
+ end
167
+ context 'success' do
168
+ let(:updated_list) do
169
+ items1 = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
170
+ items2 = {'folder2' => {'id' => 'folder.5678', 'type' => 'folder'}}
171
+ [
172
+ {'id' => 'top', 'name' => 'top', 'items' => items1},
173
+ {'id' => 'folder.1234', 'name' => 'folder1', 'items' => items2},
174
+ {'id' => 'folder.5678', 'name' => 'folder2', 'items' => items}
175
+ ]
176
+ end
177
+ it { is_expected.to be_truthy }
178
+ it do
179
+ subject
180
+ file_list.load_list
181
+ expect(file_list.list).to eq updated_list
182
+ end
183
+ end
184
+ context 'fail' do
185
+ context 'items is nil' do
186
+ let(:items) { nil }
187
+ it { is_expected.to be_falsey }
188
+ end
189
+ context 'items is not hash' do
190
+ let(:items) { [] }
191
+ it { is_expected.to be_falsey }
192
+ end
193
+ end
194
+ after(:each) do
195
+ File.delete(list_file) if File.exist?(list_file)
196
+ end
197
+ end
198
+
199
+ describe 'remove_list' do
200
+ subject { file_list.remove_list(back) }
201
+ let(:file_list) { create_file_list }
202
+ let(:list_file) { './data/test_list' }
203
+ let(:list) do
204
+ items1 = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
205
+ items2 = {'folder2' => {'id' => 'folder.5678', 'type' => 'folder'}}
206
+ items3 = {'file3' => {'id' => 'file.3456', 'type' => 'file'}}
207
+ [
208
+ {'id' => 'top', 'name' => 'top', 'items' => items1},
209
+ {'id' => 'folder.1234', 'name' => 'folder1', 'items' => items2},
210
+ {'id' => 'folder.5678', 'name' => 'folder2', 'items' => items3}
211
+ ]
212
+ end
213
+ before(:each) do
214
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
215
+ end
216
+ context 'success' do
217
+ context 'remove last 1' do
218
+ let(:back) { 2 }
219
+ it { is_expected.to be_truthy }
220
+ it do
221
+ subject
222
+ file_list.load_list
223
+ expect(file_list.list).to eq list[0..1]
224
+ end
225
+ end
226
+ context 'remove last 2' do
227
+ let(:back) { 3 }
228
+ it { is_expected.to be_truthy }
229
+ it do
230
+ subject
231
+ file_list.load_list
232
+ expect(file_list.list).to eq list[0..0]
233
+ end
234
+ end
235
+ end
236
+ context 'fail' do
237
+ context 'remove all' do
238
+ let(:back) { 4 }
239
+ it { is_expected.to be_falsey }
240
+ end
241
+ context 'list file is not array' do
242
+ let(:list) do
243
+ items = {'test' => {'id' => 'file.1234', 'type' => 'file'}}
244
+ {'id' => 'top', 'name' => 'top', 'items' => items}
245
+ end
246
+ let(:back) { 1 }
247
+ it { is_expected.to be_falsey }
248
+ end
249
+ end
250
+ after(:each) do
251
+ File.delete(list_file) if File.exist?(list_file)
252
+ end
253
+ end
254
+
255
+ describe 'delete_list' do
256
+ subject { file_list.delete_file }
257
+ let(:file_list) { create_file_list }
258
+ let(:list_file) { './data/test_list' }
259
+ let(:list) do
260
+ items = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
261
+ [{'id' => 'top', 'name' => 'top', 'items' => items}]
262
+ end
263
+ context 'file not exists' do
264
+ it { is_expected.to be_truthy }
265
+ it do
266
+ subject
267
+ expect(File.exist?(file_list.list_file)).to be_falsey
268
+ end
269
+ end
270
+ context 'file exists' do
271
+ before(:each) do
272
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
273
+ end
274
+ it { is_expected.to be_truthy }
275
+ it do
276
+ subject
277
+ expect(File.exist?(file_list.list_file)).to be_falsey
278
+ end
279
+ end
280
+ after(:each) do
281
+ File.delete(list_file) if File.exist?(list_file)
282
+ end
283
+ end
284
+
285
+ describe 'pull_parent_id' do
286
+ subject { file_list.pull_parent_id }
287
+ let(:file_list) { create_file_list }
288
+ let(:list_file) { './data/test_list' }
289
+ let(:list) do
290
+ items1 = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
291
+ items2 = {'folder2' => {'id' => 'folder.5678', 'type' => 'folder'}}
292
+ items3 = {'file3' => {'id' => 'file.3456', 'type' => 'file'}}
293
+ [
294
+ {'id' => 'top', 'name' => 'top', 'items' => items1},
295
+ {'id' => 'folder.1234', 'name' => 'folder1', 'items' => items2},
296
+ {'id' => 'folder.5678', 'name' => 'folder2', 'items' => items3}
297
+ ]
298
+ end
299
+ before(:each) do
300
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
301
+ end
302
+ it { is_expected.to eq 'folder.5678' }
303
+ after(:each) do
304
+ File.delete(list_file) if File.exist?(list_file)
305
+ end
306
+ end
307
+
308
+ describe 'pull_current_dir' do
309
+ subject { file_list.pull_current_dir }
310
+ let(:file_list) { create_file_list }
311
+ let(:list_file) { './data/test_list' }
312
+ before(:each) do
313
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
314
+ end
315
+ context 'top' do
316
+ let(:list) do
317
+ items = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
318
+ [{'id' => 'top', 'name' => 'top', 'items' => items}]
319
+ end
320
+ it { is_expected.to eq '/top' }
321
+ end
322
+ context 'directory' do
323
+ let(:list) do
324
+ items1 = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
325
+ items2 = {'folder2' => {'id' => 'folder.5678', 'type' => 'folder'}}
326
+ items3 = {'file3' => {'id' => 'file.3456', 'type' => 'file'}}
327
+ [
328
+ {'id' => 'top', 'name' => 'top', 'items' => items1},
329
+ {'id' => 'folder.1234', 'name' => 'folder1', 'items' => items2},
330
+ {'id' => 'folder.5678', 'name' => 'folder2', 'items' => items3}
331
+ ]
332
+ end
333
+ it { is_expected.to eq '/top/folder1/folder2' }
334
+ end
335
+ after(:each) do
336
+ File.delete(list_file) if File.exist?(list_file)
337
+ end
338
+ end
339
+
340
+ describe 'pull_file_properties' do
341
+ subject { file_list.pull_file_properties(file_name) }
342
+ let(:file_list) { create_file_list }
343
+ let(:list_file) { './data/test_list' }
344
+ let(:file_name) { 'file3' }
345
+ let(:list) do
346
+ items1 = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
347
+ items2 = {'folder2' => {'id' => 'folder.5678', 'type' => 'folder'}}
348
+ items3 = {'file3' => {'id' => 'file.3456', 'type' => 'file'}}
349
+ [
350
+ {'id' => 'top', 'name' => 'top', 'items' => items1},
351
+ {'id' => 'folder.1234', 'name' => 'folder1', 'items' => items2},
352
+ {'id' => 'folder.5678', 'name' => 'folder2', 'items' => items3}
353
+ ]
354
+ end
355
+ before(:each) do
356
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
357
+ end
358
+ context 'target found' do
359
+ it { is_expected.to eq({'id' => 'file.3456', 'type' => 'file'}) }
360
+ end
361
+ context 'target not found' do
362
+ let(:file_name) { 'file4' }
363
+ it { is_expected.to be_falsey }
364
+ end
365
+ context 'list is empty' do
366
+ let(:list) { [] }
367
+ it { is_expected.to be_falsey }
368
+ end
369
+ context 'items is empty' do
370
+ let(:list) { [{'id' => 'top', 'name' => 'top', 'items' => {}}] }
371
+ it { is_expected.to be_falsey }
372
+ end
373
+ after(:each) do
374
+ File.delete(list_file) if File.exist?(list_file)
375
+ end
376
+ end
377
+
378
+ describe 'convert_name_to_id' do
379
+ subject { file_list.convert_name_to_id(mode, file_name) }
380
+ let(:file_list) { create_file_list }
381
+ let(:list_file) { './data/test_list' }
382
+ let(:list) do
383
+ items1 = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
384
+ items2 = {'folder2' => {'id' => 'folder.5678', 'type' => 'folder'}}
385
+ items3 = {'file3' => {'id' => 'file.3456', 'type' => 'file'}}
386
+ [
387
+ {'id' => 'top', 'name' => 'top', 'items' => items1},
388
+ {'id' => 'folder.1234', 'name' => 'folder1', 'items' => items2},
389
+ {'id' => 'folder.5678', 'name' => 'folder2', 'items' => items3}
390
+ ]
391
+ end
392
+ before(:each) do
393
+ open(list_file, 'wb') { |file| file << Marshal.dump(list) }
394
+ end
395
+ context 'mode == current' do
396
+ let(:mode) { 'current' }
397
+ let(:file_name) { nil }
398
+ context 'top' do
399
+ let(:list) do
400
+ items = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
401
+ [{'id' => 'top', 'name' => 'top', 'items' => items}]
402
+ end
403
+ it { is_expected.to be_nil }
404
+ end
405
+ context 'directory' do
406
+ it { is_expected.to eq 'folder.5678' }
407
+ end
408
+ end
409
+ context 'mode == parent' do
410
+ let(:mode) { 'parent' }
411
+ context 'top' do
412
+ let(:file_name) { '../' }
413
+ let(:list) do
414
+ items = {'folder1' => {'id' => 'folder.1234', 'type' => 'folder'}}
415
+ [{'id' => 'top', 'name' => 'top', 'items' => items}]
416
+ end
417
+ it { is_expected.to be_falsey }
418
+ end
419
+ context 'back to folder' do
420
+ let(:file_name) { '../' }
421
+ it { is_expected.to eq 'folder.1234' }
422
+ end
423
+ context 'back to top' do
424
+ let(:file_name) { '../../' }
425
+ it { is_expected.to be_nil }
426
+ end
427
+ end
428
+ context 'mode == target' do
429
+ let(:mode) { 'target' }
430
+ let(:file_name) { 'file3' }
431
+ context 'target found' do
432
+ it { is_expected.to eq 'file.3456' }
433
+ end
434
+ context 'target not found' do
435
+ let(:file_name) { 'file4' }
436
+ it { is_expected.to be_falsey }
437
+ end
438
+ context 'list is empty' do
439
+ let(:list) { [] }
440
+ it { is_expected.to be_falsey }
441
+ end
442
+ context 'items is empty' do
443
+ let(:list) { [{'id' => 'top', 'name' => 'top', 'items' => {}}] }
444
+ it { is_expected.to be_falsey }
445
+ end
446
+ end
447
+ after(:each) do
448
+ File.delete(list_file) if File.exist?(list_file)
449
+ end
450
+ end
451
+ end
@@ -0,0 +1,256 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.shared_examples 'http request fail' do
4
+ context 'http request fail' do
5
+ let(:status) { 401 }
6
+ let(:body) { nil }
7
+ it { expect { subject }.to raise_error(CloudDoor::UnauthorizedException) }
8
+ end
9
+ end
10
+
11
+ describe 'OneDriveApi' do
12
+ describe 'request_get_token' do
13
+ subject { storage.request_get_token(code, client_id, client_secret, redirect_url) }
14
+ let(:access_token) { 'token' }
15
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
16
+ let(:code) { '5678' }
17
+ let(:client_id) { '1234' }
18
+ let(:client_secret) { 'abcd' }
19
+ let(:redirect_url) { 'redirect' }
20
+ before(:each) do
21
+ WebMock.stub_request(:post, CloudDoor::OneDriveApi::TOKEN_URL)
22
+ .with(
23
+ body: {
24
+ 'client_id' => client_id,
25
+ 'client_secret' => client_secret,
26
+ 'redirect_uri' => redirect_url,
27
+ 'code' => code,
28
+ 'grant_type' => 'authorization_code'
29
+ },
30
+ headers: {
31
+ 'Content-Type' => 'application/x-www-form-urlencoded'
32
+ }
33
+ )
34
+ .to_return(status: status, body: body)
35
+ end
36
+ context 'success' do
37
+ let(:status) { 200 }
38
+ let(:body) { JSON('access_token' => 'mock') }
39
+ it { is_expected.to eq JSON.parse(body) }
40
+ end
41
+ context 'fail' do
42
+ it_behaves_like 'http request fail'
43
+ end
44
+ end
45
+
46
+ describe 'request_refresh_token' do
47
+ subject { storage.request_refresh_token(refresh_token, client_id, client_secret, redirect_url) }
48
+ let(:access_token) { 'token' }
49
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
50
+ let(:client_id) { '1234' }
51
+ let(:client_secret) { 'abcd' }
52
+ let(:redirect_url) { 'redirect' }
53
+ let(:refresh_token) { 'refresh' }
54
+ before(:each) do
55
+ WebMock.stub_request(:post, CloudDoor::OneDriveApi::TOKEN_URL)
56
+ .with(
57
+ body: {
58
+ 'client_id' => client_id,
59
+ 'client_secret' => client_secret,
60
+ 'redirect_uri' => redirect_url,
61
+ 'grant_type' => 'refresh_token',
62
+ 'refresh_token' => refresh_token
63
+ },
64
+ headers: {
65
+ 'Content-Type' => 'application/x-www-form-urlencoded'
66
+ }
67
+ )
68
+ .to_return(status: status, body: body)
69
+ end
70
+ context 'success' do
71
+ let(:status) { 200 }
72
+ let(:body) { JSON('access_token' => 'mock') }
73
+ it { is_expected.to eq JSON.parse(body) }
74
+ end
75
+ context 'fail' do
76
+ it_behaves_like 'http request fail'
77
+ end
78
+ end
79
+
80
+ describe 'request_user' do
81
+ subject { storage.request_user }
82
+ let(:access_token) { 'token' }
83
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
84
+ let(:url) { CloudDoor::OneDriveApi::USER_FORMAT % access_token }
85
+ before(:each) do
86
+ WebMock.stub_request(:get, url).to_return(status: status, body: body)
87
+ end
88
+ context 'success' do
89
+ let(:status) { 200 }
90
+ let(:info) { {'name' => 'onedrive'} }
91
+ let(:body) { JSON(info) }
92
+ it { is_expected.to eq info }
93
+ end
94
+ context 'fail' do
95
+ it_behaves_like 'http request fail'
96
+ end
97
+ end
98
+
99
+ describe 'request_dir' do
100
+ subject { storage.request_dir(file_id) }
101
+ let(:access_token) { 'token' }
102
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
103
+ let(:file_id) { 'folder.1234' }
104
+ let(:url) { CloudDoor::OneDriveApi::DIR_FORMAT % [file_id, access_token] }
105
+ before(:each) do
106
+ WebMock.stub_request(:get, url).to_return(status: status, body: body)
107
+ end
108
+ context 'success' do
109
+ let(:status) { 200 }
110
+ let(:info) { {'data' => ['file1', 'file2']} }
111
+ let(:body) { JSON(info) }
112
+ it { is_expected.to eq info }
113
+ end
114
+ context 'fail' do
115
+ it_behaves_like 'http request fail'
116
+ end
117
+ end
118
+
119
+ describe 'request_file' do
120
+ subject { storage.request_file(file_id) }
121
+ let(:access_token) { 'token' }
122
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
123
+ let(:file_id) { 'file.1234' }
124
+ let(:url) { CloudDoor::OneDriveApi::FILE_FORMAT % [file_id, access_token] }
125
+ before(:each) do
126
+ WebMock.stub_request(:get, url).to_return(status: status, body: body)
127
+ end
128
+ context 'success' do
129
+ let(:status) { 200 }
130
+ let(:info) { {'id' => 'file.1234', 'name' => 'file1'} }
131
+ let(:body) { JSON(info) }
132
+ it { is_expected.to eq info }
133
+ end
134
+ context 'fail' do
135
+ it_behaves_like 'http request fail'
136
+ end
137
+ end
138
+
139
+ describe 'request_download' do
140
+ subject { storage.request_download(file_id) }
141
+ let(:access_token) { 'token' }
142
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
143
+ let(:file_id) { 'file.1234' }
144
+ let(:url) { CloudDoor::OneDriveApi::DOWNLOAD_FORMAT % [file_id, access_token] }
145
+ before(:each) do
146
+ WebMock.stub_request(:get, url).to_return(status: status, body: body)
147
+ WebMock.stub_request(:get, 'http://localhost').to_return(status: status, body: file_body)
148
+ end
149
+ context 'success' do
150
+ let(:status) { 200 }
151
+ let(:info) { {'location' => 'http://localhost'} }
152
+ let(:body) { JSON(info) }
153
+ let(:file_body) { 'Onedrive' }
154
+ it { is_expected.to eq file_body }
155
+ end
156
+ context 'fail' do
157
+ context 'file not exists' do
158
+ let(:status) { 200 }
159
+ let(:body) { nil }
160
+ let(:file_body) { nil }
161
+ it { expect { subject }.to raise_error(CloudDoor::NoDataException) }
162
+ end
163
+ context 'http request fail' do
164
+ let(:status) { 401 }
165
+ let(:body) { nil }
166
+ let(:file_body) { nil }
167
+ it { expect { subject }.to raise_error(CloudDoor::UnauthorizedException) }
168
+ end
169
+ end
170
+ end
171
+
172
+ describe 'request_upload' do
173
+ subject { storage.request_upload(file_path, parent_id) }
174
+ let(:access_token) { 'token' }
175
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
176
+ let(:file_path) { 'upload_test' }
177
+ let(:parent_id) { 'folder.1234' }
178
+ let(:url) { CloudDoor::OneDriveApi::UPLOAD_FORMAT % [parent_id, access_token] }
179
+ before(:each) do
180
+ WebMock.stub_request(:post, url).to_return(status: status, body: body)
181
+ open(file_path, 'wb') { |file| file << 'upload_test' }
182
+ end
183
+ context 'success' do
184
+ let(:status) { 200 }
185
+ let(:info) { {'id' => 'file.1234', 'name' => file_path} }
186
+ let(:body) { JSON(info) }
187
+ it { is_expected.to eq info }
188
+ end
189
+ context 'fail' do
190
+ it_behaves_like 'http request fail'
191
+ end
192
+ after(:each) do
193
+ File.delete(file_path) if File.exist?(file_path)
194
+ end
195
+ end
196
+
197
+ describe 'request_delete' do
198
+ subject { storage.request_delete(file_id) }
199
+ let(:access_token) { 'token' }
200
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
201
+ let(:file_id) { 'file.1234' }
202
+ let(:url) { CloudDoor::OneDriveApi::DELETE_FORMAT % [file_id, access_token] }
203
+ before(:each) do
204
+ WebMock.stub_request(:delete, url).to_return(status: status, body: body)
205
+ end
206
+ context 'success' do
207
+ let(:status) { 200 }
208
+ let(:info) { {'id' => 'file.1234', 'name' => 'file1'} }
209
+ let(:body) { JSON(info) }
210
+ it { is_expected.to eq info }
211
+ end
212
+ context 'fail' do
213
+ it_behaves_like 'http request fail'
214
+ end
215
+ end
216
+
217
+ describe 'request_mkdir' do
218
+ subject { storage.request_mkdir(mkdir_name, parent_id) }
219
+ let(:access_token) { 'token' }
220
+ let(:storage) { CloudDoor::OneDriveApi.new(access_token) }
221
+ let(:mkdir_name) { 'folder2' }
222
+ let(:parent_id) { 'folder.1234' }
223
+ let(:url) { CloudDoor::OneDriveApi::MKDIR_FORMAT % parent_id }
224
+ before(:each) do
225
+ WebMock.stub_request(:post, url)
226
+ .with(
227
+ body: JSON('name' => mkdir_name),
228
+ headers: {
229
+ 'Authorization' => "Bearer #{access_token}",
230
+ 'Content-Type' => 'application/json'
231
+ }
232
+ )
233
+ .to_return(status: status, body: body)
234
+ end
235
+ context 'success' do
236
+ let(:status) { 200 }
237
+ let(:info) { {'id' => 'folder.5678', 'name' => mkdir_name} }
238
+ let(:body) { JSON(info) }
239
+ it { is_expected.to eq info }
240
+ end
241
+ context 'fail' do
242
+ it_behaves_like 'http request fail'
243
+ end
244
+ end
245
+
246
+ describe 'make_auth_url' do
247
+ subject { CloudDoor::OneDriveApi.make_auth_url(client_id, redirect_url) }
248
+ let(:client_id) { '1234' }
249
+ let(:redirect_url) { 'redirect' }
250
+ let(:auth_url) do
251
+ CloudDoor::OneDriveApi::AUTH_FORMAT %
252
+ [client_id, CloudDoor::OneDriveApi::UPDATE_SCOPE, redirect_url]
253
+ end
254
+ it { is_expected.to eq auth_url }
255
+ end
256
+ end