Validation

This commit is contained in:
Karel Picman 2016-02-01 15:31:39 +01:00
parent a3d227796c
commit a5ab3ed8fd
34 changed files with 1098 additions and 1005 deletions

View File

@ -148,6 +148,7 @@ class DmsfFile < ActiveRecord::Base
save
end
rescue Exception => e
Rails.logger.error e.message
errors[:base] << e.message
return false
end

View File

@ -4,7 +4,7 @@
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontorn.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontorn.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@ -86,14 +86,13 @@ module RedmineDmsf
# By using the path upwards, surely this would be quicker?
def locked_for_user?
return false unless locked?
b_shared = nil
heirarchy = self.dmsf_path
heirarchy.each do |folder|
locks = folder.locks || folder.lock(false)
b_shared = nil
self.dmsf_path.each do |entity|
locks = entity.locks || entity.lock(false)
next if locks.empty?
locks.each do |lock|
next if lock.expired? # In case we're in between updates
if (lock.lock_scope == :scope_exclusive && b_shared.nil?)
if (lock.lock_scope == :scope_exclusive && b_shared.nil?)
return true if (!lock.user) || (lock.user.id != User.current.id)
else
b_shared = true if b_shared.nil?

View File

@ -1,8 +1,9 @@
# Redmine plugin for Document Management System "Features"
# encoding: utf-8
## Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -20,11 +21,11 @@
module RedmineDmsf
module Test
class IntegrationTest < ActionController::IntegrationTest
class IntegrationTest < Redmine::IntegrationTest
def self.fixtures(*table_names)
dir = File.join( File.dirname(__FILE__), '../../../test/fixtures')
table_names.each do |x|
ActiveRecord::Fixtures.create_fixtures(dir, x) if File.exist?("#{dir}/#{x}.yml")
ActiveRecord::FixtureSet.create_fixtures(dir, x) if File.exist?("#{dir}/#{x}.yml")
end
super(table_names)
end

View File

