From a5c72bb9977f652f77443f6b65e2a6e012021276 Mon Sep 17 00:00:00 2001 From: Daniel Munn Date: Wed, 20 Jun 2012 12:29:28 +0100 Subject: [PATCH] HEAD method testing --- lib/redmine_dmsf/webdav/index_resource.rb | 2 +- lib/redmine_dmsf/webdav/project_resource.rb | 2 +- test/integration/dmsf_webdav_head_test.rb | 92 +++++++++++++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 test/integration/dmsf_webdav_head_test.rb diff --git a/lib/redmine_dmsf/webdav/index_resource.rb b/lib/redmine_dmsf/webdav/index_resource.rb index 061657e8..ab367212 100644 --- a/lib/redmine_dmsf/webdav/index_resource.rb +++ b/lib/redmine_dmsf/webdav/index_resource.rb @@ -67,7 +67,7 @@ module RedmineDmsf end def content_type - "text/html" + "inode/directory" end def content_length diff --git a/lib/redmine_dmsf/webdav/project_resource.rb b/lib/redmine_dmsf/webdav/project_resource.rb index f5a64044..c37c0d9d 100644 --- a/lib/redmine_dmsf/webdav/project_resource.rb +++ b/lib/redmine_dmsf/webdav/project_resource.rb @@ -71,7 +71,7 @@ module RedmineDmsf end def content_type - "inode/directory" #l(:field_project) + "inode/directory" end def special_type diff --git a/test/integration/dmsf_webdav_head_test.rb b/test/integration/dmsf_webdav_head_test.rb new file mode 100644 index 00000000..fea69a6a --- /dev/null +++ b/test/integration/dmsf_webdav_head_test.rb @@ -0,0 +1,92 @@ +require File.expand_path('../../test_helper', __FILE__) + +class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest + + fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules, :dmsf_folders + + def setup + DmsfFile.storage_path = File.expand_path('../../fixtures/files', __FILE__) + end + + test "HEAD requires authentication" do + make_request "/dmsf/webdav/#{Project.find(1).identifier}" + assert_response 401 + check_headers_dont_exist + end + + test "HEAD responds with authentication" do + make_request "/dmsf/webdav/#{Project.find(1).identifier}", "admin" + assert_response :success + check_headers_exist + end + + # Note: + # At present we use Rack to serve the file, this makes life easy however it removes the Etag + # header and invalidates the test - where as a folder listing will always not include a last-modified + # (but may include an etag, so there is an allowance for a 1 in 2 failure rate on (optionally) required + # headers) + test "HEAD responds to file" do + make_request "/dmsf/webdav/#{Project.find(1).identifier}/test.txt", "admin" + assert_response :success + check_headers_exist #Note it'll allow 1 out of the 3 expected to fail + end + + test "HEAD fails when file or folder not found" do + make_request "/dmsf/webdav/#{Project.find(1).identifier}/not_here.txt", "admin" + assert_response 404 + check_headers_dont_exist + + make_request "/dmsf/webdav/folder_not_here", "admin" + assert_response 404 + check_headers_dont_exist + end + + test "HEAD fails when project is not enabled for DMSF" do + + make_request "/dmsf/webdav/#{Project.find(2).identifier}/test.txt", "admin" + assert_response 404 + check_headers_dont_exist + end + + + private + def make_request(*args) + if (args.length == 1) #Just a URL + head args.first + else + head args.first, nil, credentials(args[1]) + end + end + + def check_headers_exist + assert !(response.headers.nil? || response.headers.empty?), "Head returned without headers" #Headers exist? + values = {} + values[:etag] = {:optional => true, :content => response.headers['Etag']} + values[:content_type] = response.headers['Content-Type'] + values[:last_modified] = {:optional => true, :content => response.headers['Last-Modified']} + single_optional = false + values.each {|key,val| + if val.is_a?(Hash) + if (val[:optional].nil? || !val[:optional]) + assert( !(val[:content].nil? || val[:content].empty?), "Expected header #{key} was empty." ) if single_optional + else + single_optional = true + end + else + assert !(val.nil? || val.empty?), "Expected header #{key} was empty." + end + } + end + + def check_headers_dont_exist + assert !(response.headers.nil? || response.headers.empty?), "Head returned without headers" #Headers exist? + values = {} + values[:etag] = response.headers['Etag']; + values[:last_modified] = response.headers['Last-Modified'] + values.each {|key,val| + assert (val.nil? || val.empty?), "Expected header #{key} should be empty." + } + end + + +end