unit tests fix & better locks' index

This commit is contained in:
karel.picman@lbcfree.net 2020-08-13 14:12:12 +02:00
parent 72843a1b03
commit 042855f428
17 changed files with 263 additions and 181 deletions

View File

@ -88,8 +88,8 @@ private
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

View File

@ -28,6 +28,7 @@ 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
@ -102,4 +103,8 @@ class DmsfFoldersCopyController < ApplicationController
render_403
end
def check_source_folder
render_403 if @folder.locked_for_user?
end
end

View File

@ -36,7 +36,7 @@ class DmsfFile < ActiveRecord::Base
belongs_to :project
belongs_to :dmsf_folder
belongs_to :deleted_by_user, :class_name => 'User', :foreign_key => 'deleted_by_user_id'
belongs_to :deleted_by_user, class_name: 'User', foreign_key: 'deleted_by_user_id'
has_many :dmsf_file_revisions, -> { order(created_at: :desc, id: :desc) },
dependent: :destroy

View File

@ -197,22 +197,21 @@ class DmsfFolder < ActiveRecord::Base
def self.directory_tree(project, current_folder = nil)
tree = [[l(:link_documents), nil]]
project_id = (project.is_a?(Project)) ? project.id : project
folders = DmsfFolder.where(project_id: project_id, dmsf_folder_id: nil).visible(false).to_a
project = Project.find(project) unless project.is_a?(Project)
folders = project.dmsf_folders.visible(false).to_a
# TODO: This prevents copying folders into its sub-folders too. It should be allowed.
folders.delete(current_folder)
#
folders = folders.delete_if{ |f| f.locked_for_user? }
folders.each do |folder|
tree.push(["...#{folder.title}", folder.id])
DmsfFolder.directory_subtree(tree, folder, 2, current_folder)
tree.push ["...#{folder.title}", folder.id]
DmsfFolder.directory_subtree tree, folder, 2, current_folder
end
return tree
end
def folder_tree
tree = [[title, id]]
DmsfFolder.directory_subtree(tree, self, 1, nil)
DmsfFolder.directory_subtree tree, self, 1, nil
tree
end
@ -567,19 +566,19 @@ class DmsfFolder < ActiveRecord::Base
end
end
end
classes.join(' ')
classes.join ' '
end
private
def self.directory_subtree(tree, folder, level, current_folder)
folders = DmsfFolder.where(project_id: folder.project_id, dmsf_folder_id: folder.id).notsystem.visible(false).to_a
folders.delete(current_folder)
folders = folder.dmsf_folders.notsystem.visible(false).to_a
folders.delete current_folder
folders.delete_if { |f| f.locked_for_user? }
folders.each do |subfolder|
unless subfolder == current_folder
tree.push(["#{'...' * level}#{subfolder.title}", subfolder.id])
DmsfFolder.directory_subtree(tree, subfolder, level + 1, current_folder)
tree.push ["#{'...' * level}#{subfolder.title}", subfolder.id]
DmsfFolder.directory_subtree tree, subfolder, level + 1, current_folder
end
end
end

View File

@ -0,0 +1,33 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright © 2011-20 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class ChangeIndexInDmsfLocks < ActiveRecord::Migration[5.2]
def up
remove_index :dmsf_locks, :entity_id
add_index :dmsf_locks, [:entity_id, :entity_type]
end
def down
remove_index :dmsf_locks, [:entity_id, :entity_type]
add_index :dmsf_locks, :entity_id
end
end

View File

@ -74,6 +74,7 @@ module RedmineDmsf
l.save!
reload
locks.reload
l.reload
l
end
@ -109,7 +110,7 @@ module RedmineDmsf
def unlock!(force_file_unlock_allowed = false)
raise DmsfLockError.new(l(:warning_file_not_locked)) unless self.locked?
existing = self.lock(true)
if existing.empty? || (!self.dmsf_folder.nil? && self.dmsf_folder.locked?) #If its empty its a folder thats locked (not root)
if existing.empty? || (!self.dmsf_folder.nil? && self.dmsf_folder.locked?) # If its empty its a folder that's locked (not root)
raise DmsfLockError.new(l(:error_unlock_parent_locked))
else
# If entity is locked to you, you aren't the lock originator (or named in a shared lock) so deny action

View File

