WebDAV PROPSTATS and PROPFIND caching change #742

This commit is contained in:
Karel Picman 2017-07-13 10:30:31 +02:00
parent 07e3dfebbf
commit 9f6a4d8eec
7 changed files with 166 additions and 375 deletions

View File

@ -187,14 +187,6 @@
</em>
</p>
<p>
<%= content_tag(:label, l(:label_memcached_servers)) %>
<%= text_field_tag 'settings[dmsf_memcached_servers]', @settings['dmsf_memcached_servers'], :size => 50 %>
<em class="info">
<%= l(:text_memcached_servers) %>
</em>
</p>
<p>
<%= content_tag(:label, l(:label_webdav_ignore)) %>
<%= text_field_tag 'settings[dmsf_webdav_ignore]', @settings['dmsf_webdav_ignore'], :size => 50 %>

View File

@ -48,7 +48,6 @@ Redmine::Plugin.register :redmine_dmsf do
'dmsf_display_notified_recipients' => 0,
'dmsf_global_title_format' => '',
'dmsf_columns' => %w(title size modified version workflow author),
'dmsf_memcached_servers' => '',
'dmsf_webdav_ignore' => '^(\._|\.DS_Store$|Thumbs.db$)',
'dmsf_webdav_disable_versioning' => '^\~\$|\.tmp$',
'dmsf_keep_documents_locked' => false,

View File

@ -23,62 +23,33 @@ module RedmineDmsf
module Webdav
class Cache
def self.read(name, options = nil)
init unless defined?(@@WebDAVCache)
@@WebDAVCache.read(name, options) unless name.blank?
Rails.cache.read(name, options)
end
def self.write(name, value, options = nil)
init unless defined?(@@WebDAVCache)
@@WebDAVCache.write(name, value, options) unless name.blank?
Rails.cache.write(name, value, options)
end
def self.delete(name, options = nil)
init unless defined?(@@WebDAVCache)
@@WebDAVCache.delete(name, options) unless name.blank?
Rails.cache.delete(name, options)
end
def self.exist?(name, options = nil)
init unless defined?(@@WebDAVCache)
@@WebDAVCache.exist?(name, options) unless name.blank?
Rails.cache.exist?(name, options)
end
def self.clear
Rails.cache.clear
end
def self.invalidate_item(key)
init unless defined?(@@WebDAVCache)
return if key.blank?
# Write an .invalid entry to notify anyone that is currently creating a response
# that that response is invalid and should not be cached
@@WebDAVCache.write("#{key}.invalid", expires_in: 60.seconds)
self.write("#{key}.invalid", expires_in: 60.seconds)
# Delete any existing entry in the cache
@@WebDAVCache.delete(key)
end
def self.cache
@@WebDAVCache
end
def self.init_testcache
#puts "Webdav::Cache: Enable MemoryStore cache."
@@WebDAVCache = ActiveSupport::Cache::MemoryStore.new(:namespace => "RedmineDmsfWebDAV")
end
def self.init_nullcache
#puts "Webdav::Cache: Disable cache."
@@WebDAVCache = ActiveSupport::Cache::NullStore.new
end
private
def self.init
if Setting.plugin_redmine_dmsf['dmsf_memcached_servers'].nil? || Setting.plugin_redmine_dmsf['dmsf_memcached_servers'].empty?
# Disable caching by using a null cache
Rails.logger.info "Webdav::Cache: Cache disabled!"
@@WebDAVCache = ActiveSupport::Cache::NullStore.new
else
# Create cache using the provided server address
Rails.logger.info "Webdav::Cache: Cache enabled, using memcached server '#{Setting.plugin_redmine_dmsf['dmsf_memcached_servers']}'"
@@WebDAVCache = ActiveSupport::Cache::MemCacheStore.new(Setting.plugin_redmine_dmsf['dmsf_memcached_servers'])
end
self.delete(key)
end
end
end
end

View File

