diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index f6bd21c7..cd5c48d8 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -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 diff --git a/app/models/dmsf_lock.rb b/app/models/dmsf_lock.rb index 74d68372..e1873c7d 100644 --- a/app/models/dmsf_lock.rb +++ b/app/models/dmsf_lock.rb @@ -4,7 +4,7 @@ # # Copyright (C) 2011 Vít Jonáš # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-15 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/redmine_dmsf/lockable.rb b/lib/redmine_dmsf/lockable.rb index 1c47d0f0..a2433b3f 100644 --- a/lib/redmine_dmsf/lockable.rb +++ b/lib/redmine_dmsf/lockable.rb @@ -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? diff --git a/lib/redmine_dmsf/test/integration_test.rb b/lib/redmine_dmsf/test/integration_test.rb index ef30cfae..23ed1277 100644 --- a/lib/redmine_dmsf/test/integration_test.rb +++ b/lib/redmine_dmsf/test/integration_test.rb @@ -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áš # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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 diff --git a/lib/redmine_dmsf/webdav/base_resource.rb b/lib/redmine_dmsf/webdav/base_resource.rb index f50bd9f2..a5a28651 100644 --- a/lib/redmine_dmsf/webdav/base_resource.rb +++ b/lib/redmine_dmsf/webdav/base_resource.rb @@ -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 diff --git a/lib/redmine_dmsf/webdav/controller.rb b/lib/redmine_dmsf/webdav/controller.rb index a70ea0ec..3a6deb1f 100644 --- a/lib/redmine_dmsf/webdav/controller.rb +++ b/lib/redmine_dmsf/webdav/controller.rb @@ -3,7 +3,7 @@ # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-15 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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 diff --git a/lib/redmine_dmsf/webdav/dmsf_resource.rb b/lib/redmine_dmsf/webdav/dmsf_resource.rb index e1d8f1e3..1e107b28 100644 --- a/lib/redmine_dmsf/webdav/dmsf_resource.rb +++ b/lib/redmine_dmsf/webdav/dmsf_resource.rb @@ -3,7 +3,7 @@ # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-15 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/lib/redmine_dmsf/webdav/resource_proxy.rb b/lib/redmine_dmsf/webdav/resource_proxy.rb index 1742c8a3..fa1f446f 100644 --- a/lib/redmine_dmsf/webdav/resource_proxy.rb +++ b/lib/redmine_dmsf/webdav/resource_proxy.rb @@ -3,7 +3,7 @@ # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-15 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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 diff --git a/test/ci/redmine_install.sh b/test/ci/redmine_install.sh index b2943e54..203e56f1 100644 --- a/test/ci/redmine_install.sh +++ b/test/ci/redmine_install.sh @@ -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() diff --git a/test/fixtures/dmsf_folders.yml b/test/fixtures/dmsf_folders.yml index 367f4e76..9871ea4a 100644 --- a/test/fixtures/dmsf_folders.yml +++ b/test/fixtures/dmsf_folders.yml @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/test/fixtures/dmsf_locks.yml b/test/fixtures/dmsf_locks.yml index ae4e7715..cc9595a7 100644 --- a/test/fixtures/dmsf_locks.yml +++ b/test/fixtures/dmsf_locks.yml @@ -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 \ No newline at end of file diff --git a/test/functional/dmsf_controller_test.rb b/test/functional/dmsf_controller_test.rb index 8fc0f797..ad21abb7 100644 --- a/test/functional/dmsf_controller_test.rb +++ b/test/functional/dmsf_controller_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-14 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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], diff --git a/test/functional/dmsf_files_controller_test.rb b/test/functional/dmsf_files_controller_test.rb index 637d63ae..dc2c2620 100644 --- a/test/functional/dmsf_files_controller_test.rb +++ b/test/functional/dmsf_files_controller_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-14 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/functional/dmsf_links_controller_test.rb b/test/functional/dmsf_links_controller_test.rb index e68bb94d..1f92864f 100644 --- a/test/functional/dmsf_links_controller_test.rb +++ b/test/functional/dmsf_links_controller_test.rb @@ -2,7 +2,7 @@ # # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-15 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/functional/dmsf_state_controller_test.rb b/test/functional/dmsf_state_controller_test.rb index af4c5ab7..b2073c7a 100644 --- a/test/functional/dmsf_state_controller_test.rb +++ b/test/functional/dmsf_state_controller_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-14 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/functional/dmsf_workflow_controller_test.rb b/test/functional/dmsf_workflow_controller_test.rb index e919899a..0564d1ee 100644 --- a/test/functional/dmsf_workflow_controller_test.rb +++ b/test/functional/dmsf_workflow_controller_test.rb @@ -2,7 +2,7 @@ # # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-15 Karel Pičman +# Copyright (C) 2011-16 Karel Pičman # # 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 diff --git a/test/functional/my_controller_test.rb b/test/functional/my_controller_test.rb index 76492a0e..7d7e1d5c 100644 --- a/test/functional/my_controller_test.rb +++ b/test/functional/my_controller_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2013 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/integration/dmsf_webdav_delete_test.rb b/test/integration/dmsf_webdav_delete_test.rb index 8f96a71a..ce4da8d4 100644 --- a/test/integration/dmsf_webdav_delete_test.rb +++ b/test/integration/dmsf_webdav_delete_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/integration/dmsf_webdav_get_test.rb b/test/integration/dmsf_webdav_get_test.rb index ba20da09..a3ad1353 100644 --- a/test/integration/dmsf_webdav_get_test.rb +++ b/test/integration/dmsf_webdav_get_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/integration/dmsf_webdav_head_test.rb b/test/integration/dmsf_webdav_head_test.rb index d8252081..676867ea 100644 --- a/test/integration/dmsf_webdav_head_test.rb +++ b/test/integration/dmsf_webdav_head_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/integration/dmsf_webdav_mkcol_test.rb b/test/integration/dmsf_webdav_mkcol_test.rb index cb45db0d..8c14620c 100644 --- a/test/integration/dmsf_webdav_mkcol_test.rb +++ b/test/integration/dmsf_webdav_mkcol_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/integration/dmsf_webdav_options_test.rb b/test/integration/dmsf_webdav_options_test.rb index 407cd87f..d13a5a10 100644 --- a/test/integration/dmsf_webdav_options_test.rb +++ b/test/integration/dmsf_webdav_options_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 diff --git a/test/integration/dmsf_webdav_post_test.rb b/test/integration/dmsf_webdav_post_test.rb index cf20662f..89b46c4d 100644 --- a/test/integration/dmsf_webdav_post_test.rb +++ b/test/integration/dmsf_webdav_post_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/integration/dmsf_webdav_put_test.rb b/test/integration/dmsf_webdav_put_test.rb index f68eef2e..2ddc10df 100644 --- a/test/integration/dmsf_webdav_put_test.rb +++ b/test/integration/dmsf_webdav_put_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/unit/dmsf_file_revision_test.rb b/test/unit/dmsf_file_revision_test.rb index 5405e60c..61bdead4 100644 --- a/test/unit/dmsf_file_revision_test.rb +++ b/test/unit/dmsf_file_revision_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 diff --git a/test/unit/dmsf_file_test.rb b/test/unit/dmsf_file_test.rb index 2b61245f..9ffdf3ee 100644 --- a/test/unit/dmsf_file_test.rb +++ b/test/unit/dmsf_file_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 " + def test_project_dmsf_file_listing_contains_deleted_items + assert @project1.dmsf_files.index{ |f| f.deleted }, + 'Expected at least one deleted item in ' 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 \ No newline at end of file diff --git a/test/unit/dmsf_folder_test.rb b/test/unit/dmsf_folder_test.rb index f8fce632..8116a6a8 100644 --- a/test/unit/dmsf_folder_test.rb +++ b/test/unit/dmsf_folder_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/unit/dmsf_links_test.rb b/test/unit/dmsf_links_test.rb index d6245ccf..66b41a48 100644 --- a/test/unit/dmsf_links_test.rb +++ b/test/unit/dmsf_links_test.rb @@ -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 diff --git a/test/unit/dmsf_lock_test.rb b/test/unit/dmsf_lock_test.rb index dedc9aa4..211f97c6 100644 --- a/test/unit/dmsf_lock_test.rb +++ b/test/unit/dmsf_lock_test.rb @@ -1,7 +1,9 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2012 Daniel Munn -# Copyright (C) 2011-14 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/unit/dmsf_workflow_step_action_test.rb b/test/unit/dmsf_workflow_step_action_test.rb index 4fbb7a2a..06b122db 100644 --- a/test/unit/dmsf_workflow_step_action_test.rb +++ b/test/unit/dmsf_workflow_step_action_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2013 Karel Picman +# Copyright (C) 2011-16 Karel Picman # # 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 diff --git a/test/unit/dmsf_workflow_step_assignment_test.rb b/test/unit/dmsf_workflow_step_assignment_test.rb index 623a4c80..573b3240 100644 --- a/test/unit/dmsf_workflow_step_assignment_test.rb +++ b/test/unit/dmsf_workflow_step_assignment_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2013 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/unit/dmsf_workflow_step_test.rb b/test/unit/dmsf_workflow_step_test.rb index a9eba1a6..2cb9e105 100644 --- a/test/unit/dmsf_workflow_step_test.rb +++ b/test/unit/dmsf_workflow_step_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2013 Karel Picman +# Copyright (C) 2011-16 Karel Pičman # # 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 \ No newline at end of file diff --git a/test/unit/dmsf_workflow_test.rb b/test/unit/dmsf_workflow_test.rb index 1e2bf580..a56b7e71 100644 --- a/test/unit/dmsf_workflow_test.rb +++ b/test/unit/dmsf_workflow_test.rb @@ -1,6 +1,8 @@ +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2013 Karel Picman +# Copyright (C) 2011-16 Karel Picman # # 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 diff --git a/test/unit/test_dmsf_file.rb b/test/unit/test_dmsf_file.rb deleted file mode 100644 index fb21991e..00000000 --- a/test/unit/test_dmsf_file.rb +++ /dev/null @@ -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