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 end
def check_target_folder def check_target_folder
if (@target_folder && @target_folder == @file.dmsf_folder) || if (@target_folder && (@target_folder == @file.dmsf_folder)) ||
(@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project) (@target_folder.nil? && @file.dmsf_folder.nil? && (@target_project == @file.project))
flash[:error] = l(:error_target_folder_same) flash[:error] = l(:error_target_folder_same)
redirect_to action: :new, id: @file, target_project_id: @target_project.id, target_folder_id: @target_folder redirect_to action: :new, id: @file, target_project_id: @target_project.id, target_folder_id: @target_folder
return return

View File

@ -28,6 +28,7 @@ class DmsfFoldersCopyController < ApplicationController
before_action :authorize before_action :authorize
before_action :find_target_folder before_action :find_target_folder
before_action :check_target_folder, only: [:copy, :move] before_action :check_target_folder, only: [:copy, :move]
before_action :check_source_folder, only: [:copy, :move]
def new def new
@projects = DmsfFolder.allowed_target_projects_on_copy @projects = DmsfFolder.allowed_target_projects_on_copy
@ -102,4 +103,8 @@ class DmsfFoldersCopyController < ApplicationController
render_403 render_403
end end
def check_source_folder
render_403 if @folder.locked_for_user?
end
end end

View File

@ -36,7 +36,7 @@ class DmsfFile < ActiveRecord::Base
belongs_to :project belongs_to :project
belongs_to :dmsf_folder 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) }, has_many :dmsf_file_revisions, -> { order(created_at: :desc, id: :desc) },
dependent: :destroy dependent: :destroy

View File

@ -197,22 +197,21 @@ class DmsfFolder < ActiveRecord::Base
def self.directory_tree(project, current_folder = nil) def self.directory_tree(project, current_folder = nil)
tree = [[l(:link_documents), nil]] tree = [[l(:link_documents), nil]]
project_id = (project.is_a?(Project)) ? project.id : project project = Project.find(project) unless project.is_a?(Project)
folders = DmsfFolder.where(project_id: project_id, dmsf_folder_id: nil).visible(false).to_a folders = project.dmsf_folders.visible(false).to_a
# TODO: This prevents copying folders into its sub-folders too. It should be allowed. # TODO: This prevents copying folders into its sub-folders too. It should be allowed.
folders.delete(current_folder) folders.delete(current_folder)
#
folders = folders.delete_if{ |f| f.locked_for_user? } folders = folders.delete_if{ |f| f.locked_for_user? }
folders.each do |folder| folders.each do |folder|
tree.push(["...#{folder.title}", folder.id]) tree.push ["...#{folder.title}", folder.id]
DmsfFolder.directory_subtree(tree, folder, 2, current_folder) DmsfFolder.directory_subtree tree, folder, 2, current_folder
end end
return tree return tree
end end
def folder_tree def folder_tree
tree = [[title, id]] tree = [[title, id]]
DmsfFolder.directory_subtree(tree, self, 1, nil) DmsfFolder.directory_subtree tree, self, 1, nil
tree tree
end end
@ -567,19 +566,19 @@ class DmsfFolder < ActiveRecord::Base
end end
end end
end end
classes.join(' ') classes.join ' '
end end
private private
def self.directory_subtree(tree, folder, level, current_folder) 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 = folder.dmsf_folders.notsystem.visible(false).to_a
folders.delete(current_folder) folders.delete current_folder
folders.delete_if { |f| f.locked_for_user? } folders.delete_if { |f| f.locked_for_user? }
folders.each do |subfolder| folders.each do |subfolder|
unless subfolder == current_folder unless subfolder == current_folder
tree.push(["#{'...' * level}#{subfolder.title}", subfolder.id]) tree.push ["#{'...' * level}#{subfolder.title}", subfolder.id]
DmsfFolder.directory_subtree(tree, subfolder, level + 1, current_folder) DmsfFolder.directory_subtree tree, subfolder, level + 1, current_folder
end end
end 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! l.save!
reload reload
locks.reload locks.reload
l.reload
l l
end end
@ -109,7 +110,7 @@ module RedmineDmsf
def unlock!(force_file_unlock_allowed = false) def unlock!(force_file_unlock_allowed = false)
raise DmsfLockError.new(l(:warning_file_not_locked)) unless self.locked? raise DmsfLockError.new(l(:warning_file_not_locked)) unless self.locked?
existing = self.lock(true) 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)) raise DmsfLockError.new(l(:error_unlock_parent_locked))
else else
# If entity is locked to you, you aren't the lock originator (or named in a shared lock) so deny action # 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 # Lock
def lock(args) def lock(args)
if parent.nil? || ((parent.projectless_path != '/') && (!parent.exists?)) if parent.nil? || ((parent.projectless_path != '/') && (!parent.exist?))
e = DAV4Rack::LockFailure.new e = DAV4Rack::LockFailure.new
e.add_failure @path, Conflict e.add_failure @path, Conflict
raise e raise e
@ -462,7 +462,7 @@ module RedmineDmsf
e.add_failure @path, NotFound e.add_failure @path, NotFound
raise e raise e
end end
lock_check(args[:scope]) lock_check args[:scope]
entity = file ? file : folder entity = file ? file : folder
unless entity unless entity
e = DAV4Rack::LockFailure.new e = DAV4Rack::LockFailure.new
@ -502,7 +502,7 @@ module RedmineDmsf
scope = "scope_#{(args[:scope] || 'exclusive')}".to_sym scope = "scope_#{(args[:scope] || 'exclusive')}".to_sym
type = "type_#{(args[:type] || 'write')}".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) l = entity.lock!(scope, type, Time.current + 1.weeks)
@response['Lock-Token'] = l.uuid @response['Lock-Token'] = l.uuid
[1.week.to_i, l.uuid] [1.week.to_i, l.uuid]

