From b6b176fdc19c94f8e6ab09d6ca65f112327729bf Mon Sep 17 00:00:00 2001 From: Bart Kamphorst Date: Tue, 3 Sep 2019 11:33:53 +0200 Subject: [PATCH 1/2] Add uploading tests for mode page, with and without base-path enabled. --- test/test_app.rb | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/test/test_app.rb b/test/test_app.rb index c621e2ac..cd2db5b0 100644 --- a/test/test_app.rb +++ b/test/test_app.rb @@ -379,18 +379,48 @@ context "Frontend" do assert_equal 405, last_response.status end - test "upload a file" do + test "upload a file with mode dir" do temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc' temp_upload_file.close Precious::App.set(:wiki_options, {allow_uploads: true}) + post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(temp_upload_file) - + assert_equal 302, last_response.status # redirect is expected @wiki.clear_cache file = @wiki.file("uploads/#{::File.basename(temp_upload_file.path)}") assert_equal 'abc', file.raw_data Precious::App.set(:wiki_options, {allow_uploads: false}) end + + test "upload a file with mode page" do + temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc' + temp_upload_file.close + Precious::App.set(:wiki_options, {allow_uploads: true, per_page_uploads: true}) + post "/gollum/upload_file", {:file => Rack::Test::UploadedFile.new(temp_upload_file)}, {'HTTP_REFERER' => 'http://localhost:4567/Home.md', 'HTTP_HOST' => 'localhost:4567'} + + assert_equal 302, last_response.status # redirect is expected + @wiki.clear_cache + # Find the file in a page-specific subdir (here: Home), based on referer + file = @wiki.file("uploads/Home/#{::File.basename(temp_upload_file.path)}") + assert_equal 'abc', file.raw_data + Precious::App.set(:wiki_options, {allow_uploads: false, per_page_uploads: false}) + end + + test "upload a file with mode page and base-path (base) enabled" do + temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc' + temp_upload_file.close + Precious::App.set(:wiki_options, {base_path: 'base', allow_uploads: true, per_page_uploads: true}) + post "/gollum/upload_file", {:file => Rack::Test::UploadedFile.new(temp_upload_file)}, {'HTTP_REFERER' => 'http://localhost:4567/base/Home.md', 'HTTP_HOST' => 'localhost:4567'} + + assert_equal 302, last_response.status # redirect is expected + @wiki.clear_cache + # Find the file in a page-specific subdir (here: Home), based on referer, ignoring base-path (base) + file = @wiki.file("uploads/Home/#{::File.basename(temp_upload_file.path)}") + assert_not_nil file + assert_equal 'abc', file.raw_data + Precious::App.set(:wiki_options, {allow_uploads: false, per_page_uploads: false}) + end test "guard against uploading an existing file" do temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc' From 1c98a787ab20e082ea68f7c9024840b0e4cea7da Mon Sep 17 00:00:00 2001 From: Bart Kamphorst Date: Tue, 3 Sep 2019 22:03:43 +0200 Subject: [PATCH 2/2] Reopen the tempfile before passing it to Rack::Test::UploadedFile. --- test/test_app.rb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/test/test_app.rb b/test/test_app.rb index cd2db5b0..5c930104 100644 --- a/test/test_app.rb +++ b/test/test_app.rb @@ -375,7 +375,7 @@ context "Frontend" do test "uploading is not allowed unless explicitly enabled" do temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc' temp_upload_file.close - post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(temp_upload_file) + post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(::File.open(temp_upload_file)) assert_equal 405, last_response.status end @@ -384,7 +384,7 @@ context "Frontend" do temp_upload_file.close Precious::App.set(:wiki_options, {allow_uploads: true}) - post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(temp_upload_file) + post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(::File.open(temp_upload_file)) assert_equal 302, last_response.status # redirect is expected @wiki.clear_cache @@ -397,7 +397,7 @@ context "Frontend" do temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc' temp_upload_file.close Precious::App.set(:wiki_options, {allow_uploads: true, per_page_uploads: true}) - post "/gollum/upload_file", {:file => Rack::Test::UploadedFile.new(temp_upload_file)}, {'HTTP_REFERER' => 'http://localhost:4567/Home.md', 'HTTP_HOST' => 'localhost:4567'} + post "/gollum/upload_file", {:file => Rack::Test::UploadedFile.new(::File.open(temp_upload_file))}, {'HTTP_REFERER' => 'http://localhost:4567/Home.md', 'HTTP_HOST' => 'localhost:4567'} assert_equal 302, last_response.status # redirect is expected @wiki.clear_cache @@ -411,7 +411,7 @@ context "Frontend" do temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc' temp_upload_file.close Precious::App.set(:wiki_options, {base_path: 'base', allow_uploads: true, per_page_uploads: true}) - post "/gollum/upload_file", {:file => Rack::Test::UploadedFile.new(temp_upload_file)}, {'HTTP_REFERER' => 'http://localhost:4567/base/Home.md', 'HTTP_HOST' => 'localhost:4567'} + post "/gollum/upload_file", {:file => Rack::Test::UploadedFile.new(::File.open(temp_upload_file))}, {'HTTP_REFERER' => 'http://localhost:4567/base/Home.md', 'HTTP_HOST' => 'localhost:4567'} assert_equal 302, last_response.status # redirect is expected @wiki.clear_cache @@ -426,15 +426,14 @@ context "Frontend" do temp_upload_file = Tempfile.new(['upload', '.file']) << 'abc' temp_upload_file.close Precious::App.set(:wiki_options, {allow_uploads: true}) - post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(temp_upload_file) + post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(::File.open(temp_upload_file)) assert_equal 302, last_response.status # Post the same file a second time; should result in conflict - post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(temp_upload_file) + post "/gollum/upload_file", :file => Rack::Test::UploadedFile.new(::File.open(temp_upload_file)) assert_equal 409, last_response.status Precious::App.set(:wiki_options, {allow_uploads: false}) end - test "delete a page" do name = "deleteme" post "/gollum/create", :content => 'abc', :page => name,