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? %>
+
| <%= l(:label_dmsf_workflow_step) %> |
<%= l(:label_dmsf_workflow_approval_plural) %> |
- <%=l(:button_sort)%> |
- |
+ <%=l(:button_sort)%> |
+ |
-
- <% @workflow.steps.each do |step| %>
-
- | <%= step %> |
-
- <% @workflow.approvals(step).each_with_index do |approval, i| %>
- <% if i != 0 %>
- <%= approval.soperator %> 
+ |
+ <% steps.each do |i|%>
+
+ | <%= 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) %>
|
<% 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