From aafe7253066d2912a71818e6ebbb9d56b73193bd Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Tue, 11 Aug 2020 13:55:28 +0200 Subject: [PATCH] #1136 CI --- lib/redmine_dmsf/webdav/base_resource.rb | 44 +++-- lib/redmine_dmsf/webdav/dmsf_resource.rb | 2 - .../webdav/dmsf_webdav_lock_test.rb | 180 +++++++++--------- 3 files changed, 114 insertions(+), 112 deletions(-) diff --git a/lib/redmine_dmsf/webdav/base_resource.rb b/lib/redmine_dmsf/webdav/base_resource.rb index ff6f10ad..d43e1624 100644 --- a/lib/redmine_dmsf/webdav/base_resource.rb +++ b/lib/redmine_dmsf/webdav/base_resource.rb @@ -34,7 +34,6 @@ module RedmineDmsf def initialize(path, request, response, options) raise NotFound if Setting.plugin_redmine_dmsf['dmsf_webdav'].blank? @project = nil - @projectless_path = nil @public_path = "#{options[:root_uri_path]}#{path}" @children = nil super path, request, response, options @@ -120,10 +119,8 @@ module RedmineDmsf unless @project i = 1 project_names = Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] - puts ">>> path: #{@path} - #{project_names}" while true pinfo = @path.split('/').drop(i) - puts ">>> pinfo: #{pinfo} - #{i}" if pinfo.length > 0 if project_names if pinfo.first =~ / (\d+)$/ @@ -134,22 +131,10 @@ module RedmineDmsf end end else - begin - puts ">>> pinfo.first: #{pinfo.first}" - scope = Project.visible.where(identifier: pinfo.first) - scope = scope.where(parent_id: @project.id) if @project - prj = scope.first - puts ">>> prj: #{prj.identifier}" if prj - rescue => e - Rails.logger.error e.message - end + prj = Project.visible.find_by(identifier: pinfo.first) end end - unless prj - @projectless_path = '/' + @path.split('/').drop(i + 1).join('/') - puts ">>> less_path: #{@projectless_path} - #{i}" - break - end + break unless prj i = i + 1 @project = prj prj = nil @@ -160,9 +145,28 @@ module RedmineDmsf # Make it easy to find the path without project in it. def projectless_path - puts ">>> projectless_path ###" - self.project # Initialization - @projectless_path + i = 1 + project_names = Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] + while true + pinfo = @path.split('/').drop(i) + if pinfo.length > 0 + if project_names + if pinfo.first =~ / (\d+)$/ + prj = Project.visible.find_by(id: $1) + if prj + # Check again whether it's really the project and not a folder with a number as a suffix + prj = nil unless pinfo.first =~ /^#{prj.name}/ + end + end + else + prj = Project.visible.find_by(identifier: pinfo.first) + end + end + return '/' + @path.split('/').drop(i).join('/') unless prj + i = i + 1 + prj = nil + end + puts ">>> Error: #{@path}" end def path_prefix diff --git a/lib/redmine_dmsf/webdav/dmsf_resource.rb b/lib/redmine_dmsf/webdav/dmsf_resource.rb index f75a03b5..e1585aac 100644 --- a/lib/redmine_dmsf/webdav/dmsf_resource.rb +++ b/lib/redmine_dmsf/webdav/dmsf_resource.rb @@ -471,7 +471,6 @@ module RedmineDmsf end begin if entity.locked? && entity.locked_for_user? - puts ">>> lock failure" raise DAV4Rack::LockFailure.new("Failed to lock: #{@path}") else # If scope and type are not defined, the only thing we can @@ -599,7 +598,6 @@ module RedmineDmsf end end else - #raise BadRequest unless (parent.projectless_path == '/' || (parent.exist? && parent.folder)) f = DmsfFile.new f.project_id = project.id f.name = basename diff --git a/test/integration/webdav/dmsf_webdav_lock_test.rb b/test/integration/webdav/dmsf_webdav_lock_test.rb index 4dbc0e25..94639081 100644 --- a/test/integration/webdav/dmsf_webdav_lock_test.rb +++ b/test/integration/webdav/dmsf_webdav_lock_test.rb @@ -59,96 +59,96 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest Setting.plugin_redmine_dmsf['dmsf_webdav'] = @dmsf_webdav Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = @dmsf_webdav_strategy end - # - # def test_truth - # assert_kind_of Project, @project1 - # assert_kind_of Project, @project3 - # assert_kind_of DmsfFile, @file1 - # assert_kind_of DmsfFile, @file12 - # assert_kind_of DmsfFolder, @folder10 - # assert_kind_of Role, @role - # assert_kind_of User, @admin_user - # end - # - # def test_lock_file_already_locked_by_other - # log_user 'admin', 'admin' # login as admin - # User.current = @admin_user - # assert @file1.lock!, "File failed to be locked by #{User.current}" - # process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", params: @xml, - # headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) - # assert_response :locked - # end - # - # def test_lock_file - # create_time = Time.utc(2000, 1, 2, 3, 4, 5) - # refresh_time = Time.utc(2000, 1, 2, 6, 7, 8) - # locktoken = nil - # - # # Time travel, will make the usec part of the time 0 - # travel_to create_time do - # # Lock file - # process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", params: @xml, - # headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) - # assert_response :success - # # Verify the response - # # - # # - # # - # # - # # exclusive - # # write - # # infinity - # # Second-604800 - # # - # # f5762389-6b49-4482-9a4b-ff1c8f975765 - # # - # # - # # - # # - # assert_match 'exclusive', response.body - # assert_match 'write', response.body - # assert_match 'infinity', response.body - # # 1.week = 7*24*3600=604800 seconds - # assert_match 'Second-604800', response.body - # assert_match(/([a-z0-9\-]+)<\/d:href><\/d:locktoken>/, response.body) - # # Extract the locktoken, needed when refreshing the lock - # response.body.match(/([a-z0-9\-]+)<\/d:href><\/d:locktoken>/) - # locktoken = $1 - # # Verify the lock in the db - # l = @file1.lock.first - # assert_equal create_time, l.created_at - # assert_equal create_time, l.updated_at - # assert_equal (create_time + 1.week), l.expires_at - # end - # - # travel_to refresh_time do - # # Refresh lock - # process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", - # params: nil, - # headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite', HTTP_IF: locktoken }) - # assert_response :success - # # 1.week = 7*24*3600=604800 seconds - # assert_match 'Second-604800', response.body - # # Verify the lock in the db - # @file1.reload - # l = @file1.lock.first - # assert_equal create_time, l.created_at - # assert_equal refresh_time, l.updated_at - # assert_equal (refresh_time + 1.week), l.expires_at - # end - # end - # - # def test_lock_file_in_subproject - # process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@project3.identifier}/#{@file12.name}", params: @xml, - # headers: @admin.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) - # assert_response :success - # end - # - # def test_lock_folder_in_subproject - # process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@project3.identifier}/#{@folder10.title}", params: @xml, - # headers: @admin.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) - # assert_response :success - # end + + def test_truth + assert_kind_of Project, @project1 + assert_kind_of Project, @project3 + assert_kind_of DmsfFile, @file1 + assert_kind_of DmsfFile, @file12 + assert_kind_of DmsfFolder, @folder10 + assert_kind_of Role, @role + assert_kind_of User, @admin_user + end + + def test_lock_file_already_locked_by_other + log_user 'admin', 'admin' # login as admin + User.current = @admin_user + assert @file1.lock!, "File failed to be locked by #{User.current}" + process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", params: @xml, + headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) + assert_response :locked + end + + def test_lock_file + create_time = Time.utc(2000, 1, 2, 3, 4, 5) + refresh_time = Time.utc(2000, 1, 2, 6, 7, 8) + locktoken = nil + + # Time travel, will make the usec part of the time 0 + travel_to create_time do + # Lock file + process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", params: @xml, + headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) + assert_response :success + # Verify the response + # + # + # + # + # exclusive + # write + # infinity + # Second-604800 + # + # f5762389-6b49-4482-9a4b-ff1c8f975765 + # + # + # + # + assert_match 'exclusive', response.body + assert_match 'write', response.body + assert_match 'infinity', response.body + # 1.week = 7*24*3600=604800 seconds + assert_match 'Second-604800', response.body + assert_match(/([a-z0-9\-]+)<\/d:href><\/d:locktoken>/, response.body) + # Extract the locktoken, needed when refreshing the lock + response.body.match(/([a-z0-9\-]+)<\/d:href><\/d:locktoken>/) + locktoken = $1 + # Verify the lock in the db + l = @file1.lock.first + assert_equal create_time, l.created_at + assert_equal create_time, l.updated_at + assert_equal (create_time + 1.week), l.expires_at + end + + travel_to refresh_time do + # Refresh lock + process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", + params: nil, + headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite', HTTP_IF: locktoken }) + assert_response :success + # 1.week = 7*24*3600=604800 seconds + assert_match 'Second-604800', response.body + # Verify the lock in the db + @file1.reload + l = @file1.lock.first + assert_equal create_time, l.created_at + assert_equal refresh_time, l.updated_at + assert_equal (refresh_time + 1.week), l.expires_at + end + end + + def test_lock_file_in_subproject + process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@project3.identifier}/#{@file12.name}", params: @xml, + headers: @admin.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) + assert_response :success + end + + def test_lock_folder_in_subproject + process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@project3.identifier}/#{@folder10.title}", params: @xml, + headers: @admin.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) + assert_response :success + end def test_lock_subproject process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@project3.identifier}", params: @xml,