Skip to content

Commit

Permalink
Fixes #4763 - Core Workflow: Readded options are not usable in condit…
Browse files Browse the repository at this point in the history
…ions.

Co-authored-by: Florian Liebe <fl@zammad.com>
  • Loading branch information
rolfschmidt and fliebe92 committed Aug 16, 2023
1 parent c600532 commit 0188b91
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 1 deletion.
3 changes: 2 additions & 1 deletion app/models/core_workflow/result.rb
Expand Up @@ -3,13 +3,14 @@
class CoreWorkflow::Result
include ::Mixin::HasBackends

attr_accessor :payload, :user, :assets, :assets_in_result, :result, :rerun, :form_updater
attr_accessor :payload, :payload_backup, :user, :assets, :assets_in_result, :result, :rerun, :form_updater

def initialize(payload:, user:, assets: {}, assets_in_result: true, result: {}, form_updater: false)
raise ArgumentError, __("The required parameter 'payload->class_name' is missing.") if !payload['class_name']
raise ArgumentError, __("The required parameter 'payload->screen' is missing.") if !payload['screen']

@payload = payload
@payload_backup = Marshal.load(Marshal.dump(payload))
@user = user
@assets = assets
@assets_in_result = assets_in_result
Expand Down
1 change: 1 addition & 0 deletions app/models/core_workflow/result/add_option.rb
Expand Up @@ -3,6 +3,7 @@
class CoreWorkflow::Result::AddOption < CoreWorkflow::Result::BaseOption
def run
@result_object.result[:restrict_values][field] |= Array(@perform_config['add_option'])
readd_excluded_param_values
true
end
end
31 changes: 31 additions & 0 deletions app/models/core_workflow/result/base_option.rb
Expand Up @@ -42,4 +42,35 @@ def remove_string
def excluded_by_restrict_values?(value)
@result_object.result[:restrict_values][field].exclude?(value.to_s)
end

def readd_excluded_param_values
if multiple?
restore_array
else
restore_string
end
end

def new_value_rerun(field, new_value)
return if new_value == @result_object.payload['params'][field]

set_rerun
end

def restore_array
new_value = @result_object.payload_backup['params'][field] & @result_object.result[:restrict_values][field]

new_value_rerun(field, new_value)

@result_object.payload['params'][field] = new_value
end

def restore_string
new_value = @result_object.payload_backup['params'][field]
return if @result_object.result[:restrict_values][field].exclude?(new_value)

new_value_rerun(field, new_value)

@result_object.payload['params'][field] = new_value
end
end
92 changes: 92 additions & 0 deletions spec/models/core_workflow_spec.rb
Expand Up @@ -2039,4 +2039,96 @@ def selected_attribute_match?
expect(result[:matched_workflows]).not_to include(workflow.id)
end
end

describe 'Core Workflow: Readded options are not usable in conditions #4763' do
before do
workflow_1 && workflow_2
end

context 'when single value' do
let(:workflow_1) do
create(:core_workflow,
object: 'Ticket',
perform: {
'ticket.priority_id': {
operator: 'remove_option',
remove_option: Ticket::Priority.pluck(:id).map(&:to_s),
},
})
end
let(:workflow_2) do
create(:core_workflow,
object: 'Ticket',
perform: {
'ticket.priority_id': {
operator: 'add_option',
add_option: Ticket::Priority.pluck(:id).map(&:to_s),
},
})
end
let!(:workflow_3) do
create(:core_workflow,
object: 'Ticket',
condition_selected: {
'ticket.priority_id': {
operator: 'is',
value: Ticket::Priority.where(name: '3 high').pluck(:id).map(&:to_s),
},
})
end
let(:payload) do
base_payload.merge('params' => { 'priority_id' => Ticket::Priority.find_by(name: '3 high').id.to_s })
end

it 'does match' do
expect(result[:matched_workflows]).to include(workflow_3.id)
end
end

context 'when multiple value', db_strategy: :reset do
let(:workflow_1) do
create(:core_workflow,
object: 'Ticket',
perform: {
"ticket.#{field_name}": {
operator: 'remove_option',
remove_option: ['key_1'],
},
})
end
let(:workflow_2) do
create(:core_workflow,
object: 'Ticket',
perform: {
"ticket.#{field_name}": {
operator: 'add_option',
add_option: ['key_1'],
},
})
end
let!(:workflow_3) do
create(:core_workflow,
object: 'Ticket',
condition_selected: {
"ticket.#{field_name}": {
operator: 'is',
value: ['key_1'],
},
})
end
let(:payload) do
base_payload.merge('params' => { field_name => ['key_1'] })
end
let(:field_name) { SecureRandom.uuid }

before do
create(:object_manager_attribute_multiselect, name: field_name, display: field_name)
ObjectManager::Attribute.migration_execute
end

it 'does match' do
expect(result[:matched_workflows]).to include(workflow_3.id)
end
end
end
end

0 comments on commit 0188b91

Please sign in to comment.