From 9f6a4d8eec20e5e95514f892ae9aef6c5d531212 Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Thu, 13 Jul 2017 10:30:31 +0200 Subject: [PATCH] WebDAV PROPSTATS and PROPFIND caching change #742 --- app/views/settings/_dmsf_settings.html.erb | 8 - init.rb | 1 - lib/redmine_dmsf/webdav/cache.rb | 57 +-- .../webdav/dmsf_webdav_propfind_test.rb | 432 ++++++------------ test/unit/dmsf_file_revision_test.rb | 9 +- test/unit/dmsf_file_test.rb | 16 +- test/unit/dmsf_folder_test.rb | 18 +- 7 files changed, 166 insertions(+), 375 deletions(-) diff --git a/app/views/settings/_dmsf_settings.html.erb b/app/views/settings/_dmsf_settings.html.erb index f3834af1..c3f6023a 100644 --- a/app/views/settings/_dmsf_settings.html.erb +++ b/app/views/settings/_dmsf_settings.html.erb @@ -187,14 +187,6 @@

-

- <%= content_tag(:label, l(:label_memcached_servers)) %> - <%= text_field_tag 'settings[dmsf_memcached_servers]', @settings['dmsf_memcached_servers'], :size => 50 %> - - <%= l(:text_memcached_servers) %> - -

-

