#9 Active Storage - integration tests

This commit is contained in:
Karel Pičman 2025-11-26 16:56:38 +01:00
parent d911a470c8
commit ca560b1396
10 changed files with 450 additions and 437 deletions

View File

@ -150,8 +150,7 @@ jobs:
cd /opt/redmine cd /opt/redmine
bundle exec rake redmine:plugins:test:units bundle exec rake redmine:plugins:test:units
bundle exec rake redmine:plugins:test:functionals bundle exec rake redmine:plugins:test:functionals
# TODO: bundle exec rake redmine:plugins:test:integration
# bundle exec rake redmine:plugins:test:integration
- name: Helpers tests - name: Helpers tests
run: | run: |
cd /opt/redmine cd /opt/redmine
@ -164,23 +163,23 @@ jobs:
run: | run: |
cd /opt/redmine cd /opt/redmine
bundle exec rubocop -c plugins/redmine_dmsf/.rubocop.yml plugins/redmine_dmsf/ bundle exec rubocop -c plugins/redmine_dmsf/.rubocop.yml plugins/redmine_dmsf/
#- name: Litmus - name: Litmus
# Prepare Redmine's environment for WebDAV testing Prepare Redmine's environment for WebDAV testing
# Run Webrick server Run Webrick server
# Run Litmus tests (Omit 'http' tests due to 'timeout waiting for interim response' and locks due to complex bogus conditional) Run Litmus tests (Omit 'http' tests due to 'timeout waiting for interim response' and locks due to complex bogus conditional)
# Shutdown Webrick Shutdown Webrick
# Clean up Redmine's environment from WebDAV testing Clean up Redmine's environment from WebDAV testing
# TODO: TODO:
# run: | run: |
# cd /opt/redmine cd /opt/redmine
# bundle exec rake redmine:dmsf_webdav_test_on bundle exec rake redmine:dmsf_webdav_test_on
# bundle exec rails server -u webrick -e test -d bundle exec rails server -u webrick -e test -d
# sleep 5 sleep 5
# litmus http://localhost:3000/dmsf/webdav/dmsf_test_project admin admin litmus http://localhost:3000/dmsf/webdav/dmsf_test_project admin admin
# kill $(pgrep -f webrick) kill $(pgrep -f webrick)
# bundle exec rake redmine:dmsf_webdav_test_off bundle exec rake redmine:dmsf_webdav_test_off
# env: env:
# TESTS: "basic copymove props" TESTS: "basic copymove props"
- name: Cleanup - name: Cleanup
# Rollback plugin's changes to the database # Rollback plugin's changes to the database
# Stop the database engine # Stop the database engine

View File

