megar 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,9 +27,9 @@ class Megar::Shell
27
27
  raise "Failed to connect!" unless session.connected?
28
28
  case args.first
29
29
  when /ls/i
30
- session.files.each do |file|
31
- puts file
32
- end
30
+ ls
31
+ when /get/i
32
+ get(args[1])
33
33
  else
34
34
  $stderr.puts "Connected!"
35
35
  end
@@ -62,6 +62,7 @@ Options:
62
62
  Commands:
63
63
  (none) : will perform a basic connection test only
64
64
  ls : returns a full file listing
65
+ get file_id : downloads the file with id file_id
65
66
 
66
67
  Examples:
67
68
  megar --email=my@mail.com --password=MyPassword ls
@@ -76,6 +77,23 @@ EOS
76
77
  self.class.usage
77
78
  end
78
79
 
80
+ def ls
81
+ session.files.each do |file|
82
+ puts file
83
+ end
84
+ end
85
+
86
+ def get(file_id)
87
+ if file = session.files.find_by_id(file_id)
88
+ $stderr.puts "Downloading #{file_id} to #{file.name}.."
89
+ File.open(file.name,'wb') do |f|
90
+ f.write file.body
91
+ end
92
+ else
93
+ $stderr.puts "I couldn't find the file with ID #{file_id}"
94
+ end
95
+ end
96
+
79
97
  def session
80
98
  @session ||= Megar::Session.new(email: email, password: password)
81
99
  end