@ -452,7 +452,7 @@ module RedmineDmsf
# Lock
def lock(args)
if parent.nil? || ((parent.projectless_path != '/') && (!parent.exists?))
if parent.nil? || ((parent.projectless_path != '/') && (!parent.exist?))
e = DAV4Rack::LockFailure.new
e.add_failure @path, Conflict
raise e
@ -462,7 +462,7 @@ module RedmineDmsf
e.add_failure @path, NotFound
raise e
end
lock_check(args[:scope])
lock_check args[:scope]
entity = file ? file : folder
unless entity
e = DAV4Rack::LockFailure.new
@ -502,7 +502,7 @@ module RedmineDmsf
scope = "scope_#{(args[:scope] || 'exclusive')}".to_sym
type = "type_#{(args[:type] || 'write')}".to_sym
#l should be the instance of the lock we've just created
# l should be the instance of the lock we've just created
l = entity.lock!(scope, type, Time.current + 1.weeks)
@response['Lock-Token'] = l.uuid
[1.week.to_i, l.uuid]

View File

@ -15,7 +15,7 @@ dmsf_folders_002:
dmsf_folders_003:
id: 3
title: folder2.1
title: folder3
project_id: 2
dmsf_folder_id: NULL
user_id: 1
@ -29,7 +29,7 @@ dmsf_folders_004:
dmsf_folders_005:
id: 5
title: folder3
title: folder5
project_id: 1
dmsf_folder_id: 2
user_id: 1

View File

@ -2,23 +2,15 @@
dmsf_locks_001:
id: 1
entity_id: 2
user_id: 1
entity_type: 0
user_id: 1 # admin
entity_type: 0 # DmsfFile
lock_type_cd: 0
lock_scope_cd: 0
dmsf_locks_002:
id: 2
entity_id: 2
user_id: 1
entity_type: 1
lock_type_cd: 0
lock_scope_cd: 0
dmsf_locks_003:
id: 3
entity_id: 2
user_id: 2
entity_type: 0
user_id: 2 # jsmith
entity_type: 1 # DmsfFolder
lock_type_cd: 0
lock_scope_cd: 0

View File