View File

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

View File

@ -2,23 +2,15 @@
dmsf_locks_001: dmsf_locks_001:
id: 1 id: 1
entity_id: 2 entity_id: 2
user_id: 1 user_id: 1 # admin
entity_type: 0 entity_type: 0 # DmsfFile
lock_type_cd: 0 lock_type_cd: 0
lock_scope_cd: 0 lock_scope_cd: 0
dmsf_locks_002: dmsf_locks_002:
id: 2 id: 2
entity_id: 2 entity_id: 2
user_id: 1 user_id: 2 # jsmith
entity_type: 1 entity_type: 1 # DmsfFolder
lock_type_cd: 0 lock_type_cd: 0
lock_scope_cd: 0 lock_scope_cd: 0
dmsf_locks_003:
id: 3
entity_id: 2
user_id: 2
entity_type: 0
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 :dmsf_files, :dmsf_file_revisions, :dmsf_folder_permissions, :dmsf_locks
def setup def setup
@project = Project.find 1 @project1 = Project.find 1
@project.enable_module! :dmsf @project1.enable_module! :dmsf
@folder1 = DmsfFolder.find 1 @folder1 = DmsfFolder.find 1
@folder2 = DmsfFolder.find 2 @folder2 = DmsfFolder.find 2
@folder3 = DmsfFolder.find 3 @folder3 = DmsfFolder.find 3
@ -62,7 +62,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end end
def test_truth def test_truth
assert_kind_of Project, @project assert_kind_of Project, @project1
assert_kind_of DmsfFolder, @folder1 assert_kind_of DmsfFolder, @folder1
assert_kind_of DmsfFolder, @folder2 assert_kind_of DmsfFolder, @folder2
assert_kind_of DmsfFolder, @folder3 assert_kind_of DmsfFolder, @folder3
@ -79,7 +79,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_edit_folder_forbidden def test_edit_folder_forbidden
# Missing permissions # Missing permissions
get :edit, params: { id: @project, folder_id: @folder1 } get :edit, params: { id: @project1, folder_id: @folder1 }
assert_response :forbidden assert_response :forbidden
end end
@ -87,7 +87,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
# Permissions OK # Permissions OK
@role.add_permission! :view_dmsf_folders @role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation @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_response :success
assert_select 'label', { text: @custom_field.name } assert_select 'label', { text: @custom_field.name }
assert_select 'option', { value: @custom_value.value } 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 def test_edit_folder_redirection_to_the_parent_folder
@role.add_permission! :view_dmsf_folders @role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation @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} } 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 end
def test_edit_folder_redirection_to_the_same_folder def test_edit_folder_redirection_to_the_same_folder
@role.add_permission! :view_dmsf_folders @role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation @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, dmsf_folder: { title: @folder2.title, description: @folder2.description,
redirect_to_folder_id: @folder2.id } } 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 end
def test_trash_forbidden def test_trash_forbidden
# Missing permissions # Missing permissions
get :trash, params: { id: @project } get :trash, params: { id: @project1 }
assert_response :forbidden assert_response :forbidden
end end
def test_trash_allowed def test_trash_allowed
# Permissions OK # Permissions OK
@role.add_permission! :file_delete @role.add_permission! :file_delete
get :trash, params: { id: @project } get :trash, params: { id: @project1 }
assert_response :success assert_response :success
assert_select 'h2', { text: l(:link_trash_bin) } assert_select 'h2', { text: l(:link_trash_bin) }
end end
def test_delete_forbidden def test_delete_forbidden
# Missing permissions # 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 assert_response :forbidden
end end
def test_delete_with_parmission_but_not_empty def test_delete_with_parmission_but_not_empty
# Permissions OK but the folder is not empty # Permissions OK but the folder is not empty
@role.add_permission! :folder_manipulation @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_response :redirect
assert_include l(:error_folder_is_not_empty), flash[:error] assert_include l(:error_folder_is_not_empty), flash[:error]
end end
@ -141,8 +141,8 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_delete_locked def test_delete_locked
# Permissions OK but the folder is locked # Permissions OK but the folder is locked
@role.add_permission! :folder_manipulation @role.add_permission! :folder_manipulation
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project.id, folder_id: @folder2.id) @request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1.id, folder_id: @folder2.id)
get :delete, params: { id: @project, folder_id: @folder2.id, commit: false} get :delete, params: { id: @project1, folder_id: @folder2.id, commit: false}
assert_response :redirect assert_response :redirect
assert_include l(:error_folder_is_locked), flash[:error] assert_include l(:error_folder_is_locked), flash[:error]
end end
@ -150,8 +150,8 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_delete_ok def test_delete_ok
# Empty and not locked folder # Empty and not locked folder
@role.add_permission! :folder_manipulation @role.add_permission! :folder_manipulation
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project.id, folder_id: @folder1.id) @request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1.id, folder_id: @folder1.id)
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_response :redirect
end end
@ -159,33 +159,33 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
# Missing permissions # Missing permissions
@folder4.deleted = 1 @folder4.deleted = 1
@folder4.save @folder4.save
get :restore, params: { id: @project, folder_id: @folder4.id } get :restore, params: { id: @project1, folder_id: @folder4.id }
assert_response :forbidden assert_response :forbidden
end end
def test_restore_ok def test_restore_ok
# Permissions 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 @role.add_permission! :folder_manipulation
@folder1.deleted = 1 @folder1.deleted = 1
@folder1.save @folder1.save
get :restore, params: { id: @project, folder_id: @folder1.id } get :restore, params: { id: @project1, folder_id: @folder1.id }
assert_response :redirect assert_response :redirect
end end
def test_delete_entries_forbidden def test_delete_entries_forbidden
# Missing permissions # 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}"] } ids: ["folder-#{@folder1.id}", "file-#{@file1.id}", "folder-link-#{@folder_link1.id}", "file-link-#{@file_link2.id}"] }
assert_response :forbidden assert_response :forbidden
end end
def test_delete_not_empty def test_delete_not_empty
# Permissions OK but the folder is 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! :folder_manipulation
@role.add_permission! :view_dmsf_files @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}"]} ids: ["folder-#{@folder1.id}", "file-#{@file1.id}", "folder-link-#{@folder_link1.id}", "file-link-#{@file_link2.id}"]}
assert_response :redirect assert_response :redirect
assert_equal flash[:error].to_s, l(:error_folder_is_not_empty) 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 def test_delete_entries_ok
# Permissions 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! :view_dmsf_files
@role.add_permission! :folder_manipulation @role.add_permission! :folder_manipulation
@role.add_permission! :file_delete @role.add_permission! :file_delete
flash[:error] = nil 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}"]} ids: ["folder-#{@folder7.id}", "file-#{@file1.id}", "file-link-#{@file_link2.id}"]}
assert_response :redirect assert_response :redirect
assert_nil flash[:error] assert_nil flash[:error]
@ -207,9 +207,9 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_restore_entries def test_restore_entries
# Restore # Restore
@role.add_permission! :view_dmsf_files @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 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}"]} ids: ["file-#{@file1.id}", "file-link-#{@file_link2.id}"]}
assert_response :redirect assert_response :redirect
assert_nil flash[:error] assert_nil flash[:error]
@ -220,7 +220,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
@role.add_permission! :view_dmsf_folders @role.add_permission! :view_dmsf_folders
@role.add_permission! :file_manipulation @role.add_permission! :file_manipulation
@role.add_permission! :folder_manipulation @role.add_permission! :folder_manipulation
get :show, params: { id: @project.id } get :show, params: { id: @project1.id }
assert_response :success assert_response :success
# New file link # New file link
assert_select 'a[href$=?]', '/dmsf/upload/multi_upload' assert_select 'a[href$=?]', '/dmsf/upload/multi_upload'
@ -239,7 +239,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_show_without_file_manipulation def test_show_without_file_manipulation
@role.add_permission! :view_dmsf_files @role.add_permission! :view_dmsf_files
@role.add_permission! :view_dmsf_folders @role.add_permission! :view_dmsf_folders
get :show, params: { id: @project.id } get :show, params: { id: @project1.id }
assert_response :success assert_response :success
# New file link should be missing # New file link should be missing
assert_select 'a[href$=?]', '/dmsf/upload/multi_upload', count: 0 assert_select 'a[href$=?]', '/dmsf/upload/multi_upload', count: 0
@ -248,7 +248,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_show_csv def test_show_csv
@role.add_permission! :view_dmsf_files @role.add_permission! :view_dmsf_files
@role.add_permission! :view_dmsf_folders @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 :success
assert @response.content_type.match?(/^text\/csv/) assert @response.content_type.match?(/^text\/csv/)
end end
@ -257,27 +257,27 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
@role.add_permission! :view_dmsf_files @role.add_permission! :view_dmsf_files
@role.add_permission! :view_dmsf_folders @role.add_permission! :view_dmsf_folders
# Despite the fact that project != @folder3.project # Despite the fact that project != @folder3.project
assert @project != @folder3.project assert @project1 != @folder3.project
get :show, params: { id: @project.id, folder_id: @folder3.id } get :show, params: { id: @project1.id, folder_id: @folder3.id }
assert_response :success assert_response :success
end end
def test_new_forbidden def test_new_forbidden
@role.remove_permission! :folder_manipulation @role.remove_permission! :folder_manipulation
get :new, params: { id: @project, parent_id: nil } get :new, params: { id: @project1, parent_id: nil }
assert_response :forbidden assert_response :forbidden
end end
def test_new def test_new
@role.add_permission! :folder_manipulation @role.add_permission! :folder_manipulation
get :new, params: { id: @project, parent_id: nil } get :new, params: { id: @project1, parent_id: nil }
assert_response :success assert_response :success
end end
def test_email_entries_email_from_forbidden def test_email_entries_email_from_forbidden
Setting.plugin_redmine_dmsf['dmsf_documents_email_from'] = 'karel.picman@kontron.com' Setting.plugin_redmine_dmsf['dmsf_documents_email_from'] = 'karel.picman@kontron.com'
@role.add_permission! :view_dmsf_files @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 assert_response :forbidden
end end
@ -285,7 +285,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
Setting.plugin_redmine_dmsf['dmsf_documents_email_from'] = 'karel.picman@kontron.com' Setting.plugin_redmine_dmsf['dmsf_documents_email_from'] = 'karel.picman@kontron.com'
@role.add_permission! :view_dmsf_files @role.add_permission! :view_dmsf_files
@role.add_permission! :email_documents @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_response :success
assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_from'] assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_from']
end end
@ -294,7 +294,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
Setting.plugin_redmine_dmsf['dmsf_documents_email_reply_to'] = 'karel.picman@kontron.com' Setting.plugin_redmine_dmsf['dmsf_documents_email_reply_to'] = 'karel.picman@kontron.com'
@role.add_permission! :view_dmsf_files @role.add_permission! :view_dmsf_files
@role.add_permission! :email_documents @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_response :success
assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_reply_to'] assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_reply_to']
end end
@ -303,7 +303,7 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
Setting.plugin_redmine_dmsf['dmsf_documents_email_links_only'] = '1' Setting.plugin_redmine_dmsf['dmsf_documents_email_links_only'] = '1'
@role.add_permission! :view_dmsf_files @role.add_permission! :view_dmsf_files
@role.add_permission! :email_documents @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_response :success
assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_links_only'] assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_links_only']
end end
@ -311,47 +311,49 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_entries_email def test_entries_email
@role.add_permission! :view_dmsf_files @role.add_permission! :view_dmsf_files
zip_file = Tempfile.new('test', DmsfHelper::temp_dir) 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', 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 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 ensure
zip_file.unlink zip_file.unlink
end end
def test_add_email_forbidden 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 assert_response :forbidden
end end
def test_add_email def test_add_email
@role.add_permission! :view_dmsf_files @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 assert_response :success
end end
def test_append_email_forbidden 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 assert_response :forbidden
end end
def test_append_email def test_append_email
@role.add_permission! :view_dmsf_files @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 assert_response :success
end end
def test_autocomplete_for_user_forbidden 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 assert_response :forbidden
end end
def test_autocomplete_for_user def test_autocomplete_for_user
@role.add_permission! :view_dmsf_files @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 assert_response :success
end end
@ -359,19 +361,19 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
@role.add_permission! :folder_manipulation @role.add_permission! :folder_manipulation
@role.add_permission! :view_dmsf_folders @role.add_permission! :view_dmsf_folders
assert_difference 'DmsfFolder.count', +1 do 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 end
assert_redirected_to dmsf_folder_path(id: @project, folder_id: nil) assert_redirected_to dmsf_folder_path(id: @project1, folder_id: nil)
end end
def test_create_folder def test_create_folder
@role.add_permission! :folder_manipulation @role.add_permission! :folder_manipulation
@role.add_permission! :view_dmsf_folders @role.add_permission! :view_dmsf_folders
assert_difference 'DmsfFolder.count', +1 do 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' } } dmsf_folder: { title: 'New folder', description: 'Unit tests' } }
end 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
end end