@@ -1,3 +1,3 @@
1
1
  module Megar
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1 @@
1
+ E�ɐ�^P��� @(�d�l�^�j�7��Z�Zc����~
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "email": "megartest@gmail.com",
3
3
  "email_mixed_case": "Megartest@gmail.com",
4
- "password": "15kMW4GiHVWFmqJJ",
4
+ "password": "ToLlw2D748TqCVAmrc8laio1",
5
5
  "autoconnect": false,
6
6
  "login_response_data": {
7
- "csid": "CAA4by3fJFnderfxuUgwXDhQJkaxKTREaVIA4QuyKmE2CnVDP2w5pU-tftPcHvfdCoV9Gi-rTKsB11rBcc1yK1I8IVOzAwST9yUwSmZI-9Euq-FEUOCsnHYLDlykTOSisU9OU0GausJZbCCHrSLI_Q49Ndc-BBQc361W-DkZUl8ZgKCl3qleBP5aepJbR-bSTR5bJ-IxRmdf2jYUE0dz3lLMGSC4XjGBXgydFlGNgJqURpik9FrW1gPFyKESRNfxudteoSWO-f2bgD-4eEek4kHAaZZQW2K5Yb2GBXCOVQ0_7jpcRd9-gwhUHpTJETNxtEPxMEBtOtAhEm1hxXSxWZgr",
7
+ "csid": "CAA1bK6vGGR02BJCb8CfkaeI7F1kIUyvLSXZFXzlFIrsWIp0kw7GgCUZbqN_zE9z4_eV-g5Vl8GyC--TYwUZ1JigVwNPTWEncqk0qdUmmv1SpOcbOu-Z0Z5-GWnTK2oxSp8nKPBn0UGBvf98hQ3KD1uhjEFBrJbNdAgbHc8BGTaYvE0dHNtIE1Zz7bulDDg798Rjj1eGH5bC1vEZDQ_uI7l-wBRtXsCCdXAo6GZEyzr-dcpYInPL-Sy8ZY10RU67E-x_-v_sEUqyN69EHyENk97XzL0arGvXbnGNVH4OhdjynQ1csIlcmvbNQ5kAe9KjJTIT9NeVnmSAjao3AAbIfvRj",
8
8
  "privk": "4Iurk4vQ0BlLEEvEyaRUX8QnYzJFIedm0RVKe2pLh4wTzBBtgmafnszD_dP3Y40P-DSNLEGfWghL-0_BIW4XP8tfGNFkMg7mnYgQYC91ccz58BbhGEDf7-j97dstckf3OSSsT9D9H-cocXzyt1m231w9d7YLX23c3KAGz3vxdnl66F4jsFGO9AdIyb1KTEEt7NHkljtbz3WgWlk6W6wBawuEbJvLPHPx2L16i0iacbbkQi8ZF4pmddswMa9yWOSXwUribGDbdgx_jDGjBoKJUJI-7Aa-aOaRPEoVUTft2R2lNAVErvYwD_GIsIhQiCcJWul-KqPhI3vquvzUHd2rHHvKyTLyvXKyIDeVdBGXTaqFA2ni9xsjUNMOX14ftBZ4_fgDce0jvrZzYRs5IuOMt3K9gKMpBpUWtnlaBYbnYdL2zJuFlrM77PlcYab2uLLqlSe4hh-FxMAc_p_8tDAoU4dPgpgOpU3GRR8i7oszu_MKibzNpRBeAX1UtwKwQepjPnipu9aQlPy9OtgB-5KmGi34EcMKBPg8BN6vHRYg0Za_lk_TtTQ4WbkllAqR3Fla5-RBjzB7f3dWae4ES3VX4f-dI-UYrrKDQkqaS0R_xLaMPNG6_GQMDM7L5Fsa8I3hFjdgfs9rV4Xf_uIFrhUjm25EuT5JCdobNmwBi9VU5nCbk0LQJdrXDNYV3fmD-Y_p_KV8x_-opRnXUV03SCopOD6DhitsFtpv065QXcG1SNDu0mM-kgDh9E-QddtQQtXLLPuKFyX5o1ts08EqXTxHsZo5tIsevbExZoz9hxSRrr-V5swEDcJXoV78_k6sR3iniZ_m77JVo9QU572av2MvNhyu5YeTXyc0m6Me7cPGiO0",
9
- "k": "GmSWkhwjjn38w8OHkD_S-A"
9
+ "k": "x1EvGzxu16FpfYajxFSFWQ"
10
10
  },
11
11
  "master_key": [
12
12
  384287193,
@@ -14,8 +14,8 @@
14
14
  554881366,
15
15
  530403344
16
16
  ],
17
- "expected_uh": "mBdCzS2yFgo",
18
- "sid": "yfMNTyTPzUKOuWYWRO-qhXpBOEN6Q2Y5dFp3JAKn0WNBqLBEzgbaMaILNg",
17
+ "expected_uh": "4h8kPReRUug",
18
+ "sid": "tRUhX2shZiPr8hl2KRGXJ3pBOEN6Q2Y5dFp3lh5A8mZnlSFgTcLOChMkLg",
19
19
  "rsa_private_key_b64": "BACOQ7VCjwkiwYCKhqRRvPTMBaQ5Yx2_sszj6ILrxrTBOJ2bu-9LsOSvaGz0HpnM2lXpJg3h6QWJdlQBOhwvfeafHg7rcEaaDuUWONifv5ABpQgeoAij6cgARMvFiOdjarMvu954Eduup8PHcgfjsBSu76qpu3UqkZCpBpByAYU1oQQA1i5oxuA9i7qsXxhJRsBeceI7hZSnNYAQzsWfFD0kDW8GsJBuK-CST6oNNp0z7MQ5Qof6DZ8x9wt5ZJR43HFmD2VtTQUZLvIeemC4URuR74UWn25CETyzQdIhdNSEibaCRvi0sNwb-ikCZVxxo4-O7ZBQPw0egrQOJW06HlCQUykH_00EIoiBRcbJLS6W3nJ8KhddDf_4glZYPz6fBpqu1jIdIBGOGQf4Ttn_DmdAgkLxWF7AF6k59D45J9kxfANRJIBGSWUsI1bQBlrwFtois4O14uQkQ40Jh_d5BCrLPe599zrliGH1SsECx_xYGWcWY_GPsPa99d_St56BB9oUtDW3A1clEx2uVS8OWqRPgVimu6MXs_TEEnjWGRFofHpl_8qGeAoPbNkXsTMQb6uUK4NCYq3UzVfreByEnOqxuQcu2jlF4Ey0UH9w_KjkRyT8xu--kyZAbktYaw4EZmGUxZIlkZLk_OAGaW8KWPZhdGxjfi8K7WeZK2HtLe4At48DC_ED_20pNtkTCrB6-FQlMj6a4O2C1sE6pSdrIPofcK-HpaefOXqYKWpRM-Wnp_qHnuJgEtgodQ-pw74nXkOsVFZoJzVGCepZKoa2xhevAu3CfXMfR97LIski17PPwWV9n7yQ7onSKDmJP-q4mO7PG7LICE22WkgJkk_T1W4UkDTkCxZE_t64F6JOryg",
20
20
  "decomposed_rsa_private_key": [
21
21
  99901518447147034909201847419097315968297147437151469508360346463543063455874100243913856315732601845631262435262260706834732781343251117295631282035669718956849603873760427510697419513879951677293141811802298231979984193675329310799949319780256427743430868153430092107435691279045586737323088097814348379553,
@@ -89,6 +89,26 @@
89
89
  "k": "zA8CzCf9tZw:Iz6fsJ_qIgmS4uC4eirPnfaZOcLOoQA2t_5wTtfqp7Y",
90
90
  "s": 137080,
91
91
  "ts": 1361697194
92
+ },
93
+ {
94
+ "h": "Cg50GQLT",
95
+ "p": "ywJVFBKB",
96
+ "u": "zA8CzCf9tZw",
97
+ "t": 0,
98
+ "a": "lv-LcMAl0dvpdxQFWNVZ7m9-mFT79mS0Mi_fH9InTqtBgcpe8kRVDGQ5Hj4BrXrc",
99
+ "k": "zA8CzCf9tZw:dmnxCL7Z2x3zFcrGcD9FdbUiMJ9EvCCPdGY39whRv2g",
100
+ "s": 39,
101
+ "ts": 1361925890
102
+ },
103
+ {
104
+ "h": "S0pkHArB",
105
+ "p": "ywJVFBKB",
106
+ "u": "zA8CzCf9tZw",
107
+ "t": 0,
108
+ "a": "OFTM18eQGxUTcJP2BQWXBo23vnjqs4b9QzmNZtDqekz4GZESVNiYlqKtasZqdVHN",
109
+ "k": "zA8CzCf9tZw:cnpz0cav9fLAJHK1TbL3MD5n9R7VvedDwbFRVp4qQh4",
110
+ "s": 137080,
111
+ "ts": 1361925899
92
112
  }
93
113
  ],
