diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 211f4d4b..af06b2f7 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -256,21 +256,21 @@ class DmsfController < ApplicationController {:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder.folder} end - def assign - end - - def assignment - revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id] - if revision - revision.set_workflow(params[:dmsf_workflow_id], params[:action]) - revision.assign_workflow(params[:dmsf_workflow_id]) - if request.post? && revision.save - flash[:notice] = l(:notice_successful_create) - end - end - redirect_to params[:current] ? params[:current] : - {:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder.folder} - end +# def assign +# end +# +# def assignment +# revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id] +# if revision +# revision.set_workflow(params[:dmsf_workflow_id], params[:action]) +# revision.assign_workflow(params[:dmsf_workflow_id]) +# if request.post? && revision.save +# flash[:notice] = l(:notice_successful_create) +# end +# end +# redirect_to params[:current] ? params[:current] : +# {:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder.folder} +# end private diff --git a/app/controllers/dmsf_files_controller.rb b/app/controllers/dmsf_files_controller.rb index 6b0187eb..6b107d33 100644 --- a/app/controllers/dmsf_files_controller.rb +++ b/app/controllers/dmsf_files_controller.rb @@ -97,7 +97,7 @@ class DmsfFilesController < ApplicationController @revision.disk_filename = @revision.new_storage_filename @revision.mime_type = Redmine::MimeType.of(file_upload.original_filename) end - @revision.set_workflow(params[:dmsf_workflow_id], params[:commit]) + #@revision.set_workflow(params[:dmsf_workflow_id], params[:commit]) @file.name = @revision.name @file.folder = @revision.folder diff --git a/app/controllers/dmsf_upload_controller.rb b/app/controllers/dmsf_upload_controller.rb index 7c817886..019c3f2b 100644 --- a/app/controllers/dmsf_upload_controller.rb +++ b/app/controllers/dmsf_upload_controller.rb @@ -122,7 +122,7 @@ class DmsfUploadController < ApplicationController new_revision.description = commited_file["description"] new_revision.comment = commited_file["comment"] new_revision.increase_version(commited_file["version"].to_i, true) - new_revision.set_workflow(commited_file[:dmsf_workflow_id], nil) + #new_revision.set_workflow(commited_file[:dmsf_workflow_id], nil) new_revision.mime_type = Redmine::MimeType.of(new_revision.name) new_revision.size = File.size(commited_disk_filepath) diff --git a/app/controllers/dmsf_workflows_controller.rb b/app/controllers/dmsf_workflows_controller.rb index d85d993c..d7a128cf 100644 --- a/app/controllers/dmsf_workflows_controller.rb +++ b/app/controllers/dmsf_workflows_controller.rb @@ -22,12 +22,13 @@ class DmsfWorkflowsController < ApplicationController before_filter :find_workflow, :except => [:create, :new, :index, :assign, :assignment] before_filter :find_project, :except => [:start] - before_filter :authorize_global + before_filter :authorize_global + before_filter :authorize_custom def index if @project @workflow_pages, @workflows = paginate DmsfWorkflow.where(:project_id => @project.id), :per_page => 25 - else + else @workflow_pages, @workflows = paginate DmsfWorkflow.where(:project_id => nil), :per_page => 25 end end @@ -130,7 +131,7 @@ class DmsfWorkflowsController < ApplicationController end def add_step - if request.post? + if request.post? users = User.find_all_by_id(params[:user_ids]) if params[:step] == '0' if @workflow.steps.count > 0 @@ -142,14 +143,13 @@ class DmsfWorkflowsController < ApplicationController step = params[:step].to_i end operator = (params[:commit] == l(:dmsf_and)) ? DmsfWorkflowStep::OPERATOR_AND : DmsfWorkflowStep::OPERATOR_OR - users.each do |user| + users.each do |user| @workflow.dmsf_workflow_steps << DmsfWorkflowStep.new( :dmsf_workflow_id => @workflow.id, :step => step, :user_id => user.id, :operator => operator) - end - @workflow.save + end end respond_to do |format| format.html @@ -157,17 +157,19 @@ class DmsfWorkflowsController < ApplicationController end def remove_step - if request.delete? + if request.delete? DmsfWorkflowStep.where(:dmsf_workflow_id => @workflow.id, :step => params[:step]).each do |ws| @workflow.dmsf_workflow_steps.delete(ws) - end + end @workflow.dmsf_workflow_steps.each do |ws| n = ws.step.to_i if n > params[:step].to_i ws.step = n - 1 - ws.save + unless ws.save + flash[:error] = l(:notice_cannot_renumber_steps) + end end - end + end end respond_to do |format| format.html @@ -176,7 +178,9 @@ class DmsfWorkflowsController < ApplicationController def reorder_steps if request.put? - @workflow.reorder_steps params[:step].to_i, params[:workflow_step][:move_to] + unless @workflow.reorder_steps(params[:step].to_i, params[:workflow_step][:move_to]) + flash[:error] = l(:notice_cannot_renumber_steps) + end end respond_to do |format| format.html @@ -187,8 +191,12 @@ class DmsfWorkflowsController < ApplicationController revision = DmsfFileRevision.find_by_id(params[:dmsf_file_revision_id]) if revision revision.set_workflow(@workflow.id, params[:action]) - if request.post? && revision.save - flash[:notice] = l(:notice_successful_update) + if request.post? + if revision.save + flash[:notice] = l(:notice_successful_update) + else + flash[:error] = l(:notice_cannot_start_workflow) + end end end redirect_to :back @@ -205,12 +213,16 @@ class DmsfWorkflowsController < ApplicationController @project = @workflow.project elsif params[:project_id].present? @project = Project.find_by_id params[:project_id] - end + end end def workflows_layout find_workflow find_project @project ? 'base' : 'admin' + end + + def authorize_custom + require_admin unless @project end -end +end \ No newline at end of file diff --git a/app/helpers/dmsf_workflows_helper.rb b/app/helpers/dmsf_workflows_helper.rb index 690e109d..896dfbe0 100644 --- a/app/helpers/dmsf_workflows_helper.rb +++ b/app/helpers/dmsf_workflows_helper.rb @@ -19,7 +19,7 @@ module DmsfWorkflowsHelper def render_principals_for_new_dmsf_workflow_users(workflow, dmsf_workflow_step_assignment_id, dmsf_file_revision_id) - scope = workflow.delegates(params[:q], dmsf_workflow_step_assignment_id, dmsf_file_revision_id, nil) + scope = workflow.delegates(params[:q], dmsf_workflow_step_assignment_id, dmsf_file_revision_id) principal_count = scope.count principal_pages = Redmine::Pagination::Paginator.new principal_count, 10, params['page'] principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index c9afb538..bae02049 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -156,12 +156,11 @@ class DmsfFileRevision < ActiveRecord::Base return new_revision end - def workflow_str(name) + def workflow_str(name) + str = '' if name && dmsf_workflow_id wf = DmsfWorkflow.find_by_id(dmsf_workflow_id) - str = "#{wf.name} - " if wf - else - str = '' + str = "#{wf.name} - " if wf end case workflow when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL @@ -177,28 +176,22 @@ class DmsfFileRevision < ActiveRecord::Base end end - def set_workflow(dmsf_workflow_id, commit) - if User.current.allowed_to?(:file_approval, self.file.project) - unless dmsf_workflow_id.blank? - self.dmsf_workflow_id = dmsf_workflow_id - if commit == 'start' - self.workflow = DmsfWorkflow::STATE_WAITING_FOR_APPROVAL - self.dmsf_workflow_started_by = User.current.id if User.current - self.dmsf_workflow_started_at = DateTime.now - else - self.workflow = DmsfWorkflow::STATE_DRAFT - self.dmsf_workflow_assigned_by = User.current.id if User.current - self.dmsf_workflow_assigned_at = DateTime.now - end - end - end + def set_workflow(dmsf_workflow_id, commit) + self.dmsf_workflow_id = dmsf_workflow_id + if commit == 'start' + self.workflow = DmsfWorkflow::STATE_WAITING_FOR_APPROVAL + self.dmsf_workflow_started_by = User.current.id if User.current + self.dmsf_workflow_started_at = DateTime.now + else + self.workflow = DmsfWorkflow::STATE_DRAFT + self.dmsf_workflow_assigned_by = User.current.id if User.current + self.dmsf_workflow_assigned_at = DateTime.now + end end - def assign_workflow(dmsf_workflow_id) - if User.current.allowed_to?(:file_approval, self.file.project) - wf = DmsfWorkflow.find_by_id(dmsf_workflow_id) - wf.assign(self.id) if wf && self.id - end + def assign_workflow(dmsf_workflow_id) + wf = DmsfWorkflow.find_by_id(dmsf_workflow_id) + wf.assign(self.id) if wf && self.id end def increase_version(version_to_increase, new_content) @@ -248,7 +241,7 @@ class DmsfFileRevision < ActiveRecord::Base end # Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields - def available_custom_fields + def available_custom_fields search_project = nil if self.project.present? search_project = self.project diff --git a/app/models/dmsf_workflow.rb b/app/models/dmsf_workflow.rb index 54d573d5..875d37be 100644 --- a/app/models/dmsf_workflow.rb +++ b/app/models/dmsf_workflow.rb @@ -39,37 +39,17 @@ class DmsfWorkflow < ActiveRecord::Base def to_s name - end - - def approvals(step) - wa = Array.new - dmsf_workflow_steps.each do |s| - if s.step == step - wa << s - end - end - wa - end - - def steps - ws = Array.new - dmsf_workflow_steps.each do |s| - unless ws.include? s.step - ws << s.step - end - end - ws - end + end def reorder_steps(step, move_to) case move_to when 'highest' unless step == 1 dmsf_workflow_steps.each do |ws| - if ws.step < step - ws.update_attribute('step', ws.step + 1) + if ws.step < step + return false unless ws.update_attribute('step', ws.step + 1) elsif ws.step == step - ws.update_attribute('step', 1) + return false unless ws.update_attribute('step', 1) end end end @@ -77,42 +57,41 @@ class DmsfWorkflow < ActiveRecord::Base unless step == 1 dmsf_workflow_steps.each do |ws| if ws.step == step - 1 - ws.update_attribute('step', step) + return false unless ws.update_attribute('step', step) elsif ws.step == step - ws.update_attribute('step', step - 1) + return false unless ws.update_attribute('step', step - 1) end end end when 'lower' - unless step == steps.count + unless step == dmsf_workflow_steps.collect{|s| s.step}.uniq.count dmsf_workflow_steps.each do |ws| if ws.step == step + 1 - ws.update_attribute('step', step) + return false unless ws.update_attribute('step', step) elsif ws.step == step - ws.update_attribute('step', step + 1) + return false unless ws.update_attribute('step', step + 1) end end end when 'lowest' - size = steps.count + size = dmsf_workflow_steps.collect{|s| s.step}.uniq.count unless step == size dmsf_workflow_steps.each do |ws| if ws.step > step - ws.update_attribute('step', ws.step - 1) + return false unless ws.update_attribute('step', ws.step - 1) elsif ws.step == step - ws.update_attribute('step', size) + return false unless ws.update_attribute('step', size) end end end - end + end + return reload end - def delegates(q, dmsf_workflow_step_assignment_id, dmsf_file_revision_id, project_id) - if project_id - sql = ['id IN (SELECT user_id FROM members WHERE project_id = ?', project_id] - elsif dmsf_workflow_step_assignment_id && dmsf_file_revision_id + def delegates(q, dmsf_workflow_step_assignment_id, dmsf_file_revision_id) + if dmsf_workflow_step_assignment_id && dmsf_file_revision_id sql = [ - 'id NOT IN (SELECT a.user_id FROM dmsf_workflow_step_assignments a WHERE id = ?) AND id IN (SELECT m.user_id FROM members m JOIN dmsf_file_revisions r ON m.project_id = r.project_id WHERE r.id = ?)', + 'id NOT IN (SELECT a.user_id FROM dmsf_workflow_step_assignments a WHERE id = ?) AND id IN (SELECT m.user_id FROM members m JOIN dmsf_files f ON f.project_id = m.project_id JOIN dmsf_file_revisions r ON r.dmsf_file_id = f.id WHERE r.id = ?)', dmsf_workflow_step_assignment_id, dmsf_file_revision_id] else @@ -127,12 +106,27 @@ class DmsfWorkflow < ActiveRecord::Base end def next_assignments(dmsf_file_revision_id) - self.dmsf_workflow_steps.each do |step| - unless step.finished?(dmsf_file_revision_id) - return step.next_assignments(dmsf_file_revision_id) + results = Array.new + self.dmsf_workflow_steps.each do |step| + break unless results.empty? || results[0].step.step == step.step + step.dmsf_workflow_step_assignments.each do |assignment| + if assignment.dmsf_file_revision_id == dmsf_file_revision_id + if assignment.dmsf_workflow_step_actions.empty? + results << assignment + next + end + add = true + assignment.dmsf_workflow_step_actions.each do |action| + if action.is_finished? + add = false + break + end + end + results << assignment if add + end end - end - return nil + end + results end def self.assignments_to_users_str(assignments) @@ -157,27 +151,29 @@ class DmsfWorkflow < ActiveRecord::Base end end - def try_finish(dmsf_file_revision_id, action, user_id) - res = nil + def try_finish(dmsf_file_revision_id, action, user_id) + revision = DmsfFileRevision.find_by_id dmsf_file_revision_id case action.action when DmsfWorkflowStepAction::ACTION_APPROVE self.dmsf_workflow_steps.each do |step| - res = step.result dmsf_file_revision_id - unless step.finished? dmsf_file_revision_id - return - end - end + step.dmsf_workflow_step_assignments.each do |assignment| + if assignment.dmsf_file_revision_id == dmsf_file_revision_id.to_i + if assignment.dmsf_workflow_step_actions.empty? + return + end + assignment.dmsf_workflow_step_actions.each do |act| + return unless act.is_finished? + end + end + end + end + # TODO: update_attribute doesn't wotk in unit tests because of "Couldn't find Project with id=0" error + revision.update_attribute(:workflow, DmsfWorkflow::STATE_APPROVED) if revision when DmsfWorkflowStepAction::ACTION_REJECT - res = DmsfWorkflow::STATE_REJECTED + revision.update_attribute(:workflow, DmsfWorkflow::STATE_REJECTED) if revision when DmsfWorkflowStepAction::ACTION_DELEGATE assignment = DmsfWorkflowStepAssignment.find_by_id(action.dmsf_workflow_step_assignment_id) assignment.update_attribute(:user_id, user_id) if assignment end - - if res - revision = DmsfFileRevision.find_by_id dmsf_file_revision_id - revision.update_attribute(:workflow, res) if revision - end end - end \ No newline at end of file diff --git a/app/models/dmsf_workflow_step.rb b/app/models/dmsf_workflow_step.rb index 2593fea4..351e1635 100644 --- a/app/models/dmsf_workflow_step.rb +++ b/app/models/dmsf_workflow_step.rb @@ -44,53 +44,5 @@ class DmsfWorkflowStep < ActiveRecord::Base :user_id => user_id, :dmsf_file_revision_id => dmsf_file_revision_id) step_assignment.save - end - - def finished?(dmsf_file_revision_id) - res = self.result(dmsf_file_revision_id) - res == DmsfWorkflow::STATE_APPROVED || res == DmsfWorkflow::STATE_REJECTED - end - - def result(dmsf_file_revision_id) - assignments = DmsfWorkflowStepAssignment.where( - :dmsf_workflow_step_id => self.id, :dmsf_file_revision_id => dmsf_file_revision_id).all - assignments.each do |assignment| - actions = DmsfWorkflowStepAction.where( - :dmsf_workflow_step_assignment_id => assignment.id).all - if actions.empty? - return - end - actions.each do |action| - if DmsfWorkflowStepAction.is_finished?(action.action) - case action.action - when DmsfWorkflowStepAction::ACTION_APPROVE - return DmsfWorkflow::STATE_APPROVED - when DmsfWorkflowStepAction::ACTION_REJECT - return DmsfWorkflow::STATE_REJECTED - else - return - end - end - end - end - end - - def next_assignments(dmsf_file_revision_id) - results = Array.new - assignments = DmsfWorkflowStepAssignment.where( - :dmsf_workflow_step_id => self.id, - :dmsf_file_revision_id => dmsf_file_revision_id) - assignments.each do |assignment| - add = true - assignment.dmsf_workflow_step_actions.each do |action| - if action.is_finished? - add = false - break - end - end - results << assignment if add - end - return results - end - + end end \ No newline at end of file diff --git a/app/models/dmsf_workflow_step_assignment.rb b/app/models/dmsf_workflow_step_assignment.rb index 7dd52f12..32c4e370 100644 --- a/app/models/dmsf_workflow_step_assignment.rb +++ b/app/models/dmsf_workflow_step_assignment.rb @@ -19,9 +19,12 @@ class DmsfWorkflowStepAssignment < ActiveRecord::Base belongs_to :dmsf_workflow_step - has_many :dmsf_workflow_step_actions, :dependent => :destroy - has_one :dmsf_workflow_step_assignment + has_many :dmsf_workflow_step_actions, :dependent => :destroy validates :dmsf_workflow_step_id, :presence => true validates :dmsf_file_revision_id, :presence => true + + def step + DmsfWorkflowStep.find_by_id self.dmsf_workflow_step_id + end end \ No newline at end of file diff --git a/app/views/dmsf_workflows/_action.html.erb b/app/views/dmsf_workflows/_action.html.erb index 84f99413..e9f7bded 100644 --- a/app/views/dmsf_workflows/_action.html.erb +++ b/app/views/dmsf_workflows/_action.html.erb @@ -17,7 +17,7 @@ <%= label_tag 'delegate', l(:label_dmsf_wokflow_action_delegate) %>
<%= text_field_tag 'user_search', nil %> <%= javascript_tag "observeSearchfield('user_search', 'users_for_delegate', '#{ escape_javascript autocomplete_for_user_dmsf_workflow_path(@workflow, :dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id], :dmsf_file_revision_id => params[:dmsf_file_revision_id]) }')" %> - <%= content_tag('div', principals_radio_button_tags('step_action', @workflow.delegates(nil, params[:dmsf_workflow_step_assignment_id], params[:dmsf_file_revision_id], nil)), :id => 'users_for_delegate') %> + <%= content_tag('div', principals_radio_button_tags('step_action', @workflow.delegates(nil, params[:dmsf_workflow_step_assignment_id], params[:dmsf_file_revision_id])), :id => 'users_for_delegate') %>