@ -29,8 +29,8 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
:dmsf_files, :dmsf_file_revisions, :dmsf_folder_permissions, :dmsf_locks
def setup
@project = Project.find 1
@project.enable_module! :dmsf
@project1 = Project.find 1
@project1.enable_module! :dmsf
@folder1 = DmsfFolder.find 1
@folder2 = DmsfFolder.find 2
@folder3 = DmsfFolder.find 3
@ -62,7 +62,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_truth
assert_kind_of Project, @project
assert_kind_of Project, @project1
assert_kind_of DmsfFolder, @folder1
assert_kind_of DmsfFolder, @folder2
assert_kind_of DmsfFolder, @folder3
@ -79,7 +79,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_edit_folder_forbidden
# Missing permissions
get :edit, params: { id: @project, folder_id: @folder1 }
get :edit, params: { id: @project1, folder_id: @folder1 }
assert_response :forbidden
end
@ -87,7 +87,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
# Permissions OK
@role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation
get :edit, params: { id: @project, folder_id: @folder1}
get :edit, params: { id: @project1, folder_id: @folder1}
assert_response :success
assert_select 'label', { text: @custom_field.name }
assert_select 'option', { value: @custom_value.value }
@ -96,44 +96,44 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_edit_folder_redirection_to_the_parent_folder
@role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation
post :save, params: { id: @project, folder_id: @folder2.id, parent_id: @folder2.dmsf_folder.id,
post :save, params: { id: @project1, folder_id: @folder2.id, parent_id: @folder2.dmsf_folder.id,
dmsf_folder: { title: @folder2.title, description: @folder2.description} }
assert_redirected_to dmsf_folder_path(id: @project, folder_id: @folder2.dmsf_folder.id)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder2.dmsf_folder.id)
end
def test_edit_folder_redirection_to_the_same_folder
@role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation
post :save, params: { id: @project, folder_id: @folder2.id, parent_id: @folder2.dmsf_folder.id,
post :save, params: { id: @project1, folder_id: @folder2.id, parent_id: @folder2.dmsf_folder.id,
dmsf_folder: { title: @folder2.title, description: @folder2.description,
redirect_to_folder_id: @folder2.id } }
assert_redirected_to dmsf_folder_path(id: @project, folder_id: @folder2.id)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder2.id)
end
def test_trash_forbidden
# Missing permissions
get :trash, params: { id: @project }
get :trash, params: { id: @project1 }
assert_response :forbidden
end
def test_trash_allowed
# Permissions OK
@role.add_permission! :file_delete
get :trash, params: { id: @project }
get :trash, params: { id: @project1 }
assert_response :success
assert_select 'h2', { text: l(:link_trash_bin) }
end
def test_delete_forbidden
# Missing permissions
get :delete, params: { id: @project, folder_id: @folder1.id, commit: false }
get :delete, params: { id: @project1, folder_id: @folder1.id, commit: false }
assert_response :forbidden
end
def test_delete_with_parmission_but_not_empty
# Permissions OK but the folder is not empty
@role.add_permission! :folder_manipulation
get :delete, params: { id: @project, folder_id: @folder1.id, commit: false}
get :delete, params: { id: @project1, folder_id: @folder1.id, commit: false}
assert_response :redirect
assert_include l(:error_folder_is_not_empty), flash[:error]
end
@ -141,8 +141,8 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_delete_locked
# Permissions OK but the folder is locked
@role.add_permission! :folder_manipulation
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project.id, folder_id: @folder2.id)
get :delete, params: { id: @project, folder_id: @folder2.id, commit: false}
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1.id, folder_id: @folder2.id)
get :delete, params: { id: @project1, folder_id: @folder2.id, commit: false}
assert_response :redirect
assert_include l(:error_folder_is_locked), flash[:error]
end
@ -150,8 +150,8 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_delete_ok
# Empty and not locked folder
@role.add_permission! :folder_manipulation
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project.id, folder_id: @folder1.id)
get :delete, params: { id: @project, folder_id: @folder1.id, commit: false }
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1.id, folder_id: @folder1.id)
get :delete, params: { id: @project1, folder_id: @folder1.id, commit: false }
assert_response :redirect
end
@ -159,33 +159,33 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
# Missing permissions
@folder4.deleted = 1
@folder4.save
get :restore, params: { id: @project, folder_id: @folder4.id }
get :restore, params: { id: @project1, folder_id: @folder4.id }
assert_response :forbidden
end
def test_restore_ok
# Permissions OK
@request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project.id)
@request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1.id)
@role.add_permission! :folder_manipulation
@folder1.deleted = 1
@folder1.save
get :restore, params: { id: @project, folder_id: @folder1.id }
get :restore, params: { id: @project1, folder_id: @folder1.id }
assert_response :redirect
end
def test_delete_entries_forbidden
# Missing permissions
get :entries_operation, params: { id: @project, delete_entries: 'Delete',
get :entries_operation, params: { id: @project1, delete_entries: 'Delete',
ids: ["folder-#{@folder1.id}", "file-#{@file1.id}", "folder-link-#{@folder_link1.id}", "file-link-#{@file_link2.id}"] }
assert_response :forbidden
end
def test_delete_not_empty
# Permissions OK but the folder is not empty
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project.id)
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1.id)
@role.add_permission! :folder_manipulation
@role.add_permission! :view_dmsf_files
get :entries_operation, params: { id: @project, delete_entries: 'Delete',
get :entries_operation, params: { id: @project1, delete_entries: 'Delete',
ids: ["folder-#{@folder1.id}", "file-#{@file1.id}", "folder-link-#{@folder_link1.id}", "file-link-#{@file_link2.id}"]}
assert_response :redirect
assert_equal flash[:error].to_s, l(:error_folder_is_not_empty)
@ -193,12 +193,12 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_delete_entries_ok
# Permissions OK
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project.id)
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1.id)
@role.add_permission! :view_dmsf_files
@role.add_permission! :folder_manipulation
@role.add_permission! :file_delete
flash[:error] = nil
get :entries_operation, params: { id: @project, delete_entries: 'Delete',
get :entries_operation, params: { id: @project1, delete_entries: 'Delete',
ids: ["folder-#{@folder7.id}", "file-#{@file1.id}", "file-link-#{@file_link2.id}"]}
assert_response :redirect
assert_nil flash[:error]
@ -207,9 +207,9 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_restore_entries
# Restore
@role.add_permission! :view_dmsf_files
@request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project.id)
@request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1.id)
flash[:error] = nil
get :entries_operation, params: { id: @project, restore_entries: 'Restore',
get :entries_operation, params: { id: @project1, restore_entries: 'Restore',
ids: ["file-#{@file1.id}", "file-link-#{@file_link2.id}"]}
assert_response :redirect
assert_nil flash[:error]
@ -220,7 +220,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
@role.add_permission! :view_dmsf_folders
@role.add_permission! :file_manipulation
@role.add_permission! :folder_manipulation
get :show, params: { id: @project.id }
get :show, params: { id: @project1.id }
assert_response :success
# New file link
assert_select 'a[href$=?]', '/dmsf/upload/multi_upload'
@ -239,7 +239,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_show_without_file_manipulation
@role.add_permission! :view_dmsf_files
@role.add_permission! :view_dmsf_folders
get :show, params: { id: @project.id }
get :show, params: { id: @project1.id }
assert_response :success
# New file link should be missing
assert_select 'a[href$=?]', '/dmsf/upload/multi_upload', count: 0
@ -248,7 +248,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_show_csv
@role.add_permission! :view_dmsf_files
@role.add_permission! :view_dmsf_folders
get :show, params: { id: @project.id, format: 'csv' }
get :show, params: { id: @project1.id, format: 'csv' }
assert_response :success
assert @response.content_type.match?(/^text\/csv/)
end
@ -257,27 +257,27 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
@role.add_permission! :view_dmsf_files
@role.add_permission! :view_dmsf_folders
# Despite the fact that project != @folder3.project
assert @project != @folder3.project
get :show, params: { id: @project.id, folder_id: @folder3.id }
assert @project1 != @folder3.project
get :show, params: { id: @project1.id, folder_id: @folder3.id }
assert_response :success
end
def test_new_forbidden
@role.remove_permission! :folder_manipulation
get :new, params: { id: @project, parent_id: nil }
get :new, params: { id: @project1, parent_id: nil }
assert_response :forbidden
end
def test_new
@role.add_permission! :folder_manipulation
get :new, params: { id: @project, parent_id: nil }
get :new, params: { id: @project1, parent_id: nil }
assert_response :success
end
def test_email_entries_email_from_forbidden
Setting.plugin_redmine_dmsf['dmsf_documents_email_from'] = 'karel.picman@kontron.com'
@role.add_permission! :view_dmsf_files
get :entries_operation, params: {id: @project, email_entries: 'Email', ids: ["file-#{@file1.id}"]}
get :entries_operation, params: {id: @project1, email_entries: 'Email', ids: ["file-#{@file1.id}"]}
assert_response :forbidden
end
@ -285,7 +285,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
Setting.plugin_redmine_dmsf['dmsf_documents_email_from'] = 'karel.picman@kontron.com'
@role.add_permission! :view_dmsf_files
@role.add_permission! :email_documents
get :entries_operation, params: { id: @project, email_entries: 'Email', ids: ["file-#{@file1.id}"]}
get :entries_operation, params: { id: @project1, email_entries: 'Email', ids: ["file-#{@file1.id}"]}
assert_response :success
assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_from']
end
@ -294,7 +294,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
Setting.plugin_redmine_dmsf['dmsf_documents_email_reply_to'] = 'karel.picman@kontron.com'
@role.add_permission! :view_dmsf_files
@role.add_permission! :email_documents
get :entries_operation, params: { id: @project, email_entries: 'Email', ids: ["file-#{@file1.id}"]}
get :entries_operation, params: { id: @project1, email_entries: 'Email', ids: ["file-#{@file1.id}"]}
assert_response :success
assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_reply_to']
end
@ -303,7 +303,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
Setting.plugin_redmine_dmsf['dmsf_documents_email_links_only'] = '1'
@role.add_permission! :view_dmsf_files
@role.add_permission! :email_documents
get :entries_operation, params: { id: @project, email_entries: 'Email', ids: ["file-#{@file1.id}"]}
get :entries_operation, params: { id: @project1, email_entries: 'Email', ids: ["file-#{@file1.id}"]}
assert_response :success
assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_links_only']
end
@ -311,47 +311,49 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_entries_email
@role.add_permission! :view_dmsf_files
zip_file = Tempfile.new('test', DmsfHelper::temp_dir)
get :entries_email, params: { id: @project, email:
get :entries_email, params: { id: @project1, email:
{
to: 'to@test.com', from: 'from@test.com', subject: 'subject', body: 'body', expired_at: '2015-01-01',
folders: [], files: [@file1.id], zipped_content: zip_file.path
}
}
assert_redirected_to dmsf_folder_path(id: @project)
assert_redirected_to dmsf_folder_path(id: @project1)
ensure
zip_file.unlink
end
def test_add_email_forbidden
get :add_email, params: { id: @project.id }, xhr: true
@role.remove_permission! :view_dmsf_files
get :add_email, params: { id: @project1.id }, xhr: true
assert_response :forbidden
end
def test_add_email
@role.add_permission! :view_dmsf_files
get :add_email, params: { id: @project.id }, xhr: true
get :add_email, params: { id: @project1.id }, xhr: true
assert_response :success
end
def test_append_email_forbidden
post :append_email, params: { id: @project, user_ids: @project.members.collect{ |m| m.user.id }, format: 'js'}
@role.remove_permission! :view_dmsf_files
post :append_email, params: { id: @project1, user_ids: @project1.members.collect{ |m| m.user.id }, format: 'js'}
assert_response :forbidden
end
def test_append_email
@role.add_permission! :view_dmsf_files
post :append_email, params: { id: @project, user_ids: @project.members.collect{ |m| m.user.id }, format: 'js'}
post :append_email, params: { id: @project1, user_ids: @project1.members.collect{ |m| m.user.id }, format: 'js'}
assert_response :success
end
def test_autocomplete_for_user_forbidden
get :autocomplete_for_user, params: { id: @project.id }, xhr: true
get :autocomplete_for_user, params: { id: @project1.id }, xhr: true
assert_response :forbidden
end
def test_autocomplete_for_user
@role.add_permission! :view_dmsf_files
get :autocomplete_for_user, params: { id: @project }, xhr: true
get :autocomplete_for_user, params: { id: @project1 }, xhr: true
assert_response :success
end
@ -359,19 +361,19 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
@role.add_permission! :folder_manipulation
@role.add_permission! :view_dmsf_folders
assert_difference 'DmsfFolder.count', +1 do
post :create, params: { id: @project.id, dmsf_folder: { title: 'New folder', description: 'Unit tests' } }
post :create, params: { id: @project1.id, dmsf_folder: { title: 'New folder', description: 'Unit tests' } }
end
assert_redirected_to dmsf_folder_path(id: @project, folder_id: nil)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: nil)
end
def test_create_folder
@role.add_permission! :folder_manipulation
@role.add_permission! :view_dmsf_folders
assert_difference 'DmsfFolder.count', +1 do
post :create, params: { id: @project.id, parent_id: @folder1.id,
post :create, params: { id: @project1.id, parent_id: @folder1.id,
dmsf_folder: { title: 'New folder', description: 'Unit tests' } }
end
assert_redirected_to dmsf_folder_path(id: @project, folder_id: @folder1)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1)
end
end

View File

@ -26,7 +26,7 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase
fixtures :users, :email_addresses, :dmsf_files, :dmsf_file_revisions,
:custom_fields, :custom_values, :projects, :roles, :members, :member_roles,
:enabled_modules, :dmsf_file_revisions, :dmsf_folders
:enabled_modules, :dmsf_file_revisions, :dmsf_folders, :dmsf_locks
def setup
@project1 = Project.find 1
@ -34,17 +34,18 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase
@project5 = Project.find 5
@project1.enable_module! :dmsf
@file1 = DmsfFile.find 1
@file2 = DmsfFile.find 2
@folder1 = DmsfFolder.find 1
@user_admin = User.find 1
@user_member = User.find 2
@folder2 = DmsfFolder.find 2
@admin = User.find 1
@jsmith = User.find 2
@user_non_member = User.find 3
@role_manager = Role.find_by(name: 'Manager')
User.current = nil
@request.session[:user_id] = 2 # John Smith - manager
@request.session[:user_id] = @jsmith.id
@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! :file_manipulation
@role_manager.add_permission! :view_dmsf_folders
end
@ -64,15 +65,17 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase
assert_kind_of Project, @project2
assert_kind_of Project, @project5
assert_kind_of DmsfFile, @file1
assert_kind_of DmsfFile, @file2
assert_kind_of DmsfFolder, @folder1
assert_kind_of User, @user_admin
assert_kind_of User, @user_member
assert_kind_of DmsfFolder, @folder2
assert_kind_of User, @admin
assert_kind_of User, @jsmith
assert_kind_of User, @user_non_member
assert_kind_of Role, @role_manager
end
def test_authorize_admin
@request.session[:user_id] = @user_admin.id
@request.session[:user_id] = @admin.id
get :new, params: { id: @file1.id }
assert_response :success
assert_template 'new'
@ -85,7 +88,7 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase
end
def test_authorize_member_no_module
@project1.disable_module!(:dmsf)
@project1.disable_module! :dmsf
get :new, params: { id: @file1.id }
assert_response :forbidden
end
@ -133,8 +136,11 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase
end
def test_copy_to_locked_folder
@folder1.lock!
post :copy, params: { id: @file1.id, target_project_id: @file1.project.id, target_folder_id: @folder1.id }
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
@ -167,16 +173,21 @@ class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase
assert_redirected_to action: 'new', target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder
end
def test_move_to_locked
@file1.lock!
post :move, params: { id: @file1.id, target_project_id: @file1.project.id, target_folder_id: @folder1.id }
assert_response :redirect
assert_equal l(:error_file_is_locked), flash[:error]
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
@folder1.lock!
post :move, params: { id: @file1.id, target_project_id: @file1.project.id, target_folder_id: @folder1.id }
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

View File

@ -24,8 +24,8 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase
include Redmine::I18n
fixtures :users, :projects, :roles, :members, :member_roles,:enabled_modules, :dmsf_folders,
:email_addresses
fixtures :users, :projects, :roles, :members, :member_roles, :enabled_modules, :dmsf_folders,
:email_addresses, :dmsf_locks
def setup
@project1 = Project.find 1
@ -35,16 +35,16 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase
@folder1 = DmsfFolder.find 1
@folder2 = DmsfFolder.find 2
@folder6 = DmsfFolder.find 6
@user_admin = User.find 1
@user_member = User.find 2
@admin = User.find 1
@jsmith = User.find 2
@user_non_member = User.find 3
@role_manager = Role.where(name: 'Manager').first
@role_manager = Role.find_by(name: 'Manager')
User.current = nil
@request.session[:user_id] = @user_member.id # John Smith - manager
@request.session[:user_id] = @jsmith.id
@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)
@project1.enable_module! :dmsf
@role_manager.add_permission! :folder_manipulation
@role_manager.add_permission! :view_dmsf_folders
end
@ -66,14 +66,14 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase
assert_kind_of DmsfFolder, @folder1
assert_kind_of DmsfFolder, @folder2
assert_kind_of DmsfFolder, @folder6
assert_kind_of User, @user_admin
assert_kind_of User, @user_member
assert_kind_of User, @admin
assert_kind_of User, @jsmith
assert_kind_of User, @user_non_member
assert_kind_of Role, @role_manager
end
def test_authorize_admin
@request.session[:user_id] = @user_admin.id
@request.session[:user_id] = @admin.id
get :new, params: { id: @folder1.id }
assert_response :success
assert_template 'new'
@ -128,7 +128,7 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase
end
def test_copy_to_another_project
@request.session[:user_id] = @user_admin.id
@request.session[:user_id] = @admin.id
@project2.enable_module!(:dmsf)
assert_equal @project1.id, @folder1.project_id
post :copy, params: { id: @folder1.id, target_project_id: @project2.id }
@ -143,7 +143,11 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase
end
def test_copy_to_locked_folder
post :copy, params: { id: @folder1.id, target_project_id: @folder1.project.id, target_folder_id: @folder2.id }
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
@ -182,14 +186,21 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase
assert_redirected_to action: 'new', target_project_id: @folder1.project.id, target_folder_id: @folder1.dmsf_folder
end
def test_move_to_locked
@folder1.lock!
post :move, params: { id: @folder1.id, target_project_id: @folder1.project.id, target_folder_id: @folder2.id }
def test_move_locked_folder
User.current = @admin
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
post :move, params: { id: @folder1.id, target_project_id: @folder2.project.id, target_folder_id: @folder2.id }
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
@ -199,20 +210,21 @@ class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase
end
def test_move_to_dmsf_enabled
@project5.enable_module!(:dmsf)
@project5.enable_module! :dmsf
post :move, params: { id: @folder1.id, target_project_id: @project5.id, target_folder_id: nil }
assert_response :redirect
assert_nil flash[:error]
end
def test_move_to_as_non_member
post :move, params: { id: @folder1.id, target_project_id: @project2.id, target_folder_id: nil }
@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] = @user_admin.id
@project2.enable_module!(:dmsf)
@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

