From 772570f4c610e259f163a9c51b849e765753c5e5 Mon Sep 17 00:00:00 2001 From: todd Date: Mon, 10 Feb 2025 06:34:11 +1300 Subject: [PATCH] fix: In App Message Template is Rendered for Email Step while fetching workflow data #90 --- .../MessageTemplateConverter.cs | 16 ++- .../Step/Message/InAppMessageTemplate.cs | 2 + .../MessageTemplateConverterTests.cs | 131 ++++++++++++++++++ 3 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 src/Novu.Tests/MicroTests/JsonConverters/MessageTemplateConverterTests.cs diff --git a/src/Novu.Domain/JsonConverters/MessageTemplateConverter.cs b/src/Novu.Domain/JsonConverters/MessageTemplateConverter.cs index 440c22e..03c62a0 100644 --- a/src/Novu.Domain/JsonConverters/MessageTemplateConverter.cs +++ b/src/Novu.Domain/JsonConverters/MessageTemplateConverter.cs @@ -8,9 +8,20 @@ namespace Novu.Domain.JsonConverters; /// /// Converts the incoming JSON stream into polymorphic type /// +/// +/// +/// [JsonProperty("template")] +/// [JsonConverter(typeof(MessageTemplateConverter))] +/// public IMessageTemplate Template { get; set; } +/// +/// /// /// -/// +/// +/// +/// +/// +/// public class MessageTemplateConverter : JsonCreationConverter { protected override IMessageTemplate Create(Type objectType, JObject jObject) @@ -30,13 +41,14 @@ protected override IMessageTemplate Create(Type objectType, JObject jObject) return typeEnum switch { StepTypeEnum.InApp => new InAppMessageTemplate(), - StepTypeEnum.Email => new InAppMessageTemplate(), + StepTypeEnum.Email => new EmailMessageTemplate(), StepTypeEnum.Sms => new SmsMessageTemplate(), StepTypeEnum.Chat => new ChatMessageTemplate(), StepTypeEnum.Push => new PushMessageTemplate(), StepTypeEnum.Digest => new DigestMessageTemplate(), StepTypeEnum.Trigger => new TriggerMessageTemplate(), StepTypeEnum.Delay => new DelayMessageTemplate(), + // important to throw to alert for new types _ => throw new InvalidOperationException($"Unknown type {typeEnum}"), }; } diff --git a/src/Novu.Domain/Models/Workflows/Step/Message/InAppMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/InAppMessageTemplate.cs index c129879..0faa31d 100644 --- a/src/Novu.Domain/Models/Workflows/Step/Message/InAppMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/InAppMessageTemplate.cs @@ -1,3 +1,4 @@ +using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Novu.Domain.JsonConverters; @@ -10,6 +11,7 @@ public class InAppMessageTemplate : BaseMessageTemplate, IMessageTemplate [JsonConverter(typeof(StringEnumConverter))] [JsonProperty("type")] + [Required] public StepTypeEnum Type { get; set; } = StepTypeEnum.InApp; /// diff --git a/src/Novu.Tests/MicroTests/JsonConverters/MessageTemplateConverterTests.cs b/src/Novu.Tests/MicroTests/JsonConverters/MessageTemplateConverterTests.cs new file mode 100644 index 0000000..4d35bbe --- /dev/null +++ b/src/Novu.Tests/MicroTests/JsonConverters/MessageTemplateConverterTests.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.IO; +using FluentAssertions; +using Newtonsoft.Json; +using Novu.Domain.JsonConverters; +using Novu.Domain.Models.Workflows.Step.Message; +using Xunit; + +namespace Novu.Tests.MicroTests.JsonConverters; + +public class MessageTemplateConverterTests +{ + public static IEnumerable Data => + new List + { + new object[] + { + "empty type throws exception", + @"{ ""type"": """", }", + typeof(InAppMessageTemplate), + true, + }, + new object[] + { + nameof(InAppMessageTemplate), + @" + { + ""type"": ""in_app"", + } + ", + typeof(InAppMessageTemplate), + false, + }, + new object[] + { + nameof(EmailMessageTemplate), + @" + { + ""type"": ""email"", + } + ", + typeof(EmailMessageTemplate), + false, + }, + new object[] + { + nameof(SmsMessageTemplate), + @" + { + ""type"": ""sms"", + } + ", + typeof(SmsMessageTemplate), + false, + }, + new object[] + { + nameof(ChatMessageTemplate), + @" + { + ""type"": ""chat"", + } + ", + typeof(ChatMessageTemplate), + false, + }, + new object[] + { + nameof(DigestMessageTemplate), + @" + { + ""type"": ""digest"", + } + ", + typeof(DigestMessageTemplate), + false, + }, + new object[] + { + nameof(TriggerMessageTemplate), + @" + { + ""type"": ""trigger"", + } + ", + typeof(TriggerMessageTemplate), + false, + }, + new object[] + { + nameof(DelayMessageTemplate), + @" + { + ""type"": ""delay"", + } + ", + typeof(DelayMessageTemplate), + false, + }, + }; + + [Theory] + [MemberData(nameof(Data))] + public void MessageTemplateType(string test, string json, Type t, bool throws) + { + JsonReader reader = new JsonTextReader(new StringReader(json)); + while (reader.TokenType == JsonToken.None) + { + if (!reader.Read()) + { + break; + } + } + + if (throws) + { + Assert.ThrowsAny(() => + new MessageTemplateConverter() + .ReadJson(reader, t, null, JsonSerializer.CreateDefault())); + } + else + { + new MessageTemplateConverter() + .ReadJson(reader, t, null, JsonSerializer.CreateDefault()) + .GetType() + .Should() + .Be(t); + } + } +} \ No newline at end of file