test/integration/rapidshare-ext_test.rb in rapidshare-ext-0.0.6 vs test/integration/rapidshare-ext_test.rb in rapidshare-ext-0.1.0

- old
+ new

@@ -1,32 +1,55 @@ -# encoding: utf-8 require 'digest/md5' -require File.expand_path(File.dirname(__FILE__) + "/../test_helper") +require File.expand_path(File.dirname(__FILE__) + '/../test_helper') class RapidshareExtTest < Test::Unit::TestCase def setup FakeWeb.allow_net_connect = true @rs = Rapidshare::API.new :cookie => ENV['RAPIDSHARE_COOKIE'] + + account = @rs.get_account_details + + # Check the account is the actually we wanted, because it will be erased in the next step + assert_equal ENV['RAPIDSHARE_USERNAME'], account[:username] + assert_equal ENV['RAPIDSHARE_EMAIL'], account[:email] + assert_equal ENV['RAPIDSHARE_ACCOUNT_ID'], account[:accountid] + @rs.erase_all_data! - @download_dir = File.expand_path(File.dirname(__FILE__) + "/../../tmp") - File.delete "#@download_dir/file1.txt" if File.exist? "#@download_dir/file1.txt" - File.delete "#@download_dir/file2.txt" if File.exist? "#@download_dir/file2.txt" - File.delete "#@download_dir/upload_file_1.txt" if File.exist? "#@download_dir/upload_file_1.txt" + @download_dir = File.expand_path(File.dirname(__FILE__) + '/../../tmp') + %w{file1.txt file2.txt file3.txt upload_file_1.txt}.each do |filename| + File.delete "#@download_dir/#{filename}" if File.exist? "#@download_dir/#{filename}" + end - @upload_file_1 = File.expand_path(File.dirname(__FILE__) + "/../fixtures/files/upload1.txt") + @upload_file_1 = File.expand_path(File.dirname(__FILE__) + '/../fixtures/files/upload1.txt') @upload_file_1_md5 = Digest::MD5.hexdigest(File.read(@upload_file_1)) @upload_file_1_size = File.size @upload_file_1 - @upload_file_2 = File.expand_path(File.dirname(__FILE__) + "/../fixtures/files/upload2.txt") + @upload_file_2 = File.expand_path(File.dirname(__FILE__) + '/../fixtures/files/upload2.txt') @upload_file_2_md5 = Digest::MD5.hexdigest(File.read(@upload_file_2)) @upload_file_2_size = File.size @upload_file_2 + + @upload_file_3 = File.expand_path(File.dirname(__FILE__) + '/../fixtures/files/upload3.txt') + @upload_file_3_md5 = Digest::MD5.hexdigest(File.read(@upload_file_3)) + @upload_file_3_size = 102598 # 100 Kb end - context "Api" do - should "upload file" do + context 'Api' do + + should 'initialize by login and password' do + rs = Rapidshare::API.new :login => ENV['RAPIDSHARE_USERNAME'], + :password => ENV['RAPIDSHARE_PASSWORD'] + assert_equal ENV['RAPIDSHARE_COOKIE'], rs.cookie + + account = rs.get_account_details + assert_equal ENV['RAPIDSHARE_USERNAME'], account[:username] + assert_equal ENV['RAPIDSHARE_EMAIL'], account[:email] + assert_equal ENV['RAPIDSHARE_ACCOUNT_ID'], account[:accountid] + end + + should 'upload file' do upload_assertion = ->(resp, size_local, digest_local, remote_filename) do assert_instance_of Hash, resp assert_kind_of Integer, resp[:id] assert_kind_of Integer, resp[:size] assert_equal size_local, resp[:size] @@ -35,12 +58,12 @@ assert_equal digest_local, resp[:checksum] assert_instance_of String, resp[:url] assert_equal "https://rapidshare.com/files/#{resp[:id]}/#{URI::encode(remote_filename)}", resp[:url] end - remote_filename = "upload_file_1.txt" - remote_dir = "a/b/c" + remote_filename = 'upload_file_1.txt' + remote_dir = 'a/b/c' remote_path = "#{remote_dir}/#{remote_filename}" # Initial upload response = @rs.upload @upload_file_1, :as => remote_filename, :to => remote_dir upload_assertion.call response, @upload_file_1_size, @upload_file_1_md5, remote_filename @@ -73,174 +96,232 @@ assert_false response[:already_exists?] upload_assertion.call response, @upload_file_2_size, @upload_file_2_md5, remote_filename end - should "download file" do - @rs.upload @upload_file_1, :to => "/a/b/c", :as => "upload_file_1.txt" - assert_not_nil @rs.file_info("/a/b/c/upload_file_1.txt") + should 'download file' do + # Download file with denied access + instance = @rs.download 'https://rapidshare.com/files/829628035/HornyRhinos.jpg', :downloads_dir => @download_dir + assert_equal 'Access denied', instance.error - @rs.download "/a/b/c/upload_file_1.txt", :downloads_dir => @download_dir, :save_as => "file1.txt" + # Download invalid file + instance = @rs.download 'https://rapidshare.com/files/000000000/NonExistingFile.zip', :downloads_dir => @download_dir + assert_equal 'File not found', instance.error + + @rs.upload @upload_file_1, :to => '/a/b/c', :as => 'upload_file_1.txt' + assert_not_nil @rs.file_info('/a/b/c/upload_file_1.txt') + + res = @rs.download '/a/b/c/upload_file_1.txt', :downloads_dir => @download_dir, :save_as => 'file1.txt' + assert_true res.downloaded? + assert_nil res.error assert_path_exist "#@download_dir/file1.txt" assert_equal @upload_file_1_size, File.size("#@download_dir/file1.txt") assert_equal @upload_file_1_md5, Digest::MD5.hexdigest(File.read("#@download_dir/file1.txt")) # Download with default :save_as - @rs.download "/a/b/c/upload_file_1.txt", :downloads_dir => @download_dir + res = @rs.download '/a/b/c/upload_file_1.txt', :downloads_dir => @download_dir + assert_true res.downloaded? + assert_nil res.error assert_path_exist "#@download_dir/upload_file_1.txt" assert_equal @upload_file_1_size, File.size("#@download_dir/upload_file_1.txt") assert_equal @upload_file_1_md5, Digest::MD5.hexdigest(File.read("#@download_dir/upload_file_1.txt")) # Download by http url - download_url = @rs.file_info("/a/b/c/upload_file_1.txt")[:url] - @rs.download download_url, :downloads_dir => @download_dir, :save_as => "file2.txt" + download_url = @rs.file_info('/a/b/c/upload_file_1.txt')[:url] + res = @rs.download download_url, :downloads_dir => @download_dir, :save_as => 'file2.txt' + assert_true res.downloaded? + assert_nil res.error assert_path_exist "#@download_dir/file2.txt" assert_equal @upload_file_1_size, File.size("#@download_dir/file2.txt") assert_equal @upload_file_1_md5, Digest::MD5.hexdigest(File.read("#@download_dir/file2.txt")) + + @rs.upload @upload_file_3, :to => '/a/b/c', :as => 'upload_3.txt' + assert_not_nil @rs.file_info('/a/b/c/upload_3.txt') + + # Download file with a flow control + file = '/a/b/c/upload_3.txt' + https_url = @rs.file_info(file)[:url] + expected_metrics = [ + [0, 0, @upload_file_3_size, 0], + [16384, 16384, @upload_file_3_size, 15.97], + [16384, 32768, @upload_file_3_size, 31.94], + [16384, 49152, @upload_file_3_size, 47.91], + [16384, 65536, @upload_file_3_size, 63.88], + [16384, 81920, @upload_file_3_size, 79.85], + [16384, 98304, @upload_file_3_size, 95.81], + [4294, 102598, @upload_file_3_size, 100.00], + ] + + # Download through HTTPS + metrics = [] + res = @rs.download https_url, :downloads_dir => @download_dir, :save_as => 'file3.txt' \ + do |chunk_size, downloaded, total, progress| + metrics << [chunk_size, downloaded, total, progress] + end + + assert_equal expected_metrics, metrics + assert_true res.downloaded? + assert_nil res.error + assert_equal @upload_file_3_size, File.size("#@download_dir/file3.txt") + assert_equal @upload_file_3_md5, Digest::MD5.hexdigest(File.read("#@download_dir/file3.txt")) + + # Download through HTTP + metrics = [] + http_url = https_url.gsub /^https/, 'http' + res = @rs.download http_url, :downloads_dir => @download_dir, :save_as => 'file3.txt' \ + do |chunk_size, downloaded, total, progress| + metrics << [chunk_size, downloaded, total, progress] + end + + assert_equal expected_metrics, metrics + assert_true res.downloaded? + assert_nil res.error + assert_equal @upload_file_3_size, File.size("#@download_dir/file3.txt") + assert_equal @upload_file_3_md5, Digest::MD5.hexdigest(File.read("#@download_dir/file3.txt")) end - should "rename file" do - @rs.upload @upload_file_1, :to => "/a/b/c", :as => "upload_file_1.txt" - assert_not_nil @rs.file_info("/a/b/c/upload_file_1.txt") + should 'rename file' do + @rs.upload @upload_file_1, :to => '/a/b/c', :as => 'upload_file_1.txt' + assert_not_nil @rs.file_info('/a/b/c/upload_file_1.txt') - @rs.rename_file "/a/b/c/upload_file_1.txt", "file_2.txt" - info = @rs.file_info "/a/b/c/file_2.txt" + @rs.rename_file '/a/b/c/upload_file_1.txt', 'file_2.txt' + info = @rs.file_info '/a/b/c/file_2.txt' assert_not_nil info - assert_equal info[:filename], "file_2.txt" - assert_equal info[:realfolder].to_i, @rs.folder_id("/a/b/c") + assert_equal info[:filename], 'file_2.txt' + assert_equal info[:realfolder].to_i, @rs.folder_id('/a/b/c') assert_equal info[:size].to_i, @upload_file_1_size assert_equal info[:md5hex].downcase, @upload_file_1_md5 end - should "move file" do - @rs.upload @upload_file_1, :to => "/a/b/c", :as => "upload_file_1.txt" - assert_not_nil @rs.file_info("/a/b/c/upload_file_1.txt") + should 'move file' do + @rs.upload @upload_file_1, :to => '/a/b/c', :as => 'upload_file_1.txt' + assert_not_nil @rs.file_info('/a/b/c/upload_file_1.txt') - @rs.move_file "/a/b/c/upload_file_1.txt", :to => "/a/b" - assert_nil @rs.file_info("/a/b/c/upload_file_1.txt") + @rs.move_file '/a/b/c/upload_file_1.txt', :to => '/a/b' + assert_nil @rs.file_info('/a/b/c/upload_file_1.txt') - info = @rs.file_info "/a/b/upload_file_1.txt" + info = @rs.file_info '/a/b/upload_file_1.txt' assert_not_nil info - assert_equal info[:filename], "upload_file_1.txt" - assert_equal info[:realfolder].to_i, @rs.folder_id("/a/b") + assert_equal info[:filename], 'upload_file_1.txt' + assert_equal info[:realfolder].to_i, @rs.folder_id('/a/b') assert_equal info[:size].to_i, @upload_file_1_size assert_equal info[:md5hex].downcase, @upload_file_1_md5 end - should "delete file" do - @rs.upload @upload_file_1, :to => "/a/b/c", :as => "upload_file_1.txt" - assert_not_nil @rs.file_info("/a/b/c/upload_file_1.txt") + should 'delete file' do + @rs.upload @upload_file_1, :to => '/a/b/c', :as => 'upload_file_1.txt' + assert_not_nil @rs.file_info('/a/b/c/upload_file_1.txt') - @rs.remove_file "/a/b/c/upload_file_1.txt" - assert_nil @rs.file_info("/a/b/c/upload_file_1.txt") + @rs.remove_file '/a/b/c/upload_file_1.txt' + assert_nil @rs.file_info('/a/b/c/upload_file_1.txt') end - should "folder id <=> path conversions" do - @rs.add_folder "/a/b/c" - id = @rs.folder_id("/a/b/c") - assert_equal "/a/b/c", @rs.folder_path(id) + should 'folder id <=> path conversions' do + @rs.add_folder '/a/b/c' + id = @rs.folder_id('/a/b/c') + assert_equal '/a/b/c', @rs.folder_path(id) end - should "create folder" do - folder_id = @rs.add_folder "a/b/c" + should 'create folder' do + folder_id = @rs.add_folder 'a/b/c' assert_kind_of Integer, folder_id assert_not_equal 0, folder_id tree = @rs.folders_hierarchy assert_equal 3, tree.count - assert_equal "/a/b/c", tree[folder_id][:path] - assert_equal "/a/b", tree[tree[folder_id][:parent]][:path] - assert_equal "/a", tree[tree[tree[folder_id][:parent]][:parent]][:path] + assert_equal '/a/b/c', tree[folder_id][:path] + assert_equal '/a/b', tree[tree[folder_id][:parent]][:path] + assert_equal '/a', tree[tree[tree[folder_id][:parent]][:parent]][:path] end - should "move folder" do - folder_id = @rs.add_folder "/a/b/c" + should 'move folder' do + folder_id = @rs.add_folder '/a/b/c' assert_kind_of Integer, folder_id assert_not_equal 0, folder_id tree = @rs.folders_hierarchy assert_equal 3, tree.count - assert_equal "/a/b/c", tree[folder_id][:path] - assert_equal "/a/b", tree[tree[folder_id][:parent]][:path] - assert_equal "/a", tree[tree[tree[folder_id][:parent]][:parent]][:path] + assert_equal '/a/b/c', tree[folder_id][:path] + assert_equal '/a/b', tree[tree[folder_id][:parent]][:path] + assert_equal '/a', tree[tree[tree[folder_id][:parent]][:parent]][:path] - @rs.move_folder "/a/b/c", :to => 'a' + @rs.move_folder '/a/b/c', :to => 'a' tree = @rs.reload! assert_equal 3, tree.count - assert_equal "/a/c", tree[folder_id][:path] - assert_equal @rs.folder_id("/a"), tree[folder_id][:parent] + assert_equal '/a/c', tree[folder_id][:path] + assert_equal @rs.folder_id('/a'), tree[folder_id][:parent] end - should "remove folder" do - folder_id = @rs.add_folder "a/b/c" + should 'remove folder' do + folder_id = @rs.add_folder 'a/b/c' assert_kind_of Integer, folder_id assert_not_equal 0, folder_id tree = @rs.folders_hierarchy assert_equal 3, tree.count - @rs.remove_folder "/a/b/c" + @rs.remove_folder '/a/b/c' tree = @rs.folders_hierarchy! assert_equal 2, tree.count - folder_id = @rs.add_folder "/a/b/c" + folder_id = @rs.add_folder '/a/b/c' assert_kind_of Integer, folder_id assert_not_equal 0, folder_id tree = @rs.folders_hierarchy! assert_equal 3, tree.count - @rs.remove_folder "/a" + @rs.remove_folder '/a' tree = @rs.folders_hierarchy! assert_equal 0, tree.count end - should "build folders tree" do + should 'build folders tree' do # Create folders - folder_a_id = @rs.add_folder "/a" + folder_a_id = @rs.add_folder '/a' assert_kind_of Integer, folder_a_id assert_not_equal 0, folder_a_id - folder_b_id = @rs.add_folder "/a/b" + folder_b_id = @rs.add_folder '/a/b' assert_kind_of Integer, folder_b_id assert_not_equal 0, folder_b_id - folder_c_id = @rs.add_folder "/a/b/c" + folder_c_id = @rs.add_folder '/a/b/c' assert_kind_of Integer, folder_c_id assert_not_equal 0, folder_c_id tree = @rs.folders_hierarchy # Validate tree assert_equal 3, tree.count - assert_equal "a", tree[folder_a_id][:name] - assert_equal "/a", tree[folder_a_id][:path] + assert_equal 'a', tree[folder_a_id][:name] + assert_equal '/a', tree[folder_a_id][:path] assert_equal 0, tree[folder_a_id][:parent] - assert_equal "b", tree[folder_b_id][:name] - assert_equal "/a/b", tree[folder_b_id][:path] + assert_equal 'b', tree[folder_b_id][:name] + assert_equal '/a/b', tree[folder_b_id][:path] assert_equal folder_a_id, tree[folder_b_id][:parent] - assert_equal "c", tree[folder_c_id][:name] - assert_equal "/a/b/c", tree[folder_c_id][:path] + assert_equal 'c', tree[folder_c_id][:name] + assert_equal '/a/b/c', tree[folder_c_id][:path] assert_equal folder_b_id, tree[folder_c_id][:parent] # Validate subtree sub_tree = @rs.folders_hierarchy :from => '/a/b' assert_equal 1, sub_tree.count - assert_equal "/c", sub_tree[folder_c_id][:path] - assert_equal "c", sub_tree[folder_c_id][:name] + assert_equal '/c', sub_tree[folder_c_id][:path] + assert_equal 'c', sub_tree[folder_c_id][:name] assert_equal folder_b_id, sub_tree[folder_c_id][:parent] end - should "erase all account data" do - folder_id = @rs.add_folder "/a/b/c" + should 'erase all account data' do + folder_id = @rs.add_folder '/a/b/c' assert_kind_of Integer, folder_id folder_ids = @rs.folders_hierarchy.keys assert_true folder_ids.count > 0 @@ -249,21 +330,21 @@ folder_ids = @rs.folders_hierarchy.keys assert_equal 0, folder_ids.count end - should "move orphans" do + should 'move orphans' do # Create folders - folder_a_id = @rs.add_folder "/a" + folder_a_id = @rs.add_folder '/a' assert_kind_of Integer, folder_a_id assert_not_equal 0, folder_a_id - folder_b_id = @rs.add_folder "/a/b" + folder_b_id = @rs.add_folder '/a/b' assert_kind_of Integer, folder_b_id assert_not_equal 0, folder_b_id - folder_c_id = @rs.add_folder "/a/b/c" + folder_c_id = @rs.add_folder '/a/b/c' assert_kind_of Integer, folder_c_id assert_not_equal 0, folder_c_id @rs.reload! @@ -273,11 +354,11 @@ assert_false @rs.orphan? folder_a_id assert_false @rs.orphan? folder_b_id assert_false @rs.orphan? folder_c_id - # Delete just folder "/a" to accomplish tree inconsistency + # Delete just folder '/a' to accomplish tree inconsistency @rs.delrealfolder :realfolder => folder_a_id @rs.reload! :validate => false assert_equal [folder_b_id], @rs.detect_gaps @@ -288,30 +369,30 @@ assert_false @rs.orphan? folder_a_id assert_true @rs.orphan? folder_b_id assert_true @rs.orphan? folder_c_id # Move orphan folders to root folder - @rs.move_orphans :to => "/" + @rs.move_orphans :to => '/' hierarchy_expected = { - folder_c_id => {:name=>"c", :parent => folder_b_id, :path => "/b/c"}, - folder_b_id => {:name=>"b", :parent => 0, :path => "/b"}, + folder_c_id => {:name=>'c', :parent => folder_b_id, :path => '/b/c'}, + folder_b_id => {:name=>'b', :parent => 0, :path => '/b'}, } assert_equal hierarchy_expected, @rs.folders_hierarchy! end - should "delete orphans" do + should 'delete orphans' do # Create folders - folder_a_id = @rs.add_folder "/a" + folder_a_id = @rs.add_folder '/a' assert_kind_of Integer, folder_a_id assert_not_equal 0, folder_a_id - folder_b_id = @rs.add_folder "/a/b" + folder_b_id = @rs.add_folder '/a/b' assert_kind_of Integer, folder_b_id assert_not_equal 0, folder_b_id - folder_c_id = @rs.add_folder "/a/b/c" + folder_c_id = @rs.add_folder '/a/b/c' assert_kind_of Integer, folder_c_id assert_not_equal 0, folder_c_id @rs.reload! @@ -321,34 +402,34 @@ assert_false @rs.orphan? folder_a_id assert_false @rs.orphan? folder_b_id assert_false @rs.orphan? folder_c_id - # Delete just folder "/a" to accomplish tree inconsistency + # Delete just folder '/a' to accomplish tree inconsistency @rs.delrealfolder :realfolder => folder_a_id @rs.reload! :validate => false @rs.remove_orphans! hierarchy_expected = { - folder_c_id => {:name=>"c", :parent => folder_b_id, :path => "/b/c"}, - folder_b_id => {:name=>"b", :parent => 0, :path => "/b"}, + folder_c_id => {:name=>'c', :parent => folder_b_id, :path => '/b/c'}, + folder_b_id => {:name=>'b', :parent => 0, :path => '/b'}, } assert_equal ({}), @rs.folders_hierarchy! end - should "work with invalid tree" do + should 'work with invalid tree' do # Create folders - folder_a_id = @rs.add_folder "/a" + folder_a_id = @rs.add_folder '/a' assert_kind_of Integer, folder_a_id assert_not_equal 0, folder_a_id - folder_b_id = @rs.add_folder "/a/b" + folder_b_id = @rs.add_folder '/a/b' assert_kind_of Integer, folder_b_id assert_not_equal 0, folder_b_id - folder_c_id = @rs.add_folder "/a/b/c" + folder_c_id = @rs.add_folder '/a/b/c' assert_kind_of Integer, folder_c_id assert_not_equal 0, folder_c_id @rs.reload! @@ -358,10 +439,10 @@ assert_false @rs.orphan? folder_a_id assert_false @rs.orphan? folder_b_id assert_false @rs.orphan? folder_c_id - # Delete just folder "/a" to accomplish tree inconsistency + # Delete just folder '/a' to accomplish tree inconsistency @rs.delrealfolder :realfolder => folder_a_id msg = "Directory tree consistency error. Parent folder ##{folder_a_id} for the folder \"/<undefined>/b\" [#{folder_b_id}] could not be found" assert_raise_message(msg) do @rs.reload! :validate => true