Redmine 5.1

This commit is contained in:
Karel Pičman 2023-11-15 11:59:56 +01:00
parent 4b37284140
commit 81447e04f9
39 changed files with 595 additions and 429 deletions

View File

@ -84,7 +84,7 @@ jobs:
sudo apt-get install -y litmus libreoffice
- name: Clone Redmine
# Get the latest stable Redmine
run: svn export http://svn.redmine.org/redmine/branches/5.0-stable/ /opt/redmine
run: svn export http://svn.redmine.org/redmine/branches/5.1-stable/ /opt/redmine
- name: Checkout code
uses: actions/checkout@v3
- name: Link the plugin
@ -95,7 +95,7 @@ jobs:
uses: ruby/setup-ruby@0a29871fe2b0200a17a4497bae54fe5df0d973aa # v1.115.3
with:
bundler-cache: true
ruby-version: '3.0'
ruby-version: '3.1'
- name: Setup database
# Create the database
run: |

View File

@ -17,7 +17,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
AllCops:
TargetRubyVersion: 2.7
TargetRubyVersion: 3.1
TargetRailsVersion: 6.1
SuggestExtensions: false
@ -41,6 +41,9 @@ Lint/ScriptPermission:
Exclude:
- extra/xapian_indexer.rb
Naming/BlockForwarding:
EnforcedStyle: explicit
Metrics/AbcSize:
Enabled: false
@ -72,6 +75,17 @@ Naming/AccessorMethodName:
Exclude:
- lib/dav4rack/resource.rb
Style/HashSyntax:
EnforcedShorthandSyntax: either
Style/ZeroLengthPredicate:
Exclude:
- lib/redmine_dmsf/webdav/dmsf_resource.rb
Rails/DangerousColumnNames:
Exclude:
- db/migrate/20170330131901_create_dmsf_folder_permissions.rb
Rails/DynamicFindBy:
AllowedMethods:
- find_by_token

View File

@ -45,7 +45,7 @@ Features
Dependencies
------------
* Redmine 5.0.0 or higher
* Redmine 5..0 or higher
### Full-text search (optional)

View File

@ -512,8 +512,6 @@ class DmsfController < ApplicationController
}
@back_url = params[:back_url]
render action: 'email_entries'
rescue StandardError
raise
ensure
zip&.close
end
@ -541,8 +539,6 @@ class DmsfController < ApplicationController
type: 'application/zip',
disposition: 'attachment'
)
rescue StandardError
raise
ensure
zip&.close
end

View File

@ -275,10 +275,6 @@ class DmsfWorkflowsController < ApplicationController
end
end
def edit
redirect_to dmsf_workflow_path(@dmsf_workflow)
end
def new
@dmsf_workflow = DmsfWorkflow.new
# Reload
@ -291,6 +287,10 @@ class DmsfWorkflowsController < ApplicationController
render layout: !request.xhr?
end
def edit
redirect_to dmsf_workflow_path(@dmsf_workflow)
end
def create
if params[:dmsf_workflow]
if params[:dmsf_workflow][:id].to_i.positive?
@ -399,7 +399,7 @@ class DmsfWorkflowsController < ApplicationController
def remove_step
if request.delete?
DmsfWorkflowStep.where(dmsf_workflow_id: @dmsf_workflow.id, step: params[:step]).find_each do |ws|
@dmsf_workflow.dmsf_workflow_steps.delete(ws)
@dmsf_workflow.dmsf_workflow_steps.delete ws
end
@dmsf_workflow.dmsf_workflow_steps.each do |ws|
n = ws.step.to_i

View File

@ -37,7 +37,7 @@ module DmsfHelper
def self.temp_filename(filename)
filename = sanitize_filename(filename)
timestamp = DateTime.current.strftime('%y%m%d%H%M%S')
timestamp.succ! while File.exist?(Rails.root.join("tmp/#{timestamp}_#{filename}"))
timestamp.succ! while Rails.root.join("tmp/#{timestamp}_#{filename}").exist?
"#{timestamp}_#{filename}"
end
@ -47,7 +47,7 @@ module DmsfHelper
# Replace all non alphanumeric, hyphens or periods with underscore
just_filename.gsub!(/[^\w.\-]/, '_')
# Keep the extension if any
if !(/^[a-zA-Z0-9_.\-]*$/).match?(just_filename) && just_filename =~ /(.[a-zA-Z0-9]+)$/
if !/^[a-zA-Z0-9_.\-]*$/.match?(just_filename) && just_filename =~ /(.[a-zA-Z0-9]+)$/
extension = Regexp.last_match(1)
just_filename = Digest::SHA256.hexdigest(just_filename) << extension
end

View File

@ -156,7 +156,7 @@ module DmsfUploadHelper
end
if failed_uploads.present? && controller
controller.flash[:warning] = l(:warning_some_files_were_not_committed,
files: failed_uploads.map { |u| u['name'] }.join(', '))
files: failed_uploads.pluck(:name).join(', '))
end
[files, failed_uploads]
end

View File

@ -62,7 +62,7 @@ module DmsfWorkflowsHelper
def dmsf_workflows_for_select(project, dmsf_workflow_id)
options = [['', -1]]
DmsfWorkflow.active.sorted.where(['project_id = ? OR project_id IS NULL', project.id]).each do |wf|
DmsfWorkflow.active.sorted.where(['project_id = ? OR project_id IS NULL', project.id]).find_each do |wf|
options << if wf.project_id
[wf.name, wf.id]
else
@ -74,7 +74,7 @@ module DmsfWorkflowsHelper
def dmsf_all_workflows_for_select(dmsf_workflow_id)
options = [['', 0]]
DmsfWorkflow.active.sorted.all.each do |wf|
DmsfWorkflow.active.sorted.find_each do |wf|
if wf.project_id
prj = Project.find_by(id: wf.project_id)
if User.current.allowed_to?(:manage_workflows, prj)

View File

@ -194,7 +194,7 @@ class DmsfFile < ApplicationRecord
end
def workflow
last_revision ? last_revision.workflow : nil
last_revision&.workflow
end
def size
@ -430,8 +430,8 @@ class DmsfFile < ApplicationRecord
dmsf_attrs = filename.scan(%r{^([^/]+/[^_]+)_(\d+)_(.*)$})
id_attribute = 0
id_attribute = dmsf_attrs[0][1] if dmsf_attrs.length.positive?
next if dmsf_attrs.length.zero? || id_attribute.to_i.zero?
next unless results.select { |f| f.id.to_s == id_attribute }.empty?
next if dmsf_attrs.empty? || id_attribute.to_i.zero?
next unless results.none? { |f| f.id.to_s == id_attribute }
dmsf_file = DmsfFile.visible.where(limit_options).find_by(id: id_attribute)

View File

@ -177,7 +177,7 @@ class DmsfFileRevision < ApplicationRecord
def disk_file(search_if_not_exists: true)
path = storage_base_path
begin
FileUtils.mkdir_p(path) unless File.exist?(path)
FileUtils.mkdir_p(path)
rescue StandardError => e
Rails.logger.error e.message
end

View File