94
114
  "ok": [
@@ -104,6 +124,70 @@
104
124
  "m": "megartest@gmail.com"
105
125
  }
106
126
  ],
107
- "sn": "pQ-WDyYPBHU"
127
+ "sn": "2q4ZpNDFGNA"
128
+ },
129
+ "sample_files": {
130
+ "megar_test_sample_1.txt": {
131
+ "file_download_url_response": {
132
+ "s": 39,
133
+ "at": "lv-LcMAl0dvpdxQFWNVZ7m9-mFT79mS0Mi_fH9InTqtBgcpe8kRVDGQ5Hj4BrXrc",
134
+ "g": "http://gfs262n164.userstorage.mega.co.nz/dl/mri5tfEwyd0zbAImLAPBzTeWY8_A6olaAjn4rztgo3cQZ_ovfobz7A5X4vhHxU6xDWX3Gcxkozxb0acSEOyC-wRl7gO3jZrJzqLT13812fUfghQvwQ"
135
+ },
136
+ "key": [
137
+ 2080156050,
138
+ 393781808,
139
+ -1482092335,
140
+ -760625383,
141
+ 758940180,
142
+ 1555777008,
143
+ -1644788558,
144
+ -1184834090
145
+ ],
146
+ "decomposed_key": [
147
+ 1455434630,
148
+ 1271130048,
149
+ 979342435,
150
+ 1808341711
151
+ ],
152
+ "size": 39,
153
+ "iv": [
154
+ 758940180,
155
+ 1555777008,
156
+ 0,
157
+ 0
158
+ ],
159
+ "initial_counter_value": 60129435948344049243162590180076945408
160
+ },
161
+ "megar_test_sample_2.png": {
162
+ "file_download_url_response": {
163
+ "s": 137080,
164
+ "at": "OFTM18eQGxUTcJP2BQWXBo23vnjqs4b9QzmNZtDqekz4GZESVNiYlqKtasZqdVHN",
165
+ "g": "http://gfs262n170.userstorage.mega.co.nz/dl/dpAQXYa5Q7qOQQKAWgqcNsmyPfr8As0DEJlX2LCKmTAvRVlvWpW6F3Hw-xV2Ou2ynF_bfjIcGG5ZO0vi3hf-6rFOx3jAu-FNNSKnvEA1irjUy4hT7g"
166
+ },
167
+ "key": [
168
+ 1029178532,
169
+ 1095006796,
170
+ 361733076,
171
+ -1656803926,
172
+ 1405858242,
173
+ 1396716347,
174
+ 870048465,
175
+ -473559286
176
+ ],
177
+ "decomposed_key": [
178
+ 1855173990,
179
+ 302270839,
180
+ 643070213,
181
+ 2130256544
182
+ ],
183
+ "size": 137080,
184
+ "iv": [
185
+ 1405858242,
186
+ 1396716347,
187
+ 0,
188
+ 0
189
+ ],
190
+ "initial_counter_value": 111383565294958830569229712241211736064
191
+ }
108
192
  }