View File

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

View File

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

View File

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

View File

@ -26,7 +26,7 @@ require 'fileutils'
class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles, 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 def setup
@admin = credentials 'admin' @admin = credentials 'admin'
@ -34,9 +34,13 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
@admin_user = User.find_by(login: 'admin') @admin_user = User.find_by(login: 'admin')
@project1 = Project.find 1 @project1 = Project.find 1
@project1.enable_module! 'dmsf' @project1.enable_module! 'dmsf'
@project2 = Project.find 2
@project2.enable_module! 'dmsf'
@project3 = Project.find 3 @project3 = Project.find 3
@project3.enable_module! 'dmsf' @project3.enable_module! 'dmsf'
@file1 = DmsfFile.find 1 @file1 = DmsfFile.find 1
@file2 = DmsfFile.find 2
@file9 = DmsfFile.find 9
@file12 = DmsfFile.find 12 @file12 = DmsfFile.find 12
@folder10 = DmsfFolder.find 10 @folder10 = DmsfFolder.find 10
# Fix permissions for jsmith's role # Fix permissions for jsmith's role
@ -53,6 +57,7 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
<d:locktype><d:write/></d:locktype> <d:locktype><d:write/></d:locktype>
<d:owner>jsmith</d:owner> <d:owner>jsmith</d:owner>
</d:lockinfo>} </d:lockinfo>}
User.current = nil
end end
def teardown def teardown
@ -62,8 +67,11 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
def test_truth def test_truth
assert_kind_of Project, @project1 assert_kind_of Project, @project1
assert_kind_of Project, @project2
assert_kind_of Project, @project3 assert_kind_of Project, @project3
assert_kind_of DmsfFile, @file1 assert_kind_of DmsfFile, @file1
assert_kind_of DmsfFile, @file2
assert_kind_of DmsfFile, @file9
assert_kind_of DmsfFile, @file12 assert_kind_of DmsfFile, @file12
assert_kind_of DmsfFolder, @folder10 assert_kind_of DmsfFolder, @folder10
assert_kind_of Role, @role assert_kind_of Role, @role
@ -71,12 +79,11 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
end end
def test_lock_file_already_locked_by_other def test_lock_file_already_locked_by_other
log_user 'admin', 'admin' # login as admin log_user 'jsmith', 'jsmith'
User.current = @admin_user process :lock, "/dmsf/webdav/#{@project2.identifier}/#{@file2.name}", params: @xml,
assert @file1.lock!, "File failed to be locked by #{User.current}" headers: @admin.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' })
process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", params: @xml, assert_response :multi_status
headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' }) assert_match '<d:status>HTTP/1.1 409 Conflict</d:status>', response.body
assert_response :locked
end end
def test_lock_file def test_lock_file
@ -87,7 +94,7 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
# Time travel, will make the usec part of the time 0 # Time travel, will make the usec part of the time 0
travel_to create_time do travel_to create_time do
# Lock file # 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' }) headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite' })
assert_response :success assert_response :success
# Verify the response # 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>/) response.body.match(/<d:locktoken><d:href>([a-z0-9\-]+)<\/d:href><\/d:locktoken>/)
locktoken = $1 locktoken = $1
# Verify the lock in the db # 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.created_at
assert_equal create_time, l.updated_at assert_equal create_time, l.updated_at
assert_equal (create_time + 1.week), l.expires_at assert_equal (create_time + 1.week), l.expires_at
@ -123,15 +131,15 @@ class DmsfWebdavLockTest < RedmineDmsf::Test::IntegrationTest
travel_to refresh_time do travel_to refresh_time do
# Refresh lock # Refresh lock
process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", process :lock, "/dmsf/webdav/#{@project1.identifier}/#{@file9.name}",
params: nil, params: nil,
headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite', HTTP_IF: locktoken }) headers: @jsmith.merge!({ HTTP_DEPTH: 'infinity', HTTP_TIMEOUT: 'Infinite', HTTP_IF: locktoken })
assert_response :success assert_response :success
# 1.week = 7*24*3600=604800 seconds # 1.week = 7*24*3600=604800 seconds
assert_match '<d:timeout>Second-604800</d:timeout>', response.body assert_match '<d:timeout>Second-604800</d:timeout>', response.body
# Verify the lock in the db # Verify the lock in the db
@file1.reload @file9.reload
l = @file1.lock.first l = @file9.lock.first
assert_equal create_time, l.created_at assert_equal create_time, l.created_at
assert_equal refresh_time, l.updated_at assert_equal refresh_time, l.updated_at
assert_equal (refresh_time + 1.week), l.expires_at assert_equal (refresh_time + 1.week), l.expires_at