@ -32,24 +32,21 @@ class DmsfWebdavPropfindTest < RedmineDmsf::Test::IntegrationTest
@jsmith = credentials 'jsmith' # Not a member of project1
@project1 = Project.find_by_id 1 # DMSF enabled
@project2 = Project.find_by_id 2 # DMSF disabled
# Folders in project1/
# Folders in project1
@folder1 = DmsfFolder.find_by_id 1
@folder6 = DmsfFolder.find_by_id 6
# Files in project1/
# Files in project1
@file1 = DmsfFile.find_by_id 1
@file9 = DmsfFile.find_by_id 9
@file10 = DmsfFile.find_by_id 10
Setting.plugin_redmine_dmsf['dmsf_webdav'] = '1'
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
# Temporarily enable project names to generate names for project1
Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true
@project1_name = RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)
@project1_uri = Addressable::URI.escape(@project1_name)
Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = false
RedmineDmsf::Webdav::Cache.init_nullcache
RedmineDmsf::Webdav::Cache.clear
end
def test_truth
@ -58,332 +55,201 @@ class DmsfWebdavPropfindTest < RedmineDmsf::Test::IntegrationTest
end
def test_propfind_denied_for_anonymous
xml_http_request :propfind, '/dmsf/webdav/', nil,
{:HTTP_DEPTH => '0'}
xml_http_request :propfind, '/dmsf/webdav/', nil, {:HTTP_DEPTH => '0'}
assert_response 401
end
def test_propfind_depth0_on_root_for_non_member
xml_http_request :propfind, '/dmsf/webdav/', nil,
@jsmith.merge!({:HTTP_DEPTH => '0'})
xml_http_request :propfind, '/dmsf/webdav/', nil, @jsmith.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
assert_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_match '<D:displayname>/</D:displayname>', response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project2.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project2.identifier}</D:displayname>", response.body
assert response.body.include?('<D:href>http://www.example.com:80/dmsf/webdav/</D:href>')
assert response.body.include?('<D:displayname>/</D:displayname>')
end
def test_propfind_depth1_on_root_for_non_member
xml_http_request :propfind, '/dmsf/webdav/', nil,
@jsmith.merge!({:HTTP_DEPTH => '1'})
xml_http_request :propfind, '/dmsf/webdav/', nil, @jsmith.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_match '<D:displayname>/</D:displayname>', response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project2.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project2.identifier}</D:displayname>", response.body
assert response.body.include?('<D:href>http://www.example.com:80/dmsf/webdav/</D:href>')
assert response.body.include?( '<D:displayname>/</D:displayname>')
end
def test_propfind_depth0_on_root_for_admin
xml_http_request :propfind, '/dmsf/webdav/', nil,
@admin.merge!({:HTTP_DEPTH => '0'})
xml_http_request :propfind, '/dmsf/webdav/', nil, @admin.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
assert_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_match '<D:displayname>/</D:displayname>', response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project2.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project2.identifier}</D:displayname>", response.body
assert response.body.include?('<D:href>http://www.example.com:80/dmsf/webdav/</D:href>')
assert response.body.include?('<D:displayname>/</D:displayname>')
end
def test_propfind_depth1_on_root_for_admin
xml_http_request :propfind, '/dmsf/webdav/', nil,
@admin.merge!({:HTTP_DEPTH => '1'})
xml_http_request :propfind, '/dmsf/webdav/', nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_match 'D:displayname>/</D:displayname>', response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project2.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project2.identifier}</D:displayname>", response.body
assert response.body.include?('<D:href>http://www.example.com:80/dmsf/webdav/</D:href>')
assert response.body.include?('<D:displayname>/</D:displayname>')
end
def test_propfind_depth1_on_root_for_admin_with_project_names
Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true
if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] == true
xml_http_request :propfind, '/dmsf/webdav/', nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_match '<D:displayname>/</D:displayname>', response.body
# project.identifier should not match when using project names
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
# but the project name should match
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/</D:href>", response.body
assert_match "<D:displayname>#{@project1_name}</D:displayname>", response.body
end
xml_http_request :propfind, '/dmsf/webdav/', nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert response.body.include?('<D:href>http://www.example.com:80/dmsf/webdav/</D:href>')
assert response.body.include?('<D:displayname>/</D:displayname>')
# project.identifier should not match when using project names
assert !response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>")
assert !response.body.include?("<D:displayname>#{@project1.identifier}</D:displayname>")
# but the project name should match
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/</D:href>")
assert response.body.include?("<D:displayname>#{@project1_name}</D:displayname>")
end
def test_propfind_depth0_on_project1_for_non_member
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@jsmith.merge!({:HTTP_DEPTH => '0'})
assert_response 404
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @jsmith.merge!({:HTTP_DEPTH => '0'})
assert_response :missing
end
def test_propfind_depth0_on_project1_for_admin
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '0'})
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
assert_no_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_no_match '<D:displayname>/</D:displayname>', response.body
# Project
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
# Folders
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/</D:href>", response.body
assert_no_match "<D:displayname>#{@folder1.title}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/</D:href>", response.body
assert_no_match "<D:displayname>#{@folder6.title}</D:displayname>", response.body
# Files
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}</D:href>", response.body
assert_no_match "<D:displayname>#{@file1.name}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}</D:href>", response.body
assert_no_match "<D:displayname>#{@file9.name}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}</D:href>", response.body
assert_no_match "<D:displayname>#{@file10.name}</D:displayname>", response.body
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>")
assert response.body.include?("<D:displayname>#{@project1.identifier}</D:displayname>")
end
def test_propfind_depth0_on_project1_for_admin_with_project_names
Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true
if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] == true
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '0'})
assert_response 404
xml_http_request :propfind, "/dmsf/webdav/#{@project1_uri}", nil,
@admin.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
assert_no_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_no_match '<D:displayname>/</D:displayname>', response.body
# Project
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/</D:href>", response.body
assert_match "<D:displayname>#{@project1_name}</D:displayname>", response.body
end
end
def test_propfind_depth1_on_project1_for_admin
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '0'})
assert_response :missing
xml_http_request :propfind, "/dmsf/webdav/#{@project1_uri}", nil, @admin.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/</D:href>")
assert response.body.include?("<D:displayname>#{@project1_name}</D:displayname>")
end
def test_propfind_depth1_on_project1_for_admin
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert_no_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_no_match '<D:displayname>/</D:displayname>', response.body
# Project
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>")
assert response.body.include?("<D:displayname>#{@project1.identifier}</D:displayname>")
# Folders
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/</D:href>", response.body
assert_match "<D:displayname>#{@folder1.title}</D:displayname>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/</D:href>", response.body
assert_match "<D:displayname>#{@folder6.title}</D:displayname>", response.body
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/</D:href>")
assert response.body.include?("<D:displayname>#{@folder1.title}</D:displayname>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/</D:href>")
assert response.body.include?("<D:displayname>#{@folder6.title}</D:displayname>")
# Files
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}</D:href>", response.body
assert_match "<D:displayname>#{@file1.name}</D:displayname>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}</D:href>", response.body
assert_match "<D:displayname>#{@file9.name}</D:displayname>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}</D:href>", response.body
assert_match "<D:displayname>#{@file10.name}</D:displayname>", response.body
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}</D:href>")
assert response.body.include?("<D:displayname>#{@file1.name}</D:displayname>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}</D:href>")
assert response.body.include?("<D:displayname>#{@file9.name}</D:displayname>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}</D:href>")
assert response.body.include?("<D:displayname>#{@file10.name}</D:displayname>")
end
def test_propfind_depth1_on_project1_for_admin_with_project_names
Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true
if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] == true
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 404
xml_http_request :propfind, "/dmsf/webdav/#{@project1_uri}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert_no_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_no_match '<D:displayname>/</D:displayname>', response.body
# Project
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/</D:href>", response.body
assert_match "<D:displayname>#{@project1_name}</D:displayname>", response.body
# Folders
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@folder1.title}/</D:href>", response.body
assert_match "<D:displayname>#{@folder1.title}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@folder6.title}/</D:href>", response.body
assert_match "<D:displayname>#{@folder6.title}</D:displayname>", response.body
# Files
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file1.name}</D:href>", response.body
assert_match "<D:displayname>#{@file1.name}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file9.name}</D:href>", response.body
assert_match "<D:displayname>#{@file9.name}</D:displayname>", response.body
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file10.name}</D:href>", response.body
assert_match "<D:displayname>#{@file10.name}</D:displayname>", response.body
end
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response :missing
xml_http_request :propfind, "/dmsf/webdav/#{@project1_uri}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
# Project
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/</D:href>")
# Folders
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@folder1.title}/</D:href>")
assert response.body.include?("<D:displayname>#{@folder1.title}</D:displayname>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@folder6.title}/</D:href>")
assert response.body.include?("<D:displayname>#{@folder6.title}</D:displayname>")
# Files
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file1.name}</D:href>")
assert response.body.include?("<D:displayname>#{@file1.name}</D:displayname>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file9.name}</D:href>")
assert response.body.include?("<D:displayname>#{@file9.name}</D:displayname>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file10.name}</D:href>")
assert response.body.include?("<D:displayname>#{@file10.name}</D:displayname>")
end
def test_propfind_depth1_on_root_for_admin_with_project_names_and_cache
RedmineDmsf::Webdav::Cache.init_testcache
Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true
if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] == true
# PROPSTATS for / and project1 should be cached.
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +2 do
xml_http_request :propfind, '/dmsf/webdav/', nil,
@admin.merge!({:HTTP_DEPTH => '1'})
end
assert_response 207 # MultiStatus
assert_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_match '<D:displayname>/</D:displayname>', response.body
# project.identifier should not match when using project names
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
# but the project name should match
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/</D:href>", response.body
assert_match "<D:displayname>#{@project1_name}</D:displayname>", response.body
# Rename project1
@project1.name = 'Online Cookbook'
@project1.save!
project1_new_name = RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)
project1_new_uri = Addressable::URI.escape(project1_new_name)
# PROPSTATS for / is already cached, but a new PROPSTATS should be cached for project1
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +1 do
xml_http_request :propfind, '/dmsf/webdav/', nil,
@admin.merge!({:HTTP_DEPTH => '1'})
end
assert_response 207 # MultiStatus
assert_match '<D:href>http://www.example.com:80/dmsf/webdav/</D:href>', response.body
assert_match '<D:displayname>/</D:displayname>', response.body
# project.identifier should not match when using project names
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1.identifier}</D:displayname>", response.body
# old project name should not match
assert_no_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1_uri}/</D:href>", response.body
assert_no_match "<D:displayname>#{@project1_uri}</D:displayname>", response.body
# but new project name should match
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{project1_new_uri}/</D:href>", response.body
assert_match "<D:displayname>#{project1_new_name}</D:displayname>", response.body
end
@project1.name = 'Online Cookbook'
@project1.save!
project1_new_name = RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)
project1_new_uri = Addressable::URI.escape(project1_new_name)
xml_http_request :propfind, "/dmsf/webdav/#{project1_new_uri}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{project1_new_uri}/</D:href>")
assert response.body.include?("<D:displayname>#{project1_new_name}</D:displayname>")
end
def test_propfind_depth0_on_project1_for_admin_with_cache
RedmineDmsf::Webdav::Cache.init_testcache
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +1 do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
end
# Response should be correct
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
# Project
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>")
# A new PROPSTATS entry should have been created for project1
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}")
result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}")
assert result
assert result.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>")
# Replace the PROPSTATS cache entry and make sure that it is used
RedmineDmsf::Webdav::Cache.write("PROPSTATS/#{@project1.identifier}", "Cached PROPSTATS/#{@project1.identifier}")
assert_no_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count' do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
end
assert_match "Cached PROPSTATS/#{@project1.identifier}", response.body
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '0'})
assert_response 207 # MultiStatus
assert response.body.include?("Cached PROPSTATS/#{@project1.identifier}")
end
def test_propfind_depth1_on_project1_for_admin_with_cache
RedmineDmsf::Webdav::Cache.init_testcache
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +10 do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
end
# Project, a new PROPFIND and PROPSTATS should have been created for project1
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", RedmineDmsf::Webdav::Cache.read("PROPFIND/#{@project1.id}")
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}")
# Folders, new PROPSTATS should be created for each folder.
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/</D:href>", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}/#{@folder1.title}")
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/</D:href>", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}/#{@folder6.title}")
# Files, new PROPSTATS should be created for each folder.
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}</D:href>", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}</D:href>", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}")
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}</D:href>", response.body
assert_match "<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}</D:href>", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file10.id}-#{@file10.last_revision.id}")
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
# Project
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>")
result = RedmineDmsf::Webdav::Cache.read("PROPFIND/#{@project1.id}")
assert result
assert result.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>")
result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}")
assert result
assert result.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/</D:href>")
# Folders
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/</D:href>")
result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}/#{@folder1.title}")
assert result
assert result.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/</D:href>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/</D:href>")
result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}/#{@folder6.title}")
assert result
assert result.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/</D:href>")
# Files
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}</D:href>")
result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
assert result
assert result.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}</D:href>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}</D:href>")
result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}")
assert result
assert result.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}</D:href>")
assert response.body.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}</D:href>")
result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file10.id}-#{@file10.last_revision.id}")
assert result
assert result.include?("<D:href>http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}</D:href>")
# Replace PROPFIND and verify that cached entry is used.
RedmineDmsf::Webdav::Cache.write("PROPFIND/#{@project1.id}", "Cached PROPFIND/#{@project1.id}")
assert_no_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count' do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert_match "Cached PROPFIND/#{@project1.id}", response.body
end
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert response.body.include?("Cached PROPFIND/#{@project1.id}")
# Delete PROPFIND, replace PROPSTATS for one entry and verify that it is used when creating the response and new cache
RedmineDmsf::Webdav::Cache.invalidate_item("PROPFIND/#{@project1.id}")
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}.invalid")
RedmineDmsf::Webdav::Cache.write("PROPSTATS/#{@project1.identifier}", "Cached PROPSTATS/#{@project1.identifier}")
# One PROPFIND entry is added and one .invalid entry is deleted, so no differenct.
assert_no_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count' do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => "1"})
assert_response 207 # MultiStatus
end
assert_match "Cached PROPSTATS/#{@project1.identifier}", response.body
assert_match "Cached PROPSTATS/#{@project1.identifier}", RedmineDmsf::Webdav::Cache.read("PROPFIND/#{@project1.id}")
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => "1"})
assert_response 207 # MultiStatus
assert response.body.include?("Cached PROPSTATS/#{@project1.identifier}")
result = RedmineDmsf::Webdav::Cache.read("PROPFIND/#{@project1.id}")
assert result
assert result.include?("Cached PROPSTATS/#{@project1.identifier}")
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}.invalid")
end
def test_propfind_depth1_on_project1_for_admin_with_cache_and_locks
RedmineDmsf::Webdav::Cache.init_testcache
log_user 'admin', 'admin' # login as admin
assert !User.current.anonymous?, 'Current user is anonymous'
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +10 do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
end
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
# Verify that everything exists in the cache as it should
assert RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@project1.identifier}")
@ -392,7 +258,6 @@ class DmsfWebdavPropfindTest < RedmineDmsf::Test::IntegrationTest
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file10.id}-#{@file10.last_revision.id}")
# Lock a file and verify that the PROPSTATS for the file and the PROPFIND were deleted
assert @file1.lock!, "File failed to be locked by #{User.current.name}"
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
@ -403,16 +268,11 @@ class DmsfWebdavPropfindTest < RedmineDmsf::Test::IntegrationTest
assert !RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file10.id}-#{@file10.last_revision.id}")
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +1 do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
end
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}.invalid")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
# Unlock a file and verify that the PROPSTATS for the file and the PROPFIND were deleted
assert @file1.unlock!, "File failed to be unlocked by #{User.current.name}"
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
@ -423,16 +283,11 @@ class DmsfWebdavPropfindTest < RedmineDmsf::Test::IntegrationTest
assert !RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file10.id}-#{@file10.last_revision.id}")
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +1 do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
end
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}.invalid")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
# Lock a folder and verify that the PROPSTATS for the file and the PROPFIND were deleted
assert @folder1.lock!, "File failed to be locked by #{User.current.name}"
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
@ -443,16 +298,11 @@ class DmsfWebdavPropfindTest < RedmineDmsf::Test::IntegrationTest
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file10.id}-#{@file10.last_revision.id}")
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +1 do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
end
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}.invalid")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@project1.identifier}/#{@folder1.title}")
# Unlock a folder and verify that the PROPSTATS for the file and the PROPFIND were deleted
assert @folder1.unlock!, "File failed to be unlocked by #{User.current.name}"
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
@ -463,12 +313,8 @@ class DmsfWebdavPropfindTest < RedmineDmsf::Test::IntegrationTest
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@file10.id}-#{@file10.last_revision.id}")
assert_difference 'RedmineDmsf::Webdav::Cache.cache.instance_variable_get(:@data).count', +1 do
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil,
@admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
end
xml_http_request :propfind, "/dmsf/webdav/#{@project1.identifier}", nil, @admin.merge!({:HTTP_DEPTH => '1'})
assert_response 207 # MultiStatus
assert RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}")
assert !RedmineDmsf::Webdav::Cache.exist?("PROPFIND/#{@project1.id}.invalid")
assert RedmineDmsf::Webdav::Cache.exist?("PROPSTATS/#{@project1.identifier}/#{@folder1.title}")