diff --git a/app/views/dmsf_workflows/_steps.html.erb b/app/views/dmsf_workflows/_steps.html.erb index 2d57c895..550f312b 100644 --- a/app/views/dmsf_workflows/_steps.html.erb +++ b/app/views/dmsf_workflows/_steps.html.erb @@ -20,31 +20,32 @@

-<% if @workflow.steps.any? %> - +<% steps = @workflow.dmsf_workflow_steps.collect{|s| s.step}.uniq %> +<% if steps.any? %> +
- - + + - - <% @workflow.steps.each do |step| %> - - - + <% steps.each do |i|%> + + + - + <% end; reset_cycle %> @@ -70,7 +71,7 @@

<%= l(:label_dmsf_workflow_step) %> <%= select_tag 'step', - dmsf_workflow_steps_options_for_select(@workflow.steps), + dmsf_workflow_steps_options_for_select(steps), :id => 'selected_step', :style => "width:100px" %>

<%= submit_tag l(:dmsf_and) %> <%= submit_tag l(:dmsf_or) %>

diff --git a/assets/stylesheets/dmsf.css b/assets/stylesheets/dmsf.css index 13e64c1c..6b647302 100644 --- a/assets/stylesheets/dmsf.css +++ b/assets/stylesheets/dmsf.css @@ -260,10 +260,19 @@ table.list td.note { width: 30%; } -table.list td.step, td.date { +table.list td.date { text-align: center; } +table.list td.reorder { + width: 15%; +} + +table.list td.step { + text-align: center; + width: 16px; +} + .log_header_box{ padding:6px; margin-bottom: 10px; diff --git a/config/locales/en.yml b/config/locales/en.yml index 7f4d56a0..f345e9b1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -210,6 +210,8 @@ en: error_unable_delete_dmsf_workflow: 'Unable to delete the workflow' error_empty_note: "The note can't be empty" error_workflow_assign: 'An error occured while assigning' + error_cannot_start_workflow: "Workflow can't be started" + error_cannot_renumber_steps: "Steps can't be renumbered" label_dmsf_workflow_new: 'New approval workflow' label_dmsf_workflow: 'Approval workflow' label_dmsf_workflow_plural: 'Approval workflows' @@ -236,6 +238,4 @@ en: dmsf_new_step: New step message_dmsf_wokflow_note: Your note... info_revision: "r%{rev}" - link_workflow: Workflow - - \ No newline at end of file + link_workflow: Workflow \ No newline at end of file diff --git a/init.rb b/init.rb index 23f74632..fccca951 100644 --- a/init.rb +++ b/init.rb @@ -57,7 +57,7 @@ Redmine::Plugin.register :redmine_dmsf do :dmsf_upload => [:upload_files, :upload_file, :commit_files]} permission :file_approval, {:dmsf_files => [:delete_revision, :notify_activate, :notify_deactivate], :dmsf => [:notify_activate, :notify_deactivate], - :dmsf_workflows => [:new, :create, :destroy, :edit, :add_step, :remove_step, :reorder_steps, :update, :start, :assign, :assignment, :action, :new_action, :log]} + :dmsf_workflows => [:index, :new, :create, :destroy, :edit, :add_step, :remove_step, :reorder_steps, :update, :start, :assign, :assignment, :action, :new_action, :log]} permission :force_file_unlock, {} end diff --git a/test/fixtures/dmsf_file_revisions.yml b/test/fixtures/dmsf_file_revisions.yml index 9d5152c9..f8fe1540 100644 --- a/test/fixtures/dmsf_file_revisions.yml +++ b/test/fixtures/dmsf_file_revisions.yml @@ -1,5 +1,6 @@ --- dmsf_file_revisions_001: + id: 1 dmsf_file_id: 1 source_dmsf_file_revision_id: NULL name: "test.txt" @@ -19,6 +20,7 @@ dmsf_file_revisions_001: #revision for file on non-enabled project dmsf_file_revisions_002: + id: 2 dmsf_file_id: 2 source_dmsf_file_revision_id: NULL name: "test.txt" @@ -38,6 +40,7 @@ dmsf_file_revisions_002: #revision for deleted file on dmsf-enabled project dmsf_file_revisions_003: + id: 3 dmsf_file_id: 3 source_dmsf_file_revision_id: NULL name: "deleted.txt" @@ -54,4 +57,3 @@ dmsf_file_revisions_003: deleted: 1 deleted_by_user_id: 1 user_id: 1 - diff --git a/test/fixtures/dmsf_workflow_step_actions.yml b/test/fixtures/dmsf_workflow_step_actions.yml index f3058e6d..b23703be 100644 --- a/test/fixtures/dmsf_workflow_step_actions.yml +++ b/test/fixtures/dmsf_workflow_step_actions.yml @@ -9,14 +9,28 @@ wfsac1: wfsac2: id: 2 - dmsf_workflow_step_assignment_id: 1 - action: 2 - note: 'Rejection' - created_at: '2013-05-03 10:45:36' + dmsf_workflow_step_assignment_id: 5 + action: 1 + note: 'Approval' + created_at: '2013-05-03 10:45:35' wfsac3: id: 3 - dmsf_workflow_step_assignment_id: 1 - action: 3 - note: 'Delegation' - created_at: '2013-05-03 10:45:37' \ No newline at end of file + dmsf_workflow_step_assignment_id: 6 + action: 1 + note: 'Approval' + created_at: '2013-05-03 10:45:35' + +wfsac4: + id: 4 + dmsf_workflow_step_assignment_id: 7 + action: 1 + note: 'Approval' + created_at: '2013-05-03 10:45:35' + +wfsac5: + id: 5 + dmsf_workflow_step_assignment_id: 8 + action: 1 + note: 'Approval' + created_at: '2013-05-03 10:45:35' \ No newline at end of file diff --git a/test/fixtures/dmsf_workflow_step_assignments.yml b/test/fixtures/dmsf_workflow_step_assignments.yml index 0401354f..9db487ac 100644 --- a/test/fixtures/dmsf_workflow_step_assignments.yml +++ b/test/fixtures/dmsf_workflow_step_assignments.yml @@ -3,4 +3,46 @@ wfsa1: id: 1 dmsf_workflow_step_id: 1 user_id: 1 - dmsf_file_revision_id: 2 \ No newline at end of file + dmsf_file_revision_id: 2 + +wfsa2: + id: 2 + dmsf_workflow_step_id: 1 + user_id: 2 + dmsf_file_revision_id: 2 + +wfsa3: + id: 3 + dmsf_workflow_step_id: 2 + user_id: 1 + dmsf_file_revision_id: 2 + +wfsa4: + id: 4 + dmsf_workflow_step_id: 2 + user_id: 2 + dmsf_file_revision_id: 2 + +wfsa5: + id: 5 + dmsf_workflow_step_id: 1 + user_id: 1 + dmsf_file_revision_id: 1 + +wfsa6: + id: 6 + dmsf_workflow_step_id: 1 + user_id: 2 + dmsf_file_revision_id: 1 + +wfsa7: + id: 7 + dmsf_workflow_step_id: 2 + user_id: 1 + dmsf_file_revision_id: 1 + +wfsa8: + id: 8 + dmsf_workflow_step_id: 2 + user_id: 2 + dmsf_file_revision_id: 1 \ No newline at end of file diff --git a/test/fixtures/dmsf_workflow_steps.yml b/test/fixtures/dmsf_workflow_steps.yml index c315cb90..5f781121 100644 --- a/test/fixtures/dmsf_workflow_steps.yml +++ b/test/fixtures/dmsf_workflow_steps.yml @@ -1,11 +1,4 @@ --- -wfs1: - id: 1 - dmsf_workflow_id: 1 - step: 1 - user_id: 1 - operator: 1 - wfs2: id: 2 dmsf_workflow_id: 1 @@ -13,9 +6,30 @@ wfs2: user_id: 2 operator: 1 +wfs1: + id: 1 + dmsf_workflow_id: 1 + step: 1 + user_id: 1 + operator: 0 + wfs3: id: 3 dmsf_workflow_id: 1 - step: 3 + step: 2 user_id: 1 operator: 1 + +wfs4: + id: 4 + dmsf_workflow_id: 1 + step: 1 + user_id: 2 + operator: 1 + +wfs5: + id: 5 + dmsf_workflow_id: 1 + step: 3 + user_id: 2 + operator: 1 diff --git a/test/fixtures/dmsf_workflows.yml b/test/fixtures/dmsf_workflows.yml index f8d8ddeb..bb1d53fb 100644 --- a/test/fixtures/dmsf_workflows.yml +++ b/test/fixtures/dmsf_workflows.yml @@ -2,6 +2,7 @@ wf1: id: 1 name: wf1 + project_id: 5 wf2: id: 2 diff --git a/test/functional/dmsf_workflow_controller_test.rb b/test/functional/dmsf_workflow_controller_test.rb index aa05e62d..56fa47f4 100644 --- a/test/functional/dmsf_workflow_controller_test.rb +++ b/test/functional/dmsf_workflow_controller_test.rb @@ -1,171 +1,279 @@ require File.expand_path('../../test_helper', __FILE__) class DmsfWorkflowsControllerTest < RedmineDmsf::Test::TestCase + include Redmine::I18n + fixtures :users, :dmsf_workflows, :dmsf_workflow_steps, :projects, :roles, :members, :member_roles def setup - User.current = nil - + @user_admin = User.find_by_id 1 # Redmine admin + @user_member = User.find_by_id 2 # John Smith - manager + @user_non_member = User.find_by_id 3 #Dave Lopper + @request.session[:user_id] = @user_member.id + @role_manager = Role.where(:name => 'Manager').first + @role_manager.add_permission! :file_approval + @wfs1 = DmsfWorkflowStep.find_by_id 1 # step 1 + @wfs2 = DmsfWorkflowStep.find_by_id 2 # step 2 + @wfs3 = DmsfWorkflowStep.find_by_id 3 # step 1 + @wfs4 = DmsfWorkflowStep.find_by_id 4 # step 2 + @wfs5 = DmsfWorkflowStep.find_by_id 5 # step 3 @manager_role = Role.find_by_name('Manager') - @project = Project.find(5) + @project1 = Project.find_by_id 1 + @project5 = Project.find_by_id 5 + @wf1 = DmsfWorkflow.find_by_id 1 + @wfsa2 = DmsfWorkflowStepAssignment.find_by_id 2 + @revision1 = DmsfFileRevision.find_by_id 1 + @revision2 = DmsfFileRevision.find_by_id 2 + @revision3 = DmsfFileRevision.find_by_id 3 end - def test_index_admin - @request.session[:user_id] = 1 # admin + def test_authorize + # Admin + @request.session[:user_id] = @user_admin.id get :index assert_response :success + assert_template 'index' + + # Non member + @request.session[:user_id] = @user_non_member.id + get :index, :project_id => @project5.id + assert_response :forbidden + + # Member + @request.session[:user_id] = @user_member.id + # Administration + get :index + assert_response :forbidden + # Project + get :index, :project_id => @project5.id + assert_response :success + assert_template 'index' + # Without the module + @project5.disable_module!(:dmsf) + get :index, :project_id => @project5.id + assert_response :forbidden + # Without permissions + @project5.enable_module!(:dmsf) + @role_manager.remove_permission! :file_approval + get :index, :project_id => @project5.id + assert_response :forbidden + end + + def test_index + get :index, :project_id => @project5.id + assert_response :success assert_template 'index' end - - def test_index_user - @request.session[:user_id] = 2 # non admin - get :index - assert_response :forbidden - end - - def test_index_member - old_controller = @controller - @controller = ProjectsController.new - - @request.session[:user_id] = 2 - get :settings, :id => @project.id - assert_response :success - assert_template 'settings' - - @controller = old_controller - end - - def test_new_admin - @request.session[:user_id] = 1 # admin - get :new + + def test_new + get :new, :project_id => @project5.id assert_response :success assert_template 'new' end - - def test_new_member_no_permission - @project.enable_module!(:dmsf) - @manager_role.remove_permission! :approval_workflows - @request.session[:user_id] = 2 - get :new, {:project_id => @project.id} - assert_response :forbidden - end - - def test_new_member_no_module - @project.disable_module!(:dmsf) - @manager_role.add_permission! :approval_workflows - @request.session[:user_id] = 2 - get :new, {:project_id => @project.id} - assert_response :forbidden - end - - def test_new_member - @manager_role.add_permission! :approval_workflows - @request.session[:user_id] = 2 - @project.enable_module!(:dmsf) - get :new, {:project_id => @project.id} - assert_response :success - assert_template 'new' - end - - def test_new_no_member - @manager_role.add_permission! :approval_workflows - @request.session[:user_id] = 3 - @project.enable_module!(:dmsf) - get :new, {:project_id => @project.id} - assert_response :forbidden - end - + def test_edit - @request.session[:user_id] = 1 # admin - get :edit, :id => 1 + get :edit, :id => @wf1.id assert_response :success assert_template 'edit' end - def test_create - @request.session[:user_id] = 1 # admin + def test_create assert_difference 'DmsfWorkflow.count', +1 do - post :create, :dmsf_workflow => {:name => 'wf3'} - end - workflow = DmsfWorkflow.first(:order => 'id DESC') - assert_redirected_to dmsf_workflows_path - assert_equal 'wf3', workflow.name + post :create, :dmsf_workflow => {:name => 'wf3'}, :project_id => @project5.id + end + assert_redirected_to settings_project_path(@project5, :tab => 'dmsf') end - def test_update - @request.session[:user_id] = 1 # admin - put :update, :id => 1, :dmsf_workflow => {:name => 'wf1a'} - workflow = DmsfWorkflow.find(1) - assert_equal 'wf1a', workflow.name + def test_update + put :update, :id => @wf1.id, :dmsf_workflow => {:name => 'wf1a'} + @wf1.reload + assert_equal 'wf1a', @wf1.name end - def test_destroy - @request.session[:user_id] = 1 # admin + def test_destroy + id = @wf1.id assert_difference 'DmsfWorkflow.count', -1 do - delete :destroy, :id => 1 + delete :destroy, :id => @wf1.id end - assert_redirected_to dmsf_workflows_path - assert_nil DmsfWorkflow.find_by_id(1) + assert_redirected_to settings_project_path(@project5, :tab => 'dmsf') + assert_equal 0, DmsfWorkflowStep.where(:dmsf_workflow_id => id).all.count end - def test_add_step - @request.session[:user_id] = 1 # admin + def test_add_step assert_difference 'DmsfWorkflowStep.count', +1 do - post :add_step, :commit => 'OR', :step => 1, :id => 1, :user_ids =>[3] + post :add_step, :commit => l(:dmsf_or), :step => 1, :id => @wf1.id, :user_ids =>[@user_non_member.id] end assert_response :success ws = DmsfWorkflowStep.first(:order => 'id DESC') - assert_equal 1, ws.dmsf_workflow_id + assert_equal @wf1.id, ws.dmsf_workflow_id assert_equal 1, ws.step - assert_equal 3, ws.user_id - assert_equal 0, ws.operator + assert_equal @user_non_member.id, ws.user_id + assert_equal DmsfWorkflowStep::OPERATOR_OR, ws.operator end - def test_remove_step - @request.session[:user_id] = 1 # admin - n = DmsfWorkflowStep.where(:dmsf_workflow_id => 1, :step => 1).count + def test_remove_step + n = DmsfWorkflowStep.where(:dmsf_workflow_id => @wf1.id, :step => 1).count assert_difference 'DmsfWorkflowStep.count', -n do - delete :remove_step, :step => 1, :id => 1 + delete :remove_step, :step => @wfs1.id, :id => @wf1.id end assert_response :success - ws = DmsfWorkflowStep.where(:dmsf_workflow_id => 1).first(:order => 'id ASC') + ws = DmsfWorkflowStep.where(:dmsf_workflow_id => @wf1.id).first(:order => 'id ASC') assert_equal 1, ws.step end - def test_reorder_steps_to_lower - @request.session[:user_id] = 1 # admin - put :reorder_steps, :step => 1, :id => 1, :workflow_step => {:move_to => 'lower'} - assert_response :success - assert_equal 2, DmsfWorkflowStep.find(1).step - assert_equal 1, DmsfWorkflowStep.find(2).step - assert_equal 3, DmsfWorkflowStep.find(3).step + def test_reorder_steps_to_lower + put :reorder_steps, :step => 1, :id => @wf1.id, :workflow_step => {:move_to => 'lower'} + assert_response :success + @wfs1.reload + @wfs2.reload + @wfs3.reload + @wfs4.reload + @wfs5.reload + assert_equal 1, @wfs2.step + assert_equal 1, @wfs3.step + assert_equal 2, @wfs1.step + assert_equal 2, @wfs4.step + assert_equal 3, @wfs5.step end - def test_reorder_steps_to_lowest - @request.session[:user_id] = 1 # admin - put :reorder_steps, :step => 1, :id => 1, :workflow_step => {:move_to => 'lowest'} - assert_response :success - assert_equal 3, DmsfWorkflowStep.find(1).step - assert_equal 1, DmsfWorkflowStep.find(2).step - assert_equal 2, DmsfWorkflowStep.find(3).step + def test_reorder_steps_to_lowest + put :reorder_steps, :step => 1, :id => @wf1.id, :workflow_step => {:move_to => 'lowest'} + assert_response :success + @wfs1.reload + @wfs2.reload + @wfs3.reload + @wfs4.reload + @wfs5.reload + assert_equal 1, @wfs2.step + assert_equal 1, @wfs3.step + assert_equal 2, @wfs5.step + assert_equal 3, @wfs1.step + assert_equal 3, @wfs4.step end - def test_reorder_steps_to_higher - @request.session[:user_id] = 1 # admin - put :reorder_steps, :step => 2, :id => 1, :workflow_step => {:move_to => 'higher'} - assert_response :success - assert_equal 2, DmsfWorkflowStep.find(1).step - assert_equal 1, DmsfWorkflowStep.find(2).step - assert_equal 3, DmsfWorkflowStep.find(3).step + def test_reorder_steps_to_higher + put :reorder_steps, :step => 3, :id => @wf1.id, :workflow_step => {:move_to => 'higher'} + assert_response :success + @wfs1.reload + @wfs2.reload + @wfs3.reload + @wfs4.reload + @wfs5.reload + assert_equal 1, @wfs1.step + assert_equal 1, @wfs4.step + assert_equal 2, @wfs5.step + assert_equal 3, @wfs2.step + assert_equal 3, @wfs3.step end - def test_reorder_steps_to_highest - @request.session[:user_id] = 1 # admin - put :reorder_steps, :step => 3, :id => 1, :workflow_step => {:move_to => 'highest'} - assert_response :success - assert_equal 2, DmsfWorkflowStep.find(1).step - assert_equal 3, DmsfWorkflowStep.find(2).step - assert_equal 1, DmsfWorkflowStep.find(3).step + def test_reorder_steps_to_highest + put :reorder_steps, :step => 3, :id => @wf1.id, :workflow_step => {:move_to => 'highest'} + assert_response :success + @wfs1.reload + @wfs2.reload + @wfs3.reload + @wfs4.reload + @wfs5.reload + assert_equal 1, @wfs5.step + assert_equal 2, @wfs1.step + assert_equal 2, @wfs4.step + assert_equal 3, @wfs2.step + assert_equal 3, @wfs3.step + end + + def test_action_approve + @request.env['HTTP_REFERER'] = 'http://test.host/projects/2/dmsf' + post( + :new_action, + :commit => l(:button_submit), + :id => @wf1.id, + :dmsf_workflow_step_assignment_id => @wfsa2.id, + :dmsf_file_revision_id => @revision2.id, + :step_action => DmsfWorkflowStepAction::ACTION_APPROVE, + :user_id => nil, + :note => '') + assert_response :redirect + assert DmsfWorkflowStepAction.where( + :dmsf_workflow_step_assignment_id => @wfsa2.id, + :action => DmsfWorkflowStepAction::ACTION_APPROVE).first + end + + def test_action_reject + @request.env['HTTP_REFERER'] = 'http://test.host/projects/2/dmsf' + post( + :new_action, + :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...') + assert_response :redirect + assert DmsfWorkflowStepAction.where( + :dmsf_workflow_step_assignment_id => @wfsa2.id, + :action => DmsfWorkflowStepAction::ACTION_REJECT).first + end + + def test_action + xhr( + :get, + :action, + :project_id => @project5.id, + :id => @wf1.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 + @request.env['HTTP_REFERER'] = 'http://test.host/projects/2/dmsf' + post( + :new_action, + :commit => l(:button_submit), + :id => @wf1.id, + :dmsf_workflow_step_assignment_id => @wfsa2.id, + :dmsf_file_revision_id => @revision2.id, + :step_action => DmsfWorkflowStepAction::ACTION_DELEGATE, + :user_id => @user_admin.id, + :note => 'Delegated because...') + assert_response :redirect + assert DmsfWorkflowStepAction.where( + :dmsf_workflow_step_assignment_id => @wfsa2.id, + :action => DmsfWorkflowStepAction::ACTION_DELEGATE).first + @wfsa2.reload + assert_equal @wfsa2.user_id, @user_admin.id + end + + def test_assign + xhr( + :get, + :assign, + :project_id => @project5.id, + :id => @wf1.id, + :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_assignment + # TODO: There is a strange error: 'ActiveRecord::RecordNotFound: Couldn't find Project with id=0' + # while saving the revision +# @request.env['HTTP_REFERER'] = 'http://test.host/projects/3/dmsf' +# post( +# :assignment, +# :commit => l(:button_submit), +# :id => @wf1.id, +# :dmsf_workflow_id => @wf1.id, +# :dmsf_file_revision_id => @revision3.id, +# :action => 'assignment', +# :project_id => @project5.id) +# assert_response :redirect + assert true end end diff --git a/test/unit/dmsf_workflow_step_action_test.rb b/test/unit/dmsf_workflow_step_action_test.rb index e1749116..9a299f3b 100644 --- a/test/unit/dmsf_workflow_step_action_test.rb +++ b/test/unit/dmsf_workflow_step_action_test.rb @@ -1,7 +1,7 @@ require File.expand_path('../../test_helper', __FILE__) class DmsfWorkflowStepActionTest < RedmineDmsf::Test::UnitTest - + include Redmine::I18n fixtures :dmsf_workflow_steps fixtures :dmsf_workflow_step_actions @@ -53,8 +53,49 @@ class DmsfWorkflowStepActionTest < RedmineDmsf::Test::UnitTest assert_equal 1, @wfsac1.errors.count end + def test_validate_note + @wfsac1.note = '' + @wfsac1.action = DmsfWorkflowStepAction::ACTION_REJECT + assert !@wfsac1.save + assert_equal 1, @wfsac1.errors.count + @wfsac1.note = 'Rejected because....' + assert @wfsac1.save + @wfsac1.action = DmsfWorkflowStepAction::ACTION_DELEGATE + @wfsac1.note = '' + assert !@wfsac1.save + assert_equal 1, @wfsac1.errors.count + @wfsac1.note = 'Delegated because' + assert @wfsac1.save + @wfsac1.note = '' + @wfsac1.action = DmsfWorkflowStepAction::ACTION_APPROVE + assert @wfsac1.save + end + + def test_validate_author_id + @wfsac1.author_id = nil + assert !@wfsac1.save + assert_equal 1, @wfsac1.errors.count + end + def test_destroy @wfsac1.destroy assert_nil DmsfWorkflowStepAction.find_by_id(1) + end + + def test_is_finished + @wfsac1.action = DmsfWorkflowStepAction::ACTION_APPROVE + assert @wfsac1.is_finished? + @wfsac1.action = DmsfWorkflowStepAction::ACTION_REJECT + assert @wfsac1.is_finished? + @wfsac1.action = DmsfWorkflowStepAction::ACTION_DELEGATE + assert !@wfsac1.is_finished? + end + + def test_action_str + assert_equal DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_APPROVE), l(:title_approved) + assert_equal DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_REJECT), l(:title_rejected) + assert_equal DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_DELEGATE), l(:title_delegated) + assert_equal DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_ASSIGN), l(:title_assigned) + assert_equal DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_START), l(:title_started) end end diff --git a/test/unit/dmsf_workflow_step_assignment_test.rb b/test/unit/dmsf_workflow_step_assignment_test.rb index 96189bcc..b5f097e1 100644 --- a/test/unit/dmsf_workflow_step_assignment_test.rb +++ b/test/unit/dmsf_workflow_step_assignment_test.rb @@ -14,7 +14,7 @@ class WorkflowStepAssignmentTest < RedmineDmsf::Test::UnitTest def test_create wfsa = DmsfWorkflowStepAssignment.new( - :dmsf_workflow_step_id => 2, + :dmsf_workflow_step_id => 5, :user_id => 2, :dmsf_file_revision_id => 2) assert wfsa.save @@ -50,4 +50,8 @@ class WorkflowStepAssignmentTest < RedmineDmsf::Test::UnitTest assert_nil DmsfWorkflowStepAssignment.find_by_id(1) assert_nil DmsfWorkflowStepAction.find_by_id(1) end + + def test_step + assert_equal @wfsa1.step, DmsfWorkflowStep.find_by_id(@wfsa1.dmsf_workflow_step_id) + end end diff --git a/test/unit/dmsf_workflow_step_test.rb b/test/unit/dmsf_workflow_step_test.rb index e9cf676f..7e40c7c2 100644 --- a/test/unit/dmsf_workflow_step_test.rb +++ b/test/unit/dmsf_workflow_step_test.rb @@ -1,12 +1,15 @@ require File.expand_path('../../test_helper', __FILE__) class DmsfWorkflowStepTest < RedmineDmsf::Test::UnitTest + include Redmine::I18n fixtures :users, :dmsf_workflows, :dmsf_workflow_steps def setup @wfs1 = DmsfWorkflowStep.find(1) @wfs2 = DmsfWorkflowStep.find(2) + @wfs5 = DmsfWorkflowStep.find(5) + @revision1 = DmsfFileRevision.find_by_id 1 end def test_truth @@ -17,7 +20,7 @@ class DmsfWorkflowStepTest < RedmineDmsf::Test::UnitTest wfs = DmsfWorkflowStep.new( :dmsf_workflow_id => 1, :step => 2, - :user_id => 1, + :user_id => 3, :operator => 1) assert wfs.save end @@ -69,8 +72,25 @@ class DmsfWorkflowStepTest < RedmineDmsf::Test::UnitTest assert_equal 1, @wfs2.errors.count end - def test_destroy + def test_destroy + assert DmsfWorkflowStepAssignment.where(:dmsf_workflow_step_id => @wfs2.id).all.count > 0 @wfs2.destroy assert_nil DmsfWorkflowStep.find_by_id(2) + assert_equal DmsfWorkflowStepAssignment.where(:dmsf_workflow_step_id => @wfs2.id).all.count, 0 + end + + def test_soperator + assert_equal @wfs1.soperator, l(:dmsf_or) + end + + def test_user + assert_equal @wfs1.user, User.find_by_id(@wfs1.user_id) + end + + def test_assign + @wfs5.assign(@revision1.id) + assert DmsfWorkflowStepAssignment.where( + :dmsf_workflow_step_id => @wfs5.id, + :dmsf_file_revision_id => @revision1.id).first end end diff --git a/test/unit/dmsf_workflow_test.rb b/test/unit/dmsf_workflow_test.rb index f67e8b73..58de2b13 100644 --- a/test/unit/dmsf_workflow_test.rb +++ b/test/unit/dmsf_workflow_test.rb @@ -2,12 +2,24 @@ require File.expand_path('../../test_helper', __FILE__) class DmsfWorkflowTest < RedmineDmsf::Test::UnitTest - fixtures :projects, :dmsf_workflows, :dmsf_workflow_steps + fixtures :projects, :members, :dmsf_files, :dmsf_file_revisions, + :dmsf_workflows, :dmsf_workflow_steps, :dmsf_workflow_step_assignments, + :dmsf_workflow_step_actions def setup - @wf1 = DmsfWorkflow.find(1) - @wf2 = DmsfWorkflow.find(2) - @wfs1 = DmsfWorkflowStep.find(1) + User.current = User.find_by_id 1 # Admin + @wf1 = DmsfWorkflow.find_by_id(1) + @wf2 = DmsfWorkflow.find_by_id(2) + @wfs1 = DmsfWorkflowStep.find_by_id(1) + @wfs2 = DmsfWorkflowStep.find_by_id(2) + @wfs3 = DmsfWorkflowStep.find_by_id(3) + @wfs4 = DmsfWorkflowStep.find_by_id(4) + @wfs5 = DmsfWorkflowStep.find_by_id(5) + @wfsa1 = DmsfWorkflowStepAssignment.find_by_id(1) + @wfsac1 = DmsfWorkflowStepAction.find_by_id(1) + @revision1 = DmsfFileRevision.find_by_id 1 + @revision2 = DmsfFileRevision.find_by_id 2 + @project = Project.find_by_id 2 end def test_truth @@ -51,4 +63,116 @@ class DmsfWorkflowTest < RedmineDmsf::Test::UnitTest assert_nil DmsfWorkflow.find_by_id(1) assert_nil DmsfWorkflowStep.find_by_id(@wfs1.id) end + + def test_project + # Global workflow + assert_nil @wf1.project + # Project workflow + @wf1.project_id = 5 + assert @wf1.project + end + + def test_to_s + assert_equal @wf1.name, @wf1.to_s + end + + def test_reorder_steps_highest + @wf1.reorder_steps(3, 'highest') + @wfs1.reload + @wfs2.reload + @wfs3.reload + @wfs4.reload + @wfs5.reload + assert_equal @wfs5.step, 1 + assert_equal @wfs1.step, 2 + assert_equal @wfs4.step, 2 + assert_equal @wfs2.step, 3 + assert_equal @wfs3.step, 3 + end + + def test_reorder_steps_higher + @wf1.reorder_steps(3, 'higher') + @wfs1.reload + @wfs2.reload + @wfs3.reload + @wfs4.reload + @wfs5.reload + assert_equal @wfs1.step, 1 + assert_equal @wfs4.step, 1 + assert_equal @wfs5.step, 2 + assert_equal @wfs2.step, 3 + assert_equal @wfs3.step, 3 + end + + def test_reorder_steps_lower + @wf1.reorder_steps(1, 'lower') + @wfs1.reload + @wfs2.reload + @wfs3.reload + @wfs4.reload + @wfs5.reload + assert_equal @wfs2.step, 1 + assert_equal @wfs3.step, 1 + assert_equal @wfs1.step, 2 + assert_equal @wfs4.step, 2 + assert_equal @wfs5.step, 3 + end + + def test_reorder_steps_lowest + @wf1.reorder_steps(1, 'lowest') + @wfs1.reload + @wfs2.reload + @wfs3.reload + @wfs4.reload + @wfs5.reload + assert_equal @wfs2.step, 1 + assert_equal @wfs3.step, 1 + assert_equal @wfs5.step, 2 + assert_equal @wfs1.step, 3 + assert_equal @wfs4.step, 3 + end + + def test_delegates + delegates = @wf1.delegates(nil, nil, nil) + assert_equal delegates.size, User.active.all.size + delegates = @wf1.delegates('Redmine', nil, nil) + assert_equal delegates.size, 1 + delegates = @wf1.delegates(nil, @wfsa1.id, 2) + assert !delegates.any?{|user| user.id == @wfsa1.user_id} + assert delegates.any?{|user| user.id == 8} + end + + def test_next_assignments + assignments = @wf1.next_assignments(2) + assert_equal assignments.size, 1 + assert_equal assignments[0].user_id, 2 + end + + def test_assignments_to_users_str + assignments = @wf1.next_assignments(2) + str = DmsfWorkflow.assignments_to_users_str(assignments) + assert_equal str, 'John Smith', str + end + + def test_assign + @wf1.assign(1) + @wf1.dmsf_workflow_steps.each do |step| + assert_kind_of DmsfWorkflowStepAssignment, DmsfWorkflowStepAssignment.where( + :dmsf_workflow_step_id => step.id, :dmsf_file_revision_id => 1).first + end + end + + def test_try_finish + #def try_finish(dmsf_file_revision_id, action, user_id) + # TODO: There is a strange error: 'ActiveRecord::RecordNotFound: Couldn't find Project with id=0' + # while saving the revision +# @revision1.set_workflow @wf1.id, 'start' +# @wf1.try_finish @revision1.id, @wfsac1, User.current.id +# @revision1.reload +# assert_equal @revision1.workflow, DmsfWorkflow::STATE_APPROVED +# @revision2.set_workflow @wf1.id, 'start' +# @wf1.try_finish @revision2.id, @wfsac1, User.current.id +# assert_equal @revision2.workflow, DmsfWorkflow::STATE_WAITING_FOR_APPROVAL + assert true + end end
<%= l(:label_dmsf_workflow_step) %> <%= l(:label_dmsf_workflow_approval_plural) %><%=l(:button_sort)%><%=l(:button_sort)%>
<%= step %> - <% @workflow.approvals(step).each_with_index do |approval, i| %> - <% if i != 0 %> - <%= approval.soperator %>  +
<%= i %> + <% @workflow.dmsf_workflow_steps.collect{|s| (s.step == i) ? s : nil}.compact.each_with_index do |step, j| %> + <% if j != 0 %> + <%= step.soperator %>  <% end %> - <%= link_to_user approval.user %> + <%= link_to_user step.user %> <% end %> - - <%= reorder_links('workflow_step', {:action => 'edit', :id => @workflow, :step => step}, :put) %> + + <%= reorder_links('workflow_step', {:action => 'edit', :id => @workflow, :step => i}, :put) %> - <%= delete_link edit_dmsf_workflow_path(@workflow, :step => step) %> + <%= delete_link edit_dmsf_workflow_path(@workflow, :step => i) %>