109
193
  }
@@ -0,0 +1 @@
1
+ Just about the simplest file possible..
@@ -7,15 +7,57 @@ module CryptoExpectationsHelper
7
7
  Pathname.new(File.dirname(__FILE__)).join('..','fixtures','crypto_expectations')
8
8
  end
9
9
 
10
- def crypto_expectations_sample_path(sample_name)
11
- crypto_expectations_path.join("#{sample_name}.json")
10
+ def crypto_expectations_sample_path(sample_name,ext='.json')
11
+ crypto_expectations_path.join("#{sample_name}#{ext}")
12
12
  end
13
13
 
14
14
  # Returns the JSON representation of +sample_name+ expectations
15
- def crypto_expectations(sample_name)
15
+ def crypto_expectations(sample_name='sample_user')
16
16
  JSON.parse(crypto_expectations_sample_path(sample_name).read)
17
17
  end
18
18
 
19
+ def crypto_sample_encrypted_file_stream(filename)
20
+ File.open(crypto_expectations_sample_path(filename,'.enc'),'rb')
21
+ end
22
+
23
+ # Returns the expected raw (encrypted) content for +filename+
24
+ def crypto_sample_encrypted_file_content(filename)
25
+ crypto_sample_encrypted_file_stream(filename).read
26
+ end
27
+
28
+ def crypto_sample_files_path
29
+ Pathname.new(File.dirname(__FILE__)).join('..','fixtures','sample_files')
30
+ end
31
+
32
+ def crypto_sample_file_path(filename)
33
+ crypto_sample_files_path.join(filename)
34
+ end
35
+
36
+ def crypto_sample_file_stream(filename)
37
+ File.open(crypto_sample_file_path(filename),'rb')
38
+ end
39
+
40
+ # Returns the expected (decrypted) content for +filename+
41
+ def crypto_sample_decrypted_content(filename)
42
+ crypto_sample_file_path(filename).read
43
+ end
44
+
45
+ # Writes the crypto expectations file and returns the file name used
46
+ def write_crypto_expectations(content,sample_name='sample_user')
47
+ filename = crypto_expectations_sample_path(sample_name)
48
+ File.open(filename,'w') do |f|
49
+ f.write JSON.pretty_generate(content)
50
+ end
51
+ filename
52
+ end
53
+
54
+ def write_file_download_sample(filename,raw_content)
55
+ fn = crypto_expectations_sample_path(filename,'.enc')
56
+ File.open(fn,'wb') do |f|
57
+ f.write raw_content
58
+ end
59
+ end
60
+
19
61
  def generate_crypto_expectations(email,password)