View File

@ -29,19 +29,21 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
:dmsf_files, :dmsf_locks
def setup
@user_member = User.find 2
@admin = User.find 1
@jsmith = User.find 2
User.current = nil
@request.session[:user_id] = @user_member.id
@request.session[:user_id] = @jsmith.id
end
def test_truth
assert_kind_of User, @user_member
assert_kind_of User, @admin
assert_kind_of User, @jsmith
end
def test_page_with_open_approvals_one_approval
DmsfFileRevision.where(id: 5).delete_all
@user_member.pref[:my_page_layout] = { 'top' => ['open_approvals'] }
@user_member.pref.save!
@jsmith.pref[:my_page_layout] = { 'top' => ['open_approvals'] }
@jsmith.pref.save!
get :page
assert_response :success
unless defined?(EasyExtensions)
@ -52,8 +54,8 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
end
def test_page_with_open_approvals_no_approval
@user_member.pref[:my_page_layout] = { 'top' => ['open_approvals'] }
@user_member.pref.save!
@jsmith.pref[:my_page_layout] = { 'top' => ['open_approvals'] }
@jsmith.pref.save!
get :page
assert_response :success
unless defined?(EasyExtensions)
@ -64,8 +66,9 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
end
def test_page_with_open_locked_documents
@user_member.pref[:my_page_layout] = { 'top' => ['locked_documents'] }
@user_member.pref.save!
@request.session[:user_id] = @admin.id
@admin.pref[:my_page_layout] = { 'top' => ['locked_documents'] }
@admin.pref.save!
get :page
assert_response :success
unless defined?(EasyExtensions)