View File

@ -102,7 +102,7 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
assert r1.save
# Just make sure the file exists
File.open(r1.disk_file, 'wb') do |f|
f.write("1234")
f.write('1234')
end
# Directly after the file has been stored generate the r2 storage filename.
@ -114,8 +114,7 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
end
def test_save_and_destroy_with_cache
RedmineDmsf::Webdav::Cache.init_testcache
Rails.cache.clear
# save
cache_key = @revision1.propfind_cache_key
RedmineDmsf::Webdav::Cache.write(cache_key, "")
@ -125,7 +124,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.delete("#{cache_key}.invalid")
# destroy
RedmineDmsf::Webdav::Cache.write(cache_key, "")
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
@ -133,7 +131,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
@revision1.destroy
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
# save!
cache_key = @revision2.propfind_cache_key
RedmineDmsf::Webdav::Cache.write(cache_key, "")
@ -142,8 +139,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
@revision2.save!
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.init_nullcache
end
def test_workflow_tooltip

View File

@ -167,45 +167,39 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
end
def test_save_and_destroy_with_cache
RedmineDmsf::Webdav::Cache.init_testcache
Rails.cache.clear
# save
cache_key = @file5.propfind_cache_key
RedmineDmsf::Webdav::Cache.write(cache_key, "")
RedmineDmsf::Webdav::Cache.write(cache_key, '')
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert !RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
@file5.save
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.delete("#{cache_key}.invalid")
# destroy
RedmineDmsf::Webdav::Cache.write(cache_key, "")
RedmineDmsf::Webdav::Cache.write(cache_key, '')
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert !RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
@file5.destroy
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
# save!
cache_key = @file6.propfind_cache_key
RedmineDmsf::Webdav::Cache.write(cache_key, "")
RedmineDmsf::Webdav::Cache.write(cache_key, '')
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert !RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
@file6.save!
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.delete("#{cache_key}.invalid")
# destroy!
RedmineDmsf::Webdav::Cache.write(cache_key, "")
RedmineDmsf::Webdav::Cache.write(cache_key, '')
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert !RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
@file6.destroy!
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.init_nullcache
end
def test_project_project

