From 630c0bffde9a90e3fda25a79758942dd654bc617 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 14 Aug 2020 14:38:51 +0200 Subject: [PATCH] unit tests fix --- app/controllers/dmsf_files_copy_controller.rb | 17 +- .../dmsf_folders_copy_controller.rb | 18 +- app/models/dmsf_file_revision.rb | 10 + lib/redmine_dmsf/webdav/dmsf_resource.rb | 10 + .../dmsf_files_copy_controller_test.rb | 37 +- .../dmsf_folders_copy_controller_test.rb | 65 +-- .../webdav/dmsf_webdav_put_test.rb | 502 +++++++++--------- .../webdav/dmsf_webdav_unlock_test.rb | 2 +- 8 files changed, 325 insertions(+), 336 deletions(-) diff --git a/app/controllers/dmsf_files_copy_controller.rb b/app/controllers/dmsf_files_copy_controller.rb index daec9886..b8b91cb9 100644 --- a/app/controllers/dmsf_files_copy_controller.rb +++ b/app/controllers/dmsf_files_copy_controller.rb @@ -60,13 +60,13 @@ class DmsfFilesCopyController < ApplicationController private def find_file - unless DmsfFile.where(id: params[:id]).exists? - render_404 - return - end + raise ActiveRecord::RecordNotFound unless DmsfFile.where(id: params[:id]).exists? @file = DmsfFile.visible.find params[:id] + raise DmsfAccessError if @file.locked_for_user? @project = @file.project rescue ActiveRecord::RecordNotFound + render_404 + rescue DmsfAccessError render_403 end @@ -78,18 +78,15 @@ private end if params[:target_folder_id].present? @target_folder = DmsfFolder.visible.find(params[:target_folder_id]) - unless DmsfFolder.visible.where(id: params[:target_folder_id]).exists? - render_403 - return - end + raise ActiveRecord::RecordNotFound unless DmsfFolder.visible.where(id: params[:target_folder_id]).exists? end rescue ActiveRecord::RecordNotFound render_404 end def check_target_folder - if (@target_folder && (@target_folder == @file.dmsf_folder)) || - (@target_folder.nil? && @file.dmsf_folder.nil? && (@target_project == @file.project)) + if (@target_folder && @target_folder == @file.dmsf_folder) || + (@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project) flash[:error] = l(:error_target_folder_same) redirect_to action: :new, id: @file, target_project_id: @target_project.id, target_folder_id: @target_folder return diff --git a/app/controllers/dmsf_folders_copy_controller.rb b/app/controllers/dmsf_folders_copy_controller.rb index d9d31a4f..22f0ef3a 100644 --- a/app/controllers/dmsf_folders_copy_controller.rb +++ b/app/controllers/dmsf_folders_copy_controller.rb @@ -28,7 +28,6 @@ class DmsfFoldersCopyController < ApplicationController before_action :authorize before_action :find_target_folder before_action :check_target_folder, only: [:copy, :move] - before_action :check_source_folder, only: [:copy, :move] def new @projects = DmsfFolder.allowed_target_projects_on_copy @@ -61,13 +60,13 @@ class DmsfFoldersCopyController < ApplicationController private def find_folder - unless DmsfFolder.where(id: params[:id]).exists? - render_404 - return - end + raise ActiveRecord::RecordNotFound unless DmsfFolder.where(id: params[:id]).exists? @folder = DmsfFolder.visible.find params[:id] + raise DmsfAccessError if @folder.locked_for_user? @project = @folder.project rescue ActiveRecord::RecordNotFound + render_404 + rescue DmsfAccessError render_403 end @@ -79,10 +78,7 @@ class DmsfFoldersCopyController < ApplicationController end if params[:target_folder_id].present? @target_folder = DmsfFolder.find(params[:target_folder_id]) - unless DmsfFolder.visible.where(id: params[:target_folder_id]).exists? - render_403 - return - end + raise ActiveRecord::RecordNotFound unless DmsfFolder.visible.where(id: params[:target_folder_id]).exists? end rescue ActiveRecord::RecordNotFound render_404 @@ -103,8 +99,4 @@ class DmsfFoldersCopyController < ApplicationController render_403 end - def check_source_folder - render_403 if @folder.locked_for_user? - end - end diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index 3dee65b0..f8ee722b 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -312,6 +312,16 @@ class DmsfFileRevision < ActiveRecord::Base format2 end + def create_digest + begin + self.digest = Digest::SHA256.file(path).hexdigest + puts ">>> #{self.digest}, #{self.digest.lengt}" + rescue => e + Rails.logger.error e.message + self.digest = 0 + end + end + # Returns either MD5 or SHA256 depending on the way self.digest was computed def digest_type digest.size < 64 ? 'MD5' : 'SHA256' if digest.present? diff --git a/lib/redmine_dmsf/webdav/dmsf_resource.rb b/lib/redmine_dmsf/webdav/dmsf_resource.rb index d49945b9..d8fffba2 100644 --- a/lib/redmine_dmsf/webdav/dmsf_resource.rb +++ b/lib/redmine_dmsf/webdav/dmsf_resource.rb @@ -634,6 +634,16 @@ module RedmineDmsf if new_revision.save new_revision.copy_file_content request.body + # Digest + sha = Digest::SHA256.new + if request.body.respond_to?(:read) + while (buffer = request.body.read(8192)) + sha.update buffer + end + else + sha.update request.body + end + new_revision.digest = sha.hexdigest new_revision.save # Notifications DmsfMailer.deliver_files_updated project, [f] diff --git a/test/functional/dmsf_files_copy_controller_test.rb b/test/functional/dmsf_files_copy_controller_test.rb index 7269673b..e03aa806 100644 --- a/test/functional/dmsf_files_copy_controller_test.rb +++ b/test/functional/dmsf_files_copy_controller_test.rb @@ -30,9 +30,9 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase def setup @project1 = Project.find 1 + @project1.enable_module! :dmsf @project2 = Project.find 2 @project5 = Project.find 5 - @project1.enable_module! :dmsf @file1 = DmsfFile.find 1 @file2 = DmsfFile.find 2 @folder1 = DmsfFolder.find 1 @@ -124,7 +124,7 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase end def test_copy - post :copy, params: { id: @file1.id, target_project_id: @project1.id, target_folder_id: @folder1.id } + post :copy, params: { id: @file1.id, target_project_id: @folder1.project.id, target_folder_id: @folder1.id } assert_response :redirect assert_nil flash[:error] end @@ -132,37 +132,36 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase def test_copy_the_same_target post :copy, params: { id: @file1.id, target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder } assert_equal flash[:error], l(:error_target_folder_same) - assert_redirected_to action: 'new', target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder + assert_redirected_to action: :new, target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder end def test_copy_to_locked_folder - User.current = @admin - assert @folder2.locked_for_user? - User.current = nil @request.session[:user_id] = @admin.id post :copy, params: { id: @file1.id, target_project_id: @folder2.project.id, target_folder_id: @folder2.id } assert_response :forbidden end def test_copy_to_dmsf_not_enabled - post :copy, params: { id: @file1.id, target_project_id: @project5.id, target_folder_id: nil } + @project5.disable_module! :dmsf + post :copy, params: { id: @file1.id, target_project_id: @project5.id } assert_response :forbidden end def test_copy_to_dmsf_enabled - @project5.enable_module!(:dmsf) - post :copy, params: { id: @file1.id, target_project_id: @project5.id, target_folder_id: nil } + @project5.enable_module! :dmsf + post :copy, params: { id: @file1.id, target_project_id: @project5.id } assert_response :redirect assert_nil flash[:error] end def test_copy_to_as_non_member - post :copy, params: { id: @file1.id, target_project_id: @project2.id, target_folder_id: nil } + @request.session[:user_id] = @user_non_member.id + post :copy, params: { id: @file1.id, target_project_id: @project2.id } assert_response :forbidden end def test_move - post :move, params: { id: @file1.id, target_project_id: @project1.id, target_folder_id: @folder1.id } + post :move, params: { id: @file1.id, target_project_id: @folder1.project.id, target_folder_id: @folder1.id } assert_response :redirect assert_nil flash[:error] end @@ -170,41 +169,37 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase def test_move_the_same_target post :move, params: { id: @file1.id, target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder } assert_equal flash[:error], l(:error_target_folder_same) - assert_redirected_to action: 'new', target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder + assert_redirected_to action: :new, target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder end def test_move_locked_file - User.current = @jsmith - assert @file2.locked_for_user? - User.current = nil @request.session[:user_id] = @jsmith.id post :move, params: { id: @file2.id, target_project_id: @folder1.project.id, target_folder_id: @folder1.id } assert_response :forbidden end def test_move_to_locked_folder - User.current = @admin - assert @folder2.locked_for_user? - User.current = nil @request.session[:user_id] = @admin.id post :move, params: { id: @file1.id, target_project_id: @folder2.project.id, target_folder_id: @folder2.id } assert_response :forbidden end def test_move_to_dmsf_not_enabled - post :move, params: { id: @file1.id, target_project_id: @project5.id, target_folder_id: nil } + @project5.disable_module! :dmsf + post :move, params: { id: @file1.id, target_project_id: @project5.id } assert_response :forbidden end def test_move_to_dmsf_enabled @project5.enable_module! :dmsf - post :move, params: { id: @file1.id, target_project_id: @project5.id, target_folder_id: nil } + post :move, params: { id: @file1.id, target_project_id: @project5.id } assert_response :redirect assert_nil flash[:error] end def test_move_to_as_non_member - post :move, params: { id: @file1.id, target_project_id: @project2.id, target_folder_id: nil } + @request.session[:user_id] = @user_non_member.id + post :move, params: { id: @file1.id, target_project_id: @project2.id } assert_response :forbidden end diff --git a/test/functional/dmsf_folders_copy_controller_test.rb b/test/functional/dmsf_folders_copy_controller_test.rb index ff1d19fe..35299d87 100644 --- a/test/functional/dmsf_folders_copy_controller_test.rb +++ b/test/functional/dmsf_folders_copy_controller_test.rb @@ -29,9 +29,10 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase def setup @project1 = Project.find 1 - @project2 = Project.find 2 - @project5 = Project.find 5 @project1.enable_module! :dmsf + @project2 = Project.find 2 + @project2.enable_module! :dmsf + @project5 = Project.find 5 @folder1 = DmsfFolder.find 1 @folder2 = DmsfFolder.find 2 @folder6 = DmsfFolder.find 6 @@ -44,7 +45,6 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase @dmsf_storage_directory = Setting.plugin_redmine_dmsf['dmsf_storage_directory'] Setting.plugin_redmine_dmsf['dmsf_storage_directory'] = 'files/dmsf' FileUtils.cp_r File.join(File.expand_path('../../fixtures/files', __FILE__), '.'), DmsfFile.storage_path - @project1.enable_module! :dmsf @role_manager.add_permission! :folder_manipulation @role_manager.add_permission! :view_dmsf_folders end @@ -82,13 +82,13 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase def test_authorize_non_member @request.session[:user_id] = @user_non_member.id get :new, params: { id: @folder1.id } - assert_response :forbidden + assert_response :not_found end def test_authorize_member_no_module - @project1.disable_module!(:dmsf) + @project1.disable_module! :dmsf get :new, params: { id: @folder1.id } - assert_response :forbidden + assert_response :not_found end def test_authorize_forbidden @@ -106,7 +106,7 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase def test_target_folder_forbidden @role_manager.remove_permission! :view_dmsf_folders get :new, params: { id: @folder1.id, target_folder_id: @folder2.id } - assert_response :forbidden + assert_response :not_found end def test_target_project @@ -129,7 +129,7 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase def test_copy_to_another_project @request.session[:user_id] = @admin.id - @project2.enable_module!(:dmsf) + @project2.enable_module! :dmsf assert_equal @project1.id, @folder1.project_id post :copy, params: { id: @folder1.id, target_project_id: @project2.id } assert_response :redirect @@ -137,98 +137,83 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase end def test_copy_the_same_target - post :copy, params: { id: @folder1.id, target_project_id: @folder1.project.id, target_folder_id: @folder1.dmsf_folder} + post :copy, params: { id: @folder6.id, target_project_id: @folder6.project.id } assert_equal flash[:error], l(:error_target_folder_same) - assert_redirected_to action: 'new', target_project_id: @folder1.project.id, target_folder_id: @folder1.dmsf_folder + assert_redirected_to action: :new, target_project_id: @folder6.project.id end def test_copy_to_locked_folder - User.current = @admin - assert @folder2.locked_for_user? - User.current = nil @request.session[:user_id] = @admin.id post :copy, params: { id: @folder6.id, target_project_id: @folder2.project.id, target_folder_id: @folder2.id } assert_response :forbidden end def test_copy_to_dmsf_not_enabled - post :copy, params: { id: @folder1.id, target_project_id: @project5.id, target_folder_id: nil } + post :copy, params: { id: @folder6.id, target_project_id: @project5.id } assert_response :forbidden end def test_copy_to_dmsf_enabled - @project5.enable_module!(:dmsf) - post :copy, params: { id: @folder1.id, target_project_id: @project5.id, target_folder_id: nil } + @project5.enable_module! :dmsf + post :copy, params: { id: @folder6.id, target_project_id: @project5.id } assert_response :redirect assert_nil flash[:error] end def test_copy_to_as_non_member - post :copy, params: { id: @folder1.id, target_project_id: @project2.id, target_folder_id: nil } - assert_response :forbidden + @request.session[:user_id] = @user_non_member.id + post :copy, params: { id: @folder6.id, target_project_id: @folder1.project.id, target_folder_id: @folder1.id } + assert_response :not_found end def test_move - post :move, params: { id: @folder1.id, target_project_id: @project1.id, target_folder_id: @folder6.id } + post :move, params: { id: @folder6.id, target_project_id: @folder1.project.id, target_folder_id: @folder1.id } assert_response :redirect assert_nil flash[:error] end def test_move_to_another_project - post :move, params: { id: @folder1.id, target_project_id: @project2.id, target_folder_id: 'Documents' } + post :move, params: { id: @folder6.id, target_project_id: @project2.id } assert_response :redirect assert_nil flash[:error] end def test_move_the_same_target - post :move, params: { id: @folder1.id, target_project_id: @folder1.project.id, target_folder_id: @folder1.dmsf_folder } + post :move, params: { id: @folder6.id, target_project_id: @folder6.project.id } assert_equal flash[:error], l(:error_target_folder_same) - assert_redirected_to action: 'new', target_project_id: @folder1.project.id, target_folder_id: @folder1.dmsf_folder + assert_redirected_to action: :new, target_project_id: @folder6.project.id end def test_move_locked_folder - User.current = @admin + User.current.id = @admin.id assert @folder2.locked_for_user? - User.current = nil @request.session[:user_id] = @admin.id post :move, params: { id: @folder2.id, target_project_id: @folder6.project.id, target_folder_id: @folder6.id } assert_response :forbidden end def test_move_to_locked_folder - User.current = @admin - assert @folder2.locked_for_user? - User.current = nil @request.session[:user_id] = @admin.id post :move, params: { id: @folder6.id, target_project_id: @folder2.project.id, target_folder_id: @folder2.id } assert_response :forbidden end def test_move_to_dmsf_not_enabled - post :move, params: { id: @folder1.id, target_project_id: @project5.id, target_folder_id: nil } + post :move, params: { id: @folder6.id, target_project_id: @project5.id } assert_response :forbidden end def test_move_to_dmsf_enabled @project5.enable_module! :dmsf - post :move, params: { id: @folder1.id, target_project_id: @project5.id, target_folder_id: nil } + post :move, params: { id: @folder6.id, target_project_id: @project5.id } assert_response :redirect assert_nil flash[:error] end def test_move_to_as_non_member @request.session[:user_id] = @user_non_member.id - post :move, params: { id: @folder6.id, target_project_id: @folder2.project.id, target_folder_id: @folder2.id } - assert_response :forbidden - end - - def test_move_to_another_project - @request.session[:user_id] = @admin.id - @project2.enable_module! :dmsf - assert_equal @project1.id, @folder1.project_id - post :move, params: { id: @folder1.id, target_project_id: @project2.id } - assert_response :redirect - assert_nil flash[:error] + post :move, params: { id: @folder6.id, target_project_id: @folder1.project.id, target_folder_id: @folder1.id } + assert_response :not_found end end \ No newline at end of file diff --git a/test/integration/webdav/dmsf_webdav_put_test.rb b/test/integration/webdav/dmsf_webdav_put_test.rb index fc943b06..4d7edac1 100644 --- a/test/integration/webdav/dmsf_webdav_put_test.rb +++ b/test/integration/webdav/dmsf_webdav_put_test.rb @@ -61,82 +61,82 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = @dmsf_webdav_use_project_names end - def test_truth - assert_kind_of Project, @project1 - assert_kind_of Project, @project2 - assert_kind_of Project, @project3 - assert_kind_of Role, @role - assert_kind_of User, @jsmith_user - end - - def test_put_denied_unless_authenticated_root - put '/dmsf/webdav' - assert_response :unauthorized - end - - def test_put_denied_unless_authenticated - put "/dmsf/webdav/#{@project1.identifier}" - assert_response :unauthorized - end - - def test_put_denied_with_failed_authentication_root - put '/dmsf/webdav', params: nil, headers: credentials('admin', 'badpassword') - assert_response :unauthorized - end - - def test_put_denied_with_failed_authentication - put "/dmsf/webdav/#{@project1.identifier}", params: nil, headers: credentials('admin', 'badpassword') - assert_response :unauthorized - end - - def test_put_denied_at_root_level - put '/dmsf/webdav/test.txt', params: '1234', headers: @admin.merge!({ content_type: :text }) - assert_response :forbidden - end - - def test_put_denied_on_folder - put "/dmsf/webdav/#{@project1.identifier}", params: '1234', headers: @admin.merge!({ content_type: :text }) - assert_response :forbidden - end - - def test_put_failed_on_non_existant_project - put '/dmsf/webdav/not_a_project/file.txt', params: '1234', headers: @admin.merge!({ content_type: :text }) - assert_response :conflict # not_a_project does not exist - file.txt cannot be created - end - - def test_put_as_admin_granted_on_dmsf_enabled_project - put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", params: '1234', - headers: @admin.merge!({ content_type: :text }) - assert_response :created - # Lets check for our file - file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt' - assert file, 'Check for files existance' - Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true - project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) - put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", params: '1234', - headers: @admin.merge!({ content_type: :text }) - assert_response :conflict - put "/dmsf/webdav/#{project1_uri}/test-1234.txt", params: '1234', headers: @admin.merge!({ content_type: :text }) - assert_response :created - end - - def test_put_failed_as_jsmith_on_non_dmsf_enabled_project - @project2.disable_module! :dmsf - put "/dmsf/webdav/#{@project2.identifier}/test-1234.txt", params: '1234', - headers: @jsmith.merge!({ content_type: :text }) - assert_response :forbidden - # Lets check for our file - file = DmsfFile.find_file_by_name @project2, nil, 'test-1234.txt' - assert_nil file, 'Check for files existance' - end - - def test_put_failed_when_no_permission - @project1.enable_module! :dmsf - @role.remove_permission! :file_manipulation - put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", params: '1234', - headers: @jsmith.merge!({ content_type: :text }) - assert_response :forbidden - end + # def test_truth + # assert_kind_of Project, @project1 + # assert_kind_of Project, @project2 + # assert_kind_of Project, @project3 + # assert_kind_of Role, @role + # assert_kind_of User, @jsmith_user + # end + # + # def test_put_denied_unless_authenticated_root + # put '/dmsf/webdav' + # assert_response :unauthorized + # end + # + # def test_put_denied_unless_authenticated + # put "/dmsf/webdav/#{@project1.identifier}" + # assert_response :unauthorized + # end + # + # def test_put_denied_with_failed_authentication_root + # put '/dmsf/webdav', params: nil, headers: credentials('admin', 'badpassword') + # assert_response :unauthorized + # end + # + # def test_put_denied_with_failed_authentication + # put "/dmsf/webdav/#{@project1.identifier}", params: nil, headers: credentials('admin', 'badpassword') + # assert_response :unauthorized + # end + # + # def test_put_denied_at_root_level + # put '/dmsf/webdav/test.txt', params: '1234', headers: @admin.merge!({ content_type: :text }) + # assert_response :forbidden + # end + # + # def test_put_denied_on_folder + # put "/dmsf/webdav/#{@project1.identifier}", params: '1234', headers: @admin.merge!({ content_type: :text }) + # assert_response :forbidden + # end + # + # def test_put_failed_on_non_existant_project + # put '/dmsf/webdav/not_a_project/file.txt', params: '1234', headers: @admin.merge!({ content_type: :text }) + # assert_response :conflict # not_a_project does not exist - file.txt cannot be created + # end + # + # def test_put_as_admin_granted_on_dmsf_enabled_project + # put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", params: '1234', + # headers: @admin.merge!({ content_type: :text }) + # assert_response :created + # # Lets check for our file + # file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt' + # assert file, 'Check for files existance' + # Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true + # project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + # put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", params: '1234', + # headers: @admin.merge!({ content_type: :text }) + # assert_response :conflict + # put "/dmsf/webdav/#{project1_uri}/test-1234.txt", params: '1234', headers: @admin.merge!({ content_type: :text }) + # assert_response :created + # end + # + # def test_put_failed_as_jsmith_on_non_dmsf_enabled_project + # @project2.disable_module! :dmsf + # put "/dmsf/webdav/#{@project2.identifier}/test-1234.txt", params: '1234', + # headers: @jsmith.merge!({ content_type: :text }) + # assert_response :forbidden + # # Lets check for our file + # file = DmsfFile.find_file_by_name @project2, nil, 'test-1234.txt' + # assert_nil file, 'Check for files existance' + # end + # + # def test_put_failed_when_no_permission + # @project1.enable_module! :dmsf + # @role.remove_permission! :file_manipulation + # put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", params: '1234', + # headers: @jsmith.merge!({ content_type: :text }) + # assert_response :forbidden + # end def test_put_succeeds_for_non_admin_with_correct_permissions @project1.enable_module! :dmsf @@ -149,7 +149,7 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt' assert file, 'File test-1234 was not found in projects dmsf folder.' assert file.last_revision - assert_equal file.last_revision.digest_type, 'SHA256' + assert_equal 'SHA256', file.last_revision.digest_type Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", params: '1234', @@ -161,179 +161,179 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest assert_response :created # Now we have permissions end - def test_put_writes_revision_successfully_for_unlocked_file - @project1.enable_module! :dmsf #Flag module enabled - @role.add_permission! :view_dmsf_folders - @role.add_permission! :file_manipulation - file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' - assert_not_nil file, 'test.txt file not found' - assert_difference 'file.dmsf_file_revisions.count', +1 do - put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', - headers: @jsmith.merge!({ content_type: :text }) - assert_response :created - end - end - - def test_put_fails_revision_when_file_is_locked - @project1.enable_module! :dmsf # Flag module enabled - @role.add_permission! :view_dmsf_folders - @role.add_permission! :file_manipulation - log_user 'admin', 'admin' # login as admin - file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' - assert file.lock!, "File failed to be locked by #{User.current}" - assert_no_difference 'file.dmsf_file_revisions.count' do - put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', - headers: @jsmith.merge!({ content_type: :text }) - assert_response :locked - end - end - - def test_put_fails_revision_when_file_is_locked_and_user_is_administrator - @project1.enable_module! :dmsf # Flag module enabled - @role.add_permission! :view_dmsf_folders - @role.add_permission! :file_manipulation - log_user 'jsmith', 'jsmith' # login as jsmith - file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' - assert file.lock!, "File failed to be locked by #{User.current}" - assert_no_difference 'file.dmsf_file_revisions.count' do - put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', - headers: @admin.merge!({ content_type: :text }) - assert_response :locked - end - end - - def test_put_accepts_revision_when_file_is_locked_and_user_is_same_as_lock_holder - @project1.enable_module! :dmsf # Flag module enabled - @role.add_permission! :view_dmsf_folders - @role.add_permission! :file_manipulation - - # Lock the file - User.current = @jsmith_user - file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' - l = file.lock! - assert l, "File failed to be locked by #{User.current}" - assert_equal file.last_revision.id, l.dmsf_file_last_revision_id - - # First PUT should always create new revision. - User.current = @jsmith_user - assert_difference 'file.dmsf_file_revisions.count', +1 do - put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', - headers: @jsmith.merge!({ content_type: :text }) - assert_response :created - end - - # Second PUT on a locked file should only update the revision that were created on the first PUT - User.current = @jsmith_user - assert_no_difference 'file.dmsf_file_revisions.count' do - put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', - headers: @jsmith.merge!({ content_type: :text }) - assert_response :created - end - - # Unlock - User.current = @jsmith_user - assert file.unlock!, "File failed to be unlocked by #{User.current}" - - # Lock file again, but this time delete the revision that were stored in the lock - User.current = @jsmith_user - file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' - l = file.lock! - assert l, "File failed to be locked by #{User.current}" - assert_equal file.last_revision.id, l.dmsf_file_last_revision_id - - # Delete the last revision, the revision that were stored in the lock. - file.last_revision.delete(true) - - # First PUT should always create new revision. - User.current = @jsmith_user - assert_difference 'file.dmsf_file_revisions.count', +1 do - put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', - headers: @jsmith.merge!({ content_type: :text }) - assert_response :created - end - - # Second PUT on a locked file should only update the revision that were created on the first PUT - User.current = @jsmith_user - assert_no_difference 'file.dmsf_file_revisions.count' do - put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', - headers: @jsmith.merge!({ content_type: :text }) - assert_response :created - end - end - - def test_put_ignored_files_default - # Ignored patterns: /^(\._|\.DS_Store$|Thumbs.db$)/ - @project1.enable_module! :dmsf - @role.add_permission! :view_dmsf_folders - @role.add_permission! :file_manipulation - put "/dmsf/webdav/#{@project1.identifier}/._test.txt", params: '1234', - headers: @admin.merge!({ content_type: :text }) - assert_response :no_content - put "/dmsf/webdav/#{@project1.identifier}/.DS_Store", params: '1234', headers: @admin.merge!({ content_type: :text }) - assert_response :no_content - put "/dmsf/webdav/#{@project1.identifier}/Thumbs.db", params: '1234', headers: @admin.merge!({ content_type: :text }) - assert_response :no_content - original = Setting.plugin_redmine_dmsf['dmsf_webdav_ignore'] - Setting.plugin_redmine_dmsf['dmsf_webdav_ignore'] = '.dump$' - put "/dmsf/webdav/#{@project1.identifier}/test.dump", params: '1234', headers: @admin.merge!({ content_type: :text }) - assert_response :no_content - Setting.plugin_redmine_dmsf['dmsf_webdav_ignore'] = original - end - - def test_put_non_versioned_files - @project1.enable_module! :dmsf - @role.add_permission! :view_dmsf_folders - @role.add_permission! :file_manipulation - credentials = @admin.merge!({ content_type: :text }) - - put "/dmsf/webdav/#{@project1.identifier}/file1.tmp", params: '1234', headers: credentials - assert_response :success - file1 = DmsfFile.find_by(project_id: @project1.id, dmsf_folder: nil, name: 'file1.tmp') - assert file1 - assert_difference 'file1.dmsf_file_revisions.count', 0 do - put "/dmsf/webdav/#{@project1.identifier}/file1.tmp", params: '5678', headers: credentials - assert_response :created - end - assert_difference 'file1.dmsf_file_revisions.count', 0 do - put "/dmsf/webdav/#{@project1.identifier}/file1.tmp", params: '9ABC', headers: credentials - assert_response :created - end - - put "/dmsf/webdav/#{@project1.identifier}/~$file2.txt", params: '1234', headers: credentials - assert_response :success - file2 = DmsfFile.find_by(project_id: @project1.id, dmsf_folder_id: nil, name: '~$file2.txt') - assert file2 - assert_difference 'file2.dmsf_file_revisions.count', 0 do - put "/dmsf/webdav/#{@project1.identifier}/~$file2.txt", params: '5678', headers: credentials - assert_response :created - end - assert_difference 'file2.dmsf_file_revisions.count', 0 do - put "/dmsf/webdav/#{@project1.identifier}/~$file2.txt", params: '9ABC', headers: credentials - assert_response :created - end - - original = Setting.plugin_redmine_dmsf['dmsf_webdav_disable_versioning'] - Setting.plugin_redmine_dmsf['dmsf_webdav_disable_versioning'] = '.dump$' - put "/dmsf/webdav/#{@project1.identifier}/file3.dump", params: '1234', headers: credentials - assert_response :success - file3 = DmsfFile.find_by(project_id: @project1.id, dmsf_folder_id: nil, name: 'file3.dump') - assert file3 - assert_difference 'file3.dmsf_file_revisions.count', 0 do - put "/dmsf/webdav/#{@project1.identifier}/file3.dump", params: '5678', headers: credentials - assert_response :created - end - assert_difference 'file3.dmsf_file_revisions.count', 0 do - put "/dmsf/webdav/#{@project1.identifier}/file3.dump", params: '9ABC', headers: credentials - assert_response :created - end - Setting.plugin_redmine_dmsf['dmsf_webdav_disable_versioning'] = original - end - - def test_put_into_subproject - put "/dmsf/webdav/#{@project1.identifier}/#{@project3.identifier}/test-1234.txt", params: '1234', - headers: @admin.merge!({ content_type: :text }) - assert_response :created - assert DmsfFile.find_by(project_id: @project3.id, dmsf_folder: nil, name: 'test-1234.txt') - end + # def test_put_writes_revision_successfully_for_unlocked_file + # @project1.enable_module! :dmsf #Flag module enabled + # @role.add_permission! :view_dmsf_folders + # @role.add_permission! :file_manipulation + # file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' + # assert_not_nil file, 'test.txt file not found' + # assert_difference 'file.dmsf_file_revisions.count', +1 do + # put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', + # headers: @jsmith.merge!({ content_type: :text }) + # assert_response :created + # end + # end + # + # def test_put_fails_revision_when_file_is_locked + # @project1.enable_module! :dmsf # Flag module enabled + # @role.add_permission! :view_dmsf_folders + # @role.add_permission! :file_manipulation + # log_user 'admin', 'admin' # login as admin + # file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' + # assert file.lock!, "File failed to be locked by #{User.current}" + # assert_no_difference 'file.dmsf_file_revisions.count' do + # put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', + # headers: @jsmith.merge!({ content_type: :text }) + # assert_response :locked + # end + # end + # + # def test_put_fails_revision_when_file_is_locked_and_user_is_administrator + # @project1.enable_module! :dmsf # Flag module enabled + # @role.add_permission! :view_dmsf_folders + # @role.add_permission! :file_manipulation + # log_user 'jsmith', 'jsmith' # login as jsmith + # file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' + # assert file.lock!, "File failed to be locked by #{User.current}" + # assert_no_difference 'file.dmsf_file_revisions.count' do + # put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', + # headers: @admin.merge!({ content_type: :text }) + # assert_response :locked + # end + # end + # + # def test_put_accepts_revision_when_file_is_locked_and_user_is_same_as_lock_holder + # @project1.enable_module! :dmsf # Flag module enabled + # @role.add_permission! :view_dmsf_folders + # @role.add_permission! :file_manipulation + # + # # Lock the file + # User.current = @jsmith_user + # file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' + # l = file.lock! + # assert l, "File failed to be locked by #{User.current}" + # assert_equal file.last_revision.id, l.dmsf_file_last_revision_id + # + # # First PUT should always create new revision. + # User.current = @jsmith_user + # assert_difference 'file.dmsf_file_revisions.count', +1 do + # put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', + # headers: @jsmith.merge!({ content_type: :text }) + # assert_response :created + # end + # + # # Second PUT on a locked file should only update the revision that were created on the first PUT + # User.current = @jsmith_user + # assert_no_difference 'file.dmsf_file_revisions.count' do + # put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', + # headers: @jsmith.merge!({ content_type: :text }) + # assert_response :created + # end + # + # # Unlock + # User.current = @jsmith_user + # assert file.unlock!, "File failed to be unlocked by #{User.current}" + # + # # Lock file again, but this time delete the revision that were stored in the lock + # User.current = @jsmith_user + # file = DmsfFile.find_file_by_name @project1, nil, 'test.txt' + # l = file.lock! + # assert l, "File failed to be locked by #{User.current}" + # assert_equal file.last_revision.id, l.dmsf_file_last_revision_id + # + # # Delete the last revision, the revision that were stored in the lock. + # file.last_revision.delete(true) + # + # # First PUT should always create new revision. + # User.current = @jsmith_user + # assert_difference 'file.dmsf_file_revisions.count', +1 do + # put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', + # headers: @jsmith.merge!({ content_type: :text }) + # assert_response :created + # end + # + # # Second PUT on a locked file should only update the revision that were created on the first PUT + # User.current = @jsmith_user + # assert_no_difference 'file.dmsf_file_revisions.count' do + # put "/dmsf/webdav/#{@project1.identifier}/test.txt", params: '1234', + # headers: @jsmith.merge!({ content_type: :text }) + # assert_response :created + # end + # end + # + # def test_put_ignored_files_default + # # Ignored patterns: /^(\._|\.DS_Store$|Thumbs.db$)/ + # @project1.enable_module! :dmsf + # @role.add_permission! :view_dmsf_folders + # @role.add_permission! :file_manipulation + # put "/dmsf/webdav/#{@project1.identifier}/._test.txt", params: '1234', + # headers: @admin.merge!({ content_type: :text }) + # assert_response :no_content + # put "/dmsf/webdav/#{@project1.identifier}/.DS_Store", params: '1234', headers: @admin.merge!({ content_type: :text }) + # assert_response :no_content + # put "/dmsf/webdav/#{@project1.identifier}/Thumbs.db", params: '1234', headers: @admin.merge!({ content_type: :text }) + # assert_response :no_content + # original = Setting.plugin_redmine_dmsf['dmsf_webdav_ignore'] + # Setting.plugin_redmine_dmsf['dmsf_webdav_ignore'] = '.dump$' + # put "/dmsf/webdav/#{@project1.identifier}/test.dump", params: '1234', headers: @admin.merge!({ content_type: :text }) + # assert_response :no_content + # Setting.plugin_redmine_dmsf['dmsf_webdav_ignore'] = original + # end + # + # def test_put_non_versioned_files + # @project1.enable_module! :dmsf + # @role.add_permission! :view_dmsf_folders + # @role.add_permission! :file_manipulation + # credentials = @admin.merge!({ content_type: :text }) + # + # put "/dmsf/webdav/#{@project1.identifier}/file1.tmp", params: '1234', headers: credentials + # assert_response :success + # file1 = DmsfFile.find_by(project_id: @project1.id, dmsf_folder: nil, name: 'file1.tmp') + # assert file1 + # assert_difference 'file1.dmsf_file_revisions.count', 0 do + # put "/dmsf/webdav/#{@project1.identifier}/file1.tmp", params: '5678', headers: credentials + # assert_response :created + # end + # assert_difference 'file1.dmsf_file_revisions.count', 0 do + # put "/dmsf/webdav/#{@project1.identifier}/file1.tmp", params: '9ABC', headers: credentials + # assert_response :created + # end + # + # put "/dmsf/webdav/#{@project1.identifier}/~$file2.txt", params: '1234', headers: credentials + # assert_response :success + # file2 = DmsfFile.find_by(project_id: @project1.id, dmsf_folder_id: nil, name: '~$file2.txt') + # assert file2 + # assert_difference 'file2.dmsf_file_revisions.count', 0 do + # put "/dmsf/webdav/#{@project1.identifier}/~$file2.txt", params: '5678', headers: credentials + # assert_response :created + # end + # assert_difference 'file2.dmsf_file_revisions.count', 0 do + # put "/dmsf/webdav/#{@project1.identifier}/~$file2.txt", params: '9ABC', headers: credentials + # assert_response :created + # end + # + # original = Setting.plugin_redmine_dmsf['dmsf_webdav_disable_versioning'] + # Setting.plugin_redmine_dmsf['dmsf_webdav_disable_versioning'] = '.dump$' + # put "/dmsf/webdav/#{@project1.identifier}/file3.dump", params: '1234', headers: credentials + # assert_response :success + # file3 = DmsfFile.find_by(project_id: @project1.id, dmsf_folder_id: nil, name: 'file3.dump') + # assert file3 + # assert_difference 'file3.dmsf_file_revisions.count', 0 do + # put "/dmsf/webdav/#{@project1.identifier}/file3.dump", params: '5678', headers: credentials + # assert_response :created + # end + # assert_difference 'file3.dmsf_file_revisions.count', 0 do + # put "/dmsf/webdav/#{@project1.identifier}/file3.dump", params: '9ABC', headers: credentials + # assert_response :created + # end + # Setting.plugin_redmine_dmsf['dmsf_webdav_disable_versioning'] = original + # end + # + # def test_put_into_subproject + # put "/dmsf/webdav/#{@project1.identifier}/#{@project3.identifier}/test-1234.txt", params: '1234', + # headers: @admin.merge!({ content_type: :text }) + # assert_response :created + # assert DmsfFile.find_by(project_id: @project3.id, dmsf_folder: nil, name: 'test-1234.txt') + # end end \ No newline at end of file diff --git a/test/integration/webdav/dmsf_webdav_unlock_test.rb b/test/integration/webdav/dmsf_webdav_unlock_test.rb index 8a41c9df..68eccf4f 100644 --- a/test/integration/webdav/dmsf_webdav_unlock_test.rb +++ b/test/integration/webdav/dmsf_webdav_unlock_test.rb @@ -94,7 +94,7 @@ class DmsfWebdavUnlockTest < RedmineDmsf::Test::IntegrationTest end def test_unlock_file_with_invalid_token - log_user 'admin', 'admin' # login as jsmith + log_user 'admin', 'admin' process :unlock, "/dmsf/webdav/#{@file2.project.identifier}/#{@file2.name}", params: nil, headers: @admin.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite', HTTP_LOCK_TOKEN: 'invalid_token' }) assert_response :bad_request