Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
[{ToString(InTimeZone(@Timestamp, @App.Settings.TimeZoneName), @App.Settings.DateTimeFormat)} {@l:u3}] {@Message}
{#if @Exception is not null}{@Exception}{#end}{#each n, v in @Properties}
{n}: {v}{#end}
{n}: {v}{#end}{#if @Resource is not null}{#each n, v in @Resource}
@Resource.{n}: {v}{#end}{#end}{#if @Scope is not null}{#each n, v in @Scope}
@Scope.{n}: {v}{#end}{#end}

Sent by Seq at {@Host.BaseUri}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
<b>{@Message}</b>
<a href="{@Host.BaseUri}#/events?filter=@Id%20%3D%20'{UriEncode(@Id)}'">View in Seq</a>
{#each n, v in @Properties}
<b>{n}</b>: <code>{v}</code>{#end}{#if @Exception is not null}
<b>{n}</b>: <code>{v}</code>{#end}{#if @Resource is not null}{#each n, v in @Resource}
<b>@Resource.{n}</b>: <code>{v}</code>{#end}{#end}{#if @Scope is not null}{#each n, v in @Scope}
<b>@Scope.{n}</b>: <code>{v}</code>{#end}{#end}{#if @Exception is not null}

<pre>{@Exception}</pre>{#end}
{#end}
Expand Down
97 changes: 83 additions & 14 deletions test/Datalust.Seq.App.Telegram.Tests/TelegramMessageFactoryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ static TelegramMessageFactory CreateFactory(
return new TelegramMessageFactory(chatId, bodyTemplate, plainText, timeZoneName, dateFormat, app, host);
}

static TelegramMessageFactory CreateDefaultFactory(bool plainText = false)
{
var defaultTemplate = TelegramApp.LoadDefaultBodyTemplate(plainText);
return CreateFactory(bodyTemplate: defaultTemplate, plainText: plainText);
}

[Fact]
public void PlainTextMessagesRenderWithoutEncoding()
{
Expand Down Expand Up @@ -155,11 +161,7 @@ public void TimezoneFormattingProducesExpectedOutput()
[Fact]
public void DefaultHtmlTemplateRendersSuccessfully()
{
var defaultTemplate = TelegramApp.LoadDefaultBodyTemplate(false);
var app = new global::Seq.Apps.App("app-1", "Test App", new Dictionary<string, string>(), "//TEST");
var host = new global::Seq.Apps.Host("https://seq.example.com", null);
var factory = new TelegramMessageFactory("12345", defaultTemplate, false, "Etc/UTC", "o", app, host);

var factory = CreateDefaultFactory();
var evt = Some.InformationEvent("Something happened with {Widget}", "sprocket");
var message = factory.FromEvent(evt);
Assert.Contains("Something happened with", message.Text);
Expand All @@ -170,25 +172,92 @@ public void DefaultHtmlTemplateRendersSuccessfully()
[Fact]
public void DefaultPlainTextTemplateRendersSuccessfully()
{
var defaultTemplate = TelegramApp.LoadDefaultBodyTemplate(true);
var app = new global::Seq.Apps.App("app-1", "Test App", new Dictionary<string, string>(), "//TEST");
var host = new global::Seq.Apps.Host("https://seq.example.com", null);
var factory = new TelegramMessageFactory("12345", defaultTemplate, true, "Etc/UTC", "o", app, host);

var factory = CreateDefaultFactory(plainText: true);
var evt = Some.InformationEvent("Something happened with {Widget}", "sprocket");
var message = factory.FromEvent(evt);
Assert.Contains("Something happened with", message.Text);
Assert.Contains("Sent by Seq", message.Text);
Assert.Contains("INF", message.Text);
}

[Fact]
public void ResourcePropertiesAreIncludedInHtmlOutput()
{
var factory = CreateDefaultFactory();
var evt = Some.InformationEvent("Hello");
evt.AddOrUpdateProperty(new LogEventProperty("@ra", new StructureValue(new[]
{
new LogEventProperty("service.name", new ScalarValue("my-service")),
new LogEventProperty("service.version", new ScalarValue("1.0.0"))
})));

var message = factory.FromEvent(evt);
Assert.Contains("@Resource.service.name", message.Text);
Assert.Contains("my-service", message.Text);
Assert.Contains("@Resource.service.version", message.Text);
Assert.Contains("1.0.0", message.Text);
}

[Fact]
public void ScopePropertiesAreIncludedInHtmlOutput()
{
var factory = CreateDefaultFactory();
var evt = Some.InformationEvent("Hello");
evt.AddOrUpdateProperty(new LogEventProperty("@sa", new StructureValue(new[]
{
new LogEventProperty("name", new ScalarValue("MyLibrary")),
new LogEventProperty("version", new ScalarValue("2.0.0"))
})));

var message = factory.FromEvent(evt);
Assert.Contains("@Scope.name", message.Text);
Assert.Contains("MyLibrary", message.Text);
Assert.Contains("@Scope.version", message.Text);
Assert.Contains("2.0.0", message.Text);
}

[Fact]
public void ResourcePropertiesAreIncludedInPlainTextOutput()
{
var factory = CreateDefaultFactory(plainText: true);
var evt = Some.InformationEvent("Hello");
evt.AddOrUpdateProperty(new LogEventProperty("@ra", new StructureValue(new[]
{
new LogEventProperty("service.name", new ScalarValue("my-service"))
})));

var message = factory.FromEvent(evt);
Assert.Contains("@Resource.service.name: my-service", message.Text);
}

[Fact]
public void ScopePropertiesAreIncludedInPlainTextOutput()
{
var factory = CreateDefaultFactory(plainText: true);
var evt = Some.InformationEvent("Hello");
evt.AddOrUpdateProperty(new LogEventProperty("@sa", new StructureValue(new[]
{
new LogEventProperty("name", new ScalarValue("MyLibrary"))
})));

var message = factory.FromEvent(evt);
Assert.Contains("@Scope.name: MyLibrary", message.Text);
}

[Fact]
public void ResourceAndScopeAreOmittedWhenAbsent()
{
var factory = CreateDefaultFactory(plainText: true);
var evt = Some.InformationEvent("Hello");
var message = factory.FromEvent(evt);
Assert.DoesNotContain("@Resource", message.Text);
Assert.DoesNotContain("@Scope", message.Text);
}

[Fact]
public void DefaultHtmlTemplateRendersAlertBranch()
{
var defaultTemplate = TelegramApp.LoadDefaultBodyTemplate(false);
var app = new global::Seq.Apps.App("app-1", "Test App", new Dictionary<string, string>(), "//TEST");
var host = new global::Seq.Apps.Host("https://seq.example.com", null);
var factory = new TelegramMessageFactory("12345", defaultTemplate, false, "Etc/UTC", "o", app, host);
var factory = CreateDefaultFactory();

// Create an event with the alert EventType
var properties = new List<LogEventProperty>
Expand Down
Loading