@ -138,19 +138,22 @@ table { width:100%%; }
File.dirname(path)
end
#return instance of Project based on path
# Return instance of Project based on path
def project
return @Project unless @Project.nil?
pinfo = @path.split('/').drop(1)
if pinfo.length > 0
begin
@Project = Project.find(pinfo.first)
rescue
unless @project
pinfo = @path.split('/').drop(1)
if pinfo.length > 0
begin
@project = Project.find(pinfo.first)
rescue Exception => e
Rails.logger.error e.message
end
end
end
@project
end
#Make it easy to find the path without project in it.
# Make it easy to find the path without project in it.
def projectless_path
'/' + path.split('/').drop(2).join('/')
end

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -31,9 +31,7 @@ module RedmineDmsf
unless(resource.exist?)
NotFound
else
# Win7 hack start
#unless(request_document.xpath("//#{ns}propfind/#{ns}allprop").empty?)
# properties = resource.properties
# Win7 hack start
if request_document.xpath("//#{ns}propfind").empty? || request_document.xpath("//#{ns}propfind/#{ns}allprop").present?
properties = resource.properties.map { |prop| DAV4Rack::DAVElement.new(prop.merge(:namespace => DAV4Rack::DAVElement.new(:href => prop[:ns_href]))) }
# Win7 hack end

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -24,21 +24,16 @@ require 'uuidtools'
module RedmineDmsf
module Webdav
class DmsfResource < BaseResource
def initialize(*args)
super(*args)
@file = false
@folder = false
end
#Here we make sure our folder and file methods are not aliased - it should shave a few cycles off of processing
# Here we make sure our folder and file methods are not aliased - it should shave a few cycles off of processing
def setup
@skip_alias |= [ :folder, :file, :folder?, :file? ]
@skip_alias |= [ :folder, :file ]
end
# Here we hook into the fact that resources can have a pre-execution routine run for them
# Our sole job here is to ensure that any write functionality is restricted to relevent configuration
before do |resource, method_name|
#If our method is not one of the following, there is no point continuing.
# If our method is not one of the following, there is no point continuing.
if [ :put, :make_collection, :move, :copy, :delete, :lock, :unlock, :set_property ].include?(method_name)
webdav_setting = Setting.plugin_redmine_dmsf['dmsf_webdav_strategy']
webdav_setting = 'WEBDAV_READ_ONLY' unless webdav_setting
@ -68,82 +63,65 @@ module RedmineDmsf
# - 2012-06-15: Only if you're allowed to browse the project
# - 2012-06-18: Issue #5, ensure item is only listed if project is enabled for dmsf
def exist?
return false if project.nil? || !project.module_enabled?('dmsf') || !(folder? || file?)
User.current.admin? || User.current.allowed_to?(:view_dmsf_folders, project)
return project && project.module_enabled?('dmsf') && (folder || file) &&
(User.current.admin? || User.current.allowed_to?(:view_dmsf_folders, project))
end
# is this entity a folder?
# Is this entity a folder?
def collection?
folder? #no need to check if entity exists, as false is returned if entity does not exist anyways
folder.present? # No need to check if entity exists, as false is returned if entity does not exist anyways
end
# Check if current entity is a folder and return DmsfFolder object if found (nil if not)
# Todo: Move folder data retrieval into folder function, and use folder method to determine existence
# Check if current entity is a folder and return DmsfFolder object if found (nil if not)
def folder
return @folder unless @folder == false
return nil if project.nil? || project.id.nil? #if the project doesn't exist, this entity can't exist
@folder = nil
# Note: Folder is searched for as a generic search to prevent SQL queries being generated:
# if we were to look within parent, we'd have to go all the way up the chain as part of the
# existence check, and although I'm sure we'd love to access the hierarchy, I can't yet
# see a practical need for it
folders = DmsfFolder.visible.where(:project_id => project.id, :title => basename).order('title ASC').to_a
return nil unless folders.length > 0
if (folders.length > 1) then
folders.delete_if { |x| '/' + x.dmsf_path_str != projectless_path }
unless @folder
return nil unless project # If the project doesn't exist, this entity can't exist
# Note: Folder is searched for as a generic search to prevent SQL queries being generated:
# if we were to look within parent, we'd have to go all the way up the chain as part of the
# existence check, and although I'm sure we'd love to access the hierarchy, I can't yet
# see a practical need for it
folders = DmsfFolder.visible.where(:project_id => project.id, :title => basename).order('title ASC').to_a
return nil unless folders.length > 0
@folder = folders[0]
else
if ('/' + folders[0].dmsf_path_str == projectless_path) then
if (folders.length > 1)
folders.delete_if { |x| '/' + x.dmsf_path_str != projectless_path }
return nil unless folders.length > 0
@folder = folders[0]
else
if (('/' + folders[0].dmsf_path_str) == projectless_path)
@folder = folders[0]
end
end
end
@folder
end
# return boolean to determine if entity is a folder or not
def folder?
return !folder.nil?
end
end
# Check if current entity exists as a file (DmsfFile), and returns corresponding object if found (nil otherwise)
# Currently has a dual search approach (depending on if parent can be determined)
# Todo: Move file data retrieval into folder function, and use file method to determine existence
# Currently has a dual search approach (depending on if parent can be determined)
def file
return @file unless @file == false
return nil if project.nil? || project.id.nil? # Again if entity project is nil, it cannot exist in context of this object
@file = nil
# Hunt for files parent path
f = false
if (parent.projectless_path != '/')
if parent.folder?
f = parent.folder
unless @file
return nil unless project # Again if entity project is nil, it cannot exist in context of this object
# Hunt for files parent path
f = false
if (parent.projectless_path != '/')
f = parent.folder if parent.folder
else
f = nil
end
else
f = nil
end
if f || f.nil? then
# f has a value other than false? - lets use traditional
# DMSF file search by name.
@file = DmsfFile.visible.find_file_by_name(project, f, basename)
else
# If folder is false, means it couldn't pick up parent,
# as such its probably fine to bail out, however we'll
# perform a search in this scenario
files = DmsfFile.visible.where(:project_id => project.id, :name => basename).order('name ASC').to_a
files.delete_if {|x| File.dirname('/' + x.dmsf_path_str) != File.dirname(projectless_path)}
if files.length > 0
@file = files[0]
if f || f.nil?
# f has a value other than false? - lets use traditional
# DMSF file search by name.
@file = DmsfFile.visible.find_file_by_name(project, f, basename)
else
# If folder is false, means it couldn't pick up parent,
# as such its probably fine to bail out, however we'll
# perform a search in this scenario
files = DmsfFile.visible.where(:project_id => project.id, :name => basename).order('name ASC').to_a
files.delete_if { |x| File.dirname('/' + x.dmsf_path_str) != File.dirname(projectless_path) }
@file = files[0] if files.length > 0
end
end
end
# return boolean to determine if entity is a file or not
def file?
return !file.nil?
end
@file
end
# Return the content type of file
# will return inode/directory for any collections, and appropriate for File entities
@ -184,11 +162,11 @@ module RedmineDmsf
end
def content_length
file? ? file.size : 4096;
file ? file.size : 4096;
end
def special_type
l(:field_folder) if folder?
l(:field_folder) if folder
end
# Process incoming GET request
@ -214,12 +192,12 @@ module RedmineDmsf
# - 2012-06-18: Ensure item is only functional if project is enabled for dmsf
def make_collection
if request.body.read.to_s.empty?
raise NotFound if project.nil? || project.id.nil? || !project.module_enabled?('dmsf')
raise NotFound unless project && project.module_enabled?('dmsf')
raise Forbidden unless User.current.admin? || User.current.allowed_to?(:folder_manipulation, project)
return MethodNotAllowed if exist? #If we already exist, why waste the time trying to save?
return MethodNotAllowed if exist? # If we already exist, why waste the time trying to save?
parent_folder = nil
if (parent.projectless_path != '/')
return Conflict unless parent.folder?
return Conflict unless parent.folder
parent_folder = parent.folder.id
end
f = DmsfFolder.new
@ -252,7 +230,7 @@ module RedmineDmsf
# Process incoming MOVE request
#
# Behavioural differences between collection and single entity
# Todo: Support overwrite between both types of entity, and implement better checking
# TODO: Support overwrite between both types of entity, and implement better checking
def move(dest, overwrite)
# All of this should carry accrross the ResourceProxy frontend, we ensure this to
# prevent unexpected errors
@ -262,19 +240,19 @@ module RedmineDmsf
parent = resource.parent
if (collection?)
#At the moment we don't support cross project destinations
if collection?
# At the moment we don't support cross project destinations
return MethodNotImplemented unless project.id == resource.project.id
raise Forbidden unless User.current.admin? || User.current.allowed_to?(:folder_manipulation, project)
#Current object is a folder, so now we need to figure out information about Destination
# Current object is a folder, so now we need to figure out information about Destination
if dest.exist?
MethodNotAllowed
else
if(parent.projectless_path == '/') #Project root
folder.dmsf_folder_id = nil
else
return PreconditionFailed unless parent.exist? && parent.folder?
return PreconditionFailed unless parent.exist? && parent.folder
folder.dmsf_folder_id = parent.folder.id
end
folder.title = resource.basename
@ -293,10 +271,10 @@ module RedmineDmsf
if(parent.projectless_path == '/') #Project root
f = nil
else
return PreconditionFailed unless parent.exist? && parent.folder?
return PreconditionFailed unless parent.exist? && parent.folder
f = parent.folder
end
return PreconditionFailed unless exist? && file?
return PreconditionFailed unless exist? && file
return InternalServerError unless file.move_to(resource.project, f)
# Update Revision and names of file [We can link to old physical resource, as it's not changed]
@ -315,10 +293,10 @@ module RedmineDmsf
# Process incoming COPY request
#
# Behavioural differences between collection and single entity
# Todo: Support overwrite between both types of entity, and an integrative copy where destination exists for collections
# TODO: Support overwrite between both types of entity, and an integrative copy where destination exists for collections
def copy(dest, overwrite)
# All of this should carry accrross the ResourceProxy frontend, we ensure this to
# All of this should carry across the ResourceProxy frontend, we ensure this to
# prevent unexpected errors
if dest.is_a?(ResourceProxy)
resource = dest.resource
@ -327,13 +305,14 @@ module RedmineDmsf
end
return PreconditionFailed if !resource.is_a?(DmsfResource) || resource.project.nil? || resource.project.id == 0
parent = resource.parent
if (collection?)
#Current object is a folder, so now we need to figure out information about Destination
if collection?
# Current object is a folder, so now we need to figure out information about Destination
return MethodNotAllowed if(dest.exist?)
#Permission check if they can manipulate folders and view folders
# Permission check if they can manipulate folders and view folders
# Can they:
# Manipulate folders on destination project :folder_manipulation
# View folders on destination project :view_dmsf_folders
@ -345,22 +324,18 @@ module RedmineDmsf
User.current.allowed_to?(:view_dmsf_files, project) &&
User.current.allowed_to?(:view_dmsf_folders, project))
return PreconditionFailed if (parent.projectless_path != "/" && !parent.folder?)
return PreconditionFailed if (parent.projectless_path != '/' && !parent.folder)
folder.title = resource.basename
new_folder = folder.copy_to(resource.project, parent.folder)
return PreconditionFailed if new_folder.nil? || new_folder.id.nil?
Created
else
if(dest.exist?) then
if dest.exist?
methodNotAllowed
# Files cannot be merged at this point, until a decision is made on how to merge them
# ideally, we would merge revision history for both, ensuring the origin file wins with latest revision.
else
#Permission check if they can manipulate folders and view folders
# Permission check if they can manipulate folders and view folders
# Can they:
# Manipulate files on destination project :file_manipulation
# View files on destination project :view_dmsf_files
@ -373,19 +348,18 @@ module RedmineDmsf
if(parent.projectless_path == '/') #Project root
f = nil
else
return PreconditionFailed unless parent.exist? && parent.folder?
return PreconditionFailed unless parent.exist? && parent.folder
f = parent.folder
end
return PreconditionFailed unless exist? && file?
return PreconditionFailed unless exist? && file
return InternalServerError unless file.copy_to(resource.project, f)
# Update Revision and names of file [We can link to old physical resource, as it's not changed]
file.last_revision.name = resource.basename if file.last_revision
file.name = resource.basename
#Save Changes
# Save Changes
(file.last_revision.save! && file.save!) ? Created : PreconditionFailed
end
end
end
@ -395,9 +369,9 @@ module RedmineDmsf
# At present as deletions of folders are not recursive, we do not need to extend
# this to cover every file, just queried
def lock_check(lock_scope = nil)
if file?
if file
raise Locked if file.locked_for_user?
elsif folder?
elsif folder
raise Locked if folder.locked_for_user?
end
end
@ -410,12 +384,11 @@ module RedmineDmsf
Rails.logger.warn "Path doesn't exist: #{@path}"
return super
end
entity = file? ? file : folder
entity = file ? file : folder
begin
if (entity.locked? && entity.locked_for_user?)
raise DAV4Rack::LockFailure.new("Failed to lock: #{@path}")
else
# If scope and type are not defined, the only thing we can
# logically assume is that the lock is being refreshed (office loves
# to do this for example, so we do a few checks, try to find the lock
@ -433,8 +406,7 @@ module RedmineDmsf
@response['Lock-Token'] = l.uuid
return [1.hours.to_i, l.uuid]
#Unfortunately if we're here, then it's updating a lock we can't find
# Unfortunately if we're here, then it's updating a lock we can't find
return Conflict
end
@ -461,7 +433,7 @@ module RedmineDmsf
BadRequest
else
begin
entity = file? ? file : folder
entity = file ? file : folder
l = DmsfLock.find(token)
l_entity = l.file || l.folder
# Additional case: if a user tries to unlock the file instead of the folder that's locked
@ -480,15 +452,15 @@ module RedmineDmsf
# HTTP POST request.
#
# Forbidden, as method should not be utilised.
# Forbidden, as method should not be utilized.
def post(request, response)
raise Forbidden
end
# HTTP POST request.
def put(request, response)
raise BadRequest if collection?
raise Forbidden unless User.current.admin? || User.current.allowed_to?(:file_manipulation, project)
def put(request, response)
raise BadRequest if collection?
raise Forbidden unless User.current.admin? || User.current.allowed_to?(:file_manipulation, project)
# Ignore Mac OS X resource forks and special Windows files.
if basename.match(/^\._/i) || basename.match(/^Thumbs.db$/i)
@ -528,7 +500,7 @@ module RedmineDmsf
new_revision.mime_type = Redmine::MimeType.of(new_revision.name)
# Phusion passenger does not have a method "length" in its model
# however includes a size method - so we instead use reflection
# however, includes a size method - so we instead use reflection
# to determine best approach to problem
if request.body.respond_to? 'length'
new_revision.size = request.body.length
@ -563,13 +535,16 @@ module RedmineDmsf
# for lock information to be presented
def get_property(element)
raise NotImplemented if (element[:ns_href] != 'DAV:')
unless folder?
unless folder
return NotFound unless (file && file.last_revision && File.exist?(file.last_revision.disk_file))
end
case element[:name]
when 'supportedlock' then supported_lock
when 'lockdiscovery' then discover_lock
else super
when 'supportedlock'
supported_lock
when 'lockdiscovery'
discover_lock
else
super
end
end
@ -629,13 +604,13 @@ module RedmineDmsf
end
}
if lock.folder.nil?
doc.depth "0"
doc.depth '0'
else
doc.depth "infinity"
doc.depth 'infinity'
end
doc.owner lock.user.to_s
if lock.expires_at.nil?
doc.timeout = "Infinite"
doc.timeout = 'Infinite'
else
doc.timeout "Second-#{(lock.expires_at.to_i - Time.now.to_i)}"
end
@ -659,7 +634,7 @@ module RedmineDmsf
# supported_lock
# As the name suggests, we're returning locks supported by our implementation
def supported_lock
x = Nokogiri::XML::DocumentFragment.parse ""
x = Nokogiri::XML::DocumentFragment.parse ''
Nokogiri::XML::Builder.with(x) do |doc|
doc.supportedlock {
doc.lockentry {
@ -677,4 +652,4 @@ module RedmineDmsf
end
end
end
end

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -101,7 +101,7 @@ module RedmineDmsf
@resource_c.get(request, response)
end
def put(request, response)
def put(request, response)
@resource_c.put(request, response)
end

View File

@ -48,7 +48,7 @@ run_tests()
# Run tests within application
bundle exec rake redmine:plugins:test:units NAME=redmine_dmsf
bundle exec rake redmine:plugins:test:functionals NAME=redmine_dmsf
#bundle exec rake redmine:plugins:test:integration NAME=redmine_dmsf
bundle exec rake redmine:plugins:test:integration NAME=redmine_dmsf
}
uninstall()

View File

@ -1,35 +1,42 @@
--- !omap
- dmsf_folders_001:
id: 1
title: folder1
project_id: 1
dmsf_folder_id: NULL
user_id: 1
---
dmsf_folders_001:
id: 1
title: folder1
project_id: 1
dmsf_folder_id: NULL
user_id: 1
- dmsf_folders_002:
id: 2
title: folder2
project_id: 1
dmsf_folder_id: 1
user_id: 1
dmsf_folders_002:
id: 2
title: folder2
project_id: 1
dmsf_folder_id: 1
user_id: 1
- dmsf_folders_003:
id: 3
title: folder1
project_id: 2
dmsf_folder_id: NULL
user_id: 1
dmsf_folders_003:
id: 3
title: folder1
project_id: 2
dmsf_folder_id: NULL
user_id: 1
- dmsf_folders_004:
id: 4
title: folder2
project_id: 2
dmsf_folder_id: 3
user_id: 1
- dmsf_folders_005:
id: 5
title: folder3
project_id: 1
dmsf_folder_id: 2
user_id: 1
dmsf_folders_004:
id: 4
title: folder2
project_id: 2
dmsf_folder_id: 3
user_id: 1
dmsf_folders_005:
id: 5
title: folder3
project_id: 1
dmsf_folder_id: 2
user_id: 1
dmsf_folders_006:
id: 6
title: folder6
project_id: 1
dmsf_folder_id: NULL
user_id: 2

View File

@ -21,4 +21,4 @@ dmsf_locks_003:
user_id: 2
entity_type: 0
lock_type_cd: 0
lock_scope_cd: 0
lock_scope_cd: 0

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,11 +23,11 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfControllerTest < RedmineDmsf::Test::TestCase
include Redmine::I18n
fixtures :users, :dmsf_folders, :custom_fields, :custom_values, :projects,
:roles, :members, :member_roles, :dmsf_links, :dmsf_files, :dmsf_file_revisions
fixtures :users, :email_addresses, :dmsf_folders, :custom_fields,
:custom_values, :projects, :roles, :members, :member_roles, :dmsf_links,
:dmsf_files, :dmsf_file_revisions
def setup
@request.session[:user_id] = 2
def setup
@project = Project.find_by_id 1
assert_not_nil @project
@project.enable_module! :dmsf
@ -37,9 +39,9 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
@folder_link1 = DmsfLink.find_by_id 1
@role = Role.find_by_id 1
@custom_field = CustomField.find_by_id 21
@custom_value = CustomValue.find_by_id 21
@user1 = User.find_by_id 1
User.current = @user1
@custom_value = CustomValue.find_by_id 21
User.current = nil
@request.session[:user_id] = 2
end
def test_truth
@ -52,15 +54,16 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
assert_kind_of DmsfLink, @folder_link1
assert_kind_of Role, @role
assert_kind_of CustomField, @custom_field
assert_kind_of CustomValue, @custom_value
assert_kind_of User, @user1
assert_kind_of CustomValue, @custom_value
end
def test_edit_folder
# Missing permissions
def test_edit_folder_forbidden
# Missing permissions
get :edit, :id => @project, :folder_id => @folder1
assert_response 403
assert_response :forbidden
end
def test_edit_folder_allowed
# Permissions OK
@role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation
@ -70,84 +73,101 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
assert_select 'option', { :value => @custom_value.value }
end
def test_trash
def test_trash_forbidden
# Missing permissions
get :trash, :id => @project
assert_response 403
assert_response :forbidden
end
def test_trash_allowed
# Permissions OK
@role.add_permission! :file_delete
@role.add_permission! :file_delete
get :trash, :id => @project
assert_response :success
assert_select 'h2', { :text => l(:link_trash_bin) }
end
def test_delete
def test_delete_forbidden
# Missing permissions
get :delete, :id => @project, :folder_id => @folder1.id, :commit => false
assert_response 403
assert_response :forbidden
end
def test_delete_not_empty
# Permissions OK but the folder is not empty
@role.add_permission! :folder_manipulation
@role.add_permission! :folder_manipulation
get :delete, :id => @project, :folder_id => @folder1.id, :commit => false
assert_response :redirect
assert_include l(:error_folder_is_not_empty), flash[:error]
# Permissions OK but the folder is locked
end
def test_delete_locked
# Permissions OK but the folder is locked
@role.add_permission! :folder_manipulation
get :delete, :id => @project, :folder_id => @folder2.id, :commit => false
assert_response :redirect
assert_include l(:error_folder_is_locked), flash[:error]
# Empty and not locked folder
flash[:error].clear
get :delete, :id => @project, :folder_id => @folder4.id, :commit => false
assert_response :redirect
assert_equal 0, flash[:error].size
end
def test_restore
@role.add_permission! :folder_manipulation
get :delete, :id => @project, :folder_id => @folder4.id
assert_response :redirect
# Missing permissions
@role.remove_permission! :folder_manipulation
def test_delete_ok
# Empty and not locked folder
@role.add_permission! :folder_manipulation
get :delete, :id => @project, :folder_id => @folder4.id, :commit => false
assert_response :redirect
end
def test_restore_forbidden
# Missing permissions
@folder4.deleted = 1
@folder4.save
get :restore, :id => @project, :folder_id => @folder4.id
assert_response 403
assert_response :forbidden
end
def test_restore_ok
# Permissions OK
@request.env['HTTP_REFERER'] = trash_dmsf_path(:id => @project.id)
@role.add_permission! :folder_manipulation
@role.add_permission! :folder_manipulation
@folder4.deleted = 1
@folder4.save
get :restore, :id => @project, :folder_id => @folder4.id
assert_response :redirect
end
def test_delete_restore_entries
def test_delete_restore_entries_forbidden
# Missing permissions
get :entries_operation, :id => @project, :delete_entries => 'Delete',
:subfolders => [@folder1.id.to_s], :files => [@file1.id.to_s],
:dir_links => [@folder_link1.id.to_s], :file_links => [@file_link2.id.to_s]
assert_response :forbidden
end
def test_delete_restore_not_empty
# Permissions OK but the folder is not empty
@request.env['HTTP_REFERER'] = dmsf_folder_path(:id => @project.id)
@role.add_permission! :folder_manipulation
@request.env['HTTP_REFERER'] = dmsf_folder_path(:id => @project.id)
@role.add_permission! :view_dmsf_files
get :entries_operation, :id => @project, :delete_entries => 'Delete',
:subfolders => [@folder1.id.to_s], :files => [@file1.id.to_s],
:dir_links => [@folder_link1.id.to_s], :file_links => [@file_link2.id.to_s]
assert_response :redirect
assert_equal flash[:error].to_s, l(:error_folder_is_not_empty)
end
def test_delete_restore_entries_ok
# Permissions OK
@request.env['HTTP_REFERER'] = dmsf_folder_path(:id => @project.id)
@role.add_permission! :view_dmsf_files
flash[:error] = nil
get :entries_operation, :id => @project, :delete_entries => 'Delete',
:subfolders => [], :files => [@file1.id.to_s],
:dir_links => [], :file_links => [@file_link2.id.to_s]
assert_response :redirect
assert_nil flash[:error]
end
def test_restore_entries
# Restore
@role.add_permission! :view_dmsf_files
@request.env['HTTP_REFERER'] = trash_dmsf_path(:id => @project.id)
get :entries_operation, :id => @project, :restore_entries => 'Restore',
:subfolders => [], :files => [@file1.id.to_s],

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -20,64 +22,66 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfFilesControllerTest < RedmineDmsf::Test::TestCase
fixtures :users, :dmsf_files, :dmsf_file_revisions, :custom_fields,
:custom_values, :projects, :roles, :members, :member_roles, :enabled_modules,
:dmsf_file_revisions
fixtures :users, :email_addresses, :dmsf_files, :dmsf_file_revisions,
:custom_fields, :custom_values, :projects, :roles, :members, :member_roles,
:enabled_modules, :dmsf_file_revisions
def setup
@project = Project.find_by_id 1
assert_not_nil @project
@project.enable_module! :dmsf
@user = User.find_by_id 2
assert_not_nil @user
@request.session[:user_id] = @user.id
@project.enable_module! :dmsf
@file = DmsfFile.find_by_id 1
@role = Role.find_by_id 1
@custom_field = CustomField.find_by_id 21
@custom_value = CustomValue.find_by_id 22
User.current = nil
@request.session[:user_id] = 2
end
def test_truth
assert_kind_of Project, @project
assert_kind_of User, @user
def test_truth
assert_kind_of DmsfFile, @file
assert_kind_of Role, @role
assert_kind_of CustomField, @custom_field
assert_kind_of CustomValue, @custom_value
assert_kind_of Role, @role
end
# TODO: Not working in Travis
# def test_show_file
# # Missing permissions
# get :show, :id => @file.id
# assert_response 403
#
# # Permissions OK
# @role.add_permission! :view_dmsf_files
# @role.add_permission! :file_manipulation
# get :show, :id => @file.id
# assert_response :success
#
# # The last revision
# assert_select 'label', { :text => @custom_field.name }
# assert_select '.customfield', { :text => "#{@custom_field.name}: #{@custom_value.value}" }
#
# # A new revision
# assert_select 'label', { :text => @custom_field.name }
# assert_select 'option', { :value => @custom_value.value }
# end
def test_show_file_ok
# Permissions OK
@role.add_permission! :view_dmsf_files
get :show, :id => @file.id, :download => ''
assert_response :missing # The file is not physically present.
end
def test_show_file_forbidden
# Missing permissions
get :show, :id => @file.id, :download => ''
assert_response :forbidden
end
def test_view_file_ok
# Permissions OK
@role.add_permission! :view_dmsf_files
get :view, :id => @file.id
assert_response :missing # The file is not physically present.
end
def test_view_file_forbidden
# Missing permissions
get :view, :id => @file.id
assert_response :forbidden
end
def delete
def delete_forbidden
# Missing permissions
delete @file, :commit => false
assert_response 403
assert_response :forbidden
end
def delete_locked
# Permissions OK but the file is locked
@role.add_permission! :file_delete
delete @file, :commit => false
assert_response :redirect
assert_include l(:error_file_is_locked), flash[:error]
end
def delete_ok
# Permissions OK and not locked
flash[:error].clear
@file.unlock!
@ -86,5 +90,4 @@ class DmsfFilesControllerTest < RedmineDmsf::Test::TestCase
assert_equal 0, flash[:error].size
end
end
end

View File

@ -2,7 +2,7 @@
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-15 Karel Pičman <karel.picman@lbcfree.net>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@lbcfree.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -22,14 +22,16 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
fixtures :projects, :members, :dmsf_files, :dmsf_file_revisions,
:dmsf_folders, :dmsf_links, :roles, :member_roles
fixtures :users, :email_addresses, :projects, :members, :dmsf_files,
:dmsf_file_revisions, :dmsf_folders, :dmsf_links, :roles, :member_roles
def setup
@user_admin = User.find_by_id 1
@user_admin = User.find_by_id 1
assert_not_nil @user_admin
@user_member = User.find_by_id 2
assert_not_nil @user_member
@user_non_member = User.find_by_id 3
assert_not_nil @user_non_member
@role_manager = Role.where(:name => 'Manager').first
assert_not_nil @role_manager
@role_manager.add_permission! :file_manipulation
@ -48,10 +50,11 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
@file1 = DmsfFile.find_by_id 1 # project1/file1
@file2 = DmsfFile.find_by_id 2 # project2/file2
@file4 = DmsfFile.find_by_id 4 # project1/folder2/file4
@file6 = DmsfFile.find_by_id 6 # project2/folder3/file6
@request.session[:user_id] = @user_member.id
@file6 = DmsfFile.find_by_id 6 # project2/folder3/file6
@file_link = DmsfLink.find_by_id 1
@request.env['HTTP_REFERER'] = dmsf_folder_path(:id => @project1.id, :folder_id => @folder1.id)
@request.session[:user_id] = @user_member.id
User.current = nil
end
def test_truth
@ -85,16 +88,20 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
assert_response :forbidden
end
def test_authorize_member
def test_authorize_member_ok
@request.session[:user_id] = @user_member.id
get :new, :project_id => @project1.id
assert_response :success
end
def test_authorize_member_no_module
# Without the module
@project1.disable_module!(:dmsf)
get :new, :project_id => @project1.id
assert_response :forbidden
end
def test_authorize_forbidden
# Without permissions
@project1.enable_module!(:dmsf)
@role_manager.remove_permission! :file_manipulation
@ -107,7 +114,7 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
assert_response :success
end
def test_create_file_link_from
def test_create_file_link_from_f1
# 1. File link in a folder from another folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -121,7 +128,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_folder_path(:id => @project1.id, :folder_id => @folder1.id)
end
def test_create_file_link_from_f2
# 2. File link in a folder from another root folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -135,7 +144,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_folder_path(:id => @project1.id, :folder_id => @folder1.id)
end
def test_create_file_link_from_f3
# 3. File link in a root folder from another folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -148,7 +159,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_folder_path(:id => @project1.id)
end
def test_create_file_link_from_f4
# 4. File link in a root folder from another root folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -161,8 +174,8 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
end
assert_redirected_to dmsf_folder_path(:id => @project1.id)
end
def test_create_folder_link_from
def test_create_folder_link_from_d1
# 1. Folder link in a folder from another folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -175,7 +188,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_folder_path(:id => @project1.id, :folder_id => @folder1.id)
end
def test_create_folder_link_from_d2
# 2. Folder link in a folder from another root folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -187,7 +202,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_folder_path(:id => @project1.id, :folder_id => @folder1.id)
end
def test_create_folder_link_from_d3
# 3. Folder link in a root folder from another folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -199,7 +216,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_folder_path(:id => @project1.id)
end
def test_create_folder_link_from_d4
# 4. Folder link in a root folder from another root folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -212,7 +231,7 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
assert_redirected_to dmsf_folder_path(:id => @project1.id)
end
def test_create_file_link_to
def test_create_file_link_to_f1
# 1. File link to a root folder from another folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -225,7 +244,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_file_path(@file1)
end
def test_create_file_link_to_f2
# 2. File link to a folder from another folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -239,7 +260,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_file_path(@file6)
end
def test_create_file_link_to_f3
# 3. File link to a root folder from another root folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -251,7 +274,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to dmsf_file_path(@file6)
end
def test_create_file_link_to_f4
# 4. File link to a folder from another root folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -279,7 +304,7 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
assert_redirected_to dmsf_folder_path(:id => @project1.id)
end
def test_create_folder_link_to
def test_create_folder_link_to_f1
# 1. Folder link to a root folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -291,7 +316,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
}
end
assert_redirected_to edit_dmsf_path(:id => @project1.id, :folder_id => @folder1.id)
end
def test_create_folder_link_to_f2
# 2. Folder link to a folder
assert_difference 'DmsfLink.count', +1 do
post :create, :dmsf_link => {
@ -306,26 +333,27 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
assert_redirected_to edit_dmsf_path(:id => @project1.id, :folder_id => @folder1.id)
end
def test_destroy
# TODO: Doesn't work in Travis
#assert_difference 'DmsfLink.visible.count', -1 do
def test_destroy
assert_difference 'DmsfLink.visible.count', -1 do
delete :destroy, :project_id => @project1.id, :id => @file_link.id
#end
end
assert_redirected_to dmsf_folder_path(:id => @project1.id, :folder_id => @folder1.id)
end
def test_restore
#User.current = @user_admin
@request.env['HTTP_REFERER'] = trash_dmsf_path(:id => @project1.id)
def test_restore_forbidden
# Missing permissions
@request.env['HTTP_REFERER'] = trash_dmsf_path(:id => @project1.id)
@role_manager.remove_permission! :file_manipulation
get :restore, :project_id => @project1.id, :id => @file_link.id
assert_response :forbidden
end
def test_restore_ok
# Permissions OK
@request.env['HTTP_REFERER'] = trash_dmsf_path(:id => @project1.id)
@role_manager.add_permission! :file_manipulation
get :restore, :project_id => @project1.id, :id => @file_link.id
assert_response :redirect
end
end

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,7 +23,7 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfStateControllerTest < RedmineDmsf::Test::TestCase
include Redmine::I18n
fixtures :users, :projects, :members, :roles, :member_roles
fixtures :users, :email_addresses, :projects, :members, :roles, :member_roles
def setup
@user_admin = User.find_by_id 1 # Redmine admin
@ -30,8 +32,8 @@ class DmsfStateControllerTest < RedmineDmsf::Test::TestCase
@project = Project.find_by_id 1
assert_not_nil @project
@project.enable_module! :dmsf
@role_manager = Role.find_by_name('Manager')
@role_manager.add_permission! :user_preferences
@role_manager = Role.find_by_name('Manager')
User.current = nil
end
def test_truth
@ -42,24 +44,43 @@ class DmsfStateControllerTest < RedmineDmsf::Test::TestCase
assert_kind_of Role, @role_manager
end
def test_user_pref_save
# Member
def test_user_pref_save_member
# Member
@request.session[:user_id] = @user_member.id
post :user_pref_save, :id => @project.id, :email_notify => 1
@role_manager.add_permission! :user_preferences
post :user_pref_save, :id => @project.id, :email_notify => 1,
:title_format => '%t_%v'
assert_redirected_to settings_project_path(@project, :tab => 'dmsf')
assert_not_nil flash[:notice]
assert_equal flash[:notice], l(:notice_your_preferences_were_saved)
# Non Member
@request.session[:user_id] = @user_non_member.id
post :user_pref_save, :id => @project.id, :email_notify => 1
end
def test_user_pref_save_member_forbidden
# Member
@request.session[:user_id] = @user_member.id
post :user_pref_save, :id => @project.id, :email_notify => 1,
:title_format => '%t_%v'
assert_response :forbidden
end
def test_user_pref_save_none_member
# Non Member
@request.session[:user_id] = @user_non_member.id
@role_manager.add_permission! :user_preferences
post :user_pref_save, :id => @project.id, :email_notify => 1,
:title_format => '%t_%v'
assert_response :forbidden
end
def test_user_pref_save_admin
# Admin - non member
@request.session[:user_id] = @user_admin.id
post :user_pref_save, :id => @project.id, :email_notify => 1
@role_manager.add_permission! :user_preferences
post :user_pref_save, :id => @project.id, :email_notify => 1,
:title_format => '%t_%v'
assert_redirected_to settings_project_path(@project, :tab => 'dmsf')
assert_not_nil flash[:warning]
assert_equal flash[:warning], l(:user_is_not_project_member)
end
end

View File

@ -2,7 +2,7 @@
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -23,15 +23,14 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
include Redmine::I18n
fixtures :users, :dmsf_workflows, :dmsf_workflow_steps, :projects, :roles,
:members, :member_roles, :dmsf_workflow_step_assignments, :dmsf_file_revisions,
:dmsf_files
fixtures :users, :email_addresses, :dmsf_workflows, :dmsf_workflow_steps,
:projects, :roles, :members, :member_roles, :dmsf_workflow_step_assignments,
:dmsf_file_revisions, :dmsf_files
def setup
@user_admin = User.find_by_id 1 # Redmine admin
@user_member = User.find_by_id 2 # John Smith - manager
@user_non_member = User.find_by_id 3 # Dave Lopper
@request.session[:user_id] = @user_member.id
@user_admin = User.find_by_id 1 # Redmine admin
@user_member = User.find_by_id 2 # John Smith - manager
@user_non_member = User.find_by_id 3 # Dave Lopper
@role_manager = Role.find_by_name('Manager')
@role_manager.add_permission! :file_manipulation
@role_manager.add_permission! :manage_workflows
@ -51,6 +50,8 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
@file1 = DmsfFile.find_by_id 1
@file2 = DmsfFile.find_by_id 2
@request.env['HTTP_REFERER'] = dmsf_folder_path(:id => @project1.id)
User.current = nil
@request.session[:user_id] = @user_member.id
end
def test_truth
@ -73,40 +74,58 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
assert_kind_of DmsfFile, @file2
end
def test_authorize
def test_authorize_admin
# Admin
@request.session[:user_id] = @user_admin.id
get :index
assert_response :success
assert_template 'index'
end
def test_authorize_member
# Non member
@request.session[:user_id] = @user_non_member.id
get :index, :project_id => @project1.id
assert_response :forbidden
# Member
@request.session[:user_id] = @user_member.id
end
def test_authorize_administration
# Administration
get :index
assert_response :forbidden
end
def test_authorize_projects
# Project
get :index, :project_id => @project1.id
assert_response :success
assert_template 'index'
end
def test_authorize_manage_workflows_forbidden
# Without permissions
@role_manager.remove_permission! :manage_workflows
get :index, :project_id => @project1.id
assert_response :forbidden
end
def test_authorization_file_approval_ok
@role_manager.add_permission! :file_approval
@revision2.dmsf_workflow_id = @wf1.id
get :start, :id => @revision2.dmsf_workflow_id,:dmsf_file_revision_id => @revision2.id
@revision2.dmsf_workflow_id = @wf1.id
get :start, :id => @revision2.dmsf_workflow_id,
:dmsf_file_revision_id => @revision2.id
assert_response :redirect
end
def test_authorization_file_approval_forbidden
@role_manager.remove_permission! :file_approval
get :start, :id => @revision2.dmsf_workflow_id,:dmsf_file_revision_id => @revision2.id
@revision2.dmsf_workflow_id = @wf1.id
get :start, :id => @revision2.dmsf_workflow_id,
:dmsf_file_revision_id => @revision2.id
assert_response :forbidden
end
def test_authorization_no_module
# Without the module
@role_manager.add_permission! :file_manipulation
@project1.disable_module!(:dmsf)
@ -327,4 +346,5 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
:project_id => @project1.id)
assert_response :redirect
end
end

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2013 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,13 +23,14 @@ require File.expand_path('../../test_helper', __FILE__)
class MyControllerTest < RedmineDmsf::Test::TestCase
include Redmine::I18n
fixtures :users, :user_preferences, :dmsf_workflows, :dmsf_workflow_steps,
:dmsf_workflow_step_assignments, :dmsf_file_revisions, :dmsf_files,
:dmsf_file_revisions, :dmsf_locks
fixtures :users, :email_addresses, :user_preferences, :projects,
:dmsf_workflows, :dmsf_workflow_steps, :dmsf_workflow_step_assignments,
:dmsf_file_revisions, :dmsf_folders, :dmsf_files, :dmsf_locks
def setup
@user_member = User.find_by_id 2
assert_not_nil @user_member
User.current = nil
@request.session[:user_id] = @user_member.id
end
@ -39,9 +42,10 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
@user_member.pref[:my_page_layout] = { 'top' => ['open_approvals'] }
@user_member.pref.save!
get :page
assert_response :success
# TODO: Not working in Travis
#assert_select 'h3', { :text => "#{l(:label_my_open_approvals)} (4)" }
assert_response :success
assert_select 'div#list-top' do
assert_select 'h3', { :text => "#{l(:label_my_open_approvals)} (0)" }
end
end
def test_page_with_open_locked_documents
@ -49,6 +53,9 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
@user_member.pref.save!
get :page
assert_response :success
assert_select 'h3', { :text => "#{l(:label_my_locked_documents)} (0/1)" }
assert_select 'div#list-top' do
assert_select 'h3', { :text => "#{l(:label_my_locked_documents)} (0/1)" }
end
end
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -22,159 +24,180 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
include Redmine::I18n
fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
:dmsf_folders, :dmsf_files, :dmsf_file_revisions, :dmsf_locks
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles,
:enabled_modules, :dmsf_folders, :dmsf_files, :dmsf_file_revisions,
:dmsf_locks
def setup
DmsfFile.storage_path = File.expand_path '../fixtures/files', __FILE__
DmsfFile.storage_path = File.expand_path '../../fixtures/files', __FILE__
DmsfLock.delete_all
@admin = credentials 'admin'
@jsmith = credentials 'jsmith'
@project1 = Project.find_by_id 1
@project2 = Project.find_by_id 2
@role_developer = Role.find 2
@folder4 = DmsfFolder.find_by_id 4
@file1 = DmsfFile.find_by_id 1
@file2 = DmsfFile.find_by_id 2
@file4 = DmsfFile.find_by_id 4
@role = Role.find_by_id 1 # Manager
@folder1 = DmsfFolder.find_by_id 1
@folder6 = DmsfFolder.find_by_id 6
@file1 = DmsfFile.find_by_id 1
Setting.plugin_redmine_dmsf['dmsf_webdav'] = '1'
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
super
DmsfFile.storage_path = File.expand_path '../../fixtures/files', __FILE__
User.current = nil
end
def test_truth
assert_kind_of Project, @project1
assert_kind_of Project, @project2
assert_kind_of DmsfFolder, @folder4
assert_kind_of DmsfFile, @file1
assert_kind_of DmsfFile, @file2
assert_kind_of DmsfFile, @file4
assert_kind_of Role, @role_developer
assert_kind_of DmsfFolder, @folder1
assert_kind_of DmsfFolder, @folder6
assert_kind_of DmsfFile, @file1
assert_kind_of Role, @role
end
def test_not_authenticated
delete 'dmsf/webdav'
def test_not_authenticated
delete '/dmsf/webdav'
assert_response 401
delete "dmsf/webdav/#{@project1.identifier}"
end
def test_not_authenticated_project
delete "/dmsf/webdav/#{@project1.identifier}"
assert_response 401
end
def test_failed_authentication
delete 'dmsf/webdav', nil, credentials('admin', 'badpassword')
delete '/dmsf/webdav', nil, credentials('admin', 'badpassword')
assert_response 401
delete "dmsf/webdav/#{@project1.identifier}", nil, credentials('admin', 'badpassword')
end
def test_failed_authentication
delete "/dmsf/webdav/#{@project1.identifier}", nil, credentials('admin', 'badpassword')
assert_response 401
end
def test_root_folder
delete 'dmsf/webdav/', nil, @admin
assert_response 501
def test_root_folder
delete '/dmsf/webdav', nil, @admin
assert_response :error # 501
end
def test_delete_not_empty_folder
put "dmsf/webdav/#{@project1.identifier}/folder1", nil, @admin
put "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", nil, @admin
assert_response :forbidden
end
def test_not_existed_project
delete 'dmsf/webdav/not_a_project/file.txt', nil, @admin
assert_response 404 #Item does not exist
delete '/dmsf/webdav/not_a_project/file.txt', nil, @admin
assert_response :missing # Item does not exist.
end
def test_dmsf_not_enabled
delete "dmsf/webdav/#{@project2.identifier}/test.txt", nil, @jsmith
assert_response 404 #Item does not exist, as project is not enabled
delete "/dmsf/webdav/#{@project1.identifier}/test.txt", nil, @jsmith
assert_response :missing # Item does not exist, as project is not enabled.
end
def test_delete_when_ro
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_ONLY'
delete "dmsf/webdav/#{@project2.identifier}/#{@file1.name}", nil, @admin
assert_response 502 #Item does not exist, as project is not enabled
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
assert_response :error # 502 - Item does not exist, as project is not enabled.
end
def test_unlocked_file
delete "dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
assert_response :success # If its in the 20x range it's acceptable, should be 204
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
assert_response :success # If its in the 20x range it's acceptable, should be 204.
@file1.reload
assert @file1.deleted, "File #{@file1.name} hasn't been deleted"
end
def test_unathorized_user
@project2.enable_module! :dmsf #Flag module enabled
delete "dmsf/webdav/#{@project2.identifier}/#{@file2.name}", nil, @jsmith
assert_response 404 # Without folder_view permission, he will not even be aware of its existence
@file2.reload
assert !@file2.deleted, "File #{@file2.name} is expected to exist"
@role_developer.add_permission! :view_dmsf_folders
delete "dmsf/webdav/#{@project2.identifier}/#{@file2.name}", nil, @jsmith
assert_response :forbidden # Now jsmith's role has view_folder rights, however they do not hold file manipulation rights
@file2.reload
assert !@file2.deleted, "File #{@file2.name} is expected to exist"
@project1.enable_module! :dmsf # Flag module enabled
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
assert_response :missing # Without folder_view permission, he will not even be aware of its existence.
@file1.reload
assert !@file1.deleted, "File #{@file1.name} is expected to exist"
end
def test_unathorized_user_forbidden
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
assert_response :forbidden # Now jsmith's role has view_folder rights, however they do not hold file manipulation rights.
@file1.reload
assert !@file1.deleted, "File #{@file1.name} is expected to exist"
end
def test_view_folder_not_allowed
@project2.enable_module! :dmsf #Flag module enabled
@role_developer.add_permission! :file_manipulation
delete "dmsf/webdav/#{@project2.identifier}/#{@file2.name}", nil, @jsmith
assert_response 404 #Without folder_view permission, he will not even be aware of its existence
@file2.reload
assert !@file2.deleted, "File #{@file2.name} is expected to exist"
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :file_manipulation
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", nil, @jsmith
assert_response :missing # Without folder_view permission, he will not even be aware of its existence.
@folder1.reload
assert !@folder1.deleted, "Folder #{@folder1.title} is expected to exist"
end
def test_folder_manipulation_not_allowed
@project2.enable_module! :dmsf #Flag module enabled
@role_developer.add_permission! :view_dmsf_folders
delete "dmsf/webdav/#{@project2.identifier}/folder1/#{@folder4.title}", nil, @jsmith
assert_response :forbidden #Without manipulation permission, action is forbidden
@folder4.reload
assert !@folder4.deleted, "File #{@file2.name} is expected to exist"
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", nil, @jsmith
assert_response :forbidden # Without manipulation permission, action is forbidden.
@folder1.reload
assert !@folder1.deleted, "Foler #{@folder1.title} is expected to exist"
end
def test_folder_delete_by_admin
@project2.enable_module! :dmsf #Flag module enabled
delete "dmsf/webdav/#{@project2.identifier}/folder1/#{@folder4.title}", nil, @admin
@project1.enable_module! :dmsf # Flag module enabled
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @admin
assert_response :success
@folder4.reload
assert @folder4.deleted
@folder6.reload
assert @folder6.deleted, "Folder #{@folder1.title} is not expected to exist"
end
def test_folder_delete_by_user
@role_developer.add_permission! :view_dmsf_folders
@role_developer.add_permission! :folder_manipulation
@project2.enable_module! :dmsf #Flag module enabled
delete "dmsf/webdav/#{@project2.identifier}/folder1/#{@folder4.title}", nil, @jsmith
@role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation
@project1.enable_module! :dmsf # Flag module enabled
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
assert_response :success
@folder4.reload
assert @folder4.deleted
@folder6.reload
assert @folder6.deleted, "Folder #{@folder1.title} is not expected to exist"
end
def test_file_delete_by_administrator
@project2.enable_module! :dmsf
delete "dmsf/webdav/#{@project2.identifier}/#{@file2.name}", nil, @admin
@project1.enable_module! :dmsf
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
assert_response :success
@file2.reload
assert @file2.deleted
@file1.reload
assert @file1.deleted, "File #{@file1.name} is not expected to exist"
end
def test_file_delete_by_user
@project2.enable_module! :dmsf
@role_developer.add_permission! :view_dmsf_folders
@role_developer.add_permission! :file_delete
delete "dmsf/webdav/#{@project2.identifier}/#{@file2.name}", nil, @jsmith
def test_file_delete_by_user
@project1.enable_module! :dmsf
@role.add_permission! :view_dmsf_folders
@role.add_permission! :file_delete
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
assert_response :success
@file2.reload
assert @file2.deleted
@file1.reload
assert @file1.deleted, "File #{@file1.name} is not expected to exist"
end
def test_locked_file
@project2.enable_module! :dmsf #Flag module enabled
@role_developer.add_permission! :view_dmsf_folders
@role_developer.add_permission! :file_delete
delete "dmsf/webdav/#{@project2.identifier}/#{@file2.name}", nil, @jsmith
assert_response :success
# TODO: locks are not working here :-(
#assert @file2.deleted, "File is not deleted?!?"
#assert_include l(:error_file_is_locked), flash[:error]
def test_locked_folder
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
@role.add_permission! :folder_manipulation
@folder6.lock!
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
assert_response 423 # Locked
@folder6.reload
assert !@folder6.deleted, "Folder #{@folder6.title} is expected to exist"
end
def test_locked_file
@project1.enable_module! :dmsf
@role.add_permission! :view_dmsf_folders
@role.add_permission! :file_delete
@file1.lock!
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
assert_response 423 # Locked
@file1.reload
assert !@file1.deleted, "File #{@file1.name} is expected to exist"
end
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,114 +23,120 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWebdavGetTest < RedmineDmsf::Test::IntegrationTest
fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
:dmsf_folders, :dmsf_files, :dmsf_file_revisions
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles,
:enabled_modules, :dmsf_folders, :dmsf_files, :dmsf_file_revisions
def setup
@admin = credentials 'admin'
@jsmith = credentials 'jsmith'
@project1 = Project.find_by_id 1
@project2 = Project.find_by_id 2
@role_developer = Role.find 2
@role = Role.find_by_id 1 # Manager
Setting.plugin_redmine_dmsf['dmsf_webdav'] = '1'
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
DmsfFile.storage_path = File.expand_path '../fixtures/files', __FILE__
super
DmsfFile.storage_path = File.expand_path '../../fixtures/files', __FILE__
User.current = nil
end
def test_truth
assert_kind_of Project, @project1
assert_kind_of Project, @project2
assert_kind_of Role, @role_developer
assert_kind_of Role, @role
end
def test_should_deny_anonymous
get 'dmsf/webdav'
get '/dmsf/webdav'
assert_response 401
end
def test_should_deny_failed_authentication
get 'dmsf/webdav', nil, credentials('admin', 'badpassword')
get '/dmsf/webdav', nil, credentials('admin', 'badpassword')
assert_response 401
end
def test_should_permit_authenticated_user
get 'dmsf/webdav', nil, @admin
get '/dmsf/webdav', nil, @admin
assert_response :success
end
def test_should_list_dmsf_enabled_project
get 'dmsf/webdav', nil, @admin
get '/dmsf/webdav', nil, @admin
assert_response :success
assert !response.body.match(@project1.name).nil?, "Expected to find project #{@project1.name} in return data"
end
def test_should_not_list_non_dmsf_enabled_project
get 'dmsf/webdav', nil, @jsmith
get '/dmsf/webdav', nil, @jsmith
assert_response :success
assert response.body.match(@project2.name).nil?, "Unexpected find of project #{@project2.name} in return data"
end
def test_should_return_status_404_when_accessing_non_existant_or_non_dmsf_enabled_project
## Test project resource object
get 'dmsf/webdav/project_does_not_exist', nil, @jsmith
assert_response 404
get "dmsf/webdav/#{@project2.identifier}", nil, @jsmith
assert_response 404
## Test dmsf resource object
get 'dmsf/webdav/project_does_not_exist/test1', nil, @jsmith
assert_response 404
get "dmsf/webdav/#{@project2.identifier}/test.txt", nil, @jsmith
assert_response 404
def test_should_return_status_404_when_project_does_not_exist
@project1.enable_module! :dmsf # Flag module enabled
get '/dmsf/webdav/project_does_not_exist', nil, @jsmith
assert_response :missing
end
def test_should_return_status_404_when_dmsf_not_enabled
get "/dmsf/webdav/#{@project2.identifier}", nil, @jsmith
assert_response :missing
end
def test_download_file_from_dmsf_enabled_project
# TODO: the storage path is not set as expected => reset
DmsfFile.storage_path = File.expand_path('../../fixtures/files', __FILE__)
get "dmsf/webdav/#{@project1.identifier}/test.txt", nil, @admin
#@project1.enable_module! :dmsf # Flag module enabled
get "/dmsf/webdav/#{@project1.identifier}/test.txt", nil, @admin
assert_response :success
assert_equal response.body, '1234', "File downloaded with unexpected contents: '#{response.body}'"
assert_equal response.body, '1234',
"File downloaded with unexpected contents: '#{response.body}'"
end
def test_should_list_dmsf_contents_within_project
get "dmsf/webdav/#{@project1.identifier}", nil, @admin
get "/dmsf/webdav/#{@project1.identifier}", nil, @admin
assert_response :success
folder = DmsfFolder.find_by_id 1
assert folder
assert response.body.match(folder.title), "Expected to find #{folder.title} in return data"
assert response.body.match(folder.title),
"Expected to find #{folder.title} in return data"
file = DmsfFile.find_by_id 1
assert file
assert response.body.match(file.name), "Expected to find #{file.name} in return data"
assert response.body.match(file.name),
"Expected to find #{file.name} in return data"
end
def test_user_assigned_to_project
# We'll be using project 2 and user jsmith for this test (Manager)
get "dmsf/webdav/#{@project2.identifier}", nil, @jsmith
assert_response 404
def test_user_assigned_to_project_dmsf_module_not_enabled
get "/dmsf/webdav/#{@project1.identifier}", nil, @jsmith
assert_response :missing
end
def test_user_assigned_to_project_folder_forbidden
@project2.enable_module! :dmsf # Flag module enabled
get "/dmsf/webdav/#{@project1.identifier}", nil, @jsmith
assert_response :missing
end
@project2.enable_module! :dmsf #Flag module enabled
get "dmsf/webdav/#{@project2.identifier}", nil, @jsmith
assert_response 404
@role_developer.add_permission! :view_dmsf_folders #assign rights
get "dmsf/webdav/#{@project2.identifier}", nil, @jsmith
def test_user_assigned_to_project_folder_ok
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
@role.add_permission! :view_dmsf_files
get "/dmsf/webdav/#{@project1.identifier}", nil, @jsmith
assert_response :success
get "dmsf/webdav/#{@project2.identifier}/test.txt", nil, @jsmith
assert_response 403 #Access is not granted as does not hold view_dmsf_files role (yet)
@role_developer.add_permission! :view_dmsf_files #assign rights
# TODO: the storage path is not set as expected => reset
DmsfFile.storage_path = File.expand_path('../../fixtures/files', __FILE__)
get "dmsf/webdav/#{@project2.identifier}/test.txt", nil, @jsmith
end
def test_user_assigned_to_project_file_forbidden
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
get "/dmsf/webdav/#{@project1.identifier}/test.txt", nil, @jsmith
assert_response :forbidden
end
def test_user_assigned_to_project_file_ok
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
@role.add_permission! :view_dmsf_files
get "/dmsf/webdav/#{@project1.identifier}/test.txt", nil, @jsmith
assert_response :success
assert_equal response.body, '1234', "File downloaded with unexpected contents: '#{response.body}'"
assert_equal response.body, '1234',
"File downloaded with unexpected contents: '#{response.body}'"
end
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,15 +23,18 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWebdavHeadTest < RedmineDmsf::Test::IntegrationTest
fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
:dmsf_folders
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles,
:enabled_modules, :dmsf_folders
def setup
def setup
@admin = credentials 'admin'
@jsmith = credentials 'jsmith'
@project1 = Project.find_by_id 1
@project2 = Project.find_by_id 2
Setting.plugin_redmine_dmsf['dmsf_webdav'] = '1'
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
DmsfFile.storage_path = File.expand_path '../fixtures/files', __FILE__
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
DmsfFile.storage_path = File.expand_path '../../fixtures/files', __FILE__
User.current = nil
end
def test_truth
@ -38,13 +43,13 @@ class DmsfWebdavHeadTest < RedmineDmsf::Test::IntegrationTest
end
def test_head_requires_authentication
make_request "/dmsf/webdav/#{@project1.identifier}"
head "/dmsf/webdav/#{@project1.identifier}"
assert_response 401
check_headers_dont_exist
end
def test_head_responds_with_authentication
make_request "/dmsf/webdav/#{@project1.identifier}", 'admin'
head "/dmsf/webdav/#{@project1.identifier}", nil, @admin
assert_response :success
check_headers_exist
end
@ -54,68 +59,61 @@ class DmsfWebdavHeadTest < RedmineDmsf::Test::IntegrationTest
# header and invalidates the test - where as a folder listing will always not include a last-modified
# (but may include an etag, so there is an allowance for a 1 in 2 failure rate on (optionally) required
# headers)
def test_head_responds_to_file
# TODO: the storage path is not set as expected => reset
DmsfFile.storage_path = File.expand_path('../../fixtures/files', __FILE__)
make_request "/dmsf/webdav/#{@project1.identifier}/test.txt", 'admin'
def test_head_responds_to_file
head "/dmsf/webdav/#{@project1.identifier}/test.txt", nil, @admin
assert_response :success
check_headers_exist #Note it'll allow 1 out of the 3 expected to fail
check_headers_exist # Note it'll allow 1 out of the 3 expected to fail
end
def test_head_fails_when_file_or_folder_not_found
make_request "/dmsf/webdav/#{@project1.identifier}/not_here.txt", 'admin'
assert_response 404
def test_head_fails_when_file_not_found
head "/dmsf/webdav/#{@project1.identifier}/not_here.txt", nil, @admin
assert_response :missing
check_headers_dont_exist
make_request '/dmsf/webdav/folder_not_here', 'admin'
assert_response 404
end
def test_head_fails_when_folder_not_found
head '/dmsf/webdav/folder_not_here', nil, @admin
assert_response :missing
check_headers_dont_exist
end
def test_head_fails_when_project_is_not_enabled_for_dmsf
make_request "/dmsf/webdav/#{@project2.identifier}/test.txt", 'jsmith'
assert_response 404
head "/dmsf/webdav/#{@project2.identifier}/test.txt", nil, @jsmith
assert_response :missing
check_headers_dont_exist
end
private
def make_request(*args)
if (args.length == 1) #Just a URL
head args.first
else
head args.first, nil, credentials(args[1])
end
end
def check_headers_exist
assert !(response.headers.nil? || response.headers.empty?), 'Head returned without headers' #Headers exist?
assert !(response.headers.nil? || response.headers.empty?),
'Head returned without headers' # Headers exist?
values = {}
values[:etag] = {:optional => true, :content => response.headers['Etag']}
values[:etag] = { :optional => true, :content => response.headers['Etag'] }
values[:content_type] = response.headers['Content-Type']
values[:last_modified] = {:optional => true, :content => response.headers['Last-Modified']}
values[:last_modified] = { :optional => true, :content => response.headers['Last-Modified'] }
single_optional = false
values.each {|key,val|
values.each do |key,val|
if val.is_a?(Hash)
if (val[:optional].nil? || !val[:optional])
assert( !(val[:content].nil? || val[:content].empty?), "Expected header #{key} was empty." ) if single_optional
assert(!(val[:content].nil? || val[:content].empty?), "Expected header #{key} was empty." ) if single_optional
else
single_optional = true
end
else
assert !(val.nil? || val.empty?), "Expected header #{key} was empty."
end
}
end
end
def check_headers_dont_exist
assert !(response.headers.nil? || response.headers.empty?), 'Head returned without headers' #Headers exist?
assert !(response.headers.nil? || response.headers.empty?), 'Head returned without headers' # Headers exist?
values = {}
values[:etag] = response.headers['Etag'];
values[:last_modified] = response.headers['Last-Modified']
values.each {|key,val|
values.each do |key,val|
assert (val.nil? || val.empty?), "Expected header #{key} should be empty."
}
end
end
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,68 +23,75 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWebdavMkcolTest < RedmineDmsf::Test::IntegrationTest
fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
:dmsf_folders
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles,
:enabled_modules, :dmsf_folders
def setup
@admin = credentials 'admin'
@jsmith = credentials 'jsmith'
@project1 = Project.find_by_id 1
@project2 = Project.find_by_id 2
@role_developer = Role.find 2
@role = Role.find_by_id 1 # Manager
@folder6 = DmsfFolder.find_by_id 6
Setting.plugin_redmine_dmsf['dmsf_webdav'] = '1'
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
super
DmsfFile.storage_path = File.expand_path '../../fixtures/files', __FILE__
User.current = nil
end
def test_truth
assert_kind_of Project, @project1
assert_kind_of Project, @project2
assert_kind_of Role, @role_developer
assert_kind_of Role, @role
assert_kind_of DmsfFolder, @folder6
end
def test_mkcol_requires_authentication
xml_http_request :mkcol, 'dmsf/webdav/test1'
xml_http_request :mkcol, '/dmsf/webdav/test1'
assert_response 401
end
def test_mkcol_fails_to_create_folder_at_root_level
xml_http_request :mkcol, 'dmsf/webdav/test1', nil, @admin
assert_response 501 #Not Implemented at this level
xml_http_request :mkcol, '/dmsf/webdav/test1', nil, @admin
assert_response :error # 501 - Not Implemented at this level
end
def test_should_not_succeed_on_a_non_existant_project
xml_http_request :mkcol, 'dmsf/webdav/project_doesnt_exist/test1', nil, @admin
assert_response 404 #Not found
xml_http_request :mkcol, '/dmsf/webdav/project_doesnt_exist/test1', nil, @admin
assert_response :missing # Not found
end
def test_should_not_succed_on_a_non_dmsf_enabled_project
xml_http_request :mkcol, "dmsf/webdav/#{@project2.identifier}/test1", nil, @jsmith
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/folder", nil, @jsmith
assert_response :forbidden
end
def test_should_create_folder_on_dmsf_enabled_project
xml_http_request :mkcol, "dmsf/webdav/#{@project1.identifier}/test1", nil, @admin
assert_response :success
def test_should_not_create_folder_without_permissions
@project1.enable_module! :dmsf # Flag module enabled
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/folder", nil, @jsmith
assert_response :forbidden
end
def test_should_fail_to_create_folder_that_already_exists
xml_http_request :mkcol, "dmsf/webdav/#{@project1.identifier}/test1", nil, @admin
assert_response :success
xml_http_request :mkcol, "dmsf/webdav/#{@project1.identifier}/test1", nil, @admin
assert_response 405 #Method not Allowed
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :folder_manipulation
@role.add_permission! :view_dmsf_folders
xml_http_request :mkcol,
"/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
assert_response 405 # Method not Allowed
end
def test_should_fail_to_create_folder_for_user_without_rights
xml_http_request :mkcol, "dmsf/webdav/#{@project1.identifier}/test1", nil, @jsmith
assert_response 403 #Forbidden
@project1.enable_module! :dmsf # Flag module enabled
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/test1", nil, @jsmith
assert_response :forbidden
end
def test_should_create_folder_for_non_admin_user_with_rights
@role_developer.add_permission! :folder_manipulation
@project2.enable_module! :dmsf
xml_http_request :mkcol, "dmsf/webdav/#{@project2.identifier}/test1", nil, @jsmith
assert_response :success
@project1.enable_module! :dmsf
@role.add_permission! :folder_manipulation
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/test1", nil, @jsmith
assert_response :success
end
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,8 +23,8 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest
fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
:dmsf_folders
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles,
:enabled_modules, :dmsf_folders
def setup
@admin = credentials 'admin'
@ -30,7 +32,6 @@ class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest
@project2 = Project.find_by_id 2
Setting.plugin_redmine_dmsf['dmsf_webdav'] = '1'
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
super
end
def test_truth
@ -39,12 +40,12 @@ class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest
end
def test_options_requires_no_authentication_for_root_level
xml_http_request :options, 'dmsf/webdav'
xml_http_request :options, '/dmsf/webdav'
assert_response :success
end
def test_options_returns_expected_allow_header
xml_http_request :options, 'dmsf/webdav'
xml_http_request :options, '/dmsf/webdav'
assert_response :success
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
assert response.headers['Allow'] , 'Allow header is empty or does not exist'
@ -52,14 +53,14 @@ class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest
end
def test_options_returns_expected_dav_header
xml_http_request :options, 'dmsf/webdav'
xml_http_request :options, '/dmsf/webdav'
assert_response :success
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
assert response.headers['Dav'] , 'Dav header is empty or does not exist'
end
def test_options_returns_expected_ms_auth_via_header
xml_http_request :options, 'dmsf/webdav'
xml_http_request :options, '/dmsf/webdav'
assert_response :success
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
assert response.headers['Ms-Author-Via'] , 'Ms-Author-Via header is empty or does not exist'
@ -67,33 +68,33 @@ class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest
end
def test_options_requires_authentication_for_non_root_request
xml_http_request :options, "dmsf/webdav/#{@project1.identifier}"
assert_response 401 #Unauthorized
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}"
assert_response 401 # Unauthorized
end
def test_un_authenticated_options_returns_expected_allow_header
xml_http_request :options, "dmsf/webdav/#{@project1.identifier}"
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}"
assert_response 401
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
assert_nil response.headers['Allow'] , 'Allow header should not exist'
end
def test_un_authenticated_options_returns_expected_dav_header
xml_http_request :options, "dmsf/webdav/#{@project1.identifier}"
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}"
assert_response 401
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
assert_nil response.headers['Dav'] , 'Dav header should not exist'
end
def test_un_authenticated_options_returns_expected_ms_auth_via_header
xml_http_request :options, "dmsf/webdav/#{@project1.identifier}"
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}"
assert_response 401
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
assert_nil response.headers['Ms-Author-Via'] , 'Ms-Author-Via header should not exist'
end
def test_authenticated_options_returns_expected_allow_header
xml_http_request :options, "dmsf/webdav/#{@project1.identifier}", nil, @admin
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}", nil, @admin
assert_response :success
assert !(response.headers.nil? || response.headers.empty?), "Response headers are empty"
assert response.headers['Allow'], 'Allow header is empty or does not exist'
@ -101,24 +102,27 @@ class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest
end
def test_authenticated_options_returns_expected_dav_header
xml_http_request :options, "dmsf/webdav/#{@project1.identifier}", nil, @admin
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}", nil, @admin
assert_response :success
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
assert response.headers['Dav'], 'Dav header is empty or does not exist'
end
def test_authenticated_options_returns_expected_ms_auth_via_header
xml_http_request :options, "dmsf/webdav/#{@project1.identifier}", nil, @admin
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}", nil, @admin
assert_response :success
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
assert response.headers['Ms-Author-Via'], 'Ms-Author-Via header is empty or does not exist'
assert response.headers['Ms-Author-Via'] == 'DAV', 'Ms-Author-Via header - expected: DAV'
end
def test_authenticated_options_returns_401_for_not_found_or_non_dmsf_enabled_items
xml_http_request :options, "dmsf/webdav/#{@project2.identifier}", nil, @jsmith
def test_authenticated_options_returns_401_for_non_dmsf_enabled_items
xml_http_request :options, "/dmsf/webdav/#{@project2.identifier}", nil, @jsmith
assert_response 401 # refused
xml_http_request :options, 'dmsf/webdav/does-not-exist', nil, @jsmith
end
def test_authenticated_options_returns_401_for_not_found
xml_http_request :options, '/dmsf/webdav/does-not-exist', nil, @jsmith
assert_response 401 # refused
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,13 +23,12 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWebdavPostTest < RedmineDmsf::Test::IntegrationTest
fixtures :users, :enabled_modules
fixtures :users, :email_addresses
def setup
@admin = credentials 'admin'
Setting.plugin_redmine_dmsf['dmsf_webdav'] = '1'
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
super
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
end
# Test that any post request is authenticated
@ -39,7 +40,7 @@ class DmsfWebdavPostTest < RedmineDmsf::Test::IntegrationTest
# Test post is not implemented
def test_post_not_implemented
post '/dmsf/webdav/', nil, @admin
assert_response 501 # 501 Not Implemented
assert_response :error # 501 Not Implemented
end
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -22,207 +24,177 @@ require 'fileutils'
class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
:dmsf_folders, :dmsf_files, :dmsf_file_revisions
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles,
:enabled_modules, :dmsf_folders, :dmsf_files, :dmsf_file_revisions
def setup
DmsfLock.delete_all #Delete all locks that are in our test DB - probably not safe but ho hum
DmsfLock.delete_all # Delete all locks that are in our test DB - probably not safe but ho hum
timestamp = DateTime.now.strftime("%y%m%d%H%M")
DmsfFile.storage_path = File.expand_path("./dmsf_test-#{timestamp}", DmsfHelper.temp_dir)
Dir.mkdir(DmsfFile.storage_path) unless File.directory?(DmsfFile.storage_path)
@admin = credentials 'admin'
@jsmith = credentials 'jsmith'
@jsmith = credentials 'jsmith'
@project1 = Project.find_by_id 1
@project2 = Project.find_by_id 2
@role_developer = Role.find 2
@role = Role.find 1 #
Setting.plugin_redmine_dmsf['dmsf_webdav'] = '1'
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
super
end
# def teardown
# # Delete our tmp folder
# begin
# FileUtils.rm_rf DmsfFile.storage_path
# rescue
# warn 'DELETE FAILED'
# end
# end
def teardown
# Delete our tmp folder
begin
FileUtils.rm_rf DmsfFile.storage_path
rescue Exception => e
error e.message
end
end
def test_truth
assert_kind_of Project, @project1
assert_kind_of Project, @project2
assert_kind_of Role, @role_developer
assert_kind_of Role, @role
end
test 'PUT denied unless authenticated' do
put 'dmsf/webdav'
def test_put_denied_unless_authenticated_root
put '/dmsf/webdav'
assert_response 401
put "dmsf/webdav/#{@project1.identifier}"
end
def test_put_denied_unless_authenticated
put "/dmsf/webdav/#{@project1.identifier}"
assert_response 401
end
test 'PUT denied with failed authentication' do
put 'dmsf/webdav', nil, credentials('admin', 'badpassword')
assert_response 401
put "dmsf/webdav/#{@project1.identifier}", nil, credentials('admin', 'badpassword')
def test_put_denied_with_failed_authentication_root
put '/dmsf/webdav', nil, credentials('admin', 'badpassword')
assert_response 401
end
test 'PUT denied at root level' do
put 'dmsf/webdav/test.txt', "1234", @admin.merge!({:content_type => :text})
assert_response 501
def test_put_denied_with_failed_authentication
put "/dmsf/webdav/#{@project1.identifier}", nil, credentials('admin', 'badpassword')
assert_response 401
end
test 'PUT denied on collection/folder' do
put "dmsf/webdav/#{@project1.identifier}", '1234', @admin.merge!({:content_type => :text})
assert_response 403 #forbidden
def test_put_denied_at_root_level
put '/dmsf/webdav/test.txt', '1234', @admin.merge!({:content_type => :text})
assert_response :error # 501
end
test 'PUT failed on non-existant project' do
put 'dmsf/webdav/not_a_project/file.txt', '1234', @admin.merge!({:content_type => :text})
def test_put_denied_on_folder
put "/dmsf/webdav/#{@project1.identifier}", '1234', @admin.merge!({:content_type => :text})
assert_response :forbidden
end
def test_put_failed_on_non_existant_project
put '/dmsf/webdav/not_a_project/file.txt', '1234', @admin.merge!({:content_type => :text})
assert_response 409 # Conflict, not_a_project does not exist - file.txt cannot be created
end
test 'PUT as admin granted on dmsf-enabled project' do
put "dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @admin.merge!({:content_type => :text})
assert_response 201 #201 Created
#Lets check for our file
def test_put_as_admin_granted_on_dmsf_enabled_project
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @admin.merge!({:content_type => :text})
assert_response :success # 201 Created
# Lets check for our file
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
assert file, 'Check for files existance'
end
test 'PUT failed as jsmith on non-dmsf enabled project' do
put "dmsf/webdav/#{@project2.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 409 #Should report conflict, as project 2 technically doesn't exist if not enabled
#Lets check for our file
def test_put_failed_as_jsmith_on_non_dmsf_enabled_project
put "/dmsf/webdav/#{@project2.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 409 # Should report conflict, as project 2 technically doesn't exist if not enabled
# Lets check for our file
file = DmsfFile.find_file_by_name @project2, nil, 'test-1234.txt'
assert_nil file, 'Check for files existance'
end
test 'PUT failed when insuficient permissions on project' do
@project2.enable_module! :dmsf #Flag module enabled
put "dmsf/webdav/#{@project2.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 409 #We don't hold the permission view_dmsf_folders, and thus project 2 doesn't exist to us.
@role_developer.add_permission! :view_dmsf_folders
put "dmsf/webdav/#{@project2.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 403 #We don't hold the permission file_manipulation - so we're unable to do anything with files
@role_developer.remove_permission! :view_dmsf_folders
@role_developer.add_permission! :file_manipulation
#Check we don't have write access even if we do have the file_manipulation permission
put "dmsf/webdav/#{@project2.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 409 #We don't hold the permission view_dmsf_folders, and thus project 2 doesn't exist to us.
#Lets check for our file
file = DmsfFile.find_file_by_name @project2, nil, 'test-1234.txt'
def test_put_failed_when_no_permission
@project2.enable_module! :dmsf # Flag module enabled
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 409 # We don't hold the permission view_dmsf_folders, and thus project 2 doesn't exist to us.
end
def test_put_failed_when_no_file_manipulation_permission
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response :forbidden # We don't hold the permission file_manipulation - so we're unable to do anything with files
end
def test_put_failed_when_no_view_dmsf_folders_permission
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :file_manipulation
# Check we don't have write access even if we do have the file_manipulation permission
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 409 # We don't hold the permission view_dmsf_folders, and thus project 2 doesn't exist to us.
# Lets check for our file
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
assert_nil file, 'File test-1234 was found in projects dmsf folder.'
end
test 'PUT succeeds for non-admin with correct permissions' do
@project2.enable_module! :dmsf #Flag module enabled
put "dmsf/webdav/#{@project2.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 409 #We don't hold the permission view_dmsf_folders, and thus project 2 doesn't exist to us.
@role_developer.add_permission! :view_dmsf_folders
@role_developer.add_permission! :file_manipulation
#Check we don't have write access even if we do have the file_manipulation permission
put "dmsf/webdav/#{@project2.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 201 #Now we have permissions :D
#Lets check for our file
file = DmsfFile.find_file_by_name @project2, nil, 'test-1234.txt'
def test_put_succeeds_for_non_admin_with_correct_permissions
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
@role.add_permission! :file_manipulation
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response :success # 201 - Now we have permissions
# Lets check for our file
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
assert file, 'File test-1234 was not found in projects dmsf folder.'
end
test 'PUT writes revision successfully for unlocked file' do
@project2.enable_module! :dmsf #Flag module enabled
@role_developer.add_permission! :view_dmsf_folders
@role_developer.add_permission! :file_manipulation
file = DmsfFile.find_file_by_name @project2, nil, 'test.txt'
assert_difference('file.revisions.count') do
put "dmsf/webdav/#{@project2.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 201 #Created
def test_put_writes_revision_successfully_for_unlocked_file
@project1.enable_module! :dmsf #Flag module enabled
@role.add_permission! :view_dmsf_folders
@role.add_permission! :file_manipulation
file = DmsfFile.find_file_by_name @project1, nil, 'test.txt'
assert_not_nil file, 'test.txt file not found'
assert_difference 'file.revisions.count', +1 do
put "/dmsf/webdav/#{@project1.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response :success # 201 - Created
end
end
test 'PUT fails revision when file is locked' do
@project2.enable_module! :dmsf #Flag module enabled
@role_developer.add_permission! :view_dmsf_folders
@role_developer.add_permission! :file_manipulation
def test_put_fails_revision_when_file_is_locked
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
@role.add_permission! :file_manipulation
log_user 'admin', 'admin' # login as admin
assert !User.current.anonymous?, 'Current user is not anonymous'
file = DmsfFile.find_file_by_name @project2, nil, 'test.txt'
file = DmsfFile.find_file_by_name @project1, nil, 'test.txt'
assert file.lock!, "File failed to be locked by #{User.current.name}"
assert_no_difference('file.revisions.count') do
put "dmsf/webdav/#{@project2.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 423 #Locked
end
User.current = User.find(1)
file.unlock!
assert !file.locked?, "File failed to unlock by #{User.current.name}"
assert_no_difference 'file.revisions.count' do
put "/dmsf/webdav/#{@project1.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 423 # Locked
end
end
test 'PUT fails revision when file is locked and user is administrator' do
@project2.enable_module! :dmsf #Flag module enabled
@role_developer.add_permission! :view_dmsf_folders
@role_developer.add_permission! :file_manipulation
def test_put_fails_revision_when_file_is_locked_and_user_is_administrator
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
@role.add_permission! :file_manipulation
log_user 'jsmith', 'jsmith' # login as jsmith
assert !User.current.anonymous?, "Current user is not anonymous"
file = DmsfFile.find_file_by_name @project2, nil, 'test.txt'
assert !User.current.anonymous?, 'Current user is not anonymous'
file = DmsfFile.find_file_by_name @project1, nil, 'test.txt'
assert file.lock!, "File failed to be locked by #{User.current.name}"
assert_no_difference('file.revisions.count') do
put "dmsf/webdav/#{@project2.identifier}/test.txt", "1234", @admin.merge!({:content_type => :text})
assert_response 423 #Created
end
User.current = User.find(2)
begin
file.unlock!
rescue
#nothing
end
assert !file.locked?, "File failed to unlock by #{User.current.name}"
assert_no_difference 'file.revisions.count' do
put "/dmsf/webdav/#{@project1.identifier}/test.txt", '1234', @admin.merge!({:content_type => :text})
assert_response 423 # Locked
end
end
test 'PUT accepts revision when file is locked and user is same as lock holder' do
@project2.enable_module! :dmsf #Flag module enabled
@role_developer.add_permission! :view_dmsf_folders
@role_developer.add_permission! :file_manipulation
log_user 'jsmith', 'jsmith' #login as jsmith
def test_put_accepts_revision_when_file_is_locked_and_user_is_same_as_lock_holder
@project1.enable_module! :dmsf # Flag module enabled
@role.add_permission! :view_dmsf_folders
@role.add_permission! :file_manipulation
log_user 'jsmith', 'jsmith' # login as jsmith
assert !User.current.anonymous?, 'Current user is not anonymous'
file = DmsfFile.find_file_by_name @project2, nil, 'test.txt'
file = DmsfFile.find_file_by_name @project1, nil, 'test.txt'
assert file.lock!, "File failed to be locked by #{User.current.name}"
assert_difference('file.revisions.count') do
put "dmsf/webdav/#{@project2.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response 201 #Created
end
file.unlock!
assert !file.locked?, "File failed to unlock by #{User.current.name}"
assert_difference 'file.revisions.count', +1 do
put "/dmsf/webdav/#{@project1.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
assert_response :success # 201 - Created
end
end
end

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -19,9 +21,9 @@
require File.expand_path('../../test_helper', __FILE__)
class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
fixtures :projects, :users, :dmsf_folders, :dmsf_files, :dmsf_file_revisions,
:roles, :members, :member_roles, :enabled_modules, :enumerations,
:dmsf_locks
fixtures :projects, :users, :email_addresses, :dmsf_folders, :dmsf_files,
:dmsf_file_revisions, :roles, :members, :member_roles, :enabled_modules,
:enumerations, :dmsf_locks
def setup
@revision5 = DmsfFileRevision.find_by_id 5
@ -33,9 +35,11 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
def test_delete_restore
@revision5.delete false
assert @revision5.deleted
assert @revision5.deleted,
"File revision #{@revision5.name} hasn't been deleted"
@revision5.restore
assert !@revision5.deleted
assert !@revision5.deleted,
"File revision #{@revision5.name} hasn't been restored"
end
def test_destroy

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -20,21 +22,25 @@
require File.expand_path('../../test_helper', __FILE__)
class DmsfFileTest < RedmineDmsf::Test::UnitTest
fixtures :projects, :users, :dmsf_folders, :dmsf_files, :dmsf_file_revisions,
:roles, :members, :member_roles, :dmsf_locks, :dmsf_links
fixtures :projects, :users, :email_addresses, :dmsf_folders, :dmsf_files,
:dmsf_file_revisions, :roles, :members, :member_roles, :dmsf_locks,
:dmsf_links
def setup
@user1 = User.find_by_id 1
@admin = User.find_by_id 1
@jsmith = User.find_by_id 2
@project1 = Project.find_by_id 1
@file1 = DmsfFile.find_by_id 1
@file2 = DmsfFile.find_by_id 2
@file3 = DmsfFile.find_by_id 3
@file4 = DmsfFile.find_by_id 4
@file5 = DmsfFile.find_by_id 5
@file5 = DmsfFile.find_by_id 5
User.current = nil
end
def test_truth
assert_kind_of User, @user1
assert_kind_of User, @admin
assert_kind_of User, @jsmith
assert_kind_of Project, @project1
assert_kind_of DmsfFile, @file1
assert_kind_of DmsfFile, @file2
@ -43,75 +49,89 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
assert_kind_of DmsfFile, @file5
end
test "project file count differs from project visibility count" do
def test_project_file_count_differs_from_project_visibility_count
assert_not_same(@project1.dmsf_files.count, @project1.dmsf_files.visible.count)
end
test "project DMSF file listing contains deleted items" do
found_deleted = false
@project1.dmsf_files.each {|file|
found_deleted = true if file.deleted
}
assert found_deleted, "Expected at least one deleted item in <all items>"
def test_project_dmsf_file_listing_contains_deleted_items
assert @project1.dmsf_files.index{ |f| f.deleted },
'Expected at least one deleted item in <all items>'
end
test "project DMSF file visible listing contains no deleted items" do
@project1.dmsf_files.visible.each {|file|
assert !file.deleted, "File #{file.name} is deleted, this was unexpected"
}
def test_project_dmsf_file_visible_listing_contains_no_deleted_items
assert @project1.dmsf_files.visible.index{ |f| f.deleted }.nil?,
'There is a deleted file, this was unexpected'
end
test "Known locked file responds as being locked" do
assert @file2.locked?
def test_known_locked_file_responds_as_being_locked
assert @file2.locked?, "#{@file2.name} is not locked"
end
test "File with locked folder is reported as locked" do
assert @file4.locked?
def test_file_with_locked_folder_is_reported_as_locked
assert @file4.locked?, "#{@file4.name} is not locked"
end
test "File with folder up heirarchy (locked) is reported as locked" do
assert @file5.locked?
def test_file_with_folder_up_heirarchy_locked_is_reported_as_locked
assert @file5.locked?, "#{@file5.name} is not locked"
end
test "File with folder up heirarchy (locked) is not locked for user id 1" do
User.current = @user1
assert @file5.locked?
assert !@file5.locked_for_user?
def test_file_locked_is_not_locked_for_user_who_locked
User.current = @admin
@file1.lock!
assert !@file1.locked_for_user?,
"#{@file1.name} is locked for #{User.current.name}"
@file1.unlock!
end
test "File with no locks reported unlocked" do
def test_file_locked_is_locked_for_user_who_didnt_lock
User.current = @admin
@file1.lock!
User.current = @jsmith
assert @file1.locked_for_user?,
"#{@file1.name} is locked for #{User.current.name}"
User.current = @admin
@file1.unlock!
end
def test_file_with_no_locks_reported_unlocked
assert !@file1.locked?
end
def test_delete_restore
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_equal 1, @file4.revisions.visible.count
#assert_equal 2, @file4.referenced_links.visible.count
# Delete
@file4.delete false
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert @file4.deleted
#assert_equal 0, @file4.revisions.visible.count
#assert_equal 0, @file4.referenced_links.visible.count
# Restore
@file4.restore
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert !@file4.deleted
#assert_equal 1, @file4.revisions.visible.count
#assert_equal 2, @file4.referenced_links.visible.count
def test_delete_restore
assert_equal 1, @file4.revisions.visible.count
assert_equal 2, @file4.referenced_links.visible.count
end
def test_destroy
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_equal 1, @file4.revisions.visible.count
#assert_equal 2, @file4.referenced_links.visible.count
@file4.delete true
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_nil DmsfFile.find_by_id(@file4.id)
#assert_equal 0, @file4.revisions.count
#assert_equal 0, @file4.referenced_links.count
def test_delete
User.current = @admin
@file4.folder.unlock!
assert @file4.delete(false), @file4.errors.full_messages.to_sentence
assert @file4.deleted, "File #{@file4.name} is not deleted"
assert_equal 0, @file4.revisions.visible.count
assert_equal 0, @file4.referenced_links.visible.count
@file4.folder.lock!
end
def test_restore
User.current = @admin
@file4.folder.unlock!
assert @file4.delete(false), @file4.errors.full_messages.to_sentence
@file4.restore
assert !@file4.deleted, "File #{@file4} hasn't been restored"
assert_equal 1, @file4.revisions.visible.count
assert_equal 2, @file4.referenced_links.visible.count
@file4.folder.lock!
end
def test_destroy
User.current = @admin
@file4.folder.unlock!
assert_equal 1, @file4.revisions.visible.count
assert_equal 2, @file4.referenced_links.visible.count
@file4.delete true
assert_equal 0, @file4.revisions.count
assert_equal 0, @file4.referenced_links.count
@file4.folder.lock!
end
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -20,37 +22,32 @@
require File.expand_path('../../test_helper', __FILE__)
class DmsfFolderTest < RedmineDmsf::Test::UnitTest
fixtures :projects, :users, :dmsf_folders, :dmsf_files, :dmsf_file_revisions,
:roles, :members, :member_roles, :dmsf_locks, :dmsf_links
fixtures :projects, :users, :email_addresses, :dmsf_folders, :roles,
:members, :member_roles
def setup
@folder4 = DmsfFolder.find_by_id 4
@folder6 = DmsfFolder.find_by_id 6
end
def test_truth
assert_kind_of DmsfFolder, @folder4
assert_kind_of DmsfFolder, @folder6
end
def test_delete_restore
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_equal 1, @folder4.referenced_links.visible.count
@folder4.delete false
assert @folder4.deleted
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_equal 0, @folder4.referenced_links.visible.count
@folder4.restore
assert !@folder4.deleted
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_equal 1, @folder4.referenced_links.visible.count
def test_delete
assert @folder6.delete(false), @folder6.errors.full_messages.to_sentence
assert @folder6.deleted, "Folder #{@folder6} hasn't been deleted"
end
def test_destroy
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_equal 1, @folder4.referenced_links.visible.count
@folder4.delete true
assert_nil DmsfFolder.find_by_id(@folder4.id)
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_equal 0, DmsfLink.where(:target_id => @folder4.id, :target_type => DmsfFolder.model_name.to_s).count
def test_restore
assert @folder6.delete(false), @folder6.errors.full_messages.to_sentence
assert @folder6.deleted, "Folder #{@folder6} hasn't been deleted"
assert @folder6.restore, @folder6.errors.full_messages.to_sentence
assert !@folder6.deleted, "Folder #{@folder6} hasn't been restored"
end
def test_destroy
@folder6.delete true
assert_nil DmsfFolder.find_by_id(@folder6.id)
end
end