@ -142,7 +142,7 @@ class DmsfFilesController < ApplicationController
revision.disk_filename = revision.new_storage_filename revision.disk_filename = revision.new_storage_filename
revision.mime_type = upload.mime_type revision.mime_type = upload.mime_type
revision.digest = upload.digest revision.digest = upload.digest
revision.shared_file.attach( revision.file.attach(
io: File.open(upload.tempfile_path), io: File.open(upload.tempfile_path),
filename: revision.disk_filename, filename: revision.disk_filename,
content_type: revision.mime_type, content_type: revision.mime_type,

View File

@ -96,7 +96,7 @@ module DmsfUploadHelper
a = Attachment.find_by_token(committed_file[:token]) a = Attachment.find_by_token(committed_file[:token])
committed_file[:tempfile_path] = a.diskfile if a committed_file[:tempfile_path] = a.diskfile if a
end end
new_revision.shared_file.attach( new_revision.file.attach(
io: File.open(committed_file[:tempfile_path]), io: File.open(committed_file[:tempfile_path]),
filename: new_revision.name, filename: new_revision.name,
content_type: new_revision.mime_type, content_type: new_revision.mime_type,

View File

@ -313,10 +313,15 @@ class DmsfFile < ApplicationRecord
file = DmsfFile.new file = DmsfFile.new
file.dmsf_folder_id = folder.id if folder file.dmsf_folder_id = folder.id if folder
file.project_id = project.id file.project_id = project.id
if DmsfFile.exists?(project_id: file.project_id, dmsf_folder_id: file.dmsf_folder_id, name: filename) title = last_revision&.title
if DmsfFile.visible.exists?(project_id: file.project_id, dmsf_folder_id: file.dmsf_folder_id, name: filename)
basename = File.basename(filename, '.*')
extname = File.extname(filename)
1.step do |i| 1.step do |i|
gen_filename = " #{filename} #{l(:dmsf_copy, n: i)}" title = "#{basename} (#{i})"
unless DmsfFile.exists?(project_id: file.project_id, dmsf_folder_id: file.dmsf_folder_id, name: gen_filename) gen_filename = "#{title}#{extname}"
unless DmsfFile.visible.exists?(project_id: file.project_id, dmsf_folder_id: file.dmsf_folder_id,
name: gen_filename)
filename = gen_filename filename = gen_filename
break break
end end
@ -326,9 +331,11 @@ class DmsfFile < ApplicationRecord
file.notification = RedmineDmsf.dmsf_default_notifications? file.notification = RedmineDmsf.dmsf_default_notifications?
if file.save && last_revision if file.save && last_revision
new_revision = last_revision.clone new_revision = last_revision.clone
new_revision.name = filename
new_revision.title = title
new_revision.dmsf_file = file new_revision.dmsf_file = file
new_revision.disk_filename = new_revision.new_storage_filename new_revision.disk_filename = new_revision.new_storage_filename
# Assign the same workflow if it's a global one or we are in the same project # Assign the same workflow if it's a global one, or we are in the same project
new_revision.workflow = nil new_revision.workflow = nil
new_revision.dmsf_workflow_id = nil new_revision.dmsf_workflow_id = nil
new_revision.dmsf_workflow_assigned_by_user_id = nil new_revision.dmsf_workflow_assigned_by_user_id = nil
@ -340,8 +347,17 @@ class DmsfFile < ApplicationRecord
new_revision.set_workflow wf.id, nil new_revision.set_workflow wf.id, nil
new_revision.assign_workflow wf.id new_revision.assign_workflow wf.id
end end
if File.exist? last_revision.disk_file if last_revision.file.attached?
FileUtils.cp last_revision.disk_file, new_revision.disk_file(search_if_not_exists: false) begin
new_revision.file.attach(
io: StringIO.new(last_revision.file.blob.download),
filename: filename,
content_type: new_revision.file.content_type,
identify: false
)
rescue ActiveStorage::FileNotFoundError => e
Rails.logger.error e
end
end end
new_revision.comment = l(:comment_copied_from, source: "#{self.project.identifier}:#{dmsf_path_str}") new_revision.comment = l(:comment_copied_from, source: "#{self.project.identifier}:#{dmsf_path_str}")
new_revision.custom_values = [] new_revision.custom_values = []

View File

@ -316,7 +316,12 @@ class DmsfFileRevision < ApplicationRecord
end end
def copy_file_content(open_file) def copy_file_content(open_file)
file.attach io: open_file, filename: dmsf_file.name file.attach(
io: open_file,
filename: dmsf_file.name,
content_type: mime_type,
identify: false
)
self.digest = file.blob.checksum self.digest = file.blob.checksum
end end

View File

@ -44,7 +44,7 @@ class ActiveStorageMigration < ActiveRecord::Migration[7.0]
.find_each .find_each
.with_index do |r, i| .with_index do |r, i|
if i.zero? if i.zero?
r.shared_file.attach( r.file.attach(
io: File.open(path), io: File.open(path),
filename: r.name, filename: r.name,
content_type: r.mime_type, content_type: r.mime_type,
@ -52,8 +52,8 @@ class ActiveStorageMigration < ActiveRecord::Migration[7.0]
) )
# Remove the original file # Remove the original file
FileUtils.rm path FileUtils.rm path
key = r.shared_file.blob.key key = r.file.blob.key
$stdout.puts "#{path} => #{File.join(key[0..1], key[2..3], key)} (#{r.shared_file.blob.filename})" $stdout.puts "#{path} => #{File.join(key[0..1], key[2..3], key)} (#{r.file.blob.filename})"
else else
# The other revisions should have set the source revision # The other revisions should have set the source revision
warn("r#{r.id}.source_dmsf_file_revision_id is null") unless r.source_dmsf_file_revision_id warn("r#{r.id}.source_dmsf_file_revision_id is null") unless r.source_dmsf_file_revision_id

View File

@ -276,9 +276,7 @@ module RedmineDmsf
# Copy file.last_revision.disk_file to new_revision.disk_file # Copy file.last_revision.disk_file to new_revision.disk_file
new_revision.size = file.last_revision.size new_revision.size = file.last_revision.size
new_revision.disk_filename = new_revision.new_storage_filename new_revision.disk_filename = new_revision.new_storage_filename
File.open(file.last_revision.disk_file, 'rb') do |f| new_revision.copy_file_content StringIO.new(file.last_revision.file.download)
new_revision.copy_file_content f
end
# Save # Save
new_revision.save && dest.resource.file.save new_revision.save && dest.resource.file.save
# Delete (and destroy) the file that should have been renamed and return what should have been returned # Delete (and destroy) the file that should have been renamed and return what should have been returned
@ -340,7 +338,7 @@ module RedmineDmsf
res = NoContent res = NoContent
end end
return PreconditionFailed unless parent.exist? && parent.folder return PreconditionFailed unless parent.exist? && (parent.folder || parent.project)
if collection? if collection?
# Permission check if they can manipulate folders and view folders # Permission check if they can manipulate folders and view folders
@ -376,15 +374,11 @@ module RedmineDmsf
new_file = file.copy_to(dest.resource.project, parent&.folder) new_file = file.copy_to(dest.resource.project, parent&.folder)
return InternalServerError unless new_file&.last_revision return InternalServerError unless new_file&.last_revision
# Update Revision and names of file (We can link to old physical resource, as it's not changed) res
new_file.last_revision.name = dest.resource.basename
new_file.name = dest.resource.basename
# Save Changes
new_file.last_revision.save && new_file.save ? res : PreconditionFailed
end end
end end
# Lock Check # Lock check
# Check for the existence of locks # Check for the existence of locks
def lock_check(args = {}) def lock_check(args = {})
entity = file || folder entity = file || folder
@ -626,7 +620,6 @@ module RedmineDmsf
end end
new_revision.disk_filename = new_revision.new_storage_filename unless reuse_revision new_revision.disk_filename = new_revision.new_storage_filename unless reuse_revision
if new_revision.save if new_revision.save
new_revision.copy_file_content request.body new_revision.copy_file_content request.body
new_revision.save new_revision.save
@ -636,7 +629,6 @@ module RedmineDmsf
Rails.logger.error new_revision.errors.full_messages.to_sentence Rails.logger.error new_revision.errors.full_messages.to_sentence
raise InternalServerError raise InternalServerError
end end
Created Created
end end

View File

@ -22,199 +22,199 @@ require 'fileutils'
# WebDAV MOVE tests # WebDAV MOVE tests
class DmsfWebdavMoveTest < RedmineDmsf::Test::IntegrationTest class DmsfWebdavMoveTest < RedmineDmsf::Test::IntegrationTest
# def test_move_denied_for_anonymous def test_move_denied_for_anonymous
# new_name = "#{@file1.name}.moved" new_name = "#{@file1.name}.moved"
# assert_no_difference '@file1.dmsf_file_revisions.count' do assert_no_difference '@file1.dmsf_file_revisions.count' do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } headers: { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# assert_response :unauthorized assert_response :unauthorized
# end end
# end end
#
# def test_move_to_new_filename_without_file_manipulation_permission def test_move_to_new_filename_without_file_manipulation_permission
# @role.remove_permission! :file_manipulation @role.remove_permission! :file_manipulation
# new_name = "#{@file1.name}.moved" new_name = "#{@file1.name}.moved"
# assert_no_difference '@file1.dmsf_file_revisions.count' do assert_no_difference '@file1.dmsf_file_revisions.count' do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :forbidden assert_response :forbidden
# end end
# end end
#
# def test_move_to_new_filename_without_file_manipulation_permission_as_admin def test_move_to_new_filename_without_file_manipulation_permission_as_admin
# @role.remove_permission! :file_manipulation @role.remove_permission! :file_manipulation
# new_name = "#{@file1.name}.moved" new_name = "#{@file1.name}.moved"
# assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @admin.merge!( headers: @admin.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :created assert_response :created
# f = DmsfFile.find_file_by_name @project1, nil, new_name f = DmsfFile.find_file_by_name @project1, nil, new_name
# assert f, "Moved file '#{new_name}' not found in project." assert f, "Moved file '#{new_name}' not found in project."
# end end
# end end
#
# def test_without_folder_manipulation_permission def test_without_folder_manipulation_permission
# @role.remove_permission! :folder_manipulation @role.remove_permission! :folder_manipulation
# new_name = "#{@folder1.title}.moved" new_name = "#{@folder1.title}.moved"
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :forbidden assert_response :forbidden
# end end
#
# def test_without_folder_manipulation_permission_as_admin def test_without_folder_manipulation_permission_as_admin
# @role.remove_permission! :folder_manipulation @role.remove_permission! :folder_manipulation
# new_name = "#{@folder1.title}.moved" new_name = "#{@folder1.title}.moved"
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}",
# params: nil, params: nil,
# headers: @admin.merge!( headers: @admin.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :created assert_response :created
# end end
#
# def test_move_folder_to_another_project def test_move_folder_to_another_project
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}",
# params: nil, params: nil,
# headers: @admin.merge!( headers: @admin.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project2.identifier}/#{@folder1.title}" } { destination: "http://www.example.com/dmsf/webdav/#{@project2.identifier}/#{@folder1.title}" }
# ) )
# assert_response :created assert_response :created
# @folder1.dmsf_folders.each do |d| @folder1.dmsf_folders.each do |d|
# assert_equal @project2, d.project assert_equal @project2, d.project
# end end
# @folder1.dmsf_files.each do |f| @folder1.dmsf_files.each do |f|
# assert_equal @project2, f.project assert_equal @project2, f.project
# end end
# @folder1.dmsf_links.each do |l| @folder1.dmsf_links.each do |l|
# assert_equal @project2, l.project assert_equal @project2, l.project
# end end
# end end
#
# def test_move_non_existent_file def test_move_non_existent_file
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/not_a_file.txt", "/dmsf/webdav/#{@project1.identifier}/not_a_file.txt",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/moved_file.txt" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/moved_file.txt" }
# ) )
# assert_response :not_found # NotFound assert_response :not_found # NotFound
# end end
#
# def test_move_to_new_filename def test_move_to_new_filename
# new_name = "#{@file1.name}.moved" new_name = "#{@file1.name}.moved"
# assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :created assert_response :created
# f = DmsfFile.find_file_by_name @project1, nil, new_name f = DmsfFile.find_file_by_name @project1, nil, new_name
# assert f, "Moved file '#{new_name}' not found in project." assert f, "Moved file '#{new_name}' not found in project."
# end end
# end end
#
# def test_move_to_new_filename_with_project_names def test_move_to_new_filename_with_project_names
# with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1', with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1',
# 'dmsf_webdav' => '1', 'dmsf_webdav' => '1',
# 'dmsf_webdav_authentication' => 'Basic', 'dmsf_webdav_authentication' => 'Basic',
# 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do
# project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1))
# new_name = "#{@file1.name}.moved" new_name = "#{@file1.name}.moved"
# assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
# process :move, "/dmsf/webdav/#{project1_uri}/#{@file1.name}", process :move, "/dmsf/webdav/#{project1_uri}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{project1_uri}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{project1_uri}/#{new_name}" }
# ) )
# assert_response :created assert_response :created
# f = DmsfFile.find_file_by_name @project1, nil, new_name f = DmsfFile.find_file_by_name @project1, nil, new_name
# assert f, "Moved file '#{new_name}' not found in project." assert f, "Moved file '#{new_name}' not found in project."
# end end
# end end
# end end
#
# def test_move_zero_sized_to_new_filename def test_move_zero_sized_to_new_filename
# new_name = "#{@file10.name}.moved" new_name = "#{@file10.name}.moved"
# assert_no_difference '@file10.dmsf_file_revisions.count' do assert_no_difference '@file10.dmsf_file_revisions.count' do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@file10.name}", "/dmsf/webdav/#{@project1.identifier}/#{@file10.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :created assert_response :created
# f = DmsfFile.find_file_by_name @project1, nil, new_name f = DmsfFile.find_file_by_name @project1, nil, new_name
# assert f, "Moved file '#{new_name}' not found in project." assert f, "Moved file '#{new_name}' not found in project."
# end end
# end end
#
# def test_move_to_new_folder def test_move_to_new_folder
# assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
# process( process(
# :move, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", :move, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/#{@file1.name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/#{@file1.name}" }
# ) )
# ) )
# assert_response :created assert_response :created
# @file1.reload @file1.reload
# assert_equal @folder1.id, @file1.dmsf_folder_id assert_equal @folder1.id, @file1.dmsf_folder_id
# end end
# end end
#
# def test_move_to_new_folder_with_project_names def test_move_to_new_folder_with_project_names
# with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1', with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1',
# 'dmsf_webdav' => '1', 'dmsf_webdav' => '1',
# 'dmsf_webdav_authentication' => 'Basic', 'dmsf_webdav_authentication' => 'Basic',
# 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do
# project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1))
# assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
# process :move, process :move,
# "/dmsf/webdav/#{project1_uri}/#{@file1.name}", "/dmsf/webdav/#{project1_uri}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{project1_uri}/#{@folder1.title}/#{@file1.name}" } { destination: "http://www.example.com/dmsf/webdav/#{project1_uri}/#{@folder1.title}/#{@file1.name}" }
# ) )
# assert_response :created assert_response :created
# @file1.reload @file1.reload
# assert_equal @folder1.id, @file1.dmsf_folder_id assert_equal @folder1.id, @file1.dmsf_folder_id
# end end
# end end
# end end
#
# def test_move_zero_sized_to_new_folder def test_move_zero_sized_to_new_folder
# assert_no_difference '@file10.dmsf_file_revisions.count' do assert_no_difference '@file10.dmsf_file_revisions.count' do
# process( process(
# :move, "/dmsf/webdav/#{@project1.identifier}/#{@file10.name}", :move, "/dmsf/webdav/#{@project1.identifier}/#{@file10.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/#{@file10.name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}/#{@file10.name}" }
# ) )
# ) )
# assert_response :created assert_response :created
# @file10.reload @file10.reload
# assert_equal @folder1.id, @file10.dmsf_folder_id assert_equal @folder1.id, @file10.dmsf_folder_id
# end end
# end end
def test_move_to_existing_filename def test_move_to_existing_filename
assert_no_difference '@file9.dmsf_file_revisions.count' do assert_no_difference '@file9.dmsf_file_revisions.count' do
@ -228,189 +228,189 @@ class DmsfWebdavMoveTest < RedmineDmsf::Test::IntegrationTest
end end
end end
# def test_move_when_file_is_locked_by_other def test_move_when_file_is_locked_by_other
# log_user 'admin', 'admin' # login as admin log_user 'admin', 'admin' # login as admin
# User.current = @admin_user User.current = @admin_user
# assert @file1.lock!, "File failed to be locked by #{User.current}" assert @file1.lock!, "File failed to be locked by #{User.current}"
# new_name = "#{@file1.name}.moved" new_name = "#{@file1.name}.moved"
# assert_no_difference '@file1.dmsf_file_revisions.count' do assert_no_difference '@file1.dmsf_file_revisions.count' do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :locked assert_response :locked
# end end
# end end
#
# def test_move_when_file_is_locked_by_other_and_user_is_admin def test_move_when_file_is_locked_by_other_and_user_is_admin
# log_user 'jsmith', 'jsmith' # login as jsmith log_user 'jsmith', 'jsmith' # login as jsmith
# User.current = @jsmith_user User.current = @jsmith_user
# assert @file1.lock!, "File failed to be locked by #{User.current}" assert @file1.lock!, "File failed to be locked by #{User.current}"
#
# new_name = "#{@file1.name}.moved" new_name = "#{@file1.name}.moved"
# assert_no_difference '@file1.dmsf_file_revisions.count' do assert_no_difference '@file1.dmsf_file_revisions.count' do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @admin.merge!( headers: @admin.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :locked assert_response :locked
# end end
# end end
#
# def test_move_when_file_is_locked_by_user def test_move_when_file_is_locked_by_user
# log_user 'jsmith', 'jsmith' # login as jsmith log_user 'jsmith', 'jsmith' # login as jsmith
# User.current = @jsmith_user User.current = @jsmith_user
# assert @file1.lock!, "File failed to be locked by #{User.current}" assert @file1.lock!, "File failed to be locked by #{User.current}"
#
# # Move once # Move once
# new_name = "#{@file1.name}.m1" new_name = "#{@file1.name}.m1"
# assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
# process :move, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", process :move, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name}" }
# ) )
# assert_response :success # Created assert_response :success # Created
# end end
# # Move twice, make sure that the MsOffice store sequence is not disrupting normal move # Move twice, make sure that the MsOffice store sequence is not disrupting normal move
# new_name2 = "#{new_name}.m2" new_name2 = "#{new_name}.m2"
# assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{new_name}", "/dmsf/webdav/#{@project1.identifier}/#{new_name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name2}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{new_name2}" }
# ) )
# assert_response :success # Created assert_response :success # Created
# end end
# end end
#
# def test_move_msoffice_save_locked_file def test_move_msoffice_save_locked_file
# # When some versions of MsOffice save a file they use the following sequence: # When some versions of MsOffice save a file they use the following sequence:
# # 1. Save changes to a new temporary document, XXX.tmp # 1. Save changes to a new temporary document, XXX.tmp
# # 2. Rename (MOVE) document to YYY.tmp. History is lost here if the original document is moved. # 2. Rename (MOVE) document to YYY.tmp. History is lost here if the original document is moved.
# # 3. Rename (MOVE) XXX.tmp to document's name. XXX.tmp must be merged to the original document otherwise the # 3. Rename (MOVE) XXX.tmp to document's name. XXX.tmp must be merged to the original document otherwise the
# # history is lost. # history is lost.
# # 4. Delete YYY.tmp. # 4. Delete YYY.tmp.
# # Verify that steps 2 and 3 work. # Verify that steps 2 and 3 work.
# log_user 'jsmith', 'jsmith' # login as jsmith log_user 'jsmith', 'jsmith' # login as jsmith
# User.current = @jsmith_user User.current = @jsmith_user
# assert @file1.lock!, "File failed to be locked by #{User.current}" assert @file1.lock!, "File failed to be locked by #{User.current}"
#
# # First save while the file is locked, should create new revision # First save while the file is locked, should create new revision
# temp_file_name = 'AAAAAAAA.tmp' temp_file_name = 'AAAAAAAA.tmp'
#
# # Make sure that the temp-file does not exist. # Make sure that the temp-file does not exist.
# temp_file = DmsfFile.find_file_by_name @project1, nil, temp_file_name temp_file = DmsfFile.find_file_by_name @project1, nil, temp_file_name
# assert_not temp_file, "File '#{temp_file_name}' should not exist yet." assert_not temp_file, "File '#{temp_file_name}' should not exist yet."
#
# # Move the original file to AAAAAAAA.tmp. The original file should not changed but a new file should be created. # Move the original file to AAAAAAAA.tmp. The original file should not changed but a new file should be created.
# assert_no_difference '@file1.dmsf_file_revisions.count' do assert_no_difference '@file1.dmsf_file_revisions.count' do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{temp_file_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{temp_file_name}" }
# ) )
# assert_response :success # Created assert_response :success # Created
# end end
#
# # Verify that a new file has been created # Verify that a new file has been created
# temp_file = DmsfFile.find_file_by_name @project1, nil, temp_file_name temp_file = DmsfFile.find_file_by_name @project1, nil, temp_file_name
# assert temp_file, "File '#{temp_file_name}' not found, move failed." assert temp_file, "File '#{temp_file_name}' not found, move failed."
# assert_equal temp_file.dmsf_file_revisions.count, 1 assert_equal temp_file.dmsf_file_revisions.count, 1
# assert_not_equal temp_file.id, @file1.id assert_not_equal temp_file.id, @file1.id
#
# # Move a temporary file (use AAAAAAAA.tmp) to the original file. # Move a temporary file (use AAAAAAAA.tmp) to the original file.
# assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{temp_file_name}", "/dmsf/webdav/#{@project1.identifier}/#{temp_file_name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { {
# destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# 'HTTP_OVERWRITE' => 'T' 'HTTP_OVERWRITE' => 'T'
# } }
# ) )
# assert_response :success # Created assert_response :success # Created
# end end
#
# # Second save while file is locked, should NOT create new revision # Second save while file is locked, should NOT create new revision
# temp_file_name = 'BBBBBBBB.tmp' temp_file_name = 'BBBBBBBB.tmp'
#
# # Make sure that the temp-file does not exist. # Make sure that the temp-file does not exist.
# temp_file = DmsfFile.find_file_by_name @project1, nil, temp_file_name temp_file = DmsfFile.find_file_by_name @project1, nil, temp_file_name
# assert_not temp_file, "File '#{temp_file_name}' should not exist yet." assert_not temp_file, "File '#{temp_file_name}' should not exist yet."
#
# # Move the original file to BBBBBBBB.tmp. The original file should not change but a new file should be created. # Move the original file to BBBBBBBB.tmp. The original file should not change but a new file should be created.
# assert_no_difference '@file1.dmsf_file_revisions.count' do assert_no_difference '@file1.dmsf_file_revisions.count' do
# process :move, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", process :move, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{temp_file_name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{temp_file_name}" }
# ) )
# assert_response :success # Created assert_response :success # Created
# end end
#
# # Verify that a new file has been created # Verify that a new file has been created
# temp_file = DmsfFile.find_file_by_name @project1, nil, temp_file_name temp_file = DmsfFile.find_file_by_name @project1, nil, temp_file_name
# assert temp_file, "File '#{temp_file_name}' not found, move failed." assert temp_file, "File '#{temp_file_name}' not found, move failed."
# assert_equal temp_file.dmsf_file_revisions.count, 1 assert_equal temp_file.dmsf_file_revisions.count, 1
# assert_not_equal temp_file.id, @file1.id assert_not_equal temp_file.id, @file1.id
#
# # Move a temporary file (use BBBBBBBB.tmp) to the original file. # Move a temporary file (use BBBBBBBB.tmp) to the original file.
# assert_no_difference '@file1.dmsf_file_revisions.count' do assert_no_difference '@file1.dmsf_file_revisions.count' do
# process :move, "/dmsf/webdav/#{@project1.identifier}/#{temp_file_name}", process :move, "/dmsf/webdav/#{@project1.identifier}/#{temp_file_name}",
# params: nil, params: nil,
# headers: @jsmith.merge!( headers: @jsmith.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@file1.name}" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@file1.name}" }
# ) )
# assert_response :success # Created assert_response :success # Created
# end end
# end end
#
# def test_move_file_in_subproject def test_move_file_in_subproject
# dest = "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/new_file_name" dest = "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/new_file_name"
# assert_difference '@file12.dmsf_file_revisions.count', +1 do assert_difference '@file12.dmsf_file_revisions.count', +1 do
# process :move, "/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/#{@file12.name}", process :move, "/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/#{@file12.name}",
# params: nil, params: nil,
# headers: @admin.merge!({ destination: dest }) headers: @admin.merge!({ destination: dest })
# assert_response :created assert_response :created
# end end
# end end
#
# def test_move_folder_in_subproject def test_move_folder_in_subproject
# dest = "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/new_folder_name" dest = "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/new_folder_name"
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/#{@folder10.title}", "/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/#{@folder10.title}",
# params: nil, params: nil,
# headers: @admin.merge!({ destination: dest }) headers: @admin.merge!({ destination: dest })
# assert_response :created assert_response :created
# @folder10.reload @folder10.reload
# assert_equal 'new_folder_name', @folder10.title assert_equal 'new_folder_name', @folder10.title
# end end
#
# def test_move_folder_in_subproject_to_the_same_name_as_subproject def test_move_folder_in_subproject_to_the_same_name_as_subproject
# dest = "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/#{@project5.identifier}" dest = "http://www.example.com/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/#{@project5.identifier}"
# process :move, process :move,
# "/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/#{@folder10.title}", "/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}/#{@folder10.title}",
# params: nil, params: nil,
# headers: @admin.merge!({ destination: dest }) headers: @admin.merge!({ destination: dest })
# assert_response :created assert_response :created
# @folder10.reload @folder10.reload
# assert_equal @project5.identifier, @folder10.title assert_equal @project5.identifier, @folder10.title
# end end
#
# def test_move_subproject def test_move_subproject
# process :move, "/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}", process :move, "/dmsf/webdav/#{@project1.identifier}/#{@project5.identifier}",
# params: nil, params: nil,
# headers: @admin.merge!( headers: @admin.merge!(
# { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/new_project_name" } { destination: "http://www.example.com/dmsf/webdav/#{@project1.identifier}/new_project_name" }
# ) )
# assert_response :method_not_allowed assert_response :method_not_allowed
# end end
end end

View File

@ -112,7 +112,7 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt' 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, 'File test-1234 was not found in projects dmsf folder.'
assert file.last_revision assert file.last_revision
assert_equal 'SHA256', file.last_revision.digest_type assert_equal 'MD5', file.last_revision.digest_type
with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1', with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1',
'dmsf_webdav' => '1', 'dmsf_webdav' => '1',
@ -381,17 +381,18 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
headers: @jsmith.merge!({ content_type: :text }) headers: @jsmith.merge!({ content_type: :text })
assert_response :created assert_response :created
end end
sha = Digest::SHA256.file(@file1.last_revision.disk_file) sha = @file1.last_revision.file.checksum
assert_equal sha, @file1.last_revision.digest assert_equal sha, @file1.last_revision.digest
end end
def test_put_version def test_put_version
assert_equal '1.0', @file1.last_revision.version
assert_difference '@file1.dmsf_file_revisions.count', +1 do assert_difference '@file1.dmsf_file_revisions.count', +1 do
put "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", put "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
params: '1234', params: '1234',
headers: @jsmith.merge!({ content_type: :text }) headers: @jsmith.merge!({ content_type: :text })
assert_response :created assert_response :created
end end
assert_equal '1.2', @file1.last_revision.version assert_equal '1.1', @file1.dmsf_file_revisions.visible.first.version
end end
end end

View File

@ -72,23 +72,23 @@ class ProjectPatchTest < RedmineDmsf::Test::UnitTest
assert_equal 5, @project1.dmsf_files.visible.all.size assert_equal 5, @project1.dmsf_files.visible.all.size
assert_equal 3, @project1.dmsf_folders.visible.all.size assert_equal 3, @project1.dmsf_folders.visible.all.size
assert_equal 2, @project1.file_links.visible.all.size assert_equal 2, @project1.file_links.all.size
assert_equal 1, @project1.folder_links.visible.all.size assert_equal 1, @project1.folder_links.all.size
assert_equal 0, @project1.url_links.visible.all.size assert_equal 0, @project1.url_links.all.size
assert_equal 1, @project5.dmsf_files.visible.all.size assert_equal 1, @project5.dmsf_files.all.size
assert_equal 1, @project5.dmsf_folders.visible.all.size assert_equal 1, @project5.dmsf_folders.all.size
assert_equal 0, @project5.file_links.visible.all.size assert_equal 0, @project5.file_links.all.size
assert_equal 0, @project5.folder_links.visible.all.size assert_equal 0, @project5.folder_links.all.size
assert_equal 0, @project5.url_links.visible.all.size assert_equal 0, @project5.url_links.all.size
@project5.copy_dmsf @project1 @project5.copy_dmsf @project1
assert_equal 6, @project5.dmsf_files.visible.all.size assert_equal 6, @project5.dmsf_files.all.size
assert_equal 4, @project5.dmsf_folders.visible.all.size assert_equal 4, @project5.dmsf_folders.all.size
assert_equal 2, @project5.file_links.visible.all.size assert_equal 2, @project5.file_links.all.size
assert_equal 1, @project5.folder_links.visible.all.size assert_equal 1, @project5.folder_links.all.size
assert_equal 0, @project5.url_links.visible.all.size assert_equal 0, @project5.url_links.all.size
end end
def test_dmsf_avaliable def test_dmsf_avaliable