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.
This commit is contained in:
@@ -86,6 +86,9 @@ class Whatsapp::TemplateParameterConverterService
|
|||||||
# Hash format: {"1": "John", "name": "Jane"} → {body: {"1": "John", "name": "Jane"}}
|
# Hash format: {"1": "John", "name": "Jane"} → {body: {"1": "John", "name": "Jane"}}
|
||||||
body_params = convert_hash_to_body_params(legacy_params)
|
body_params = convert_hash_to_body_params(legacy_params)
|
||||||
enhanced['body'] = body_params unless body_params.empty?
|
enhanced['body'] = body_params unless body_params.empty?
|
||||||
|
when NilClass
|
||||||
|
# Templates without parameters (nil processed_params)
|
||||||
|
# Return empty enhanced structure
|
||||||
else
|
else
|
||||||
raise ArgumentError, "Unknown legacy format: #{legacy_params.class}"
|
raise ArgumentError, "Unknown legacy format: #{legacy_params.class}"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -63,6 +63,25 @@ FactoryBot.define do
|
|||||||
],
|
],
|
||||||
'sub_category' => 'CUSTOM',
|
'sub_category' => 'CUSTOM',
|
||||||
'parameter_format' => 'NAMED'
|
'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
|
end
|
||||||
message_templates_last_updated { Time.now.utc }
|
message_templates_last_updated { Time.now.utc }
|
||||||
|
|||||||
@@ -133,6 +133,48 @@ describe Whatsapp::TemplateParameterConverterService do
|
|||||||
end
|
end
|
||||||
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
|
context 'when invalid format' do
|
||||||
let(:invalid_params) do
|
let(:invalid_params) do
|
||||||
{
|
{
|
||||||
@@ -174,6 +216,26 @@ describe Whatsapp::TemplateParameterConverterService do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe 'simplified conversion methods' do
|
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
|
describe '#convert_array_to_body_params' do
|
||||||
it 'converts empty array' do
|
it 'converts empty array' do
|
||||||
converter = described_class.new({}, template)
|
converter = described_class.new({}, template)
|
||||||
|
|||||||
Reference in New Issue
Block a user