View File

@ -45,8 +45,7 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
assert_kind_of DmsfLink, @file_link
end
def test_create
# Folder link
def test_create_folder_link
folder_link = DmsfLink.new
folder_link.target_project_id = @project1.id
folder_link.target_id = @folder1.id
@ -56,8 +55,9 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
folder_link.created_at = DateTime.now()
folder_link.updated_at = DateTime.now()
assert folder_link.save, folder_link.errors.full_messages.to_sentence
# File link
end
def test_create_file_link
file_link = DmsfLink.new
file_link.target_project_id = @project1.id
file_link.target_id = @file1.id
@ -67,8 +67,9 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
file_link.created_at = DateTime.now()
file_link.updated_at = DateTime.now()
assert file_link.save, file_link.errors.full_messages.to_sentence
end
# External link
def test_create_external_link
external_link = DmsfLink.new
external_link.target_project_id = @project1.id
external_link.external_url = 'http://www.redmine.org/plugins/dmsf'
@ -82,35 +83,36 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
def test_validate_name_length
@folder_link.name = 'a' * 256
assert !@folder_link.save
assert !@folder_link.save,
"Folder link #{@folder_link.name} should have not been saved"
assert_equal 1, @folder_link.errors.count
end
def test_validate_name_presence
@folder_link.name = ''
assert !@folder_link.save
assert !@folder_link.save,
"Folder link #{@folder_link.name} should have not been saved"
assert_equal 1, @folder_link.errors.count
end
def test_validate_external_url
@file_link.target_type = 'DmsfUrl'
@file_link.external_url = nil
assert !@file_link.save
assert !@file_link.save, 'External link should have not been saved'
assert_equal 1, @file_link.errors.count
end
# TODO: Not working in Travis
# def test_belongs_to_project
# @project1.destroy
# assert_nil DmsfLink.find_by_id 1
# assert_nil DmsfLink.find_by_id 2
# end
#
# def test_belongs_to_dmsf_folder
# @folder1.destroy
# assert_nil DmsfLink.find_by_id 1
# assert_nil DmsfLink.find_by_id 2
# end
def test_belongs_to_project
@project1.destroy
assert_nil DmsfLink.find_by_id 1
assert_nil DmsfLink.find_by_id 2
end
def test_belongs_to_dmsf_folder
@folder1.destroy
assert_nil DmsfLink.find_by_id 1
assert_nil DmsfLink.find_by_id 2
end
def test_target_folder_id
assert_equal 2, @file_link.target_folder_id
@ -147,61 +149,74 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
assert_equal @folder_link.name, @folder_link.title
end
def test_find_link_by_file_name
# TODO: Doesn't work in Travis - a problem with bolean visiblity
#assert_equal @file_link,
# DmsfLink.find_link_by_file_name(@file_link.project, @file_link.folder, @file_link.target_file.name)
def test_find_link_by_file_name
file_link = DmsfLink.find_link_by_file_name(@file_link.project,
@file_link.folder, @file_link.target_file.name)
assert file_link, 'File link not found by its name'
end
def test_path
assert_equal 'folder1/folder2/test.txt', @file_link.path
assert_equal 'folder1', @folder_link.path
end
# TODO: Not working in Travis
# def test_copy_to
# # File link
# file_link_copy = @file_link.copy_to @folder2.project, @folder2
# assert_not_nil file_link_copy
# assert_equal file_link_copy.target_project_id, @file_link.target_project_id
# assert_equal file_link_copy.target_id, @file_link.target_id
# assert_equal file_link_copy.target_type, @file_link.target_type
# assert_equal file_link_copy.name, @file_link.name
# assert_equal file_link_copy.project_id, @folder2.project.id
# assert_equal file_link_copy.dmsf_folder_id, @folder2.id
#
# # Folder link
# folder_link_copy = @folder_link.copy_to @folder2.project, @folder2
# assert_not_nil folder_link_copy
# assert_equal folder_link_copy.target_project_id, @folder_link.target_project_id
# assert_equal folder_link_copy.target_id, @folder_link.target_id
# assert_equal folder_link_copy.target_type, @folder_link.target_type
# assert_equal folder_link_copy.name, @folder_link.name
# assert_equal folder_link_copy.project_id, @folder2.project.id
# assert_equal folder_link_copy.dmsf_folder_id, @folder2.id
# end
def test_delete_restore
# File link
@file_link.delete false
assert @file_link.deleted
@file_link.restore
assert !@file_link.deleted
def test_file_kink_copy_to
file_link_copy = @file_link.copy_to @folder2.project, @folder2
assert_not_nil file_link_copy, 'File link copying failed'
assert_equal file_link_copy.target_project_id, @file_link.target_project_id
assert_equal file_link_copy.target_id, @file_link.target_id
assert_equal file_link_copy.target_type, @file_link.target_type
assert_equal file_link_copy.name, @file_link.name
assert_equal file_link_copy.project_id, @folder2.project.id
assert_equal file_link_copy.dmsf_folder_id, @folder2.id
end
# Folder link
@folder_link.delete false
assert @folder_link.deleted
@folder_link.restore
assert !@folder_link.deleted
end
def test_folder_link_copy_to
folder_link_copy = @folder_link.copy_to @folder2.project, @folder2
assert_not_nil folder_link_copy, 'Folder link copying failed'
assert_equal folder_link_copy.target_project_id,
@folder_link.target_project_id
assert_equal folder_link_copy.target_id, @folder_link.target_id
assert_equal folder_link_copy.target_type, @folder_link.target_type
assert_equal folder_link_copy.name, @folder_link.name
assert_equal folder_link_copy.project_id, @folder2.project.id
assert_equal folder_link_copy.dmsf_folder_id, @folder2.id
end
def test_destroy
# File link
@file_link.delete true
def test_delete_file_link
assert @file_link.delete(false), @file_link.errors.full_messages.to_sentence
assert @file_link.deleted, "File link hasn't been deleted"
end
def test_restore_file_link
assert @file_link.delete(false), @file_link.errors.full_messages.to_sentence
assert @file_link.deleted, "File link hasn't been deleted"
assert @file_link.restore, @file_link.errors.full_messages.to_sentence
assert !@file_link.deleted, "File link hasn't been restored"
end
def test_delete_folder_link
assert @folder_link.delete(false),
@folder_link.errors.full_messages.to_sentence
assert @folder_link.deleted, "Folder link hasn't been deleted"
end
def test_restore_folder_link
assert @folder_link.delete(false),
@folder_link.errors.full_messages.to_sentence
assert @folder_link.deleted, "Folder link hasn't been deleted"
assert @folder_link.restore, @folder_link.errors.full_messages.to_sentence
assert !@folder_link.deleted, "Folder link hasn't been restored"
end
def test_destroy_file_link
assert @file_link.delete(true), @file_link.errors.full_messages.to_sentence
assert_nil DmsfLink.find_by_id @file_link.id
end
# Folder link
@folder_link.delete true
def test_destroy_folder_link
assert @folder_link.delete(true),
@folder_link.errors.full_messages.to_sentence
assert_nil DmsfLink.find_by_id @folder_link.id
end