View File

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

View File

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

View File

@ -28,9 +28,10 @@ class DmsfLockTest < RedmineDmsf::Test::UnitTest
:enumerations, :dmsf_locks :enumerations, :dmsf_locks
def setup def setup
@lock = dmsf_locks(:dmsf_locks_001) @lock = DmsfLock.find 1
@folder2 = dmsf_folders(:dmsf_folders_002) @folder2 = DmsfFolder.find 2
@file4 = dmsf_files(:dmsf_files_004) @folder7 = DmsfFolder.find 7
@file4 = DmsfFile.find 4
@jsmith = User.find 2 @jsmith = User.find 2
@admin = User.find 1 @admin = User.find 1
end end
@ -44,9 +45,9 @@ class DmsfLockTest < RedmineDmsf::Test::UnitTest
end end
def test_lock_type_is_enumerable def test_lock_type_is_enumerable
assert DmsfLock.respond_to?(:lock_types), assert DmsfLock.respond_to?(:lock_types),
"DmsfLock class hasn't got lock_types method" "DmsfLock class hasn't got lock_types method"
assert DmsfLock.lock_types.is_a?(SimpleEnum::Enum), assert DmsfLock.lock_types.is_a?(SimpleEnum::Enum),
'DmsfLock class is not enumerable' 'DmsfLock class is not enumerable'
end end
@ -58,7 +59,7 @@ class DmsfLockTest < RedmineDmsf::Test::UnitTest
end end
def test_linked_to_either_file_or_folder def test_linked_to_either_file_or_folder
assert_not_nil @lock.file || @lock.folder assert_not_nil @lock.file || @lock.folder
if @lock.file if @lock.file
assert_kind_of DmsfFile, @lock.file assert_kind_of DmsfFile, @lock.file
else else
@ -66,27 +67,29 @@ class DmsfLockTest < RedmineDmsf::Test::UnitTest
end end
end end
def test_locked_folder_reports_un_locked_child_file_as_locked def test_locked_folder_reports_un_locked_child_file_as_locked
assert @folder2.locked?, assert @folder2.locked?,
"Folder #{@folder2.title} should be locked by fixture" "Folder #{@folder2.title} should be locked by fixture"
assert_equal 1, @folder2.lock.count # Check the folder lists 1 lock assert_equal 1, @folder2.lock.count # Check the folder lists 1 lock
assert @file4.locked?, assert @file4.locked?,
"File #{@file4.name} sits within #{@folder2.title} and should be locked" "File #{@file4.name} sits within #{@folder2.title} and should be locked"
assert_equal 1, @file4.lock.count # Check the file lists 1 lock assert_equal 1, @file4.lock.count # Check the file lists 1 lock
assert_equal 0, @file4.lock(false).count # Check the file does not list any entries for itself assert_equal 0, @file4.lock(false).count # Check the file does not list any entries for itself
end end
def test_locked_folder_cannot_be_unlocked_by_someone_without_rights_or_anon def test_locked_folder_cannot_be_unlocked_by_someone_without_rights_or_anon
User.current = @admin
@folder7.lock!
User.current = nil User.current = nil
assert_no_difference('@folder2.lock.count') do assert_no_difference('@folder7.lock.count') do
assert_raise DmsfLockError do assert_raise DmsfLockError do
@folder2.unlock! @folder7.unlock!
end end
end end
User.current = @jsmith User.current = @jsmith
assert_no_difference('@folder2.lock.count') do assert_no_difference('@folder7.lock.count') do
assert_raise DmsfLockError do assert_raise DmsfLockError do
@folder2.unlock! @folder7.unlock!
end end
end end
end end
@ -109,7 +112,7 @@ class DmsfLockTest < RedmineDmsf::Test::UnitTest
assert_nothing_raised do assert_nothing_raised do
@folder2.unlock! @folder2.unlock!
end end
end end
@folder2.lock! @folder2.lock!
User.current = nil User.current = nil
end end