megar 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,9 +7,11 @@ describe Megar::Folder do
7
7
 
8
8
  context "when initialised" do
9
9
  let(:id) { 'some id' }
10
+ let(:parent_folder_id) { 'some parent id' }
10
11
  let(:name) { 'some name' }
11
12
  let(:type) { 1 }
12
13
  let(:payload) { {
14
+ 'p' => parent_folder_id
13
15
  } }
14
16
  let(:attributes) { {
15
17
  id: id,
@@ -19,10 +21,59 @@ describe Megar::Folder do
19
21
  'n' => name
20
22
  }
21
23
  } }
24
+
22
25
  subject { instance }
23
- its(:id) { should eql(id) }
24
- its(:name) { should eql(name) }
25
- its(:type) { should eql(type) }
26
+
27
+ its(:id) { should eql(id) }
28
+ its(:name) { should eql(name) }
29
+ its(:type) { should eql(type) }
30
+ its(:parent_folder_id) { should eql(parent_folder_id) }
31
+
32
+ end
33
+
34
+ describe "#folders" do
35
+ let(:session) { dummy_session_with_files_and_folders }
36
+
37
+ subject { folder.folders }
38
+
39
+ context "when child folders present" do
40
+ let(:folder) { session.folders.find_by_id('dir1') }
41
+ its(:count) { should eql(1) }
42
+ describe "child folder" do
43
+ subject { folder.folders.first }
44
+ its(:id) { should eql('dir3') }
45
+ its(:parent_folder) { should eql(folder) }
46
+ end
47
+ end
48
+
49
+ context "when child folders not present" do
50
+ let(:folder) { session.folders.find_by_id('dir2') }
51
+ its(:count) { should eql(0) }
52
+ end
53
+
54
+ end
55
+
56
+ describe "#files" do
57
+ let(:session) { dummy_session_with_files_and_folders }
58
+
59
+ subject { folder.files }
60
+
61
+ context "when child files present" do
62
+ let(:folder) { session.folders.find_by_id('dir1') }
63
+ its(:count) { should eql(2) }
64
+ describe "child file" do
65
+ subject { folder.files.first }
66
+ its(:id) { should eql('file1') }
67
+ its(:parent_folder) { should eql(folder) }
68
+ end
69
+ end
70
+
71
+ context "when child files not present" do
72
+ let(:folder) { session.folders.find_by_id('dir2') }
73
+ its(:count) { should eql(0) }
74
+ end
75
+
26
76
  end
27
77
 
78
+
28
79
  end
@@ -1,11 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
- class CryptoTestHarness
4
- include Megar::Crypto
3
+ class CryptoSupportTestHarness
4
+ include Megar::CryptoSupport
5
5
  end
6
6
 
7
- describe Megar::Crypto do
8
- let(:harness) { CryptoTestHarness.new }
7
+ describe Megar::CryptoSupport do
8
+ let(:harness) { CryptoSupportTestHarness.new }
9
+
10
+ describe "#crypto_requirements_met?" do
11
+ subject { harness.crypto_requirements_met? }
12
+ it "must be true - which implies OpenSSL has the required modes including CTR" do
13
+ should be_true
14
+ end
15
+ end
9
16
 
10
17
  describe "#str_to_a32" do
11
18
  subject { harness.str_to_a32(string) }
@@ -451,8 +458,27 @@ describe Megar::Crypto do
451
458
 
452
459
  end
453
460
 
461
+ describe "#decompose_file_key" do
462
+ # expectation generation in javascript:
463
+ # dl_key = [1281139164, 1127317712, 263279788, 1988157168, 402822759, 1958040625, 716219392, 465402751]
464
+ # expected_key = [dl_key[0]^dl_key[4],dl_key[1]^dl_key[5],dl_key[2]^dl_key[6],dl_key[3]^dl_key[7]]
465
+ # => [1415460795, 931452129, 620884140, 1832756623]
466
+ subject { harness.decompose_file_key(key) }
467
+ [
468
+ {
469
+ key: [1281139164, 1127317712, 263279788, 1988157168, 402822759, 1958040625, 716219392, 465402751],
470
+ expected_key: [1415460795, 931452129, 620884140, 1832756623]
471
+ }
472
+ ].each do |expectations|
473
+ context "given #{expectations[:key]}" do
474
+ let(:key) { expectations[:key] }
475
+ it { should eql(expectations[:expected_key])}
476
+ end
477
+ end
478
+ end
479
+
454
480
  describe "#decrypt_file_attributes" do
