Validation
This commit is contained in:
parent
a3d227796c
commit
a5ab3ed8fd
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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?
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
71
test/fixtures/dmsf_folders.yml
vendored
71
test/fixtures/dmsf_folders.yml
vendored
@ -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
|
||||
2
test/fixtures/dmsf_locks.yml
vendored
2
test/fixtures/dmsf_locks.yml
vendored
@ -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
|
||||
@ -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],
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
Loading…
x
Reference in New Issue
Block a user