From eee41580b4334b5a43a04d1f4dc3b11d9f5457a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex=20Albarca?= Date: Thu, 1 Jun 2023 17:13:06 +0200 Subject: [PATCH] conversation-category-based-pricing: add new conversation category based pricing --- .../Notification/Support/ConversationType.php | 8 + .../Unit/WebHook/NotificationFactoryTest.php | 232 ++++++++++++++++++ 2 files changed, 240 insertions(+) diff --git a/src/WebHook/Notification/Support/ConversationType.php b/src/WebHook/Notification/Support/ConversationType.php index 403ff3d..9e72ac8 100644 --- a/src/WebHook/Notification/Support/ConversationType.php +++ b/src/WebHook/Notification/Support/ConversationType.php @@ -14,4 +14,12 @@ final class ConversationType extends \MyCLabs\Enum\Enum private const CUSTOMER_INITIATED = 'user_initiated'; private const REFERRAL_INITIATED = 'referral_conversion'; + + private const AUTHENTICATION = 'authentication'; + + private const MARKETING = 'marketing'; + + private const UTILITY = 'utility'; + + private const SERVICE = 'service'; } diff --git a/tests/Unit/WebHook/NotificationFactoryTest.php b/tests/Unit/WebHook/NotificationFactoryTest.php index 9b13989..4fc7f93 100644 --- a/tests/Unit/WebHook/NotificationFactoryTest.php +++ b/tests/Unit/WebHook/NotificationFactoryTest.php @@ -949,4 +949,236 @@ public function test_build_from_payload_return_null_when_payload_is_empty() $this->assertNull($notification); } + + public function test_build_from_payload_can_build_an_authentication_status_notification() + { + $payload = json_decode('{ + "object": "whatsapp_business_account", + "entry": [ + { + "id": "108536708899139", + "changes": [ + { + "value": { + "messaging_product": "whatsapp", + "metadata": { + "display_phone_number": "CUSTOMER_PHONE_NUMBER", + "phone_number_id": "CUSTOMER_PHONE_NUMBER" + }, + "statuses": [ + { + "id": "wamid.ID", + "status": "delivered", + "timestamp": "1685626673", + "recipient_id": "CUSTOMER_PHONE_NUMBER", + "conversation": { + "id": "CONVERSATION_ID", + "origin": { + "type": "authentication" + } + }, + "pricing": { + "billable": true, + "pricing_model": "CBP", + "category": "authentication" + } + } + ] + }, + "field": "messages" + } + ] + } + ] + }', true); + + $notification = $this->notification_factory->buildFromPayload($payload); + + $this->assertInstanceOf(Notification\StatusNotification::class, $notification); + $this->assertEquals('wamid.ID', $notification->id()); + $this->assertEquals('CUSTOMER_PHONE_NUMBER', $notification->customerId()); + $this->assertEquals('CONVERSATION_ID', $notification->conversationId()); + $this->assertFalse($notification->isBusinessInitiatedConversation()); + $this->assertFalse($notification->isCustomerInitiatedConversation()); + $this->assertFalse($notification->isReferralInitiatedConversation()); + $this->assertEquals('authentication', $notification->conversationType()); + $this->assertEquals('delivered', $notification->status()); + $this->assertFalse($notification->isMessageRead()); + $this->assertTrue($notification->isMessageDelivered()); + $this->assertTrue($notification->isMessageSent()); + } + + public function test_build_from_payload_can_build_a_marketing_status_notification() + { + $payload = json_decode('{ + "object": "whatsapp_business_account", + "entry": [ + { + "id": "108536708899139", + "changes": [ + { + "value": { + "messaging_product": "whatsapp", + "metadata": { + "display_phone_number": "CUSTOMER_PHONE_NUMBER", + "phone_number_id": "CUSTOMER_PHONE_NUMBER" + }, + "statuses": [ + { + "id": "wamid.ID", + "status": "delivered", + "timestamp": "1685626673", + "recipient_id": "CUSTOMER_PHONE_NUMBER", + "conversation": { + "id": "CONVERSATION_ID", + "origin": { + "type": "marketing" + } + }, + "pricing": { + "billable": true, + "pricing_model": "CBP", + "category": "marketing" + } + } + ] + }, + "field": "messages" + } + ] + } + ] + }', true); + + $notification = $this->notification_factory->buildFromPayload($payload); + + $this->assertInstanceOf(Notification\StatusNotification::class, $notification); + $this->assertEquals('wamid.ID', $notification->id()); + $this->assertEquals('CUSTOMER_PHONE_NUMBER', $notification->customerId()); + $this->assertEquals('CONVERSATION_ID', $notification->conversationId()); + $this->assertFalse($notification->isBusinessInitiatedConversation()); + $this->assertFalse($notification->isCustomerInitiatedConversation()); + $this->assertFalse($notification->isReferralInitiatedConversation()); + $this->assertEquals('marketing', $notification->conversationType()); + $this->assertEquals('delivered', $notification->status()); + $this->assertFalse($notification->isMessageRead()); + $this->assertTrue($notification->isMessageDelivered()); + $this->assertTrue($notification->isMessageSent()); + } + + public function test_build_from_payload_can_build_an_utility_status_notification() + { + $payload = json_decode('{ + "object": "whatsapp_business_account", + "entry": [ + { + "id": "108536708899139", + "changes": [ + { + "value": { + "messaging_product": "whatsapp", + "metadata": { + "display_phone_number": "CUSTOMER_PHONE_NUMBER", + "phone_number_id": "CUSTOMER_PHONE_NUMBER" + }, + "statuses": [ + { + "id": "wamid.ID", + "status": "delivered", + "timestamp": "1685626673", + "recipient_id": "CUSTOMER_PHONE_NUMBER", + "conversation": { + "id": "CONVERSATION_ID", + "origin": { + "type": "utility" + } + }, + "pricing": { + "billable": true, + "pricing_model": "CBP", + "category": "utility" + } + } + ] + }, + "field": "messages" + } + ] + } + ] + }', true); + + $notification = $this->notification_factory->buildFromPayload($payload); + + $this->assertInstanceOf(Notification\StatusNotification::class, $notification); + $this->assertEquals('wamid.ID', $notification->id()); + $this->assertEquals('CUSTOMER_PHONE_NUMBER', $notification->customerId()); + $this->assertEquals('CONVERSATION_ID', $notification->conversationId()); + $this->assertFalse($notification->isBusinessInitiatedConversation()); + $this->assertFalse($notification->isCustomerInitiatedConversation()); + $this->assertFalse($notification->isReferralInitiatedConversation()); + $this->assertEquals('utility', $notification->conversationType()); + $this->assertEquals('delivered', $notification->status()); + $this->assertFalse($notification->isMessageRead()); + $this->assertTrue($notification->isMessageDelivered()); + $this->assertTrue($notification->isMessageSent()); + } + + public function test_build_from_payload_can_build_a_service_status_notification() + { + $payload = json_decode('{ + "object": "whatsapp_business_account", + "entry": [ + { + "id": "108536708899139", + "changes": [ + { + "value": { + "messaging_product": "whatsapp", + "metadata": { + "display_phone_number": "CUSTOMER_PHONE_NUMBER", + "phone_number_id": "CUSTOMER_PHONE_NUMBER" + }, + "statuses": [ + { + "id": "wamid.ID", + "status": "delivered", + "timestamp": "1685626673", + "recipient_id": "CUSTOMER_PHONE_NUMBER", + "conversation": { + "id": "CONVERSATION_ID", + "origin": { + "type": "service" + } + }, + "pricing": { + "billable": true, + "pricing_model": "CBP", + "category": "service" + } + } + ] + }, + "field": "messages" + } + ] + } + ] + }', true); + + $notification = $this->notification_factory->buildFromPayload($payload); + + $this->assertInstanceOf(Notification\StatusNotification::class, $notification); + $this->assertEquals('wamid.ID', $notification->id()); + $this->assertEquals('CUSTOMER_PHONE_NUMBER', $notification->customerId()); + $this->assertEquals('CONVERSATION_ID', $notification->conversationId()); + $this->assertFalse($notification->isBusinessInitiatedConversation()); + $this->assertFalse($notification->isCustomerInitiatedConversation()); + $this->assertFalse($notification->isReferralInitiatedConversation()); + $this->assertEquals('service', $notification->conversationType()); + $this->assertEquals('delivered', $notification->status()); + $this->assertFalse($notification->isMessageRead()); + $this->assertTrue($notification->isMessageDelivered()); + $this->assertTrue($notification->isMessageSent()); + } }