View File

@ -138,46 +138,40 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
end
def test_save_and_destroy_with_cache
RedmineDmsf::Webdav::Cache.init_testcache
Rails.cache.clear
# save
cache_key = @folder4.propfind_cache_key
RedmineDmsf::Webdav::Cache.write(cache_key, "")
RedmineDmsf::Webdav::Cache.write(cache_key, '')
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert !RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
@folder4.save
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.delete("#{cache_key}.invalid")
# destroy
RedmineDmsf::Webdav::Cache.write(cache_key, "")
RedmineDmsf::Webdav::Cache.write(cache_key, '')
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert !RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
@folder4.destroy
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.cache.clear
#RedmineDmsf::Webdav::Cache.cache.clear
# save!
cache_key = @folder5.propfind_cache_key
RedmineDmsf::Webdav::Cache.write(cache_key, "")
RedmineDmsf::Webdav::Cache.write(cache_key, '')
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert !RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
@folder5.save!
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.delete("#{cache_key}.invalid")
# destroy!
RedmineDmsf::Webdav::Cache.write(cache_key, "")
RedmineDmsf::Webdav::Cache.write(cache_key, '')
assert RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert !RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
@folder5.destroy!
assert !RedmineDmsf::Webdav::Cache.exist?(cache_key)
assert RedmineDmsf::Webdav::Cache.exist?("#{cache_key}.invalid")
RedmineDmsf::Webdav::Cache.init_nullcache
end
def test_to_csv