11using System ;
22using System . Collections . Generic ;
33using System . Linq ;
4+ using System . Reflection . Metadata ;
45using System . Text ;
56using System . Text . Json ;
67using System . Threading . Tasks ;
@@ -13,48 +14,28 @@ namespace Devlooped.WhatsApp;
1314public class WhatsAppModelTests ( ITestOutputHelper output )
1415{
1516 [ Theory ]
16- [ InlineData (
17- """
18- {
19- "object": "whatsapp_business_account",
20- "entry": [
21- {
22- "id": "554372691093163",
23- "changes": [
24- {
25- "value": {
26- "messaging_product": "whatsapp",
27- "metadata": {
28- "display_phone_number": "5491123960774",
29- "phone_number_id": "524718744066632"
30- },
31- "contacts": [
32- {
33- "profile": { "name": "Kzu" },
34- "wa_id": "5491159278282"
35- }
36- ],
37- "messages": [
38- {
39- "from": "5491159278282",
40- "id": "wamid.HBgNNTQ5MTE1OTI3ODI4MhUCABIYFjNFQjBFOEFGODAzMEI4RTI3NzczNjkA",
41- "timestamp": "1744062742",
42- "text": { "body": "hello!" },
43- "type": "text"
44- }
45- ]
46- },
47- "field": "messages"
48- }
49- ]
50- }
51- ]
52- }
53- """ ) ]
54- public async Task DeserializePayload ( string json )
17+ [ InlineData ( nameof ( ContentType . Audio ) , "927483105672819" , "wamid.XYZRandomString123ABC456DEF789GHI==" ) ]
18+ [ InlineData ( nameof ( ContentType . Contact ) , "927481035162874" , "wamid.HBgNNDcyODkwMTIzNDU2NhUCABIYFjE4QTlDMzU2MkJDOTg3RUY2NDg5RTFEMTIzQzVFRAA==" ) ]
19+ [ InlineData ( nameof ( ContentType . Document ) , "813947205126374" , "wamid.HBgNMTIwMjU1NTk4NzY1NhUCABIYFjE4QTlDMzU2MkJDOTg3RUY2NDg5RTFEMTIzQzVFRAA==" ) ]
20+ [ InlineData ( nameof ( ContentType . Image ) , "813927405162784" , "wamid.HBgNMTIwMjU1NTk4NzY1NhUCABIYFjE4QTlDMzU2MkJDOTg3RUY2NDg5RTFEMTIzQzVFRAA==" ) ]
21+ [ InlineData ( nameof ( ContentType . Location ) , "813920475601234" , "wamid.HBgNMTIwMjk4NzQ1NjM1NhUCABIYFjE5RDhGMzQ2NEJDOTg3RUY2NDg5RTFEMTIzQzVFRAA==" ) ]
22+ [ InlineData ( nameof ( ContentType . Text ) , "813920475102346" , "wamid.HBgNMTIwMjk4NzQ1NjM1NhUCABIYFjQ5RjE4QzJEMzU2ODk3QTJFMUY3RDEyMjNBNkI5QwA==" , "wamid.HBgNNTQ5MTE1OTL4ODI4MhUCBBEYEjUxNDI3NkMzRkI1ODVCRTgwOAA=" ) ]
23+ [ InlineData ( nameof ( ContentType . Video ) , "813927405162374" , "wamid.HBgNMTIwMjU1NTk4NzY1NhUCABIYFjE4QTlDMzU2MkJDOTg3RUY2NDg5RTFEMTIzQzVFRAA==" ) ]
24+ [ InlineData ( nameof ( MessageType . Unsupported ) , "837625914708254" , "wamid.HBgNNTQ5MzcyNjEwNDg1OVUCABIYFjJCRDM5RTg0QkY3OEQxMjM2RkE0QjcA" ) ]
25+ [ InlineData ( nameof ( MessageType . Error ) , "729104583621947" , "wamid.XYZgMDEyMzQ1Njc4OTA5MRUCABEYEjU5NkM3ODlFQjAxMjM0NTY7OA==" ) ]
26+ [ InlineData ( nameof ( MessageType . Interactive ) , "123456789012345" , "wamid.RandomMessageID" , "wamid.RandomContextID" ) ]
27+ [ InlineData ( nameof ( MessageType . Reaction ) , "123456789012345" , "wamid.HBgNMTIzNDU2Nzg5MDEyMzQ1MhUCABEYEkY5QzQxNDNBQjgyRkVENEIzMQA=" , "wamid.HBgNMTIzNDU2Nzg5MDEyMzQ1MhUCABEYEkY5QzQxNDNBQjgyRkVENEIzMQA=" ) ]
28+ // For consistency, status message ID == status context ID.
29+ [ InlineData ( nameof ( MessageType . Status ) , "987654321098765" , "wamid.HBgNNTQ5OTg3NjU0MzIxMDlUCABEYEkLMNVzNDU2Nzg5MAA=" , "wamid.HBgNNTQ5OTg3NjU0MzIxMDlUCABEYEkLMNVzNDU2Nzg5MAA=" ) ]
30+ public async Task DeserializeMessage ( string type , string notification , string id , string ? context = default )
5531 {
32+ var json = await File . ReadAllTextAsync ( $ "Content/WhatsApp/{ type } .json") ;
5633 var message = await Message . DeserializeAsync ( json ) ;
34+
5735 Assert . NotNull ( message ) ;
36+ Assert . Equal ( notification , message . NotificationId ) ;
37+ Assert . Equal ( id , message . Id ) ;
38+ Assert . Equal ( context , message . Context ) ;
5839 Assert . NotNull ( message . To ) ;
5940 Assert . NotNull ( message . From ) ;
6041 }
@@ -67,14 +48,15 @@ public async Task DeserializePayload(string json)
6748 [ InlineData ( ContentType . Location ) ]
6849 [ InlineData ( ContentType . Text ) ]
6950 [ InlineData ( ContentType . Video ) ]
70- public async Task DeserializePolymorphic ( ContentType type )
51+ public async Task DeserializeContent ( ContentType type )
7152 {
7253 var json = await File . ReadAllTextAsync ( $ "Content/WhatsApp/{ type } .json") ;
7354 var message = await Message . DeserializeAsync ( json ) ;
7455
7556 var content = Assert . IsType < ContentMessage > ( message ) ;
7657
7758 Assert . NotNull ( message ) ;
59+ Assert . NotNull ( message . NotificationId ) ;
7860 Assert . NotNull ( message . To ) ;
7961 Assert . NotNull ( message . From ) ;
8062 Assert . NotNull ( content . Content ) ;
@@ -90,6 +72,7 @@ public async Task DeserializeErrorStatus()
9072 var error = Assert . IsType < ErrorMessage > ( message ) ;
9173
9274 Assert . NotNull ( message ) ;
75+ Assert . NotNull ( message . NotificationId ) ;
9376 Assert . NotNull ( message . To ) ;
9477 Assert . NotNull ( message . From ) ;
9578 Assert . NotNull ( error . Error ) ;
@@ -105,6 +88,7 @@ public async Task DeserializeStatus()
10588 var status = Assert . IsType < StatusMessage > ( message ) ;
10689
10790 Assert . NotNull ( message ) ;
91+ Assert . NotNull ( message . NotificationId ) ;
10892 Assert . NotNull ( message . To ) ;
10993 Assert . NotNull ( message . From ) ;
11094 Assert . Equal ( Status . Delivered , status . Status ) ;
@@ -119,6 +103,7 @@ public async Task DeserializeInteractive()
119103 var interactive = Assert . IsType < InteractiveMessage > ( message ) ;
120104
121105 Assert . NotNull ( message ) ;
106+ Assert . NotNull ( message . NotificationId ) ;
122107 Assert . NotNull ( message . To ) ;
123108 Assert . NotNull ( message . From ) ;
124109 Assert . Equal ( "btn_yes" , interactive . Button . Id ) ;
@@ -134,7 +119,23 @@ public async Task DeserializeUnsupported()
134119 var unsupported = Assert . IsType < UnsupportedMessage > ( message ) ;
135120
136121 Assert . NotNull ( message ) ;
122+ Assert . NotNull ( message . NotificationId ) ;
123+ Assert . NotNull ( message . To ) ;
124+ Assert . NotNull ( message . From ) ;
125+ }
126+
127+ [ Fact ]
128+ public async Task DeserializeReaction ( )
129+ {
130+ var json = await File . ReadAllTextAsync ( $ "Content/WhatsApp/Reaction.json") ;
131+ var message = await Message . DeserializeAsync ( json ) ;
132+
133+ var reaction = Assert . IsType < ReactionMessage > ( message ) ;
134+
135+ Assert . NotNull ( message ) ;
136+ Assert . NotNull ( message . NotificationId ) ;
137137 Assert . NotNull ( message . To ) ;
138138 Assert . NotNull ( message . From ) ;
139+ Assert . Equal ( "😊" , reaction . Emoji ) ;
139140 }
140141}
0 commit comments