Browse Source

Fixes #5265 - Webhook custom payload parser does not accept digits within placeholders

Tobias Schäfer 7 months ago
parent
commit
85b53b8108

+ 1 - 1
app/jobs/trigger_webhook_job/custom_payload/parser.rb

@@ -69,7 +69,7 @@ module TriggerWebhookJob::CustomPayload::Parser
 
   # Scan the custom payload for replacement variables.
   def scan(record)
-    placeholders = record.scan(%r{(#\{[a-z_.?!]+\})}).flatten.uniq
+    placeholders = record.scan(%r{(#\{[a-z0-9_.?!]+\})}).flatten.uniq
 
     return [] if placeholders.blank?
 

+ 2 - 0
app/jobs/trigger_webhook_job/custom_payload/validator.rb

@@ -88,6 +88,8 @@ module TriggerWebhookJob::CustomPayload::Validator
   # Validate the next method to be called.
   def validate_method!(method, reference, display)
     return "\#{#{display} / missing method}" if method.blank?
+    # Inspecting a symbol quotes invalid method names.
+    return "\#{#{display} / no such method}" if method.to_sym.inspect.start_with?(%r{:"@?})
     return "\#{#{display} / no such method}" if !allowed_class_method?(method, reference)
     return "\#{#{display} / no such method}" if !reference.respond_to?(method.to_sym)
 

+ 10 - 1
spec/jobs/trigger_webhook_job/custom_payload_spec.rb

@@ -111,6 +111,15 @@ RSpec.describe TriggerWebhookJob::CustomPayload do
       end
     end
 
+    context 'when the placeholder contains valid object and invalid method' do
+      let(:record) { { 'ticket' => '#{ticket.1_article}' }.to_json }
+      let(:json_data) { { 'ticket' => '#{ticket.1_article / no such method}' } }
+
+      it 'returns the placeholder reporting "no such method"' do
+        expect(generate).to eq(json_data)
+      end
+    end
+
     context 'when the placeholder contains valid object and method' do
       let(:record) { { 'ticket.id' => '#{ticket.id}' }.to_json }
       let(:json_data) { { 'ticket.id' => ticket.id } }
@@ -280,7 +289,7 @@ RSpec.describe TriggerWebhookJob::CustomPayload do
       end
 
       context 'when multiselect is used inside the ticket' do
-        let(:object_manager_attribute_name)  { 'multiselect' }
+        let(:object_manager_attribute_name)  { 'multiselect_keys_001' }
         let(:object_manager_attribute_value) { %w[key_1 key_3] }
         let(:create_object_manager_attribute) do
           create(:object_manager_attribute_multiselect, name: object_manager_attribute_name)