From 48fa7bf72b7b029bb9315f43bd6b9fd0e1872a41 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Tue, 12 Aug 2025 22:56:53 +0530 Subject: [PATCH] fix: Handle nil `processed_params` for WhatsApp templates without params (#12177) WhatsApp templates without parameters (body-only templates like notifications, confirmations) were failing to send with the error: ArgumentError (Unknown legacy format: NilClass). This affected all parameter-less templates across marketing messages, notifications, and utility templates. --- .../template_parameter_converter_service.rb | 3 + spec/factories/channel/channel_whatsapp.rb | 19 ++++++ ...mplate_parameter_converter_service_spec.rb | 62 +++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/app/services/whatsapp/template_parameter_converter_service.rb b/app/services/whatsapp/template_parameter_converter_service.rb index b9a9d55d9..641a29b95 100644 --- a/app/services/whatsapp/template_parameter_converter_service.rb +++ b/app/services/whatsapp/template_parameter_converter_service.rb @@ -86,6 +86,9 @@ class Whatsapp::TemplateParameterConverterService # Hash format: {"1": "John", "name": "Jane"} → {body: {"1": "John", "name": "Jane"}} body_params = convert_hash_to_body_params(legacy_params) enhanced['body'] = body_params unless body_params.empty? + when NilClass + # Templates without parameters (nil processed_params) + # Return empty enhanced structure else raise ArgumentError, "Unknown legacy format: #{legacy_params.class}" end diff --git a/spec/factories/channel/channel_whatsapp.rb b/spec/factories/channel/channel_whatsapp.rb index ad2bab241..dae7eb04f 100644 --- a/spec/factories/channel/channel_whatsapp.rb +++ b/spec/factories/channel/channel_whatsapp.rb @@ -63,6 +63,25 @@ FactoryBot.define do ], 'sub_category' => 'CUSTOM', 'parameter_format' => 'NAMED' + }, + { + 'name' => 'test_no_params_template', + 'status' => 'APPROVED', + 'category' => 'UTILITY', + 'language' => 'en', + 'namespace' => 'ed41a221_133a_4558_a1d6_192960e3aee9', + 'id' => '9876543210987654', + 'length' => 1, + 'parameter_format' => 'POSITIONAL', + 'previous_category' => 'MARKETING', + 'sub_category' => 'CUSTOM', + 'components' => [ + { + 'text' => 'Thank you for contacting us! Your request has been processed successfully. Have a great day! 🙂', + 'type' => 'BODY' + } + ], + 'rejected_reason' => 'NONE' }] end message_templates_last_updated { Time.now.utc } diff --git a/spec/services/whatsapp/template_parameter_converter_service_spec.rb b/spec/services/whatsapp/template_parameter_converter_service_spec.rb index 2994bb472..570c5c6cc 100644 --- a/spec/services/whatsapp/template_parameter_converter_service_spec.rb +++ b/spec/services/whatsapp/template_parameter_converter_service_spec.rb @@ -133,6 +133,48 @@ describe Whatsapp::TemplateParameterConverterService do end end + context 'when processed_params is nil (parameter-less templates)' do + let(:nil_params) do + { + 'processed_params' => nil + } + end + + let(:parameterless_template) do + { + 'name' => 'test_no_params_template', + 'language' => 'en', + 'parameter_format' => 'POSITIONAL', + 'id' => '9876543210987654', + 'status' => 'APPROVED', + 'category' => 'UTILITY', + 'previous_category' => 'MARKETING', + 'sub_category' => 'CUSTOM', + 'components' => [ + { + 'type' => 'BODY', + 'text' => 'Thank you for contacting us! Your request has been processed successfully. Have a great day! 🙂' + } + ] + } + end + + it 'converts nil to empty enhanced format' do + converter = described_class.new(nil_params, parameterless_template) + result = converter.normalize_to_enhanced + + expect(result['processed_params']).to eq({}) + expect(result['format_version']).to eq('legacy') + end + + it 'does not raise ArgumentError for nil processed_params' do + expect do + converter = described_class.new(nil_params, parameterless_template) + converter.normalize_to_enhanced + end.not_to raise_error + end + end + context 'when invalid format' do let(:invalid_params) do { @@ -174,6 +216,26 @@ describe Whatsapp::TemplateParameterConverterService do end describe 'simplified conversion methods' do + describe '#convert_legacy_to_enhanced' do + it 'handles nil processed_params without raising error' do + converter = described_class.new({}, template) + result = converter.send(:convert_legacy_to_enhanced, nil, template) + expect(result).to eq({}) + end + + it 'returns empty hash for parameter-less templates' do + parameterless_template = { + 'name' => 'no_params_template', + 'language' => 'en', + 'components' => [{ 'type' => 'BODY', 'text' => 'Hello World!' }] + } + + converter = described_class.new({}, parameterless_template) + result = converter.send(:convert_legacy_to_enhanced, nil, parameterless_template) + expect(result).to eq({}) + end + end + describe '#convert_array_to_body_params' do it 'converts empty array' do converter = described_class.new({}, template)