View File

@ -26,7 +26,7 @@ require 'fileutils'
class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles,
:enabled_modules, :dmsf_folders, :dmsf_files, :dmsf_file_revisions
:enabled_modules, :dmsf_folders, :dmsf_files, :dmsf_file_revisions, :dmsf_locks
def setup
@admin = credentials 'admin'
@ -34,9 +34,13 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
@admin_user = User.find_by(login: 'admin')
@project1 = Project.find 1
@project1.enable_module! 'dmsf'
@project2 = Project.find 2
@project2.enable_module! 'dmsf'
@project3 = Project.find 3
@project3.enable_module! 'dmsf'
@file1 = DmsfFile.find 1
@file2 = DmsfFile.find 2
@file9 = DmsfFile.find 9
@file12 = DmsfFile.find 12
@folder10 = DmsfFolder.find 10
# Fix permissions for jsmith's role
@ -53,6 +57,7 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
<d:locktype><d:write/></d:locktype>
<d:owner>jsmith</d:owner>
</d:lockinfo>}
User.current = nil
end
def teardown
@ -62,8 +67,11 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
def test_truth
assert_kind_of Project, @project1
assert_kind_of Project, @project2
assert_kind_of Project, @project3
assert_kind_of DmsfFile, @file1
assert_kind_of DmsfFile, @file2
assert_kind_of DmsfFile, @file9
assert_kind_of DmsfFile, @file12
assert_kind_of DmsfFolder, @folder10
assert_kind_of Role, @role
@ -71,12 +79,11 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
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
log_user 'jsmith', 'jsmith'
process :lock, "/dmsf/webdav/#{@project2.identifier}/#{@file2.name}", params: @xml,
headers: @admin.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' })
assert_response :multi_status
assert_match '<d:status>HTTP/1.1 409 Conflict</d:status>', response.body
end
def test_lock_file
@ -87,7 +94,7 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
# 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,
process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file9.name}", params: @xml,
headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' })
assert_response :success
# Verify the response
@ -115,7 +122,8 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
response.body.match(/<d:locktoken><d:href>([a-z0-9\-]+)<\/d:href><\/d:locktoken>/)
locktoken = $1
# Verify the lock in the db
l = @file1.lock.first
@file9.reload
l = @file9.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
@ -123,15 +131,15 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
travel_to refresh_time do
# Refresh lock
process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}",
process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file9.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 '<d:timeout>Second-604800</d:timeout>', response.body
# Verify the lock in the db
@file1.reload
l = @file1.lock.first
@file9.reload
l = @file9.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