20
62
  STDERR.puts "\nGenerating crypto_expectations for #{email}..."
21
63
  e = {email: email.downcase, email_mixed_case: email.capitalize, password: password, autoconnect: false }
@@ -28,17 +70,48 @@ module CryptoExpectationsHelper
28
70
  e[:rsa_private_key_b64] = session.rsa_private_key_b64
29
71
  e[:decomposed_rsa_private_key] = session.decomposed_rsa_private_key
30
72
  e[:files_response_data] = session.send(:get_files_response)
73
+ session.send(:handle_files_response,e[:files_response_data])
74
+ megar_test_sample_1 = session.files.find_by_name('megar_test_sample_1.txt')
75
+ megar_test_sample_2 = session.files.find_by_name('megar_test_sample_2.png')
76
+ if megar_test_sample_1 && megar_test_sample_2
77
+ downloader = megar_test_sample_1.downloader
78
+ sample_1 = {
79
+ file_download_url_response: downloader.download_url_response,
80
+ key: megar_test_sample_1.key,
81
+ decomposed_key: megar_test_sample_1.decomposed_key,
82
+ size: downloader.download_size,
83
+ iv: downloader.iv,
84
+ initial_counter_value: downloader.initial_counter_value
85
+ }
86
+ write_file_download_sample(megar_test_sample_1.name,downloader.raw_content)
87
+
88
+ downloader = megar_test_sample_2.downloader
89
+ sample_2 = {
90
+ file_download_url_response: downloader.download_url_response,
91
+ key: megar_test_sample_2.key,
92
+ decomposed_key: megar_test_sample_2.decomposed_key,
93
+ size: downloader.download_size,
94
+ iv: downloader.iv,
95
+ initial_counter_value: downloader.initial_counter_value
96
+ }
97
+ write_file_download_sample(megar_test_sample_2.name,downloader.raw_content)
98
+
99
+ e[:sample_files] = {
100
+ megar_test_sample_1.name => sample_1,
101
+ megar_test_sample_2.name => sample_2
102
+ }
103
+ else
104
+ raise "\n\nI can't find the expected samples files for testing in this account. Please upload the sample files in 'spec/fixtures/sample_files' and try this again.."
105
+ end
31
106
  end
32
- efn = crypto_expectations_sample_path('sample_user')
33
- ef = File.open(efn,'w')
34
- ef.write JSON.pretty_generate(e)
35
- ef.close
36
- STDERR.puts "\nDone! New crypto_expectations for unit test written to:\n#{efn}\n\n"
107
+ filename = write_crypto_expectations(e)
108
+ STDERR.puts "\nDone! New crypto_expectations for unit test written to:\n#{filename}\n\n"
37
109
  end
38
110
 
39
111
  end
40
112
 
41
113
 
42
114
  RSpec.configure do |conf|
115
+ conf.extend CryptoExpectationsHelper # so that these methods are available outside of individual tests
43
116
  conf.include CryptoExpectationsHelper
44
117
  end
@@ -1,19 +1,41 @@
1
1
  module MocksHelper
2
2
 
3
- def session_with_mocked_api_responses(options, mock_dataset='sample_user')
3
+ def session_with_mocked_api_responses(options={}, mock_dataset='sample_user')
4
4
  test_data = crypto_expectations(mock_dataset)
5
- session = Megar::Session.new(options.merge(autoconnect: false))
5
+ base_options = {
6
+ email: test_data['email'],
7
+ password: test_data['password']
8
+ }
9
+ session = Megar::Session.new(base_options.merge(options).merge(autoconnect: false))
6
10
  session.stub(:get_login_response).and_return(test_data['login_response_data'])
7
11
  session.stub(:get_files_response).and_return(test_data['files_response_data'])
8
12
  session
9
13
  end
10
14
 
11
- def connected_session_with_mocked_api_responses(options, mock_dataset='sample_user')
12
- session = session_with_mocked_api_responses(options, mock_dataset='sample_user')
15
+ def connected_session_with_mocked_api_responses(options={}, mock_dataset='sample_user')
16
+ session = session_with_mocked_api_responses(options, mock_dataset)
13
17
  session.connect!