<%= content_tag(:label, l(:label_webdav_ignore)) %> <%= text_field_tag 'settings[dmsf_webdav_ignore]', @settings['dmsf_webdav_ignore'], :size => 50 %> diff --git a/init.rb b/init.rb index f4ff894e..78776e69 100644 --- a/init.rb +++ b/init.rb @@ -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, diff --git a/lib/redmine_dmsf/webdav/cache.rb b/lib/redmine_dmsf/webdav/cache.rb index cd4a9bd5..262fba96 100644 --- a/lib/redmine_dmsf/webdav/cache.rb +++ b/lib/redmine_dmsf/webdav/cache.rb @@ -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 \ No newline at end of file diff --git a/test/integration/webdav/dmsf_webdav_propfind_test.rb b/test/integration/webdav/dmsf_webdav_propfind_test.rb index e21fd702..aea5cdd1 100644 --- a/test/integration/webdav/dmsf_webdav_propfind_test.rb +++ b/test/integration/webdav/dmsf_webdav_propfind_test.rb @@ -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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_match '/', response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_no_match "#{@project1.identifier}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project2.identifier}/", response.body - assert_no_match "#{@project2.identifier}", response.body + assert response.body.include?('http://www.example.com:80/dmsf/webdav/') + assert response.body.include?('/') 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_match '/', response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_no_match "#{@project1.identifier}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project2.identifier}/", response.body - assert_no_match "#{@project2.identifier}", response.body + assert response.body.include?('http://www.example.com:80/dmsf/webdav/') + assert response.body.include?( '/') 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_match '/', response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_no_match "#{@project1.identifier}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project2.identifier}/", response.body - assert_no_match "#{@project2.identifier}", response.body + assert response.body.include?('http://www.example.com:80/dmsf/webdav/') + assert response.body.include?('/') 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_match 'D:displayname>/', response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_match "#{@project1.identifier}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project2.identifier}/", response.body - assert_no_match "#{@project2.identifier}", response.body + assert response.body.include?('http://www.example.com:80/dmsf/webdav/') + assert response.body.include?('/') 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_match '/', response.body - # project.identifier should not match when using project names - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_no_match "#{@project1.identifier}", response.body - # but the project name should match - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/", response.body - assert_match "#{@project1_name}", response.body - end + xml_http_request :propfind, '/dmsf/webdav/', nil, @admin.merge!({:HTTP_DEPTH => '1'}) + assert_response 207 # MultiStatus + assert response.body.include?('http://www.example.com:80/dmsf/webdav/') + assert response.body.include?('/') + # project.identifier should not match when using project names + assert !response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/") + assert !response.body.include?("#{@project1.identifier}") + # but the project name should match + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1_uri}/") + assert response.body.include?("#{@project1_name}") 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_no_match '/', response.body - # Project - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_match "#{@project1.identifier}", response.body - # Folders - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/", response.body - assert_no_match "#{@folder1.title}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/", response.body - assert_no_match "#{@folder6.title}", response.body - # Files - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", response.body - assert_no_match "#{@file1.name}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}", response.body - assert_no_match "#{@file9.name}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}", response.body - assert_no_match "#{@file10.name}", response.body + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/") + assert response.body.include?("#{@project1.identifier}") 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_no_match '/', response.body - # Project - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_no_match "#{@project1.identifier}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/", response.body - assert_match "#{@project1_name}", 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?("http://www.example.com:80/dmsf/webdav/#{@project1_uri}/") + assert response.body.include?("#{@project1_name}") + 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_no_match '/', response.body # Project - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_match "#{@project1.identifier}", response.body + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/") + assert response.body.include?("#{@project1.identifier}") # Folders - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/", response.body - assert_match "#{@folder1.title}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/", response.body - assert_match "#{@folder6.title}", response.body + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/") + assert response.body.include?("#{@folder1.title}") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/") + assert response.body.include?("#{@folder6.title}") # Files - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", response.body - assert_match "#{@file1.name}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}", response.body - assert_match "#{@file9.name}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}", response.body - assert_match "#{@file10.name}", response.body + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}") + assert response.body.include?("#{@file1.name}") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}") + assert response.body.include?("#{@file9.name}") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}") + assert response.body.include?("#{@file10.name}") 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_no_match '/', response.body - - # Project - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_no_match "#{@project1.identifier}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/", response.body - assert_match "#{@project1_name}", response.body - - # Folders - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@folder1.title}/", response.body - assert_match "#{@folder1.title}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@folder6.title}/", response.body - assert_match "#{@folder6.title}", response.body - - # Files - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file1.name}", response.body - assert_match "#{@file1.name}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file9.name}", response.body - assert_match "#{@file9.name}", response.body - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file10.name}", response.body - assert_match "#{@file10.name}", 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?("http://www.example.com:80/dmsf/webdav/#{@project1_uri}/") + # Folders + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@folder1.title}/") + assert response.body.include?("#{@folder1.title}") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@folder6.title}/") + assert response.body.include?("#{@folder6.title}") + # Files + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file1.name}") + assert response.body.include?("#{@file1.name}") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file9.name}") + assert response.body.include?("#{@file9.name}") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1_uri}/#{@file10.name}") + assert response.body.include?("#{@file10.name}") 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_match '/', response.body - - # project.identifier should not match when using project names - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_no_match "#{@project1.identifier}", response.body - - # but the project name should match - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/", response.body - assert_match "#{@project1_name}", 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 'http://www.example.com:80/dmsf/webdav/', response.body - assert_match '/', response.body - - # project.identifier should not match when using project names - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_no_match "#{@project1.identifier}", response.body - - # old project name should not match - assert_no_match "http://www.example.com:80/dmsf/webdav/#{@project1_uri}/", response.body - assert_no_match "#{@project1_uri}", response.body - - # but new project name should match - assert_match "http://www.example.com:80/dmsf/webdav/#{project1_new_uri}/", response.body - assert_match "#{project1_new_name}", 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?("http://www.example.com:80/dmsf/webdav/#{project1_new_uri}/") + assert response.body.include?("#{project1_new_name}") 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 "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/") # A new PROPSTATS entry should have been created for project1 - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}") - + result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}") + assert result + assert result.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/") # 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 "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", RedmineDmsf::Webdav::Cache.read("PROPFIND/#{@project1.id}") - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}") - # Folders, new PROPSTATS should be created for each folder. - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}/#{@folder1.title}") - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}/#{@folder6.title}") - # Files, new PROPSTATS should be created for each folder. - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}") - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}", RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}") - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}", response.body - assert_match "http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}", 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?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/") + result = RedmineDmsf::Webdav::Cache.read("PROPFIND/#{@project1.id}") + assert result + assert result.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/") + result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}") + assert result + assert result.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/") + # Folders + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/") + result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}/#{@folder1.title}") + assert result + assert result.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/") + result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@project1.identifier}/#{@folder6.title}") + assert result + assert result.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}/") + # Files + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}") + result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file1.id}-#{@file1.last_revision.id}") + assert result + assert result.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file1.name}") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}") + result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file9.id}-#{@file9.last_revision.id}") + assert result + assert result.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file9.name}") + assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}") + result = RedmineDmsf::Webdav::Cache.read("PROPSTATS/#{@file10.id}-#{@file10.last_revision.id}") + assert result + assert result.include?("http://www.example.com:80/dmsf/webdav/#{@project1.identifier}/#{@file10.name}") # 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}") diff --git a/test/unit/dmsf_file_revision_test.rb b/test/unit/dmsf_file_revision_test.rb index fcbd3ebe..9231ba3a 100644 --- a/test/unit/dmsf_file_revision_test.rb +++ b/test/unit/dmsf_file_revision_test.rb @@ -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 diff --git a/test/unit/dmsf_file_test.rb b/test/unit/dmsf_file_test.rb index 9aa1d8cc..4a539171 100644 --- a/test/unit/dmsf_file_test.rb +++ b/test/unit/dmsf_file_test.rb @@ -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 diff --git a/test/unit/dmsf_folder_test.rb b/test/unit/dmsf_folder_test.rb index 7865da83..4e735ec4 100644 --- a/test/unit/dmsf_folder_test.rb +++ b/test/unit/dmsf_folder_test.rb @@ -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