View File

@ -285,15 +285,15 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
def test_assigned
assert !@file1.assigned?(@admin)
assert !@file1.assigned?(@jsmith)
@file7.last_revision.set_workflow(@wf1.id, nil)
@file7.last_revision.assign_workflow(@wf1.id)
@file7.last_revision.set_workflow @wf1.id, nil
@file7.last_revision.assign_workflow @wf1.id
assert @file7.assigned?(@admin)
assert @file7.assigned?(@jsmith)
end
def test_locked_by
# Locked file
assert_equal @jsmith.name, @file2.locked_by
assert_equal @admin.name, @file2.locked_by
# Unlocked file
assert_equal '', @file1.locked_by
end

View File

@ -24,7 +24,7 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfFolderTest < RedmineDmsf::Test::UnitTest
fixtures :projects, :users, :email_addresses, :dmsf_folders, :roles, :members, :member_roles,
:dmsf_folder_permissions
:dmsf_folder_permissions, :dmsf_locks
def setup
@project1 = Project.find 1
@ -33,40 +33,42 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
@project2.enable_module! :dmsf
@folder1 = DmsfFolder.find 1
@folder2 = DmsfFolder.find 2
@folder3 = DmsfFolder.find 3
@folder4 = DmsfFolder.find 4
@folder5 = DmsfFolder.find 5
@folder6 = DmsfFolder.find 6
@folder7 = DmsfFolder.find 7
@manager = User.find 2
@developer = User.find 3
@manager_role = Role.find 1
@jsmith = User.find 2 # Manager
@dlopper = User.find 3 # Developer
@manager_role = Role.find_by(name: 'Manager')
@manager_role.add_permission! :view_dmsf_folders
developer_role = Role.find 2
developer_role.add_permission! :view_dmsf_folders
User.current = @manager
User.current = @jsmith
end
def test_truth
assert_kind_of DmsfFolder, @folder1
assert_kind_of DmsfFolder, @folder1
assert_kind_of DmsfFolder, @folder2
assert_kind_of DmsfFolder, @folder3
assert_kind_of DmsfFolder, @folder4
assert_kind_of DmsfFolder, @folder5
assert_kind_of DmsfFolder, @folder6
assert_kind_of DmsfFolder, @folder7
assert_kind_of Project, @project1
assert_kind_of Project, @project2
assert_kind_of User, @manager
assert_kind_of User, @developer
assert_kind_of User, @jsmith
assert_kind_of User, @dlopper
assert_kind_of Role, @manager_role
end
def test_visiblity
# The role has got permissions
User.current = @manager
User.current = @jsmith
assert_equal 7, DmsfFolder.where(project_id: 1).all.size
assert_equal 5, DmsfFolder.visible.where(project_id: 1).all.size
# The user has got permissions
User.current = @developer
User.current = @dlopper
# Hasn't got permissions for @folder7
@folder7.dmsf_folder_permissions.where(object_type: 'User').delete_all
assert_equal 4, DmsfFolder.visible.where(project_id: 1).all.size
@ -77,7 +79,7 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
end
def test_permissions
User.current = @developer
User.current = @dlopper
assert DmsfFolder.permissions?(@folder7)
@folder7.dmsf_folder_permissions.where(object_type: 'User').delete_all
@folder7.reload
@ -148,34 +150,45 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
end
def test_directory_tree
User.current = @admin
@folder7.lock!
User.current = @jsmith
assert @folder7.locked_for_user?
tree = DmsfFolder.directory_tree(@project1)
assert tree
# [["Documents", nil],
# ["...folder7", 7],
# ["...folder1", 1],
# ["......folder2", 2] - locked
# ["......folder2", 2]
# [".........folder5", 5],
# ["...folder6", 6]]
assert tree.to_s.include?('...folder1'), "'...folder3' string in the folder tree expected."
assert !tree.to_s.include?('......folder2'), "'......folder2' string in the folder tree not expected."
# ["...folder7", 7] - locked
assert tree.to_s.include?('...folder1'), "'...folder1' string in the folder tree expected."
assert !tree.to_s.include?('...folder7'), "'...folder7' string in the folder tree not expected."
end
def test_directory_tree_id
User.current = @admin
@folder7.lock!
User.current = @jsmith
assert @folder7.locked_for_user?
tree = DmsfFolder.directory_tree(@project1.id)
assert tree
# [["Documents", nil],
# ["...folder7", 7],
# ["...folder1", 1],
# ["......folder2", 2] - locked
# ["......folder2", 2]
# [".........folder5", 5],
# ["...folder6", 6]]
assert tree.to_s.include?('...folder1'), "'...folder3' string in the folder tree expected."
assert !tree.to_s.include?('......folder2'), "'......folder2' string in the folder tree not expected."
# ["...folder7", 7] - locked
assert tree.to_s.include?('...folder1'), "'...folder1' string in the folder tree expected."
assert !tree.to_s.include?('...folder7'), "'...folder7' string in the folder tree not expected."
end
def test_folder_tree
User.current = @admin
tree = @folder1.folder_tree
assert tree
# [["folder1", 1],
# ["...folder2", 2] - locked
# ["...folder2", 2] - locked for admin
assert tree.to_s.include?('folder1'), "'folder1' string in the folder tree expected."
assert !tree.to_s.include?('...folder2'), "'...folder2' string in the folder tree not expected."
end

View File

@ -28,9 +28,10 @@ class DmsfLockTest < RedmineDmsf::Test::UnitTest
:enumerations, :dmsf_locks
def setup
@lock = dmsf_locks(:dmsf_locks_001)
@folder2 = dmsf_folders(:dmsf_folders_002)
@file4 = dmsf_files(:dmsf_files_004)
@lock = DmsfLock.find 1
@folder2 = DmsfFolder.find 2
@folder7 = DmsfFolder.find 7
@file4 = DmsfFile.find 4
@jsmith = User.find 2
@admin = User.find 1
end
@ -77,16 +78,18 @@ class DmsfLockTest < RedmineDmsf::Test::UnitTest
end
def test_locked_folder_cannot_be_unlocked_by_someone_without_rights_or_anon
User.current = @admin
@folder7.lock!
User.current = nil
assert_no_difference('@folder2.lock.count') do
assert_no_difference('@folder7.lock.count') do
assert_raise DmsfLockError do
@folder2.unlock!
@folder7.unlock!
end
end
User.current = @jsmith
assert_no_difference('@folder2.lock.count') do
assert_no_difference('@folder7.lock.count') do
assert_raise DmsfLockError do
@folder2.unlock!
@folder7.unlock!
end
end
end