14
18
  session
15
19
  end
16
20
 
21
+ def dummy_session_with_files_and_folders
22
+ session = Megar::Session.new(autoconnect: false)
23
+ session.stub(:api_request).and_return(nil) # just to be sure it wont work
24
+ session.reset_files!
25
+ session.folders.add(id: 'rootid', type: 2) # Root
26
+ session.folders.add(id: 'inboxid', type: 3) # Inbox
27
+ session.folders.add(id: 'trashid', type: 4) # Trash
28
+ session.folders.add(id: 'dir1', type: 1, name: 'User Folder 1')
29
+ session.folders.add(id: 'dir2', type: 1, name: 'User Folder 2')
30
+ session.folders.add(id: 'dir3', type: 1, name: 'User Folder 3', parent_folder_id: 'dir1')
31
+
32
+ session.files.add(id: 'file1', type: 0, name: 'User File 1', parent_folder_id: 'dir1')
33
+ session.files.add(id: 'file2', type: 0, name: 'User File 2', parent_folder_id: 'dir1')
34
+ session.files.add(id: 'file3', type: 0, name: 'User File 3', parent_folder_id: 'dir3')
35
+
36
+ session
37
+ end
38
+
17
39
  end
18
40
 
19
41
 
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+
3
+ describe Megar::FileDownloader do
4
+ let(:model_class) { Megar::FileDownloader }
5
+ let(:instance) { model_class.new(attributes) }
6
+ let(:attributes) { {} }
7
+
8
+ describe "#get_chunks (protected)" do
9
+ subject { instance.send(:get_chunks,size) }
10
+ {
11
+ 122000 => [[0, 122000]],
12
+ 332000 => [[0, 131072], [131072, 200928]],
13
+ 500000 => [[0, 131072], [131072, 262144], [393216, 106784]],
14
+ 800000 => [[0, 131072], [131072, 262144], [393216, 393216], [786432, 13568]],
15
+ 1800000 => [[0, 131072], [131072, 262144], [393216, 393216], [786432, 524288], [1310720, 489280]],
16
+ 2000000 => [[0, 131072], [131072, 262144], [393216, 393216], [786432, 524288], [1310720, 655360], [1966080, 33920]],
17
+ 2800000 => [[0, 131072], [131072, 262144], [393216, 393216], [786432, 524288], [1310720, 655360], [1966080, 786432], [2752512, 47488]],
18
+ 3800000 => [[0, 131072], [131072, 262144], [393216, 393216], [786432, 524288], [1310720, 655360], [1966080, 786432], [2752512, 917504], [3670016, 129984]],
19
+ 4800000 => [[0, 131072], [131072, 262144], [393216, 393216], [786432, 524288], [1310720, 655360], [1966080, 786432], [2752512, 917504], [3670016, 1048576], [4718592, 81408]],
20
+ 20800000 => [[0, 131072], [131072, 262144], [393216, 393216], [786432, 524288], [1310720, 655360], [1966080, 786432], [2752512, 917504], [3670016, 1048576], [4718592, 1048576], [5767168, 1048576], [6815744, 1048576], [7864320, 1048576], [8912896, 1048576], [9961472, 1048576], [11010048, 1048576], [12058624, 1048576], [13107200, 1048576], [14155776, 1048576], [15204352, 1048576], [16252928, 1048576], [17301504, 1048576], [18350080, 1048576], [19398656, 1048576], [20447232, 352768]],
21
+ }.each do |size,chunks|
22
+ context "when size=#{size}" do
23
+ let(:size) { size }
24
+ let(:expected) { chunks }
25
+ it { should eql(chunks) }
26
+ end
27
+ end
28
+ end
29
+
30
+ crypto_expectations['sample_files'].keys.each do |sample_file_name|
31
+ context "with an active session testing download of #{sample_file_name}" do
32
+
33
+ let(:file_name) { sample_file_name }
34
+ let(:file_expectation) { crypto_expectations['sample_files'][file_name] }
35
+
36
+ let(:sample_encrypted_content) { crypto_sample_encrypted_file_content(file_name) }
37
+ let(:sample_encrypted_content_digest) { Digest::SHA1.hexdigest(sample_encrypted_content) }
38
+
39
+ let(:sample_decrypted_content) { crypto_sample_decrypted_content(file_name) }
40
+ let(:sample_decrypted_content_digest) { Digest::SHA1.hexdigest(sample_decrypted_content) }
41
+
42
+ let(:session) { connected_session_with_mocked_api_responses }
43
+ let(:file) { session.files.find_by_name(file_name) }
44
+ let(:attributes) { { file: file } }
45
+
46
+ before do
47
+ session.stub(:get_file_download_url_response).and_return(file_expectation['file_download_url_response'])
48
+ instance.stub(:stream).and_return(crypto_sample_encrypted_file_stream(file_name))
49
+ end
50
+
51
+ describe "#download_url_response" do
52
+ let(:expected) { file_expectation['file_download_url_response'] }
53
+ subject { instance.download_url_response }
54
+ it { should eql(expected) }
55
+ end
56
+
57
+ describe "#download_url" do
58
+ let(:expected) { /mega\.co\.nz\/dl/ }
59
+ subject { instance.download_url }
60
+ it { should match(expected) }
61
+ end
62
+
63
+ describe "#download_size" do
64
+ let(:expected) { file_expectation['size'] }
65
+ subject { instance.download_size }
66
+ it { should eql(expected) }
67
+ end
68
+
69
+ describe "#download_attributes" do
70
+ let(:expected) { { 'n' => file_name } }
71
+ subject { instance.download_attributes }
72
+ it { should eql(expected) }
73
+ end
74
+
75
+ describe "#iv" do
76
+ let(:expected) { file_expectation['iv'] }
77
+ subject { instance.iv }
78
+ it { should eql(expected) }
79
+ end
80
+
81
+ describe "#initial_counter_value" do
82
+ let(:expected) { file_expectation['initial_counter_value'] }
83
+ subject { instance.initial_counter_value }
84
+ it { should eql(expected) }
85
+ end
86
+
87
+ describe "#raw_content" do
88
+ subject { Digest::SHA1.hexdigest(instance.raw_content) }
89
+ it { should eql(sample_encrypted_content_digest) }
90
+ end
91
+
92
+ describe "#content" do
93
+ subject { Digest::SHA1.hexdigest(instance.content) }
94
+ it { should eql(sample_decrypted_content_digest) }
95
+ end
96
+
97
+ end
98
+ end
99
+
100
+ end
@@ -7,11 +7,13 @@ describe Megar::File 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) { 0 }
12
13
  let(:size) { 33 }