455
- subject { harness.decrypt_file_attributes(f,key) }
481
+ subject { harness.decrypt_file_attributes(attributes,key) }
456
482
  {
457
483
  'simple_folder' => {
458
484
  f: { 't' => 1, 'a' => "US0wKXcni_p8dnqRvhR_Otafji3ioNJ5IsgSHB5zhOw" },
@@ -467,7 +493,8 @@ describe Megar::Crypto do
467
493
  }.each do |test_name,expectations|
468
494
  context test_name do
469
495
  let(:f) { expectations[:f] }
470
- let(:key) { expectations[:key] }
496
+ let(:attributes) { f['a'] }
497
+ let(:key) { f['t'] == 0 ? harness.decompose_file_key(expectations[:key]) : expectations[:key] }
471
498
  it { should eql(expectations[:expected_attributes])}
472
499
  end
473
500
  end
@@ -10,6 +10,14 @@ describe "Megar Exceptions" do
10
10
  end
11
11
  end
12
12
 
13
+ describe "Megar::CryptoSupportRequirementsError" do
14
+ let(:exception_class) { Megar::CryptoSupportRequirementsError }
15
+ subject { raise exception_class.new("test") }
16
+ it "should raise correctly" do
17
+ expect { subject }.to raise_error(exception_class)
18
+ end
19
+ end
20
+
13
21
  describe "Megar::MegaRequestError" do
14
22
  let(:exception_class) { Megar::MegaRequestError }
15
23
  {
@@ -14,6 +14,14 @@ describe Megar::Session do
14
14
  let(:expected_rsa_private_key_b64) { test_data['rsa_private_key_b64'] }
15
15
  let(:expected_decomposed_rsa_private_key) { test_data['decomposed_rsa_private_key'] }
16
16
 
17
+ context "when OpenSSL requirements are not met" do
18
+ before do
19
+ OpenSSL::Cipher.stub(:ciphers).and_return([])
20
+ end
21
+ it "should raise an error when instantiated" do
22
+ expect { Megar::Session.new }.to raise_error(Megar::CryptoSupportRequirementsError)
23
+ end
24
+ end
17
25
 
18
26
  context "with username and password" do
19
27
  let(:session) { Megar::Session.new(options) }
@@ -131,6 +139,39 @@ describe Megar::Session do
131
139
  subject { session.folders }
132
140
  it { should be_a(Megar::Folders) }
133
141
  its(:collection) { should_not be_empty }
142
+
143
+ describe "#root" do
144
+ let(:root) { session.folders.root }
145
+ subject { root }
146
+ its(:name) { should eql("Cloud Drive") }
147
+ its(:parent_folder) { should be_nil }
148
+ describe "#folders" do
149
+ subject { root.folders }
150
+ it { should_not be_empty }
151
+ its(:first) { should be_a(Megar::Folder) }
152
+ end
153
+ describe "#files" do
154
+ subject { root.files }
155
+ it { should_not be_empty }
156
+ its(:first) { should be_a(Megar::File) }
157
+ end
158
+ end
159
+ describe "#inbox" do
160
+ subject { session.folders.inbox }
161
+ its(:name) { should eql("Inbox") }
162
+ its(:parent_folder) { should be_nil }
163
+ end
164
+ describe "#trash" do
165
+ subject { session.folders.trash }
166
+ its(:name) { should eql("Trash Bin") }
167
+ its(:parent_folder) { should be_nil }
168
+ end
169
+ describe "random user folder" do
170
+ subject { session.folders.find_by_type(1) }
171
+ its(:name) { should_not be_empty }
172
+ its(:parent_folder) { should be_a(Megar::Folder) }
173
+ end
174
+
134
175
  end
135
176
  describe "#files" do
136
177
  subject { session.files }
@@ -6,6 +6,10 @@ describe Megar::Shell do
6
6
  let(:getoptions) { GetOptions.new(Megar::Shell::OPTIONS, options) }
7
7
  let(:shell) { Megar::Shell.new(getoptions,argv) }
8
8
 
9
+ before do
10
+ $stderr.stub(:puts) # silence console feedback chatter
11
+ end
12
+
9
13
  describe "#usage" do
10
14
  let(:options) { ['-h'] }
11
15
  let(:argv) { [] }
@@ -15,4 +19,28 @@ describe Megar::Shell do
15
19
  end
16
20
  end
17
21
 
22
+ describe "#ls" do
23
+ let(:options) { ['-e=email','-p=pwd'] }
24
+ let(:argv) { ['ls'] }
25
+ it "should invoke ls" do
26
+ mock_session = mock()
27
+ mock_session.stub(:connected?).and_return(true)
28
+ shell.stub(:session).and_return(mock_session)
29
+ shell.should_receive(:ls)
30
+ shell.run
31
+ end
32
+ end
33
+
34
+ describe "#get" do
35
+ let(:options) { ['-e=email','-p=pwd'] }
36
+ let(:argv) { ['get', 'file_id'] }
37
+ it "should invoke get" do
38
+ mock_session = mock()
39
+ mock_session.stub(:connected?).and_return(true)
40
+ shell.stub(:session).and_return(mock_session)
41
+ shell.should_receive(:get).with(argv[1])
42
+ shell.run
43
+ end
44
+ end
45
+
18
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: megar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-25 00:00:00.000000000 Z
12
+ date: 2013-03-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: getoptions
@@ -170,6 +170,8 @@ files:
170
170
  - lib/js_ref_impl/sjcl_1.js
171
171
  - lib/js_ref_impl/upload_10.js
172
172
  - lib/megar.rb
173
+ - lib/megar/adapters.rb
174
+ - lib/megar/adapters/file_downloader.rb
173
175
  - lib/megar/catalog.rb
174
176
  - lib/megar/catalog/catalog_item.rb
175
177
  - lib/megar/catalog/file.rb
@@ -178,21 +180,27 @@ files:
178
180
  - lib/megar/catalog/folders.rb
179
181
  - lib/megar/connection.rb
180
182
  - lib/megar/crypto.rb
183
+ - lib/megar/crypto/support.rb
181
184
  - lib/megar/exception.rb
182
185
  - lib/megar/session.rb
183
186
  - lib/megar/shell.rb
184
187
  - lib/megar/version.rb
185
188
  - megar.gemspec
189
+ - spec/fixtures/crypto_expectations/megar_test_sample_1.txt.enc
190
+ - spec/fixtures/crypto_expectations/megar_test_sample_2.png.enc
186
191
  - spec/fixtures/crypto_expectations/sample_user.json
192
+ - spec/fixtures/sample_files/megar_test_sample_1.txt
193
+ - spec/fixtures/sample_files/megar_test_sample_2.png
187
194
  - spec/spec_helper.rb
188
195
  - spec/support/crypto_expectations_helper.rb
189
196
  - spec/support/mocks_helper.rb
197
+ - spec/unit/adapters/file_downloader_spec.rb
190
198
  - spec/unit/catalog/file_spec.rb
191
199
  - spec/unit/catalog/files_spec.rb
192
200
  - spec/unit/catalog/folder_spec.rb
193
201
  - spec/unit/catalog/folders_spec.rb
194
202
  - spec/unit/connection_spec.rb
195
- - spec/unit/crypto_spec.rb
203
+ - spec/unit/crypto/support_spec.rb
196
204
  - spec/unit/exception_spec.rb
197
205
  - spec/unit/extensions/math_spec.rb
198
206
  - spec/unit/session_spec.rb
@@ -217,21 +225,26 @@ required_rubygems_version: !ruby/object:Gem::Requirement
217
225
  version: '0'
218
226
  requirements: []
219
227
  rubyforge_project:
220
- rubygems_version: 1.8.24
228
+ rubygems_version: 1.8.23
221
229
  signing_key:
222
230
  specification_version: 3
223
231
  summary: A Ruby wrapper and command-line tool for the Mega API (mega.co.nz)
224
232
  test_files:
233
+ - spec/fixtures/crypto_expectations/megar_test_sample_1.txt.enc
234
+ - spec/fixtures/crypto_expectations/megar_test_sample_2.png.enc
225
235
  - spec/fixtures/crypto_expectations/sample_user.json
236
+ - spec/fixtures/sample_files/megar_test_sample_1.txt
237
+ - spec/fixtures/sample_files/megar_test_sample_2.png
226
238
  - spec/spec_helper.rb
227
239
  - spec/support/crypto_expectations_helper.rb
228
240
  - spec/support/mocks_helper.rb
241
+ - spec/unit/adapters/file_downloader_spec.rb
229
242
  - spec/unit/catalog/file_spec.rb
230
243
  - spec/unit/catalog/files_spec.rb
231
244
  - spec/unit/catalog/folder_spec.rb
232
245
  - spec/unit/catalog/folders_spec.rb
233
246
  - spec/unit/connection_spec.rb
234
- - spec/unit/crypto_spec.rb
247
+ - spec/unit/crypto/support_spec.rb
235
248
  - spec/unit/exception_spec.rb
236
249
  - spec/unit/extensions/math_spec.rb
237
250
  - spec/unit/session_spec.rb