View File

@ -1,7 +1,9 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -20,131 +22,95 @@
require File.expand_path('../../test_helper.rb', __FILE__)
class DmsfLockTest < RedmineDmsf::Test::UnitTest
attr_reader :lock
fixtures :projects, :users, :dmsf_folders, :dmsf_files, :dmsf_file_revisions,
:roles, :members, :member_roles, :enabled_modules, :enumerations,
:dmsf_locks
#attr_reader :lock
fixtures :projects, :users, :email_addresses, :dmsf_folders, :dmsf_files,
:dmsf_file_revisions, :roles, :members, :member_roles, :enabled_modules,
:enumerations, :dmsf_locks
def setup
@lock = dmsf_locks(:dmsf_locks_001)
@folder2 = dmsf_folders(:dmsf_folders_002)
@file4 = dmsf_files(:dmsf_files_004)
@jsmith = User.find_by_id 2
@admin = User.find_by_id 1
end
test "lock data is created" do
assert_not_nil(lock)
def test_truth
assert_kind_of DmsfLock, @lock
assert_kind_of DmsfFile, @file4
assert_kind_of DmsfFolder, @folder2
assert_kind_of User, @jsmith
assert_kind_of User, @admin
end
# TODO: Not working in Travis
# test "lock_type is enumerable" do
# assert DmsfLock.respond_to?(:lock_types) #lock_types is a method created by as_enum
# assert DmsfLock.lock_types.is_a?(Hash)
# end
#
# test "lock_scope is enumerable" do
# assert DmsfLock.respond_to?(:lock_scopes) #lock_types is a method created by as_enum
# assert DmsfLock.lock_scopes.is_a?(Hash)
# end
#
# test "lock_type does not accept invalid values" do
# assert lock.lock_type = :type_write
# assert_raise ArgumentError do
# assert lock.lock_type = :write
# end
# end
test "lock_type accepts a valid answer" do
assert_nothing_raised ArgumentError do
lock.lock_type = :type_write
assert lock.lock_type == :type_write
end
def test_lock_type_is_enumerable
assert DmsfLock.respond_to?(:lock_types),
"DmsfLock class hasn't got lock_types method"
assert DmsfLock.lock_types.is_a?(SimpleEnum::Enum),
'DmsfLock class is not enumerable'
end
# TODO: Not working in Travis
# test "lock_scope does not accept invalid values" do
# assert lock.lock_scope = :scope_exclusive
# assert_raise ArgumentError do
# assert lock.lock_scope = :write
# end
# end
test "lock_scope accepts a valid answer" do
assert_nothing_raised ArgumentError do
lock.lock_scope = :scope_shared
assert lock.lock_scope == :scope_shared
end
def test_lock_scope_is_enumerable
assert DmsfLock.respond_to?(:lock_scopes),
"DmsfLock class hasn't got lock_scopes method"
assert DmsfLock.lock_scopes.is_a?(SimpleEnum::Enum),
'DmsfLock class is not enumerable'
end
test "linked to either file or folder" do
assert !(lock.file.nil? && lock.folder.nil?)
assert !lock.file.nil? || !lock.folder.nil?
if !lock.file.nil?
assert lock.file.is_a?(DmsfFile)
def test_linked_to_either_file_or_folder
assert_not_nil @lock.file || @lock.folder
if @lock.file
assert_kind_of DmsfFile, @lock.file
else
assert lock.file.is_a?(DmsfFolder)
assert_kind_of DmsfFolder @lock.folder
end
end
test "locked folder reports un-locked child file as locked" do
#folder id 2 is locked by fixture
#files 4 and 5 are file resources within locked folder (declared by fixture)
folder = dmsf_folders(:dmsf_folders_002)
file = dmsf_files(:dmsf_files_004)
assert folder.locked?, "Folder (2) should be locked by fixture"
assert_equal 1, folder.lock.count #Check the folder lists 1 lock
assert file.locked?, "File (4) sits within Folder(2) and should be locked"
assert_equal 1, file.lock.count #Check the file lists 1 lock
assert_equal 0, file.lock(false).count #Check the file does not list any entries for itself
def test_locked_folder_reports_un_locked_child_file_as_locked
assert @folder2.locked?,
"Folder #{@folder2.title} should be locked by fixture"
assert_equal 1, @folder2.lock.count # Check the folder lists 1 lock
assert @file4.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 0, @file4.lock(false).count # Check the file does not list any entries for itself
end
def test_locked_folder_cannot_be_unlocked_by_someone_without_rights_or_anon
assert_no_difference ('@folder2.lock.count') do
assert_raise DmsfLockError do
@folder2.unlock!
end
end
User.current = @jsmith
assert_no_difference ('@folder2.lock.count') do
assert_raise DmsfLockError do
@folder2.unlock!
end
end
end
# TODO: Not working in Travis
# test "locked folder cannot be unlocked by someone without rights (or anon)" do
# folder = dmsf_folders(:dmsf_folders_002)
# assert_no_difference ('folder.lock.count') do
# assert_raise DmsfLockError do
# folder.unlock!
# end
# end
#
# User.current = users(:users_002)
# assert_no_difference ('folder.lock.count') do
# assert_raise DmsfLockError do
# folder.unlock!
# end
# end
# end
test "locked folder can be unlocked by permission :force_file_unlock" do
User.current = users(:users_001)
folder = dmsf_folders(:dmsf_folders_002)
assert_difference('folder.lock.count', -1) do
def test_locked_folder_can_be_unlocked_by_permission
User.current = @admin
assert_difference('@folder2.lock.count', -1) do
assert_nothing_raised do
folder.unlock!
@folder2.unlock!
end
end
User.current = users(:users_002)
assert_difference('folder.lock.count') do
User.current = @jsmith
assert_difference('@folder2.lock.count') do
assert_nothing_raised do
folder.lock!
@folder2.lock!
end
end
User.current = users(:users_001)
assert_difference('folder.lock.count', -1) do
User.current = @admin
assert_difference('@folder2.lock.count', -1) do
assert_nothing_raised do
folder.unlock!
@folder2.unlock!
end
end
#We need to re-establish locks for other test
folder.lock!
end
@folder2.lock!
User.current = nil
end
end
end

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2013 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 Karel Picman <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
@ -21,8 +23,7 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWorkflowStepActionTest < RedmineDmsf::Test::UnitTest
include Redmine::I18n
fixtures :dmsf_workflow_steps
fixtures :dmsf_workflow_step_actions
fixtures :dmsf_workflow_steps, :dmsf_workflow_step_actions
def setup
@wfsac1 = DmsfWorkflowStepAction.find(1)
@ -37,11 +38,11 @@ class DmsfWorkflowStepActionTest < RedmineDmsf::Test::UnitTest
end
def test_create
wfsac = DmsfWorkflowStepAction.new(
:dmsf_workflow_step_assignment_id => 1,
:action => DmsfWorkflowStepAction::ACTION_DELEGATE,
:note => 'Approval')
assert wfsac.save
wfsac = DmsfWorkflowStepAction.new
wfsac.dmsf_workflow_step_assignment_id = 1
wfsac.action = DmsfWorkflowStepAction::ACTION_DELEGATE
wfsac.note = 'Approval'
assert wfsac.save, wfsac.errors.full_messages.to_sentence
wfsac.reload
assert wfsac.created_at
end
@ -49,11 +50,9 @@ class DmsfWorkflowStepActionTest < RedmineDmsf::Test::UnitTest
def test_update
@wfsac1.dmsf_workflow_step_assignment_id = 2
@wfsac1.action = DmsfWorkflowStepAction::ACTION_REJECT
@wfsac1.note = 'Rejection'
assert @wfsac1.save
@wfsac1.reload
@wfsac1.note = 'Rejection'
assert @wfsac1.save, !@wfsac1.errors.full_messages.to_sentence
@wfsac1.reload
assert_equal 2, @wfsac1.dmsf_workflow_step_assignment_id
assert_equal DmsfWorkflowStepAction::ACTION_REJECT, @wfsac1.action
assert_equal 'Rejection', @wfsac1.note
@ -61,7 +60,7 @@ class DmsfWorkflowStepActionTest < RedmineDmsf::Test::UnitTest
def test_validate_workflow_step_assignment_id_presence
@wfsac1.dmsf_workflow_step_assignment_id = nil
assert !@wfsac1.save
assert !@wfsac1.save, @wfsac1.errors.full_messages.to_sentence
assert_equal 1, @wfsac1.errors.count
end
@ -83,10 +82,10 @@ class DmsfWorkflowStepActionTest < RedmineDmsf::Test::UnitTest
assert !@wfsac1.save
assert_equal 1, @wfsac1.errors.count
@wfsac1.note = 'Delegated because'
assert @wfsac1.save
assert @wfsac1.save, @wfsac1.errors.full_messages.to_sentence
@wfsac1.note = ''
@wfsac1.action = DmsfWorkflowStepAction::ACTION_APPROVE
assert @wfsac1.save
assert @wfsac1.save, @wfsac1.errors.full_messages.to_sentence
end
def test_validate_author_id
@ -102,7 +101,7 @@ class DmsfWorkflowStepActionTest < RedmineDmsf::Test::UnitTest
assert_equal 1, @wfsac2.errors.count
@wfsac1.action = DmsfWorkflowStepAction::ACTION_REJECT
@wfsac2.action = @wfsac1.action;
assert @wfsac1.save
assert @wfsac1.save, @wfsac1.errors.full_messages.to_sentence
assert !@wfsac2.save
assert_equal 1, @wfsac2.errors.count
@wfsac1.action = DmsfWorkflowStepAction::ACTION_DELEGATE

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2013 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -20,7 +22,8 @@ require File.expand_path('../../test_helper', __FILE__)
class WorkflowStepAssignmentTest < RedmineDmsf::Test::UnitTest
fixtures :users, :dmsf_file_revisions, :dmsf_workflow_steps, :dmsf_workflow_step_assignments
fixtures :users, :email_addresses, :dmsf_file_revisions, :dmsf_workflow_steps,
:dmsf_workflow_step_assignments
def setup
@wfsa1 = DmsfWorkflowStepAssignment.find(1)
@ -29,24 +32,23 @@ class WorkflowStepAssignmentTest < RedmineDmsf::Test::UnitTest
def test_truth
assert_kind_of DmsfWorkflowStepAssignment, @wfsa1
assert_kind_of DmsfWorkflowStepAssignment, @wfsa2
end
def test_create
wfsa = DmsfWorkflowStepAssignment.new(
:dmsf_workflow_step_id => 5,
:user_id => 2,
:dmsf_file_revision_id => 2)
assert wfsa.save
wfsa = DmsfWorkflowStepAssignment.new
wfsa.dmsf_workflow_step_id = 5
wfsa.user_id = 2
wfsa.dmsf_file_revision_id = 2
assert wfsa.save, wfsa.errors.full_messages.to_sentence
end
def test_update
@wfsa1.dmsf_workflow_step_id = 5
@wfsa1.user_id = 2
@wfsa1.dmsf_file_revision_id = 2
assert @wfsa1.save
@wfsa1.reload
@wfsa1.dmsf_file_revision_id = 2
assert @wfsa1.save, @wfsa1.errors.full_messages.to_sentence
@wfsa1.reload
assert_equal 5, @wfsa1.dmsf_workflow_step_id
assert_equal 2, @wfsa1.user_id
assert_equal 2, @wfsa1.dmsf_file_revision_id
@ -76,4 +78,5 @@ class WorkflowStepAssignmentTest < RedmineDmsf::Test::UnitTest
assert_nil DmsfWorkflowStepAssignment.find_by_id(1)
assert_nil DmsfWorkflowStepAction.find_by_id(1)
end
end
end

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2013 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 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
@ -21,7 +23,8 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWorkflowStepTest < RedmineDmsf::Test::UnitTest
include Redmine::I18n
fixtures :users, :dmsf_workflows, :dmsf_workflow_steps
fixtures :users, :email_addresses, :dmsf_workflows, :dmsf_workflow_steps,
:dmsf_file_revisions
def setup
@wfs1 = DmsfWorkflowStep.find(1)
@ -32,6 +35,9 @@ class DmsfWorkflowStepTest < RedmineDmsf::Test::UnitTest
def test_truth
assert_kind_of DmsfWorkflowStep, @wfs1
assert_kind_of DmsfWorkflowStep, @wfs2
assert_kind_of DmsfWorkflowStep, @wfs5
assert_kind_of DmsfFileRevision, @revision1
end
def test_create
@ -40,18 +46,16 @@ class DmsfWorkflowStepTest < RedmineDmsf::Test::UnitTest
wfs.step = 2
wfs.user_id = 3
wfs.operator = 1
assert wfs.save
assert wfs.save, wfs.errors.full_messages.to_sentence
end
def test_update
@wfs1.dmsf_workflow_id = 2
@wfs1.step = 2
@wfs1.user_id = 2
@wfs1.operator = 2
assert @wfs1.save
@wfs1.reload
@wfs1.operator = 2
assert @wfs1.save, @wfs1.errors.full_messages.to_sentence
@wfs1.reload
assert_equal 2, @wfs1.dmsf_workflow_id
assert_equal 2, @wfs1.step
assert_equal 2, @wfs1.user_id
@ -111,4 +115,5 @@ class DmsfWorkflowStepTest < RedmineDmsf::Test::UnitTest
:dmsf_workflow_step_id => @wfs5.id,
:dmsf_file_revision_id => @revision1.id).first
end
end
end