13
14
  let(:payload) { {
14
- 's' => size
15
+ 's' => size,
16
+ 'p' => parent_folder_id
15
17
  } }
16
18
  let(:attributes) { {
17
19
  id: id,
@@ -21,11 +23,26 @@ describe Megar::File do
21
23
  'n' => name
22
24
  }
23
25
  } }
26
+
24
27
  subject { instance }
25
- its(:id) { should eql(id) }
26
- its(:name) { should eql(name) }
27
- its(:type) { should eql(type) }
28
- its(:size) { should eql(size) }
28
+
29
+ its(:id) { should eql(id) }
30
+ its(:name) { should eql(name) }
31
+ its(:type) { should eql(type) }
32
+ its(:size) { should eql(size) }
33
+ its(:parent_folder_id) { should eql(parent_folder_id) }
34
+ its(:body) { should be_nil }
35
+ end
36
+
37
+ context "with an active session" do
38
+ let(:session) { connected_session_with_mocked_api_responses }
39
+ let(:file) { session.files.find_by_name('megar_test_sample_1.txt') }
40
+
41
+ describe "#downloader" do
42
+ subject { instance.downloader }
43
+ it { should be_a(Megar::FileDownloader) }
44
+ end
45
+
29
46
  end
30
47
 
31
48
  end