|
| 1 | +using System.Net; |
| 2 | +using System.Text.Json; |
| 3 | +using Termii; |
| 4 | +using Termii.Tests.Infrastructure; |
| 5 | +using Xunit; |
| 6 | + |
| 7 | +namespace Termii.Tests; |
| 8 | + |
| 9 | +public sealed class TermiiWhatsAppTemplateClientTests |
| 10 | +{ |
| 11 | + [Fact] |
| 12 | + public async Task SendWhatsAppTemplateAsyncPostsTemplateBody() |
| 13 | + { |
| 14 | + using var handler = new TestHttpMessageHandler( |
| 15 | + HttpStatusCode.OK, |
| 16 | + """{"code":"ok","message":"Template accepted","message_id":"template-123","status":"queued"}"""); |
| 17 | + var client = TestTermiiClientFactory.Create(handler); |
| 18 | + |
| 19 | + var response = await client.Messaging.SendWhatsAppTemplateAsync( |
| 20 | + new SendWhatsAppTemplateRequest |
| 21 | + { |
| 22 | + PhoneNumber = "2348012345678", |
| 23 | + DeviceId = "device-123", |
| 24 | + TemplateId = "template-123", |
| 25 | + TemplateName = "order_update", |
| 26 | + Language = "en", |
| 27 | + Variables = new Dictionary<string, JsonElement> |
| 28 | + { |
| 29 | + ["first_name"] = JsonDocument.Parse("\"Ada\"").RootElement.Clone(), |
| 30 | + ["order_id"] = JsonDocument.Parse("\"ORD-123\"").RootElement.Clone(), |
| 31 | + }, |
| 32 | + }, |
| 33 | + CancellationToken.None); |
| 34 | + |
| 35 | + var request = handler.LastRequest; |
| 36 | + Assert.NotNull(request); |
| 37 | + using var body = await request.ReadJsonBodyAsync(CancellationToken.None); |
| 38 | + |
| 39 | + Assert.Equal(HttpMethod.Post, request.Method); |
| 40 | + Assert.Equal("https://example.test/api/send/template", request.RequestUri!.ToString()); |
| 41 | + Assert.Equal("test-api-key", body.RootElement.GetProperty("api_key").GetString()); |
| 42 | + Assert.Equal("2348012345678", body.RootElement.GetProperty("phone_number").GetString()); |
| 43 | + Assert.Equal("device-123", body.RootElement.GetProperty("device_id").GetString()); |
| 44 | + Assert.Equal("template-123", body.RootElement.GetProperty("template_id").GetString()); |
| 45 | + Assert.Equal("order_update", body.RootElement.GetProperty("template_name").GetString()); |
| 46 | + Assert.Equal("en", body.RootElement.GetProperty("language").GetString()); |
| 47 | + Assert.Equal("Ada", body.RootElement.GetProperty("variables").GetProperty("first_name").GetString()); |
| 48 | + |
| 49 | + Assert.Equal("ok", response.Code); |
| 50 | + Assert.Equal("Template accepted", response.Message); |
| 51 | + Assert.Equal("template-123", response.MessageId); |
| 52 | + Assert.Equal("queued", response.Status); |
| 53 | + } |
| 54 | + |
| 55 | + [Fact] |
| 56 | + public async Task SendWhatsAppTemplateMediaAsyncPostsMediaTemplateBody() |
| 57 | + { |
| 58 | + using var handler = new TestHttpMessageHandler( |
| 59 | + HttpStatusCode.OK, |
| 60 | + """{"message":"Media template accepted","status":"queued"}"""); |
| 61 | + var client = TestTermiiClientFactory.Create(handler); |
| 62 | + |
| 63 | + var response = await client.Messaging.SendWhatsAppTemplateMediaAsync( |
| 64 | + new SendWhatsAppTemplateMediaRequest |
| 65 | + { |
| 66 | + PhoneNumber = "2348012345678", |
| 67 | + DeviceId = "device-123", |
| 68 | + TemplateId = "template-media-123", |
| 69 | + Language = "en", |
| 70 | + Media = new WhatsAppTemplateMedia |
| 71 | + { |
| 72 | + Type = "document", |
| 73 | + Url = "https://example.test/invoice.pdf", |
| 74 | + Caption = "Invoice", |
| 75 | + FileName = "invoice.pdf", |
| 76 | + }, |
| 77 | + }, |
| 78 | + CancellationToken.None); |
| 79 | + |
| 80 | + var request = handler.LastRequest; |
| 81 | + Assert.NotNull(request); |
| 82 | + using var body = await request.ReadJsonBodyAsync(CancellationToken.None); |
| 83 | + var media = body.RootElement.GetProperty("media"); |
| 84 | + |
| 85 | + Assert.Equal(HttpMethod.Post, request.Method); |
| 86 | + Assert.Equal("https://example.test/api/send/template/media", request.RequestUri!.ToString()); |
| 87 | + Assert.Equal("test-api-key", body.RootElement.GetProperty("api_key").GetString()); |
| 88 | + Assert.Equal("template-media-123", body.RootElement.GetProperty("template_id").GetString()); |
| 89 | + Assert.Equal("document", media.GetProperty("type").GetString()); |
| 90 | + Assert.Equal("https://example.test/invoice.pdf", media.GetProperty("url").GetString()); |
| 91 | + Assert.Equal("Invoice", media.GetProperty("caption").GetString()); |
| 92 | + Assert.Equal("invoice.pdf", media.GetProperty("filename").GetString()); |
| 93 | + Assert.Equal("Media template accepted", response.Message); |
| 94 | + } |
| 95 | + |
| 96 | + [Fact] |
| 97 | + public async Task SendWhatsAppTemplateAsyncRejectsMissingRequiredFields() |
| 98 | + { |
| 99 | + using var handler = new TestHttpMessageHandler(); |
| 100 | + var client = TestTermiiClientFactory.Create(handler); |
| 101 | + |
| 102 | + await Assert.ThrowsAsync<ArgumentException>(() => client.Messaging.SendWhatsAppTemplateAsync( |
| 103 | + new SendWhatsAppTemplateRequest |
| 104 | + { |
| 105 | + PhoneNumber = "", |
| 106 | + DeviceId = "device-123", |
| 107 | + TemplateId = "template-123", |
| 108 | + }, |
| 109 | + CancellationToken.None)); |
| 110 | + } |
| 111 | + |
| 112 | + [Fact] |
| 113 | + public async Task SendWhatsAppTemplateMediaAsyncRejectsMissingMediaUrl() |
| 114 | + { |
| 115 | + using var handler = new TestHttpMessageHandler(); |
| 116 | + var client = TestTermiiClientFactory.Create(handler); |
| 117 | + |
| 118 | + await Assert.ThrowsAsync<ArgumentException>(() => client.Messaging.SendWhatsAppTemplateMediaAsync( |
| 119 | + new SendWhatsAppTemplateMediaRequest |
| 120 | + { |
| 121 | + PhoneNumber = "2348012345678", |
| 122 | + DeviceId = "device-123", |
| 123 | + TemplateId = "template-123", |
| 124 | + Media = new WhatsAppTemplateMedia |
| 125 | + { |
| 126 | + Type = "image", |
| 127 | + Url = "", |
| 128 | + }, |
| 129 | + }, |
| 130 | + CancellationToken.None)); |
| 131 | + } |
| 132 | +} |
0 commit comments