View File

@ -1,6 +1,8 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2013 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 Karel Picman <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
@ -20,12 +22,11 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfWorkflowTest < RedmineDmsf::Test::UnitTest
fixtures :projects, :members, :dmsf_files, :dmsf_file_revisions,
:dmsf_workflows, :dmsf_workflow_steps, :dmsf_workflow_step_assignments,
:dmsf_workflow_step_actions
fixtures :users, :email_addresses, :projects, :members, :dmsf_files,
:dmsf_file_revisions, :dmsf_workflows, :dmsf_workflow_steps,
:dmsf_workflow_step_assignments, :dmsf_workflow_step_actions
def setup
User.current = User.find_by_id 1 # Admin
def setup
@wf1 = DmsfWorkflow.find_by_id(1)
@wf2 = DmsfWorkflow.find_by_id(2)
@wfs1 = DmsfWorkflowStep.find_by_id(1)
@ -60,13 +61,13 @@ class DmsfWorkflowTest < RedmineDmsf::Test::UnitTest
def test_create
workflow = DmsfWorkflow.new
workflow.name = 'wf'
assert workflow.save
assert workflow.save, workflow.errors.full_messages.to_sentence
end
def test_update
@wf1.name = 'wf1a'
@wf1.project_id = 5
assert @wf1.save
assert @wf1.save, @wf1.errors.full_messages.to_sentence
@wf1.reload
assert_equal 'wf1a', @wf1.name
assert_equal 5, @wf1.project_id
@ -208,4 +209,5 @@ class DmsfWorkflowTest < RedmineDmsf::Test::UnitTest
participiants = @wf1.participiants
assert_equal participiants.count, 2
end
end

View File

@ -1,16 +0,0 @@
# To change this license header, choose License Headers in Project Properties.
# To change this template file, choose Tools | Templates
# and open the template in the editor.
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
require 'test/unit'
require 'dmsf_file'
class TestDmsfFile < Test::Unit::TestCase
def test_foo
#TODO: Write test
flunk "TODO: Write test"
# assert_equal("foo", bar)
end
end