Просмотр исходного кода

Fixes #4198 - Tickets can be closed with the bulk action, even when a mandatory field is empty.

Rolf Schmidt 2 лет назад
Родитель
Сommit
ff8c829d76

+ 3 - 3
app/models/concerns/checks_core_workflow.rb

@@ -50,7 +50,7 @@ module ChecksCoreWorkflow
     perform_result[:mandatory].each_key do |key|
       next if field_visible?(perform_result, key)
       next if !field_mandatory?(perform_result, key)
-      next if !column_value?(key)
+      next if !column_empty?(key)
       next if !colum_default?(key)
 
       raise Exceptions::ApplicationModel.new(self, "Missing required value for field '#{key}'!")
@@ -65,8 +65,8 @@ module ChecksCoreWorkflow
     perform_result[:mandatory][key]
   end
 
-  def column_value?(key)
-    self[key].nil?
+  def column_empty?(key)
+    self[key].nil? || ([true, false].exclude?(self[key]) && self[key].blank?)
   end
 
   def colum_default?(key)

+ 44 - 0
spec/models/concerns/checks_core_workflow_examples.rb

@@ -108,4 +108,48 @@ RSpec.shared_examples 'ChecksCoreWorkflow' do
       expect { ticket }.not_to raise_error
     end
   end
+
+  describe 'Tickets can be closed with the bulk action, even when a mandatory field is empty #4198', db_strategy: :reset do
+    let(:ticket) { create(:ticket, group: agent_group, state: Ticket::State.find_by(name: 'open')) }
+    let(:ticket2)       { create(:ticket, group: agent_group, state: Ticket::State.find_by(name: 'open')) }
+    let(:field_name)    { SecureRandom.uuid }
+    let(:ticket_update) { { screen: 'edit', title: 'test' } }
+
+    before do
+      ticket
+
+      create(:object_manager_attribute_text, object_name: 'Ticket', name: field_name, display: field_name, screens: {
+               'edit' => {
+                 'ticket.agent' => {
+                   shown:    true,
+                   required: false,
+                 }
+               }
+             })
+      ObjectManager::Attribute.migration_execute
+
+      ticket2
+
+      create(:core_workflow,
+             object:  'Ticket',
+             perform: {
+               "ticket.#{field_name}": {
+                 operator:      'set_mandatory',
+                 set_mandatory: true
+               },
+             })
+    end
+
+    it 'does raise error for old tickets before required test field got created' do
+      expect do
+        ticket.update(ticket_update)
+      end.to raise_error(Exceptions::ApplicationModel, "Missing required value for field '#{field_name}'!")
+    end
+
+    it 'does raise error for new tickets after required test field got created' do
+      expect do
+        ticket2.update(ticket_update)
+      end.to raise_error(Exceptions::ApplicationModel, "Missing required value for field '#{field_name}'!")
+    end
+  end
 end