From 619a2055fe40a3d21a398c8cd1ffec865ef8e46f Mon Sep 17 00:00:00 2001 From: evazion Date: Sat, 17 Mar 2018 16:04:09 -0500 Subject: [PATCH] tests: add storage manager tests. --- test/unit/storage_manager_test.rb | 124 ++++++++++++++++++++++++++++++ test/unit/upload_test.rb | 8 ++ 2 files changed, 132 insertions(+) create mode 100644 test/unit/storage_manager_test.rb diff --git a/test/unit/storage_manager_test.rb b/test/unit/storage_manager_test.rb new file mode 100644 index 000000000..5b4adc911 --- /dev/null +++ b/test/unit/storage_manager_test.rb @@ -0,0 +1,124 @@ +require 'test_helper' + +class StorageManagerTest < ActiveSupport::TestCase + BASE_DIR = "#{Rails.root}/tmp/test-storage" + + setup do + CurrentUser.ip_addr = "127.0.0.1" + end + + context "StorageManager::Local" do + setup do + @storage_manager = StorageManager::Local.new(base_dir: BASE_DIR, base_url: "/data") + end + + teardown do + FileUtils.rm_rf(BASE_DIR) + end + + context "#store method" do + should "store the file" do + @storage_manager.store(StringIO.new("data"), "#{BASE_DIR}/test.txt") + + assert("data", File.read("#{BASE_DIR}/test.txt")) + end + + should "overwrite the file if it already exists" do + @storage_manager.store(StringIO.new("foo"), "#{BASE_DIR}/test.txt") + @storage_manager.store(StringIO.new("bar"), "#{BASE_DIR}/test.txt") + + assert("bar", File.read("#{BASE_DIR}/test.txt")) + end + end + + context "#delete method" do + should "delete the file" do + @storage_manager.store(StringIO.new("data"), "test.txt") + @storage_manager.delete("test.txt") + + assert_not(File.exist?("#{BASE_DIR}/test.txt")) + end + + should "not fail if the file doesn't exist" do + assert_nothing_raised { @storage_manager.delete("dne.txt") } + end + end + + context "#store_file and #delete_file methods" do + setup do + @post = FactoryGirl.create(:post, file_ext: "png") + + @storage_manager.store_file(StringIO.new("data"), @post, :preview) + @storage_manager.store_file(StringIO.new("data"), @post, :large) + @storage_manager.store_file(StringIO.new("data"), @post, :original) + + @file_path = "#{BASE_DIR}/preview/#{@post.md5}.jpg" + @large_file_path = "#{BASE_DIR}/sample/sample-#{@post.md5}.jpg" + @preview_file_path = "#{BASE_DIR}/#{@post.md5}.#{@post.file_ext}" + end + + should "store the files at the correct path" do + assert(File.exist?(@file_path)) + assert(File.exist?(@large_file_path)) + assert(File.exist?(@preview_file_path)) + end + + should "delete the files" do + @storage_manager.delete_file(@post.id, @post.md5, @post.file_ext, :preview) + @storage_manager.delete_file(@post.id, @post.md5, @post.file_ext, :large) + @storage_manager.delete_file(@post.id, @post.md5, @post.file_ext, :original) + + assert_not(File.exist?(@file_path)) + assert_not(File.exist?(@large_file_path)) + assert_not(File.exist?(@preview_file_path)) + end + end + + context "#file_url method" do + should "return the correct urls" do + @post = FactoryGirl.create(:post, file_ext: "png") + @storage_manager.stubs(:tagged_filenames).returns(false) + + assert_equal("/data/#{@post.md5}.png", @storage_manager.file_url(@post, :original)) + assert_equal("/data/sample/sample-#{@post.md5}.jpg", @storage_manager.file_url(@post, :large)) + assert_equal("/data/preview/#{@post.md5}.jpg", @storage_manager.file_url(@post, :preview)) + end + end + end + + context "StorageManager::Hybrid" do + setup do + @post1 = FactoryGirl.build(:post, id: 1, file_ext: "png") + @post2 = FactoryGirl.build(:post, id: 2, file_ext: "png") + + @storage_manager = StorageManager::Hybrid.new do |id, md5, file_ext, type| + if id.odd? + StorageManager::Local.new(base_dir: "#{BASE_DIR}/i1", base_url: "/i1") + else + StorageManager::Local.new(base_dir: "#{BASE_DIR}/i2", base_url: "/i2") + end + end + end + + teardown do + FileUtils.rm_rf(BASE_DIR) + end + + context "#store_file method" do + should "store odd-numbered posts under /i1 and even-numbered posts under /i2" do + @storage_manager.store_file(StringIO.new("post1"), @post1, :original) + @storage_manager.store_file(StringIO.new("post2"), @post2, :original) + + assert(File.exist?("#{BASE_DIR}/i1/#{@post1.md5}.png")) + assert(File.exist?("#{BASE_DIR}/i2/#{@post2.md5}.png")) + end + end + + context "#file_url method" do + should "generate /i1 urls for odd posts and /i2 urls for even posts" do + assert_equal("/i1/#{@post1.md5}.png", @storage_manager.file_url(@post1, :original)) + assert_equal("/i2/#{@post2.md5}.png", @storage_manager.file_url(@post2, :original)) + end + end + end +end diff --git a/test/unit/upload_test.rb b/test/unit/upload_test.rb index 2a4dc196d..cd7184c6f 100644 --- a/test/unit/upload_test.rb +++ b/test/unit/upload_test.rb @@ -195,6 +195,13 @@ class UploadTest < ActiveSupport::TestCase assert_equal(post.id, @upload.post_id) assert_equal("completed", @upload.status) end + + context "automatic tagging" do + should "tag animated png files" do + @upload = FactoryGirl.build(:upload, file_ext: "png", file: upload_file("test/files/apng/normal_apng.png")) + assert_equal("animated_png", @upload.automatic_tags) + end + end end should "process completely for a pixiv ugoira" do @@ -210,6 +217,7 @@ class UploadTest < ActiveSupport::TestCase assert_equal(60, post.image_height) assert_equal("https://i.pximg.net/img-zip-ugoira/img/2014/10/05/23/42/23/46378654_ugoira1920x1080.zip", post.source) assert_nothing_raised { post.file(:original) } + assert_nothing_raised { post.file(:large) } assert_nothing_raised { post.file(:preview) } end