@ -124,13 +124,13 @@ class DmsfFolder < ApplicationRecord
if folder.dmsf_folder_permissions.any?
role_ids = User.current.roles_for_project(folder.project).map(&:id)
role_permission_ids = folder.dmsf_folder_permissions.roles.map(&:object_id)
return true if (role_ids & role_permission_ids).any?
return true if role_ids.intersect?(role_permission_ids)
principal_ids = folder.dmsf_folder_permissions.users.map(&:object_id)
return true if principal_ids.include?(User.current.id)
user_group_ids = User.current.groups.map(&:id)
(principal_ids & user_group_ids).any?
principal_ids.intersect?(user_group_ids)
else
DmsfFolder.permissions? folder.dmsf_folder, allow_system: allow_system, file: file
end
@ -511,7 +511,7 @@ class DmsfFolder < ApplicationRecord
save
end
ALL_INVALID_CHARACTERS = /[#{INVALID_CHARACTERS}]/.freeze
ALL_INVALID_CHARACTERS = /[#{INVALID_CHARACTERS}]/
def self.get_valid_title(title)
# 1. Invalid characters are replaced with dots.
# 2. Two or more dots in a row are replaced with a single dot.

View File

@ -21,7 +21,7 @@
# File name validator
class DmsfFileNameValidator < ActiveModel::EachValidator
ALL_INVALID_CHARACTERS = /\A[^#{DmsfFolder::INVALID_CHARACTERS}]*\z/.freeze
ALL_INVALID_CHARACTERS = /\A[^#{DmsfFolder::INVALID_CHARACTERS}]*\z/
def validate_each(record, attribute, value)
record.errors.add attribute, :error_contains_invalid_character unless ALL_INVALID_CHARACTERS.match?(value)

View File

@ -69,7 +69,7 @@ class CreateHierarchy < ActiveRecord::Migration[4.2]
create_table :dmsf_user_prefs do |t|
t.references :project, null: false
t.references :user, null: false
t.boolean :email_notify
t.boolean :email_notify, null: false, default: false
t.timestamps
end
end

View File

@ -22,7 +22,7 @@
# Add column
class Dmsf090 < ActiveRecord::Migration[4.2]
def up
add_column :members, :dmsf_mail_notification, :boolean
add_column :members, :dmsf_mail_notification, :boolean, null: false, default: false
drop_table :dmsf_user_prefs
end
@ -31,7 +31,7 @@ class Dmsf090 < ActiveRecord::Migration[4.2]
create_table :dmsf_user_prefs do |t|
t.references :project, null: false
t.references :user, null: false
t.boolean :email_notify
t.boolean :email_notify, null: false, default: false
t.timestamps
end
end

View File

@ -24,6 +24,7 @@ require 'uuidtools'
# Locking
class Dmsf144 < ActiveRecord::Migration[4.2]
# File lock
class DmsfFileLock < ApplicationRecord
belongs_to :file, class_name: 'DmsfFile', foreign_key: 'dmsf_file_id'
belongs_to :user

View File

@ -22,6 +22,6 @@
class UpdateProjects < ActiveRecord::Migration[4.2]
def change
# DMSF - project's root folder notification
add_column :projects, :dmsf_notification, :boolean
add_column :projects, :dmsf_notification, :boolean, null: false, default: false
end
end

View File

@ -24,7 +24,7 @@ class ApprovalWorkflowStatus < ActiveRecord::Migration[4.2]
add_column :dmsf_workflows, :status, :integer,
null: false, default: DmsfWorkflow::STATUS_ACTIVE
DmsfWorkflow.reset_column_information
DmsfWorkflow.all.each { |wf| wf.update_attribute(:status, DmsfWorkflow::STATUS_ACTIVE) }
DmsfWorkflow.find_each { |wf| wf.update_attribute(:status, DmsfWorkflow::STATUS_ACTIVE) }
end
def down

View File

@ -28,7 +28,7 @@ class ApprovalWorkflowStdFields < ActiveRecord::Migration[4.2]
end
DmsfWorkflow.reset_column_information
# Set updated_on
DmsfWorkflow.all.each(&:touch)
DmsfWorkflow.find_each(&:touch)
# Set created_on and author_id
admin_ids = User.active.where(admin: true).limit(1).ids
DmsfWorkflow.update_all ['created_on = updated_on, author_id = ?', admin_ids.first]

View File

@ -21,6 +21,7 @@
# Add column
class AddDmsfNotInheritableToCustomFields < ActiveRecord::Migration[4.2]
def change
add_column :custom_fields, :dmsf_not_inheritable, :boolean, null: true
add_column :custom_fields, :dmsf_not_inheritable, :boolean,
null: false, default: false
end
end

View File

@ -38,7 +38,7 @@ class MigrateDocuments < ActiveRecord::Migration[4.2]
begin
FileUtils.mv origin, target, verbose: true
folder = storage_base_path(dmsf_file_revision)
Dir.rmdir(folder) if folder && (Dir.entries(folder).size == 2)
Dir.rmdir(folder) if folder && Dir.empty?(folder)
rescue StandardError => e
msg = "DmsfFileRevisions ID #{dmsf_file_revision.id}: #{e.message}"
say msg
@ -91,7 +91,7 @@ class MigrateDocuments < ActiveRecord::Migration[4.2]
begin
FileUtils.mv origin, target, verbose: true
folder = dmsf_file_revision.storage_base_path
Dir.rmdir(folder) if folder && (Dir.entries(folder).size == 2)
Dir.rmdir(folder) if folder && Dir.empty?(folder)
rescue StandardError => e
msg = "DmsfFileRevisions ID #{dmsf_file_revision.id}: #{e.message}"
say msg
@ -136,7 +136,7 @@ class MigrateDocuments < ActiveRecord::Migration[4.2]
def disk_file(dmsf_file_revision)
path = storage_base_path(dmsf_file_revision)
if path
FileUtils.mkdir_p(path) unless File.exist?(path)
FileUtils.mkdir_p(path)
return "#{path}/#{dmsf_file_revision.disk_filename}"
end
nil

View File

@ -63,7 +63,7 @@ module RedmineDmsf
options = []
if object&.project
files = object.project.dmsf_files.visible.to_a
DmsfFolder.visible(false).where(project_id: object.project.id).each do |f|
DmsfFolder.visible(false).where(project_id: object.project.id).find_each do |f|
files += f.dmsf_files.visible.to_a
end
files.sort! { |a, b| a.title.casecmp(b.title) }

View File

@ -100,8 +100,8 @@ module RedmineDmsf
links = get_links(context[:container])
return unless links.present? && Setting.thumbnails_enabled?
images = links.map { |x| x[0] }.select(&:image?)
return 'yes' if images.any?
images = links.pluck(0).select(&:image?)
'yes' if images.any?
end
def view_issues_edit_notes_bottom_style(context = {})
@ -142,7 +142,7 @@ module RedmineDmsf
links << [dmsf_file, dmsf_link, dmsf_link.created_at] if dmsf_file&.last_revision
end
# Sort by 'create_at'
links.sort! { |x, y| x[2] <=> y[2] }
links.sort_by! { |a| a[2] }
end
links
end

View File

@ -35,7 +35,7 @@ module RedmineDmsf
def copy(project, options = {})
super(project, options)
project = project.is_a?(Project) ? project : Project.find(project)
project = Project.find(project) unless project.is_a?(Project)
to_be_copied = %w[dmsf dmsf_folders approval_workflows]
to_be_copied &= Array.wrap(options[:only]) if options[:only]
if save

View File

@ -25,7 +25,7 @@ module RedmineDmsf
# Checking physical presence of the plugin as Redmine::Plugin.installed? may return false due to alphabetical
# registering of available plugins.
def self.present?(id)
Dir.exist? Rails.root.join('plugins', id.to_s)
Rails.root.join('plugins', id.to_s).exist?
end
# Return true if a plugin that overrides Redmine::Notifiable and use the deprecated method alias_method_chain is

View File

@ -32,10 +32,10 @@ module RedmineDmsf
DIR_FILE = %(
<tr>
<td class=\"name\"><a href=\"%s\">%s</a></td>
<td class=\"size\">%s</td>
<td class=\"type\">%s</td>
<td class=\"mtime\">%s</td>
<td class="name"><a href="%s">%s</a></td>
<td class="size">%s</td>
<td class="type">%s</td>
<td class="mtime">%s</td>
</tr>
)

View File

@ -204,7 +204,7 @@ module RedmineDmsf
def get_resource_class(path)
pinfo = path.split('/').drop(1)
return IndexResource if pinfo.length.zero?
return IndexResource if pinfo.empty?
return ProjectResource if pinfo.length == 1

View File

@ -24,7 +24,7 @@ require File.expand_path('../../test_helper', __FILE__)
class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
include Redmine::I18n
fixtures :dmsf_folders, :dmsf_files, :dmsf_file_revisions, :dmsf_links
fixtures :dmsf_folders, :dmsf_files, :dmsf_file_revisions, :dmsf_links, :dmsf_locks
def setup
super
@ -32,14 +32,13 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
@file_link6 = DmsfLink.find 6
@folder_link1 = DmsfLink.find 1
@url_link5 = DmsfLink.find 5
User.current = nil
@request.session[:user_id] = @jsmith.id
end
def test_dmsf_file
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings notified_events: ['dmsf_legacy_notifications'] do
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-edit', text: l(:button_edit)
assert_select 'a.icon-lock', text: l(:button_lock)
@ -53,9 +52,10 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_file_locked
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings notified_events: ['dmsf_legacy_notifications'] do
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do
get :dmsf, params: { id: @file2.project.id, ids: ["file-#{@file2.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file2.project.id, ids: ["file-#{@file2.id}"] }
assert_response :success
assert_select 'a.icon-edit.disabled', text: l(:button_edit)
assert_select 'a.icon-unlock', text: l(:button_unlock)
@ -68,11 +68,11 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_edit_file_locked_by_myself
post '/login', params: { username: 'jsmith', password: 'jsmith' }
User.current = @jsmith
@file1.lock!
User.current = nil
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_select 'a.icon-unlock', text: l(:button_unlock)
assert_select 'a.icon-unlock.disabled', text: l(:button_edit_content), count: 0
assert_select 'a.icon-file', text: l(:button_edit_content)
@ -81,22 +81,25 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_file_locked_force_unlock_permission_off
get :dmsf, params: { id: @file2.project.id, ids: ["file-#{@file2.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/context_menu', params: { id: @file2.project.id, ids: ["file-#{@file2.id}"] }
assert_response :success
assert_select 'a.icon-unlock.disabled', text: l(:button_unlock)
end
def test_dmsf_file_locked_force_unlock_permission_on
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_developer.add_permission! :force_file_unlock
get :dmsf, params: { id: @file2.project.id, ids: ["file-#{@file2.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file2.project.id, ids: ["file-#{@file2.id}"] }
assert_response :success
assert_select 'a.icon-unlock.disabled', text: l(:button_unlock), count: 0
end
def test_dmsf_file_notification_on
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@file1.notify_activate
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-email', text: l(:label_notifications_off)
assert_select 'a.icon-email-add', text: l(:label_notifications_on), count: 0
@ -104,9 +107,10 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_file_manipulation_permission_off
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_manipulation
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-edit.disabled', text: l(:button_edit)
assert_select 'a.icon-lock.disabled', text: l(:button_lock)
@ -116,8 +120,9 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_file_manipulation_permission_on
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a:not(icon-edit.disabled)', text: l(:button_edit)
assert_select 'a:not(icon-lock.disabled)', text: l(:button_lock)
@ -127,75 +132,86 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_file_email_permission_off
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :email_documents
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-email.disabled', text: l(:field_mail)
end
def test_dmsf_file_email_permission_on
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :email_document
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a:not(icon-email.disabled)', text: l(:field_mail)
end
def test_dmsf_file_delete_permission_off
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_manipulation
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-del.disabled', text: l(:button_delete)
end
def test_dmsf_file_delete_permission_on
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a:not(icon-del.disabled)', text: l(:button_delete)
assert_select 'a.icon-del', text: l(:button_delete)
end
def test_dmsf_file_edit_content
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.dmsf-icon-file', text: l(:button_edit_content)
end
end
def test_dmsf_file_edit_content_webdav_disabled
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => nil } do
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a:not(dmsf-icon-file)'
end
end
def test_dmsf_file_edit_content_webdav_readonly
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_ONLY' } do
get :dmsf, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.dmsf-icon-file.disabled', text: l(:button_edit_content)
end
end
def test_dmsf_file_watch
get :dmsf, params: { id: @file1.project, ids: ["file-#{@file1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/context_menu', params: { id: @file1.project, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-fav-off', text: l(:button_watch)
end
def test_dmsf_file_unwatch
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@file1.add_watcher @jsmith
get :dmsf, params: { id: @file1.project, ids: ["file-#{@file1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @file1.project, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-fav', text: l(:button_unwatch)
end
def test_dmsf_file_link
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings notified_events: ['dmsf_legacy_notifications'] do
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do
get :dmsf, params: { id: @file_link6.project.id, folder_id: @file_link6.dmsf_folder,
ids: ["file-link-#{@file_link6.id}"] }
get '/projects/dmsf/context_menu',
params: { id: @file_link6.project.id, folder_id: @file_link6.dmsf_folder,
ids: ["file-link-#{@file_link6.id}"] }
assert_response :success
assert_select 'a.icon-edit', text: l(:button_edit)
assert_select 'a.icon-lock', text: l(:button_lock)
@ -209,10 +225,12 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_file_link_locked
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert @file_link2.target_file.locked?
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @file_link2.project.id, folder_id: @file_link2.dmsf_folder.id,
ids: ["file-link-#{@file_link2.id}"] }
get '/projects/dmsf/context_menu',
params: { id: @file_link2.project.id, folder_id: @file_link2.dmsf_folder.id,
ids: ["file-link-#{@file_link2.id}"] }
assert_response :success
assert_select 'a.icon-edit.disabled', text: l(:button_edit)
assert_select 'a.icon-unlock', text: l(:button_unlock)
@ -223,14 +241,16 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_url_link
get :dmsf, params: { id: @url_link5.project.id, ids: ["url-link-#{@url_link5.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get :'/projects/dmsf/context_menu', params: { id: @url_link5.project.id, ids: ["url-link-#{@url_link5.id}"] }
assert_response :success
assert_select 'a.icon-del', text: l(:button_delete)
end
def test_dmsf_folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @folder1.project.id, ids: ["folder-#{@folder1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder1.project.id, ids: ["folder-#{@folder1.id}"] }
assert_response :success
assert_select 'a.icon-edit', text: l(:button_edit)
assert_select 'a.icon-lock', text: l(:button_lock)
@ -243,9 +263,10 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_folder_locked
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert @folder5.locked?
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
assert_response :success
assert_select 'a.icon-edit.disabled', text: l(:button_edit)
assert_select 'a.icon-unlock', text: l(:button_unlock)
@ -256,26 +277,27 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_folder_locked_force_unlock_permission_off
@request.session[:user_id] = @dlopper.id
get :dmsf, params: { id: @folder2.project.id, ids: ["folder-#{@folder2.id}"] }
post '/login', params: { username: 'dlopper', password: 'foo' }
get '/projects/dmsf/context_menu', params: { id: @folder2.project.id, ids: ["folder-#{@folder2.id}"] }
assert_response :success
# @folder2 is locked by @jsmith, therefore @dlopper can't unlock it
assert_select 'a.icon-unlock.disabled', text: l(:button_unlock)
end
def test_dmsf_folder_locked_force_unlock_permission_om
@request.session[:user_id] = @dlopper.id
post '/login', params: { username: 'dlopper', password: 'foo' }
@role_developer.add_permission! :force_file_unlock
get :dmsf, params: { id: @folder2.project.id, ids: ["folder-#{@folder2.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder2.project.id, ids: ["folder-#{@folder2.id}"] }
assert_response :success
# @folder2 is locked by @jsmith, but @dlopper can unlock it
assert_select 'a.icon-unlock.disabled', text: l(:button_unlock), count: 0
end
def test_dmsf_folder_notification_on
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@folder5.notify_activate
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
assert_response :success
assert_select 'a.icon-email', text: l(:label_notifications_off)
assert_select 'a.icon-email-add', text: l(:label_notifications_on), count: 0
@ -283,9 +305,10 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_folder_manipulation_permmissions_off
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :folder_manipulation
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @folder1.project.id, ids: ["folder-#{@folder1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder1.project.id, ids: ["folder-#{@folder1.id}"] }
assert_response :success
assert_select 'a.icon-edit.disabled', text: l(:button_edit)
assert_select 'a.icon-lock.disabled', text: l(:button_lock)
@ -295,8 +318,9 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_folder_manipulation_permmissions_on
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @folder1.project.id, ids: ["folder-#{@folder1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder1.project.id, ids: ["folder-#{@folder1.id}"] }
assert_response :success
assert_select 'a:not(icon-edit.disabled)', text: l(:button_edit)
assert_select 'a:not(icon-lock.disabled)', text: l(:button_lock)
@ -306,34 +330,39 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_folder_email_permmissions_off
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :email_documents
get :dmsf, params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
assert_response :success
assert_select 'a.icon-email.disabled', text: l(:field_mail)
end
def test_dmsf_folder_email_permmissions_on
get :dmsf, params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/context_menu', params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
assert_response :success
assert_select 'a:not(icon-email.disabled)', text: l(:field_mail)
end
def test_dmsf_folder_watch
get :dmsf, params: { id: @folder1.project, ids: ["folder-#{@folder1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/context_menu', params: { id: @folder1.project, ids: ["folder-#{@folder1.id}"] }
assert_response :success
assert_select 'a.icon-fav-off', text: l(:button_watch)
end
def test_dmsf_folder_unwatch
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@folder1.add_watcher @jsmith
get :dmsf, params: { id: @folder1.project, ids: ["folder-#{@folder1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder1.project, ids: ["folder-#{@folder1.id}"] }
assert_response :success
assert_select 'a.icon-fav', text: l(:button_unwatch)
end
def test_dmsf_folder_link
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @folder_link1.project.id, ids: ["folder-#{@folder_link1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder_link1.project.id, ids: ["folder-#{@folder_link1.id}"] }
assert_response :success
assert_select 'a.icon-edit', text: l(:button_edit)
assert_select 'a.icon-lock', text: l(:button_lock)
@ -345,9 +374,10 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_folder_link_locked
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@folder_link1.target_folder.lock!
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :dmsf, params: { id: @folder_link1.project.id, ids: ["folder-#{@folder_link1.id}"] }
get '/projects/dmsf/context_menu', params: { id: @folder_link1.project.id, ids: ["folder-#{@folder_link1.id}"] }
assert_response :success
assert_select 'a.icon-edit.disabled', text: l(:button_edit)
assert_select 'a.icon-unlock', text: l(:button_unlock)
@ -358,7 +388,8 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_multiple
get :dmsf, params: { id: @project1.id, ids: ["folder-#{@folder1.id}", "file-#{@file1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/context_menu', params: { id: @project1.id, ids: ["folder-#{@folder1.id}", "file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-edit', text: l(:button_edit), count: 0
assert_select 'a.icon-unlock', text: l(:button_unlock), count: 0
@ -371,78 +402,90 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase
end
def test_dmsf_project_watch
get :dmsf, params: { ids: ["project-#{@project1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/context_menu', params: { ids: ["project-#{@project1.id}"] }
assert_response :success
assert_select 'a.icon-fav-off', text: l(:button_watch)
end
def test_dmsf_project_unwatch
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@project1.add_watcher @jsmith
get :dmsf, params: { ids: ["project-#{@project1.id}"] }
get '/projects/dmsf/context_menu', params: { ids: ["project-#{@project1.id}"] }
assert_response :success
assert_select 'a.icon-fav', text: l(:button_unwatch)
end
def test_trash_file
get :trash, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@file1.project.id}/dmsf/trash/context_menu", params: { ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-cancel', text: l(:title_restore)
assert_select 'a.icon-del', text: l(:button_delete)
end
def test_trash_file_manipulation_permissions_off
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_delete
@role_manager.remove_permission! :file_manipulation
get :trash, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get "/projects/#{@file1.project.id}/dmsf/trash/context_menu", params: { ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-cancel.disabled', text: l(:title_restore)
assert_select 'a.icon-del.disabled', text: l(:button_delete)
end
def test_trash_file_manipulation_permissions_on
get :trash, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@file1.project.id}/dmsf/trash/context_menu", params: { ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a:not(icon-cancel.disabled)', text: l(:title_restore)
assert_select 'a:not(icon-del.disabled)', text: l(:button_delete)
end
def test_trash_file_delete_permissions_off
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_delete
get :trash, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
get "/projects/#{@file1.project.id}/dmsf/trash/context_menu", params: { ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a.icon-del.disabled', text: l(:button_delete)
end
def test_trash_file_delete_permissions_on
get :trash, params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@file1.project.id}/dmsf/trash/context_menu", params: { ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'a:not(icon-del.disabled)', text: l(:button_delete)
end
def test_trash_folder
get :trash, params: { id: @folder5.project.id, ids: ["folder-#{@folder5.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@folder5.project.id}/dmsf/trash/context_menu", params: { ids: ["folder-#{@folder5.id}"] }
assert_response :success
assert_select 'a.icon-cancel', text: l(:title_restore)
assert_select 'a.icon-del', text: l(:button_delete)
end
def test_trash_folder_manipulation_permissions_off
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :folder_manipulation
get :trash, params: { id: @folder1.project.id, ids: ["folder-#{@folder1.id}"] }
get "/projects/#{@folder1.project.id}/dmsf/trash/context_menu", params: { ids: ["folder-#{@folder1.id}"] }
assert_response :success
assert_select 'a.icon-cancel.disabled', text: l(:title_restore)
assert_select 'a.icon-del.disabled', text: l(:button_delete)
end
def test_trash_folder_manipulation_permissions_on
get :trash, params: { id: @folder1.project.id, ids: ["folder-#{@folder1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@folder1.project.id}/dmsf/trash/context_menu", params: { ids: ["folder-#{@folder1.id}"] }
assert_response :success
assert_select 'a:not(icon-cancel.disabled)', text: l(:title_restore)
assert_select 'a:not(icon-del.disabled)', text: l(:button_delete)
end
def test_trash_multiple
get :trash, params: { id: @project1.id, ids: ["file-#{@file1.id}", "folder-#{@folder1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@file1.project.id}/dmsf/trash/context_menu",
params: { ids: ["file-#{@file1.id}", "folder-#{@folder1.id}"] }
assert_response :success
assert_select 'a.icon-cancel', text: l(:title_restore)
assert_select 'a.icon-del', text: l(:button_delete)

View File

@ -34,21 +34,21 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
@link1 = DmsfLink.find 1
@custom_field = CustomField.find 21
@custom_value = CustomValue.find 21
User.current = nil
@request.session[:user_id] = @jsmith.id
default_url_options[:host] = 'http://example.com'
default_url_options[:host] = 'www.example.com'
end
def test_edit_folder_forbidden
# Missing permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :folder_manipulation
get :edit, params: { id: @project1, folder_id: @folder1 }
get "/projects/#{@project1.id}/dmsf/edit", params: { folder_id: @folder1 }
assert_response :forbidden
end
def test_edit_folder_allowed
# Permissions OK
get :edit, params: { id: @project1, folder_id: @folder1 }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf/edit", params: { folder_id: @folder1.id }
assert_response :success
# Custom fields
assert_select 'label', { text: @custom_field.name }
@ -64,35 +64,42 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_edit_folder_redirection_to_the_parent_folder
post :save, params: { id: @project1, folder_id: @folder2.id, parent_id: @folder2.dmsf_folder.id,
dmsf_folder: { title: @folder2.title, description: @folder2.description } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/projects/#{@project1.id}/dmsf/save",
params: { folder_id: @folder2.id, parent_id: @folder2.dmsf_folder.id,
dmsf_folder: { title: @folder2.title, description: 'Updated folder' } }
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder2.dmsf_folder.id)
end
def test_edit_folder_redirection_to_the_same_folder
post :save, params: { id: @project1, folder_id: @folder2.id, parent_id: @folder2.dmsf_folder.id,
dmsf_folder: { title: @folder2.title, description: @folder2.description,
redirect_to_folder_id: @folder2.id } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/projects/#{@project1.id}/dmsf/save",
params: { folder_id: @folder2.id, parent_id: @folder2.dmsf_folder.id,
dmsf_folder: { title: @folder2.title, description: 'Updated folder',
redirect_to_folder_id: @folder2.id } }
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder2.id)
end
def test_trash_forbidden
# Missing permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_delete
get :trash, params: { id: @project1 }
get "/projects/#{@project1.id}/dmsf/trash"
assert_response :forbidden
end
def test_trash_allowed
# Permissions OK
get :trash, params: { id: @project1 }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf/trash"
assert_response :success
assert_select 'h2', { text: l(:link_trash_bin) }
end
def test_trash
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@folder1.delete commit: false
get :trash, params: { id: @project1 }
get "/projects/#{@project1.id}/dmsf/trash"
assert_response :success
assert_select 'a', href: dmsf_folder_path(id: @folder1.project.id, folder_id: @folder1.id)
assert_select 'a', href: dmsf_folder_path(id: @folder2.project.id, folder_id: @folder2.id)
@ -101,7 +108,8 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_empty_trash
get :empty_trash, params: { id: @project1.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf/empty_trash"
assert_equal 0, DmsfFolder.deleted.where(project_id: @project1.id).all.size
assert_equal 0, DmsfFile.deleted.where(project_id: @project1.id).all.size
assert_equal 0, DmsfLink.deleted.where(project_id: @project1.id).all.size
@ -110,89 +118,103 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_empty_trash_forbidden
# Missing permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_delete
get :empty_trash, params: { id: @project1.id }
get "/projects/#{@project1.id}/dmsf/empty_trash"
assert_response :forbidden
end
def test_delete_forbidden
# Missing permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :folder_manipulation
get :delete, params: { id: @project1, folder_id: @folder1.id, commit: false }
delete "/projects/#{@project1.id}/dmsf/delete", params: { folder_id: @folder1.id, commit: false }
assert_response :forbidden
end
def test_delete_locked
# Permissions OK but the folder is locked
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1, folder_id: @folder2.id)
get :delete, params: { id: @project1, folder_id: @folder2.id, commit: false }
delete "/projects/#{@project1.id}/dmsf/delete", params: { folder_id: @folder2.id, commit: false }
assert_response :redirect
assert_include l(:error_folder_is_locked), flash[:error]
end
def test_delete_ok
# Empty and not locked folder
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1, folder_id: @folder1.dmsf_folder)
get :delete, params: { id: @project1, folder_id: @folder1, parent_id: @folder1.dmsf_folder, commit: false }
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.dmsf_folder)
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1)
delete "/projects/#{@project1.id}/dmsf/delete",
params: { folder_id: @folder1.id, commit: false }
assert_redirected_to dmsf_folder_path(id: @project1)
end
def test_delete_subfolder
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1, folder_id: @folder2.dmsf_folder)
get :delete, params: { id: @project1, folder_id: @folder2, parent_id: @folder2.dmsf_folder, commit: false }
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder2.dmsf_folder)
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1, folder_id: @folder1.id)
delete "/projects/#{@folder2.project.id}/dmsf/delete",
params: { folder_id: @folder2.id, parent_id: @folder1.id, commit: false }
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.id)
end
def test_restore_forbidden
# Missing permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_developer.remove_permission! :folder_manipulation
@folder4.deleted = 1
@folder4.save
get :restore, params: { id: @folder4.project.id, folder_id: @folder4.id }
get "/projects/#{@folder4.project.id}/dmsf/restore", params: { folder_id: @folder4.id }
assert_response :forbidden
end
def test_restore_ok
# Permissions OK
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1)
@folder1.deleted = 1
@folder1.save
get :restore, params: { id: @project1, folder_id: @folder1.id }
get "/projects/#{@project1.id}/dmsf/restore", params: { folder_id: @folder1.id }
assert_response :redirect
end
def test_delete_entries_forbidden
# Missing permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :folder_manipulation
get :entries_operation, params: { id: @project1, delete_entries: 'Delete',
ids: ["folder-#{@folder1.id}", "file-#{@file1.id}", "folder-link-#{@link1.id}",
"file-link-#{@link2.id}"] }
post "/projects/#{@project1.id}/dmsf/entries",
params: { delete_entries: true,
ids: ["folder-#{@folder1.id}", "file-#{@file1.id}", "folder-link-#{@link1.id}",
"file-link-#{@link2.id}"] }
assert_response :forbidden
end
def test_delete_entries_ok
# Permissions OK
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1)
flash[:error] = nil
get :entries_operation, params: { id: @project1, delete_entries: 'Delete',
ids: ["folder-#{@folder7.id}", "file-#{@file1.id}", "file-link-#{@link2.id}"] }
post "/projects/#{@project1.id}/dmsf/entries",
params: { delete_entries: true, ids: ["folder-#{@folder7.id}", "file-#{@file1.id}", "file-link-#{@link2.id}"] }
assert_response :redirect
assert_nil flash[:error]
end
def test_restore_entries
# Restore
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1)
flash[:error] = nil
get :entries_operation, params: { id: @project1, restore_entries: 'Restore',
ids: ["file-#{@file1.id}", "file-link-#{@link2.id}"] }
post "/projects/#{@project1.id}/dmsf/entries",
params: { restore_entries: true, ids: ["file-#{@file1.id}", "file-link-#{@link2.id}"] }
assert_response :redirect
assert_nil flash[:error]
end
def test_show
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do
get :show, params: { id: @project1.id }
get "/projects/#{@project1.id}/dmsf"
assert_response :success
# New file link
assert_select 'a[href$=?]', '/dmsf/upload/multi_upload'
@ -217,15 +239,17 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_show_webdav_disabled
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => nil } do
get :show, params: { id: @project1.id }
get "/projects/#{@project1.id}/dmsf"
assert_response :success
assert_select 'a.webdav', text: 'WebDAV', count: 0
end
end
def test_show_filters_found
get :show, params: { id: @project1.id, f: ['title'], op: { 'title' => '~' }, v: { 'title' => ['Zero'] } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf", params: { f: ['title'], op: { 'title' => '~' }, v: { 'title' => ['Zero'] } }
assert_response :success
# 'Zero Size File' document
assert_select 'a', text: @file10.title
@ -234,15 +258,17 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_show_filters_not_found
get :show, params: { id: @project1.id, f: ['title'], op: { 'title' => '~' }, v: { 'title' => ['xxx'] } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf", params: { f: ['title'], op: { 'title' => '~' }, v: { 'title' => ['xxx'] } }
assert_response :success
# 'Zero Size File' document
assert_select 'a', text: @file10.title, count: 0
end
def test_show_filters_custom_field
get :show, params: { id: @project1.id, set_filter: '1', f: ['cf_21', ''], op: { 'cf_21' => '=' },
v: { 'cf_21' => ['User documentation'] } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf",
params: { set_filter: '1', f: ['cf_21', ''], op: { 'cf_21' => '=' }, v: { 'cf_21' => ['User documentation'] } }
assert_response :success
# Folder 1 with Tag=User documentation
assert_select 'a', text: @folder1.title
@ -251,27 +277,31 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_show_without_file_manipulation
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_manipulation
get :show, params: { id: @project1.id }
get "/projects/#{@project1.id}/dmsf"
assert_response :success
# New file link should be missing
assert_select 'a[href$=?]', '/dmsf/upload/multi_upload', count: 0
end
def test_show_csv
get :show, params: { id: @project1.id, format: 'csv' }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf", params: { format: 'csv' }
assert_response :success
assert @response.media_type.include?('text/csv')
end
def test_show_folder_doesnt_correspond_the_project
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert @project1 != @folder3.project
get :show, params: { id: @project1.id, folder_id: @folder3.id }
get "/projects/#{@project1.id}/dmsf", params: { folder_id: @folder3.id }
assert_response :not_found
end
def test_folder_link_to_folder
get :show, params: { id: @link1.project_id, folder_id: @link1.dmsf_folder_id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@link1.project_id}/dmsf", params: { folder_id: @link1.dmsf_folder_id }
assert_response :success
assert_select 'a', text: @link1.title, count: 1
assert_select 'a[href$=?]',
@ -280,121 +310,140 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_folder_link_to_project
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@link1.target_project_id = @project2.id
@link1.target_id = nil
assert @link1.save
get :show, params: { id: @link1.project_id, folder_id: @link1.dmsf_folder_id }
get "/projects/#{@link1.project_id}/dmsf", params: { folder_id: @link1.dmsf_folder_id }
assert_response :success
assert_select 'a', text: @link1.title, count: 1
assert_select 'a[href$=?]', "/projects/#{@project2.identifier}/dmsf", count: 1
end
def test_new_forbidden
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :folder_manipulation
get :new, params: { id: @project1, parent_id: nil }
get "/projects/#{@project1.id}/dmsf/new"
assert_response :forbidden
end
def test_new
get :new, params: { id: @project1, parent_id: nil }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf/new"
assert_response :success
end
def test_email_entries_email_from_forbidden
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :email_documents
with_settings plugin_redmine_dmsf: { 'dmsf_documents_email_from' => 'karel.picman@kontron.com' } do
get :entries_operation, params: { id: @project1, email_entries: 'Email', ids: ["file-#{@file1.id}"] }
post "/projects/#{@project1.id}/dmsf/entries", params: { email_entries: true, ids: ["file-#{@file1.id}"] }
assert_response :forbidden
end
end
def test_email_entries_email_from
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_documents_email_from' => 'karel.picman@kontron.com' } do
get :entries_operation, params: { id: @project1, email_entries: 'Email', ids: ["file-#{@file1.id}"] }
post "/projects/#{@project1.id}/dmsf/entries", params: { email_entries: true, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_from']
end
end
def test_email_entries_reply_to
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_documents_email_reply_to' => 'karel.picman@kontron.com' } do
get :entries_operation, params: { id: @project1, email_entries: 'Email', ids: ["file-#{@file1.id}"] }
post "/projects/#{@project1.id}/dmsf/entries", params: { email_entries: true, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select "input:match('value', ?)", Setting.plugin_redmine_dmsf['dmsf_documents_email_reply_to']
end
end
def test_email_entries_links_only
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_documents_email_links_only' => '1' } do
get :entries_operation, params: { id: @project1, email_entries: 'Email', ids: ["file-#{@file1.id}"] }
post "/projects/#{@project1.id}/dmsf/entries", params: { email_entries: true, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_select 'input[id=email_links_only][value=1]'
end
end
def test_entries_email
post '/login', params: { username: 'jsmith', password: 'jsmith' }
zip_file = Tempfile.new('test', Rails.root.join('tmp'))
get :entries_email,
params: { id: @project1, email: { to: 'to@test.com', from: 'from@test.com', subject: 'subject', body: 'body',
expired_at: '2015-01-01', folders: [], files: [@file1.id],
zipped_content: zip_file.path } }
post "/projects/#{@project1.id}/dmsf/entries/email",
params: { email: { to: 'to@test.com', from: 'from@test.com', subject: 'subject', body: 'body',
expired_at: '2015-01-01', folders: [], files: [@file1.id],
zipped_content: zip_file.path } }
assert_redirected_to dmsf_folder_path(id: @project1)
ensure
zip_file.unlink
end
def test_add_email_forbidden
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :view_dmsf_files
get :add_email, params: { id: @project1.id }, xhr: true
get '/projects/dmsf/add_email', params: { id: @project1.id }, xhr: true
assert_response :forbidden
end
def test_add_email
get :add_email, params: { id: @project1.id }, xhr: true
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/add_email', params: { id: @project1.id }, xhr: true
assert_response :success
end
def test_append_email_forbidden
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :view_dmsf_files
post :append_email, params: { id: @project1, user_ids: @project1.members.collect { |m| m.user.id },
format: 'js' }
post '/projects/dmsf/append_email',
params: { id: @project1, user_ids: @project1.members.collect { |m| m.user.id }, format: 'js' }
assert_response :forbidden
end
def test_append_email
post :append_email, params: { id: @project1, user_ids: @project1.members.collect { |m| m.user.id }, format: 'js' }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post '/projects/dmsf/append_email',
params: { id: @project1, user_ids: @project1.members.collect { |m| m.user.id }, format: 'js' }
assert_response :success
end
def test_autocomplete_for_user_forbidden
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :view_dmsf_files
get :autocomplete_for_user, params: { id: @project1.id }, xhr: true
get '/projects/dmsf/autocomplete_for_user', params: { id: @project1.id }, xhr: true
assert_response :forbidden
end
def test_autocomplete_for_user
get :autocomplete_for_user, params: { id: @project1 }, xhr: true
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/projects/dmsf/autocomplete_for_user', params: { id: @project1 }, xhr: true
assert_response :success
end
def test_create_folder_in_root
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfFolder.count', +1 do
post :create, params: { id: @project1.id, dmsf_folder: { title: 'New folder', description: 'Unit tests' } }
post "/projects/#{@project1.id}/dmsf/create",
params: { dmsf_folder: { title: 'New folder', description: 'Unit tests' } }
end
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: nil)
end
def test_create_folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfFolder.count', +1 do
post :create, params: { id: @project1.id, parent_id: @folder1.id,
dmsf_folder: { title: 'New folder', description: 'Unit tests' } }
post "/projects/#{@project1.id}/dmsf/create",
params: { parent_id: @folder1.id, dmsf_folder: { title: 'New folder', description: 'Unit tests' } }
end
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1)
end
def test_show_with_sub_projects
post '/login', params: { username: 'jsmith', password: 'jsmith' }
with_settings plugin_redmine_dmsf: { 'dmsf_projects_as_subfolders' => '1' } do
get :show, params: { id: @project1.id }
get "/projects/#{@project1.id}/dmsf"
assert_response :success
# @project5 is as a sub-folder
assert_select "tr##{@project5.id}pspan", count: 1
@ -402,21 +451,24 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_show_without_sub_projects
get :show, params: { id: @project1.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf"
assert_response :success
# @project5 is not as a sub-folder
assert_select "tr##{@project5.id}pspan", count: 0
end
def test_show_default_sort_column
get :show, params: { id: @project1.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/dmsf"
assert_response :success
# The default column Title's header is displayed as sorted '^'
assert_select 'a.icon-sorted-desc', text: l(:label_column_title)
end
def test_index
get :index
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/dmsf'
assert_response :success
# Projects
assert_select 'table.dmsf' do
@ -436,8 +488,8 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_index_non_member
@request.session[:user_id] = @dlopper.id
get :index
post '/login', params: { username: 'dlopper', password: 'foo' }
get '/dmsf'
assert_response :success
assert_select 'table.dmsf' do
assert_select 'tr' do
@ -450,46 +502,54 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_index_no_membership
@request.session[:user_id] = @someone.id
get :index
post '/login', params: { username: 'someone', password: 'foo' }
get '/dmsf'
assert_response :forbidden
end
def test_copymove_authorize_admin
@request.session[:user_id] = @admin.id
get :copymove, params: { id: @file1.project, folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
post '/login', params: { username: 'admin', password: 'admin' }
get "/projects/#{@project1.id}/entries/copymove",
params: { folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_template 'copymove'
end
def test_copymove_authorize_non_member
@request.session[:user_id] = @someone.id
get :copymove, params: { id: @file1.project, folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
post '/login', params: { username: 'someone', password: 'foo' }
get "/projects/#{@project1.id}/entries/copymove",
params: { folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
assert_response :forbidden
end
def test_copymove_authorize_member_no_module
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@file1.project.disable_module! :dmsf
get :copymove, params: { id: @file1.project, folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
get "/projects/#{@project1.id}/entries/copymove",
params: { folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
assert_response :forbidden
end
def test_copymove_authorize_forbidden
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :folder_manipulation
get :copymove, params: { id: @file1.project, folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
get "/projects/#{@project1.id}/entries/copymove",
params: { folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
assert_response :forbidden
end
def test_copymove_target_folder
get :copymove, params: { id: @file1.project, folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/projects/#{@project1.id}/entries/copymove",
params: { folder_id: @file1.dmsf_folder, ids: ["file-#{@file1.id}"] }
assert_response :success
assert_template 'copymove'
end
def test_entries_copy
post :entries_operation,
params: { id: @file1.project,
dmsf_entries: { target_project_id: @folder1.project.id, target_folder_id: @folder1.id },
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/projects/#{@project1.id}/dmsf/entries",
params: { dmsf_entries: { target_project_id: @folder1.project.id, target_folder_id: @folder1.id },
ids: ["file-#{@file1.id}"],
copy_entries: true }
assert_response :redirect
@ -497,9 +557,9 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_entries_copy_to_the_same_folder
post :entries_operation,
params: { id: @file1.project,
dmsf_entries: { target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder },
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/projects/#{@project1.id}/dmsf/entries",
params: { dmsf_entries: { target_project_id: @file1.project.id, target_folder_id: @file1.dmsf_folder },
ids: ["file-#{@file1.id}"],
copy_entries: true }
assert_response :redirect
@ -508,9 +568,9 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_entries_move_recursion
# Move a folder under the same folder
post :entries_operation,
params: { id: @folder1.project,
dmsf_entries: { target_project_id: @folder2.project.id, target_folder_id: @folder2.id },
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/projects/#{@project1.id}/dmsf/entries",
params: { dmsf_entries: { target_project_id: @folder2.project.id, target_folder_id: @folder2.id },
ids: ["folder-#{@folder1.id}"],
move_entries: true }
assert_response :redirect
@ -519,9 +579,9 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_entries_move_infinity
# Move the folder to itself
post :entries_operation,
params: { id: @folder1.project,
dmsf_entries: { target_project_id: @folder2.project.id, target_folder_id: @folder2.id },
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/projects/#{@project1.id}/dmsf/entries",
params: { dmsf_entries: { target_project_id: @folder2.project.id, target_folder_id: @folder2.id },
ids: ["folder-#{@folder2.id}"],
move_entries: true }
assert_response :redirect
@ -529,50 +589,50 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
end
def test_entries_copy_to_locked_folder
@request.session[:user_id] = @admin.id
post :entries_operation,
params: { id: @folder1.project,
dmsf_entries: { target_project_id: @folder2.project.id, target_folder_id: @folder2.id },
post '/login', params: { username: 'admin', password: 'admin' }
post "/projects/#{@project1.id}/dmsf/entries",
params: { dmsf_entries: { target_project_id: @folder2.project.id, target_folder_id: @folder2.id },
ids: ["file-#{@file1.id}"],
move_entries: true }
assert_response :forbidden
end
def test_entries_copy_to_dmsf_not_enabled
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@project2.disable_module! :dmsf
post :entries_operation,
params: { id: @project2.id,
dmsf_entries: { target_project_id: @project2.id },
post "/projects/#{@project2.id}/dmsf/entries",
params: { dmsf_entries: { target_project_id: @project2.id },
ids: ["file-#{@file1.id}"],
copy_entries: true }
assert_response :forbidden
end
def test_entries_copy_to_dmsf_enabled
post :entries_operation,
params: { id: @project2.id,
dmsf_entries: { target_project_id: @project2.id },
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/projects/#{@project2.id}/dmsf/entries",
params: { dmsf_entries: { target_project_id: @project2.id },
ids: ["file-#{@file1.id}"],
copy_entries: true }
assert_response :redirect
end
def test_entries_copy_to_as_non_member
@request.session[:user_id] = @someone.id
post :entries_operation,
params: { id: @project2.id,
dmsf_entries: { target_project_id: @project2.id },
post '/login', params: { username: 'someone', password: 'foo' }
post "/projects/#{@project2.id}/dmsf/entries",
params: { dmsf_entries: { target_project_id: @project2.id },
ids: ["file-#{@file1.id}"],
copy_entries: true }
assert_response :forbidden
end
def test_copymove_new_fast_links_enabled
post '/login', params: { username: 'jsmith', password: 'jsmith' }
member = Member.find_by(user_id: @jsmith.id, project_id: @project1.id)
assert member
member.dmsf_fast_links = true
member.save
get :copymove, params: { id: @file1.project, folder_id: @file1.dmsf_folder, ids: ["file-#{@file4.id}"] }
get "/projects/#{@project1.id}/entries/copymove",
params: { folder_id: @file1.dmsf_folder, ids: ["file-#{@file4.id}"] }
assert_response :success
assert_select 'label', { count: 0, text: l(:label_target_project) }
assert_select 'label', { count: 0, text: "#{l(:label_target_folder)}#" }
@ -580,9 +640,9 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase
def test_entries_move_fast_links_enabled
# Target project is not given
post :entries_operation,
params: { id: @project1.id,
dmsf_entries: { target_folder_id: @folder1.id },
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/projects/#{@project1.id}/dmsf/entries",
params: { dmsf_entries: { target_folder_id: @folder1.id },
ids: ["file-#{@file1.id}"],
move_entries: true }
assert_response :redirect

View File

@ -26,30 +26,32 @@ class DmsfFolderPermissionsControllerTest < RedmineDmsf::Test::TestCase
def setup
super
@request.session[:user_id] = @jsmith.id
post '/login', params: { username: 'jsmith', password: 'jsmith' }
end
def test_new
get :new, params: { project_id: @project1, dmsf_folder_id: @folder7, format: 'js' }, xhr: true
get '/dmsf_folder_permissions/new',
params: { project_id: @project1.id, dmsf_folder_id: @folder7.id, format: 'js' },
xhr: true
assert_response :success
assert_template 'new'
assert @response.media_type.include?('text/javascript')
end
def test_autocomplete_for_user
get :autocomplete_for_user,
params: { project_id: @project1, dmsf_folder_id: @folder7, q: 'smi', format: 'js' },
get '/dmsf_folder_permissions/autocomplete_for_user',
params: { project_id: @project1.id, dmsf_folder_id: @folder7.id, q: 'smi', format: 'js' },
xhr: true
assert_response :success
assert_include @jsmith.name, response.body
end
def test_append
get :new,
params: { project_id: @project1, dmsf_folder_id: @folder7, user_ids: [@jsmith.id], format: 'js' },
xhr: true
post '/dmsf_folder_permissions/append',
params: { project_id: @project1.id, dmsf_folder_id: @folder7.id, user_ids: [@jsmith.id], format: 'js' },
xhr: true
assert_response :success
assert_template 'new'
assert_template 'append'
assert @response.content_type.match?(%r{^text/javascript})
end
end

View File

@ -30,62 +30,66 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
super
@file_link = DmsfLink.find 1
@url_link = DmsfLink.find 5
@request.session[:user_id] = @jsmith.id
end
def test_authorize_admin
@request.session[:user_id] = @admin.id
get :new, params: { project_id: @project1.id }
post '/login', params: { username: 'admin', password: 'admin' }
get '/dmsf_links/new', params: { project_id: @project1.id }
assert_response :success
assert_template 'new'
end
def test_authorize_non_member
@request.session[:user_id] = @someone.id
get :new, params: { project_id: @project2.id }
post '/login', params: { username: 'someone', password: 'foo' }
get '/dmsf_links/new', params: { project_id: @project2.id }
assert_response :forbidden
end
def test_authorize_member_ok
@request.session[:user_id] = @jsmith.id
get :new, params: { project_id: @project1.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/dmsf_links/new', params: { project_id: @project1.id }
assert_response :success
end
def test_authorize_member_no_module
# Without the module
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@project1.disable_module! :dmsf
get :new, params: { project_id: @project1.id }
get '/dmsf_links/new', params: { project_id: @project1.id }
assert_response :forbidden
end
def test_authorize_forbidden
# Without permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_manipulation
get :new, params: { project_id: @project1.id }
get '/dmsf_links/new', params: { project_id: @project1.id }
assert_response :forbidden
end
def test_new
get :new, params: { project_id: @project1.id, type: 'link_to' }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/dmsf_links/new', params: { project_id: @project1.id, type: 'link_to' }
assert_response :success
assert_select 'label', { text: l(:label_target_project) }
end
def test_new_fast_links_enabled
post '/login', params: { username: 'jsmith', password: 'jsmith' }
member = Member.find_by(user_id: @jsmith.id, project_id: @project1.id)
assert member
member.dmsf_fast_links = true
member.save
get :new, params: { project_id: @project1.id, type: 'link_to' }
get '/dmsf_links/new', params: { project_id: @project1.id, type: 'link_to' }
assert_response :success
assert_select 'label', { count: 0, text: l(:label_target_project) }
end
def test_create_file_link_from_f1
post '/login', params: { username: 'jsmith', password: 'jsmith' }
# 1. File link in a folder from another folder
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
target_project_id: @project2.id,
dmsf_folder_id: @folder1.id,
@ -95,13 +99,14 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
type: 'link_from'
} }
end
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.id)
end
def test_create_file_link_from_f2
post '/login', params: { username: 'jsmith', password: 'jsmith' }
# 2. File link in a folder from another root folder
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
dmsf_folder_id: @folder1.id,
target_project_id: @project2.id,
@ -111,14 +116,15 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
type: 'link_from'
} }
end
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.id)
end
def test_create_file_link_from_f3
# 3. File link in a root folder from another folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project1,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
target_project_id: @project2.id,
target_file_id: @file6.id,
target_folder_id: @folder3.id,
@ -131,9 +137,10 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
def test_create_file_link_from_f4
# 4. File link in a root folder from another root folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project1,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
target_project_id: @project2.id,
target_file_id: @file2.id,
name: 'file_link',
@ -145,38 +152,41 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
def test_create_folder_link_from_d1
# 1. Folder link in a folder from another folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project1,
dmsf_folder_id: @folder1,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
dmsf_folder_id: @folder1.id,
target_project_id: @project2.id,
target_folder_id: @folder3.id,
name: 'folder_link',
type: 'link_from'
} }
end
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.id)
end
def test_create_folder_link_from_d2
# 2. Folder link in a folder from another root folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project1,
dmsf_folder_id: @folder1,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
dmsf_folder_id: @folder1.id,
target_project_id: @project2.id,
name: 'folder_link',
type: 'link_from'
} }
end
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.id)
end
def test_create_folder_link_from_d3
# 3. Folder link in a root folder from another folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project1,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
target_project_id: @project2.id,
target_folder_id: @folder3.id,
name: 'folder_link',
@ -188,9 +198,10 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
def test_create_folder_link_from_d4
# 4. Folder link in a root folder from another root folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project1,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
target_project_id: @project2.id,
name: 'folder_link',
type: 'link_from'
@ -201,25 +212,27 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
def test_create_file_link_to_f1
# 1. File link to a root folder from another folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project1,
dmsf_file_id: @file1,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
dmsf_file_id: @file1.id,
target_project_id: @project2.id,
target_folder_id: @folder3.id,
name: 'file_link',
type: 'link_to'
} }
end
assert_redirected_to dmsf_file_path(@file1)
assert_redirected_to dmsf_file_path(@file1.id)
end
def test_create_file_link_to_f2
# 2. File link to a folder from another folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project2,
dmsf_folder_id: @folder3,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project2.id,
dmsf_folder_id: @folder3.id,
target_project_id: @project1.id,
target_folder_id: @folder1.id,
dmsf_file_id: @file6.id,
@ -227,27 +240,29 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
type: 'link_to'
} }
end
assert_redirected_to dmsf_file_path(@file6)
assert_redirected_to dmsf_file_path(@file6.id)
end
def test_create_file_link_to_f3
# 3. File link to a root folder from another root folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
project_id: @project2,
post '/dmsf_links', params: { dmsf_link: {
project_id: @project2.id,
target_project_id: @project1.id,
dmsf_file_id: @file6.id,
name: 'file_link',
type: 'link_to'
} }
end
assert_redirected_to dmsf_file_path(@file6)
assert_redirected_to dmsf_file_path(@file6.id)
end
def test_create_file_link_to_f4
# 4. File link to a folder from another root folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
post '/dmsf_links', params: { dmsf_link: {
project_id: @project2,
dmsf_folder_id: @folder3,
target_project_id: @project1.id,
@ -256,12 +271,13 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
type: 'link_to'
} }
end
assert_redirected_to dmsf_file_path(@file6)
assert_redirected_to dmsf_file_path(@file6.id)
end
def test_create_external_link_from
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1,
target_project_id: @project1.id,
name: 'file_link',
@ -274,8 +290,9 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
def test_create_folder_link_to_f1
# 1. Folder link to a root folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
dmsf_folder_id: @folder1.id,
target_project_id: @project2.id,
@ -283,13 +300,14 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
type: 'link_to'
} }
end
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.dmsf_folder)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.dmsf_folder_id)
end
def test_create_folder_link_to_f2
# 2. Folder link to a folder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.count', +1 do
post :create, params: { dmsf_link: {
post '/dmsf_links', params: { dmsf_link: {
project_id: @project1.id,
dmsf_folder_id: @folder1.id,
target_project_id: @project2.id,
@ -298,35 +316,40 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase
type: 'link_to'
} }
end
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.dmsf_folder)
assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.dmsf_folder_id)
end
def test_destroy
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.visible.count', -1 do
delete :destroy, params: { project_id: @project1, id: @file_link }
delete "/dmsf_links/#{@file_link.id}", params: { project_id: @project1.id }
end
assert_redirected_to dmsf_folder_path(id: @file_link.project, folder_id: @file_link.dmsf_folder)
assert_redirected_to dmsf_folder_path(id: @file_link.project, folder_id: @file_link.dmsf_folder_id)
end
def test_destroy_in_subfolder
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfLink.visible.count', -1 do
delete :destroy, params: { project_id: @url_link.project, id: @url_link, folder_id: @url_link.dmsf_folder }
delete "/dmsf_links/#{@url_link.id}",
params: { project_id: @url_link.project_id, folder_id: @url_link.dmsf_folder_id }
end
assert_redirected_to dmsf_folder_path(id: @url_link.project, folder_id: @url_link.dmsf_folder)
assert_redirected_to dmsf_folder_path(id: @url_link.project, folder_id: @url_link.dmsf_folder_id)
end
def test_restore_forbidden
# Missing permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1)
@role_manager.remove_permission! :file_manipulation
get :restore, params: { project_id: @project1, id: @file_link }
get "/dmsf/links/#{@file_link.id}/restore", params: { project_id: @project1.id }
assert_response :forbidden
end
def test_restore_ok
# Permissions OK
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1)
get :restore, params: { project_id: @project1, id: @file_link }
get "/dmsf/links/#{@file_link.id}/restore", params: { project_id: @project1.id }
assert_response :redirect
end
end

View File

@ -25,17 +25,17 @@ class DmsfPublicUrlsControllerTest < RedmineDmsf::Test::TestCase
fixtures :dmsf_public_urls, :dmsf_folders, :dmsf_files, :dmsf_file_revisions
def test_show_valid_url
get :show, params: { token: 'd8d33e21914a433b280fdc94450ee212' }
get '/dmsf_public_urls', params: { token: 'd8d33e21914a433b280fdc94450ee212' }
assert_response :success
end
def test_show_url_width_invalid_token
get :show, params: { token: 'f8d33e21914a433b280fdc94450ee212' }
get '/dmsf_public_urls', params: { token: 'f8d33e21914a433b280fdc94450ee212' }
assert_response :not_found
end
def test_show_url_that_has_expired
get :show, params: { token: 'e8d33e21914a433b280fdc94450ee212' }
get '/dmsf_public_urls', params: { token: 'e8d33e21914a433b280fdc94450ee212' }
assert_response :not_found
end
end

View File

@ -29,13 +29,14 @@ class DmsfStateControllerTest < RedmineDmsf::Test::TestCase
def setup
super
@query401 = Query.find 401
@request.session[:user_id] = @jsmith.id
end
def test_user_pref_save_member
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.add_permission! :user_preferences
post :user_pref_save, params: { id: @project1.id, email_notify: 1, title_format: '%t_%v', fast_links: 1,
act_as_attachable: 1, default_dmsf_query: @query401.id }
post "/projects/#{@project1.id}/dmsf/state",
params: { email_notify: 1, title_format: '%t_%v', fast_links: 1, act_as_attachable: 1,
default_dmsf_query: @query401.id }
assert_redirected_to settings_project_path(@project1, tab: 'dmsf')
assert_not_nil flash[:notice]
assert_equal flash[:notice], l(:notice_your_preferences_were_saved)
@ -50,22 +51,23 @@ class DmsfStateControllerTest < RedmineDmsf::Test::TestCase
end
def test_user_pref_save_member_forbidden
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :user_preferences
post :user_pref_save, params: { id: @project1.id, email_notify: 1, title_format: '%t_%v' }
post "/projects/#{@project1.id}/dmsf/state", params: { email_notify: 1, title_format: '%t_%v' }
assert_response :forbidden
end
def test_user_pref_save_none_member
# Non Member
@request.session[:user_id] = @someone.id
post :user_pref_save, params: { id: @project1.id, email_notify: 1, title_format: '%t_%v' }
post '/login', params: { username: 'someone', password: 'foo' }
post "/projects/#{@project1.id}/dmsf/state", params: { email_notify: 1, title_format: '%t_%v' }
assert_response :forbidden
end
def test_user_pref_save_admin
# Admin - non member
@request.session[:user_id] = @admin.id
post :user_pref_save, params: { id: @project1.id, email_notify: 1, title_format: '%t_%v' }
post '/login', params: { username: 'admin', password: 'admin' }
post "/projects/#{@project1.id}/dmsf/state", params: { email_notify: 1, title_format: '%t_%v' }
assert_redirected_to settings_project_path(@project1, tab: 'dmsf')
assert_not_nil flash[:warning]
assert_equal flash[:warning], l(:user_is_not_project_member)

View File

@ -39,137 +39,151 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
@wfsa2 = DmsfWorkflowStepAssignment.find 2
@revision1 = DmsfFileRevision.find 1
@revision2 = DmsfFileRevision.find 2
@request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1)
@request.session[:user_id] = @jsmith.id
end
def test_authorize_admin
# Admin
@request.session[:user_id] = @admin.id
get :index
post '/login', params: { username: 'admin', password: 'admin' }
get '/dmsf_workflows'
assert_response :success
assert_template 'index'
end
def test_authorize_member
# Non member
@request.session[:user_id] = @someone.id
get :index, params: { project_id: @project1.id }
post '/login', params: { username: 'someone', password: 'foo' }
get '/dmsf_workflows', params: { project_id: @project1.id }
assert_response :forbidden
end
def test_authorize_administration
# Administration
get :index
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/dmsf_workflows'
assert_response :forbidden
end
def test_authorize_projects
# Project
get :index, params: { project_id: @project1.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/dmsf_workflows', params: { project_id: @project1.id }
assert_response :success
assert_template 'index'
end
def test_authorize_manage_workflows_forbidden
# Without permissions
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :manage_workflows
get :index, params: { project_id: @project1.id }
get '/dmsf_workflows', params: { project_id: @project1.id }
assert_response :forbidden
end
def test_authorization_file_approval_ok
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.add_permission! :file_approval
@revision2.dmsf_workflow_id = @wf1.id
get :start, params: { id: @revision2.dmsf_workflow_id, dmsf_file_revision_id: @revision2.id }
get "/dmsf_workflows/#{@revision2.dmsf_workflow_id}/start", params: { dmsf_file_revision_id: @revision2.id }
assert_response :redirect
end
def test_authorization_file_approval_forbidden
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :file_approval
@revision2.dmsf_workflow_id = @wf1.id
get :start, params: { id: @revision2.dmsf_workflow_id, dmsf_file_revision_id: @revision2.id }
get "/dmsf_workflows/#{@revision2.dmsf_workflow_id}/start", params: { dmsf_file_revision_id: @revision2.id }
assert_response :forbidden
end
def test_authorization_no_module
# Without the module
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.add_permission! :file_manipulation
@project1.disable_module! :dmsf
get :index, params: { project_id: @project1.id }
get '/dmsf_workflows', params: { project_id: @project1.id }
assert_response :forbidden
end
def test_index_administration
@request.session[:user_id] = @admin.id
get :index
post '/login', params: { username: 'admin', password: 'admin' }
get '/dmsf_workflows'
assert_response :success
assert_template 'index'
end
def test_index_project
get :index, params: { project_id: @project1.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/dmsf_workflows', params: { project_id: @project1.id }
assert_response :success
assert_template 'index'
end
def test_new
get :new, params: { project_id: @project1.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get '/dmsf_workflows/new', params: { project_id: @project1.id }
assert_response :success
assert_template 'new'
end
def test_lock
put :update, params: { id: @wf1.id, dmsf_workflow: { status: DmsfWorkflow::STATUS_LOCKED } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
patch "/dmsf_workflows/#{@wf1.id}", params: { dmsf_workflow: { status: DmsfWorkflow::STATUS_LOCKED } }
@wf1.reload
assert @wf1.locked?, "#{@wf1.name} status is #{@wf1.status}"
end
def test_unlock
@request.session[:user_id] = @admin.id
put :update, params: { id: @wf3.id, dmsf_workflow: { status: DmsfWorkflow::STATUS_ACTIVE } }
post '/login', params: { username: 'admin', password: 'admin' }
patch "/dmsf_workflows/#{@wf3.id}", params: { dmsf_workflow: { status: DmsfWorkflow::STATUS_ACTIVE } }
@wf3.reload
assert @wf3.active?, "#{@wf3.name} status is #{@wf3.status}"
end
def test_show
get :show, params: { id: @wf1.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/dmsf_workflows/#{@wf1.id}"
assert_response :success
assert_template 'show'
end
def test_create
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfWorkflow.count', +1 do
post :create, params: { dmsf_workflow: { name: 'wf4', project_id: @project1.id } }
post '/dmsf_workflows', params: { dmsf_workflow: { name: 'wf4', project_id: @project1.id } }
end
assert_redirected_to settings_project_path(@project1, tab: 'dmsf_workflow')
end
def test_create_with_the_same_name
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfWorkflow.count', 0 do
post :create, params: { dmsf_workflow: { name: @wf1.name, project_id: @project1.id } }
post '/dmsf_workflows', params: { dmsf_workflow: { name: @wf1.name, project_id: @project1.id } }
end
assert_response :success
assert_select_error(/#{l('activerecord.errors.messages.taken')}$/)
end
def test_update
put :update, params: { id: @wf1.id, dmsf_workflow: { name: 'wf1a' } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
patch "/dmsf_workflows/#{@wf1.id}", params: { dmsf_workflow: { name: 'wf1a' } }
@wf1.reload
assert_equal 'wf1a', @wf1.name
end
def test_destroy
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfWorkflow.count', -1 do
delete :destroy, params: { id: @wf1.id }
delete "/dmsf_workflows/#{@wf1.id}"
end
assert_redirected_to settings_project_path(@project1, tab: 'dmsf_workflow')
assert_equal 0, DmsfWorkflowStep.where(dmsf_workflow_id: @wf1.id).all.count
assert_equal 0, DmsfWorkflowStep.where(dmsf_workflow_id: @wf1.id).all.size
end
def test_add_step
post '/login', params: { username: 'jsmith', password: 'jsmith' }
assert_difference 'DmsfWorkflowStep.count', +1 do
post :add_step, params: { commit: l(:dmsf_or), step: 1, name: '1st step', id: @wf1.id, user_ids: [@someone.id] }
post "/dmsf_workflows/#{@wf1.id}/edit",
params: { commit: l(:dmsf_or), step: 1, name: '1st step', user_ids: [@someone.id] }
end
assert_response :success
ws = DmsfWorkflowStep.order(id: :desc).first
@ -181,9 +195,10 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
end
def test_remove_step
n = DmsfWorkflowStep.where(dmsf_workflow_id: @wf1.id, step: 1).count
post '/login', params: { username: 'jsmith', password: 'jsmith' }
n = DmsfWorkflowStep.where(dmsf_workflow_id: @wf1.id, step: @wfs1.step).count
assert_difference 'DmsfWorkflowStep.count', -n do
delete :remove_step, params: { step: @wfs1.id, id: @wf1.id }
delete "/dmsf_workflows/#{@wf1.id}/edit", params: { step: @wfs1.id }
end
assert_response :redirect
ws = DmsfWorkflowStep.where(dmsf_workflow_id: @wf1.id).order(id: :asc).first
@ -191,7 +206,8 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
end
def test_reorder_steps_to_lower
put :reorder_steps, params: { step: 1, id: @wf1.id, dmsf_workflow: { position: 2 } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
put "/dmsf_workflows/#{@wf1.id}/edit", params: { step: 1, dmsf_workflow: { position: 2 } }
assert_response :success
@wfs1.reload
@wfs2.reload
@ -206,7 +222,8 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
end
def test_reorder_steps_to_lowest
put :reorder_steps, params: { step: 1, id: @wf1.id, dmsf_workflow: { position: 3 } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
put "/dmsf_workflows/#{@wf1.id}/edit", params: { step: 1, dmsf_workflow: { position: 3 } }
assert_response :success
@wfs1.reload
@wfs2.reload
@ -221,7 +238,8 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
end
def test_reorder_steps_to_higher
put :reorder_steps, params: { step: 3, id: @wf1.id, dmsf_workflow: { position: 2 } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
put "/dmsf_workflows/#{@wf1.id}/edit", params: { step: 3, dmsf_workflow: { position: 2 } }
assert_response :success
@wfs1.reload
@wfs2.reload
@ -236,7 +254,8 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
end
def test_reorder_steps_to_highest
put :reorder_steps, params: { step: 3, id: @wf1.id, dmsf_workflow: { position: '1' } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
put "/dmsf_workflows/#{@wf1.id}/edit", params: { step: 3, dmsf_workflow: { position: '1' } }
assert_response :success
@wfs1.reload
@wfs2.reload
@ -251,64 +270,61 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
end
def test_action_approve
post(
:new_action, params: {
commit: l(:button_submit),
id: @wf1.id,
dmsf_workflow_step_assignment_id: @wfsa2.id,
dmsf_file_revision_id: @revision1.id,
step_action: DmsfWorkflowStepAction::ACTION_APPROVE,
user_id: nil,
note: ''
}
)
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/dmsf_workflows/#{@wf1.id}/new_action",
params: {
commit: l(:button_submit),
dmsf_workflow_step_assignment_id: @wfsa2.id,
dmsf_file_revision_id: @revision1.id,
step_action: DmsfWorkflowStepAction::ACTION_APPROVE,
user_id: nil,
note: ''
}
assert_redirected_to dmsf_folder_path(id: @project1)
assert DmsfWorkflowStepAction.exists?(dmsf_workflow_step_assignment_id: @wfsa2.id,
action: DmsfWorkflowStepAction::ACTION_APPROVE)
end
def test_action_reject
post(
:new_action, params: {
commit: l(:button_submit),
id: @wf1.id,
dmsf_workflow_step_assignment_id: @wfsa2.id,
dmsf_file_revision_id: @revision2.id,
step_action: DmsfWorkflowStepAction::ACTION_REJECT,
note: 'Rejected because...'
}
)
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/dmsf_workflows/#{@wf1.id}/new_action",
params: {
commit: l(:button_submit),
dmsf_workflow_step_assignment_id: @wfsa2.id,
dmsf_file_revision_id: @revision2.id,
step_action: DmsfWorkflowStepAction::ACTION_REJECT,
note: 'Rejected because...'
}
assert_response :redirect
assert DmsfWorkflowStepAction.exists?(dmsf_workflow_step_assignment_id: @wfsa2.id,
action: DmsfWorkflowStepAction::ACTION_REJECT)
end
def test_action
get(
:action, xhr: true, params: {
project_id: @project1.id,
id: @wf1.id,
dmsf_workflow_step_assignment_id: @wfsa2.id,
dmsf_file_revision_id: @revision2.id,
title: l(:title_waiting_for_approval)
}
)
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/dmsf_workflows/#{@wf1.id}/action",
xhr: true,
params: {
project_id: @project1.id,
dmsf_workflow_step_assignment_id: @wfsa2.id,
dmsf_file_revision_id: @revision2.id,
title: l(:title_waiting_for_approval)
}
assert_response :success
assert_match(/ajax-modal/, response.body)
assert_template 'action'
end
def test_new_action_delegate
post(
:new_action, params: {
commit: l(:button_submit),
id: @wf1.id,
dmsf_workflow_step_assignment_id: @wfsa2.id,
dmsf_file_revision_id: @revision2.id,
step_action: @admin.id * 10,
note: 'Delegated because...'
}
)
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/dmsf_workflows/#{@wf1.id}/new_action",
params: {
commit: l(:button_submit),
dmsf_workflow_step_assignment_id: @wfsa2.id,
dmsf_file_revision_id: @revision2.id,
step_action: @admin.id * 10,
note: 'Delegated because...'
}
assert_redirected_to dmsf_folder_path(id: @project1)
assert DmsfWorkflowStepAction.exists?(dmsf_workflow_step_assignment_id: @wfsa2.id,
action: DmsfWorkflowStepAction::ACTION_DELEGATE)
@ -317,41 +333,41 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
end
def test_assign
get(
:assign, xhr: true, params: {
project_id: @project1.id,
id: @wf1.id,
dmsf_file_revision_id: @revision1.id,
title: l(:label_dmsf_wokflow_action_assign)
}
)
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/dmsf_workflows/#{@project1.id}/assign",
xhr: true,
params: {
dmsf_file_revision_id: @revision1.id,
title: l(:label_dmsf_wokflow_action_assign)
}
assert_response :success
assert_match(/ajax-modal/, response.body)
assert_template 'assign'
end
def test_start
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@revision2.dmsf_workflow_id = @wf1.id
get :start, params: { id: @revision2.dmsf_workflow_id, dmsf_file_revision_id: @revision2.id }
get "/dmsf_workflows/#{@revision2.dmsf_workflow_id}/start", params: { dmsf_file_revision_id: @revision2.id }
assert_redirected_to dmsf_folder_path(id: @project1)
end
def test_assignment
post(
:assignment, params: {
commit: l(:button_submit),
id: @wf1.id,
dmsf_workflow_id: @wf1.id,
dmsf_file_revision_id: @revision2.id,
action: 'assignment',
project_id: @project1.id
}
)
post '/login', params: { username: 'jsmith', password: 'jsmith' }
post "/dmsf_workflows/#{@project1.id}/assignment",
params: {
commit: l(:button_submit),
id: @wf1.id,
dmsf_workflow_id: @wf1.id,
dmsf_file_revision_id: @revision2.id,
action: 'assignment'
}
assert_response :redirect
end
def test_update_step_name
put :update_step, params: { id: @wf1.id, step: @wfs2.step, dmsf_workflow: { step_name: 'new_name' } }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
put "/dmsf_workflows/#{@wf1.id}/update_step", params: { step: @wfs2.step, dmsf_workflow: { step_name: 'new_name' } }
assert_response :redirect
# All steps in the same step must be renamed
@wfs2.reload
@ -364,66 +380,78 @@ class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase
end
def test_update_step_operators
put :update_step, params: {
id: @wf1,
step: '1',
operator_step: { @wfs1.id.to_s => DmsfWorkflowStep::OPERATOR_OR.to_s },
assignee: { @wfs1.id.to_s => @wfs1.user_id.to_s }
}
post '/login', params: { username: 'jsmith', password: 'jsmith' }
put "/dmsf_workflows/#{@wf1.id}/update_step",
params: {
step: '1',
operator_step: { @wfs1.id.to_s => DmsfWorkflowStep::OPERATOR_OR.to_s },
assignee: { @wfs1.id.to_s => @wfs1.user_id.to_s }
}
assert_response :redirect
@wfs1.reload
assert_equal @wfs1.operator, DmsfWorkflowStep::OPERATOR_OR
end
def test_update_step_assignee
put :update_step, params: {
id: @wf1,
step: '1',
operator_step: { @wfs1.id.to_s => DmsfWorkflowStep::OPERATOR_OR.to_s },
assignee: { @wfs1.id.to_s => @someone.id.to_s }
}
post '/login', params: { username: 'jsmith', password: 'jsmith' }
put "/dmsf_workflows/#{@wf1.id}/update_step",
params: {
step: '1',
operator_step: { @wfs1.id.to_s => DmsfWorkflowStep::OPERATOR_OR.to_s },
assignee: { @wfs1.id.to_s => @someone.id.to_s }
}
assert_response :redirect
@wfs1.reload
assert_equal @someone.id, @wfs1.user_id
end
def test_delete_step
name = @wfs2.name
assert_difference 'DmsfWorkflowStep.count', -1 do
delete :delete_step, params: { id: @wf1, step: @wfs2.id }
post '/login', params: { username: 'jsmith', password: 'jsmith' }
n = DmsfWorkflowStep.where(dmsf_workflow_id: @wf1.id, step: @wfs2.step).count
assert_difference 'DmsfWorkflowStep.count', -n do
delete "/dmsf_workflows/#{@wfs1.id}/edit", params: { step: @wfs2.id }
end
@wfs3.reload
assert_equal @wfs3.name, name
assert_response :redirect
end
def test_log_non_member
@request.session[:user_id] = @someone.id
get :log, params: { id: @wf1.id, project_id: @project1.id, dmsf_file_id: @file1.id, format: 'js' }, xhr: true
post '/login', params: { username: 'someone', password: 'foo' }
get "/dmsf_workflows/#{@wf1.id}/log",
params: { project_id: @project1.id, dmsf_file_id: @file1.id, format: 'js' },
xhr: true
assert_response :forbidden
end
def test_log_member_local_wf
get :log, params: { id: @wf1.id, project_id: @project1.id, dmsf_file_id: @file1.id, format: 'js' }, xhr: true
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/dmsf_workflows/#{@wf1.id}/log",
params: { project_id: @project1.id, dmsf_file_id: @file1.id, format: 'js' },
xhr: true
assert_response :success
assert_template :log
end
def test_log_member_global_wf
get :log, params: { id: @wf3.id, project_id: @project1.id, dmsf_file_id: @file1.id, format: 'js' }, xhr: true
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/dmsf_workflows/#{@wf3.id}/log",
params: { project_id: @project1.id, dmsf_file_id: @file1.id, format: 'js' },
xhr: true
assert_response :success
assert_template :log
end
def test_log_admin
@request.session[:user_id] = @admin.id
get :log, params: { id: @wf1.id, project_id: @project1.id, dmsf_file_id: @file1.id, format: 'js' }, xhr: true
post '/login', params: { username: 'admin', password: 'admin' }
get "/dmsf_workflows/#{@wf1.id}/log",
params: { project_id: @project1.id, dmsf_file_id: @file1.id, format: 'js' },
xhr: true
assert_response :success
assert_template :log
end
def test_new_step
get :new_step, params: { id: @wf1.id, format: 'js' }, xhr: true
post '/login', params: { username: 'jsmith', password: 'jsmith' }
get "/dmsf_workflows/#{@wf1.id}/new_step", params: { format: 'js' }, xhr: true
assert_response :success
assert_template :new_step
end

View File

@ -29,7 +29,7 @@ class IssuesControllerTest < RedmineDmsf::Test::TestCase
def setup
super
@issue1 = Issue.find 1
@request.session[:user_id] = @jsmith.id
post '/login', params: { username: 'jsmith', password: 'jsmith' }
end
def test_put_update_with_project_change
@ -41,11 +41,8 @@ class IssuesControllerTest < RedmineDmsf::Test::TestCase
main_system_folder = @issue1.main_system_folder
assert main_system_folder
assert_equal @project1.id, main_system_folder.project_id
put :update,
params: {
id: @issue1.id,
issue: { project_id: @project2.id, tracker_id: '1', priority_id: '6', category_id: '3' }
}
patch "/issues/#{@issue1.id}",
params: { issue: { project_id: @project2.id, tracker_id: '1', priority_id: '6', category_id: '3' } }
assert_redirected_to action: 'show', id: @issue1.id
@issue1.reload
assert_equal @project2.id, @issue1.project.id

View File

@ -27,16 +27,12 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
fixtures :user_preferences, :dmsf_workflows, :dmsf_workflow_steps, :dmsf_workflow_step_assignments,
:dmsf_workflow_step_actions, :dmsf_folders, :dmsf_files, :dmsf_file_revisions, :dmsf_locks
def setup
super
@request.session[:user_id] = @jsmith.id
end
def test_page_with_open_approvals_one_approval
post '/login', params: { username: 'jsmith', password: 'jsmith' }
DmsfFileRevision.where(id: 5).delete_all
@jsmith.pref[:my_page_layout] = { 'top' => ['open_approvals'] }
@jsmith.pref.save!
get :page
get '/my/page'
assert_response :success
return if defined?(EasyExtensions)
@ -46,9 +42,10 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
end
def test_page_with_open_approvals_no_approval
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@jsmith.pref[:my_page_layout] = { 'top' => ['open_approvals'] }
@jsmith.pref.save!
get :page
get '/my/page'
assert_response :success
return if defined?(EasyExtensions)
@ -58,10 +55,11 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
end
def test_page_with_open_locked_documents
post '/login', params: { username: 'admin', password: 'admin' }
@request.session[:user_id] = @admin.id
@admin.pref[:my_page_layout] = { 'top' => ['locked_documents'] }
@admin.pref.save!
get :page
get '/my/page'
assert_response :success
return if defined?(EasyExtensions)
@ -73,12 +71,13 @@ class MyControllerTest < RedmineDmsf::Test::TestCase
end
def test_page_with_open_watched_documents
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@jsmith.pref[:my_page_layout] = { 'top' => ['watched_documents'] }
@jsmith.pref.save!
@file1.add_watcher @jsmith
@folder1.add_watcher @jsmith
@project1.add_watcher @jsmith
get :page
get '/my/page'
return if defined?(EasyExtensions)
assert_response :success

View File

@ -25,10 +25,10 @@ class ProjectsControllerTest < RedmineDmsf::Test::TestCase
include Redmine::I18n
def test_settings_dms_member
@request.session[:user_id] = @jsmith.id
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.add_permission! :user_preferences
with_settings plugin_redmine_dmsf: { 'dmsf_act_as_attachable' => '1' } do
get :settings, params: { id: @project1.id, tab: 'dmsf' }
get "/projects/#{@project1.id}/settings", params: { tab: 'dmsf' }
end
assert_response :success
assert_select 'fieldset legend', text: l(:link_user_preferences)
@ -36,33 +36,33 @@ class ProjectsControllerTest < RedmineDmsf::Test::TestCase
end
def test_settings_dms_member_no_permission
@request.session[:user_id] = @jsmith.id
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.remove_permission! :user_preferences
get :settings, params: { id: @project1.id, tab: 'dmsf' }
get "/projects/#{@project1.id}/settings", params: { tab: 'dmsf' }
assert_response :success
assert_select 'fieldset legend', text: l(:link_user_preferences), count: 0
end
def test_settings_dms_non_member
@request.session[:user_id] = @admin.id
get :settings, params: { id: @project1.id, tab: 'dmsf' }
post '/login', params: { username: 'admin', password: 'admin' }
get "/projects/#{@project1.id}/settings", params: { tab: 'dmsf' }
assert_response :success
assert_select 'fieldset legend', text: l(:link_user_preferences), count: 0
end
def test_settings_dms_member_no_act_as_attachments
@request.session[:user_id] = @jsmith.id
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.add_permission! :user_preferences
get :settings, params: { id: @project1.id, tab: 'dmsf' }
get "/projects/#{@project1.id}/settings", params: { tab: 'dmsf' }
assert_response :success
assert_select 'label', text: l(:label_act_as_attachable), count: 0
end
def test_legacy_notifications
@request.session[:user_id] = @jsmith.id
post '/login', params: { username: 'jsmith', password: 'jsmith' }
@role_manager.add_permission! :user_preferences
with_settings notified_events: ['dmsf_legacy_notifications'] do
get :settings, params: { id: @project1.id, tab: 'dmsf' }
get "/projects/#{@project1.id}/settings", params: { tab: 'dmsf' }
assert_response :success
assert_select 'label', text: l(:label_notifications)
end

View File

@ -4,7 +4,7 @@
#
# Copyright © 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright © 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright © 2011-15 Karel Pičman <karel.picman@kontron.com>
# Copyright © 2011-23 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -23,7 +23,7 @@
module RedmineDmsf
module Test
# Test case
class TestCase < ActionController::TestCase
class TestCase < ActionDispatch::IntegrationTest
fixtures :users, :email_addresses, :projects, :roles, :members, :member_roles
# Allow us to override the fixtures method to implement fixtures for our plugin.

View File

@ -32,7 +32,7 @@ class CustomFieldDmsfFileFormatTest < RedmineDmsf::Test::UnitTest
def test_possible_values_options
n = @issue.project.dmsf_files.visible.all.size
DmsfFolder.visible(false).where(project_id: @issue.project.id).each do |f|
DmsfFolder.visible(false).where(project_id: @issue.project.id).find_each do |f|
n += f.dmsf_files.visible.all.size
end
assert_equal n, @field.possible_values_options(@issue).size

View File

@ -35,7 +35,7 @@ class DmsfMacrosTest < RedmineDmsf::Test::HelperTest
def setup
super
User.current = @jsmith
default_url_options[:host] = 'http://example.com'
default_url_options[:host] = 'www.example.com'
@file1 = DmsfFile.find_by(id: 1)
@file6 = DmsfFile.find_by(id: 6) # video
@file7 = DmsfFile.find_by(id: 7) # image
@ -361,7 +361,7 @@ class DmsfMacrosTest < RedmineDmsf::Test::HelperTest
link = link_to(img, url, target: '_blank',
rel: 'noopener',
title: h(@file7.last_revision.try(:tooltip)),
'data-downloadurl': 'image/gif:test.gif:http://example.com/dmsf/files/7/test.gif')
'data-downloadurl': 'image/gif:test.gif:http://www.example.com/dmsf/files/7/test.gif')
assert_equal content_tag(:p, link + link), text
end
@ -395,7 +395,7 @@ class DmsfMacrosTest < RedmineDmsf::Test::HelperTest
link = link_to(img, url, target: '_blank',
rel: 'noopener',
title: h(@file7.last_revision.try(:tooltip)),
'data-downloadurl': 'image/gif:test.gif:http://example.com/dmsf/files/7/test.gif')
'data-downloadurl': 'image/gif:test.gif:http://www.example.com/dmsf/files/7/test.gif')
assert_equal content_tag(:p, link), text
width = '640'
text = textilizable("{{dmsftn(#{@file7.id}, width=#{width})}}")