From 1c945899c7badf0f338b298c7f7f0121f1d4acd5 Mon Sep 17 00:00:00 2001 From: Tanmay Deep Sharma Date: Thu, 30 Apr 2026 19:10:06 +0700 Subject: [PATCH] fix(whatsapp): restrict voice_enabled? to embedded-signup whatsapp_cloud channels --- app/models/channel/whatsapp.rb | 6 +++++- spec/models/channel/whatsapp_spec.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/models/channel/whatsapp.rb b/app/models/channel/whatsapp.rb index 656486006..12b18c90b 100644 --- a/app/models/channel/whatsapp.rb +++ b/app/models/channel/whatsapp.rb @@ -41,8 +41,12 @@ class Channel::Whatsapp < ApplicationRecord end # Mirrors Channel::TwilioSms#voice_enabled? so the call subsystem can duck-type across providers. + # Meta's Calling API is only available via the embedded-signup whatsapp_cloud flow — + # 360dialog (default provider) and manual whatsapp_cloud setups can't reach the call APIs. def voice_enabled? - provider_config['calling_enabled'].present? + provider == 'whatsapp_cloud' && + provider_config['source'] == 'embedded_signup' && + provider_config['calling_enabled'].present? end def provider_service diff --git a/spec/models/channel/whatsapp_spec.rb b/spec/models/channel/whatsapp_spec.rb index dcc010d88..e807d5763 100644 --- a/spec/models/channel/whatsapp_spec.rb +++ b/spec/models/channel/whatsapp_spec.rb @@ -209,4 +209,32 @@ RSpec.describe Channel::Whatsapp do end end end + + describe '#voice_enabled?' do + let(:account) { create(:account) } + + it 'returns true for embedded-signup whatsapp_cloud channels with calling_enabled' do + channel = create(:channel_whatsapp, account: account, provider: 'whatsapp_cloud', + validate_provider_config: false, sync_templates: false) + channel.update!(provider_config: channel.provider_config.merge('calling_enabled' => true)) + + expect(channel.voice_enabled?).to be true + end + + it 'returns false for whatsapp_cloud channels without embedded_signup source' do + channel = create(:channel_whatsapp, account: account, provider: 'whatsapp_cloud', + validate_provider_config: false, sync_templates: false) + channel.update!(provider_config: channel.provider_config.merge('source' => 'manual', 'calling_enabled' => true)) + + expect(channel.voice_enabled?).to be false + end + + it 'returns false for default-provider channels (360dialog) even with calling_enabled' do + channel = create(:channel_whatsapp, account: account, provider: 'default', + validate_provider_config: false, sync_templates: false) + channel.update!(provider_config: channel.provider_config.merge('calling_enabled' => true)) + + expect(channel.voice_enabled?).to be false + end + end end