Skip to content

Commit 5827a7b

Browse files
added filePath to webhook notification payload
1 parent 7af9174 commit 5827a7b

2 files changed

Lines changed: 171 additions & 0 deletions

File tree

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
using System.Net;
2+
using System.Text.Json;
3+
using Muxarr.Core.Config;
4+
using Muxarr.Web.Services.Notifications;
5+
using Muxarr.Web.Services.Notifications.Providers;
6+
7+
namespace Muxarr.Tests;
8+
9+
[TestClass]
10+
public class WebhookProviderTests
11+
{
12+
private sealed class CapturingHttpMessageHandler : HttpMessageHandler
13+
{
14+
public HttpRequestMessage? CapturedRequest { get; private set; }
15+
public string? CapturedBody { get; private set; }
16+
17+
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
18+
{
19+
CapturedRequest = request;
20+
if (request.Content != null)
21+
{
22+
CapturedBody = await request.Content.ReadAsStringAsync(cancellationToken);
23+
}
24+
25+
return new HttpResponseMessage(HttpStatusCode.OK);
26+
}
27+
}
28+
29+
[TestMethod]
30+
public async Task SendAsync_WithFilePath_IncludesFilePathInJsonPayload()
31+
{
32+
var handler = new CapturingHttpMessageHandler();
33+
using var client = new HttpClient(handler);
34+
var provider = new WebhookProvider();
35+
var config = new NotificationConfig
36+
{
37+
Provider = "Webhook",
38+
Settings = new Dictionary<string, string>
39+
{
40+
["Url"] = "https://example.com/webhook"
41+
}
42+
};
43+
44+
var now = DateTime.UtcNow;
45+
var payload = new NotificationPayload
46+
{
47+
Title = "Conversion Completed",
48+
Body = "movie.mkv - saved 500 MB",
49+
EventType = NotificationEventType.Completed,
50+
FileName = "movie.mkv",
51+
FilePath = "/data/media/movie.mkv",
52+
SizeBefore = 2000000000,
53+
SizeAfter = 1500000000,
54+
SizeSaved = 500000000,
55+
Error = null,
56+
Timestamp = now
57+
};
58+
59+
await provider.SendAsync(client, config, payload);
60+
61+
Assert.IsNotNull(handler.CapturedRequest);
62+
Assert.AreEqual(HttpMethod.Post, handler.CapturedRequest.Method);
63+
Assert.AreEqual("https://example.com/webhook", handler.CapturedRequest.RequestUri?.ToString());
64+
Assert.IsNotNull(handler.CapturedBody);
65+
66+
using var doc = JsonDocument.Parse(handler.CapturedBody);
67+
var root = doc.RootElement;
68+
69+
Assert.AreEqual("Completed", root.GetProperty("event").GetString());
70+
Assert.AreEqual("Conversion Completed", root.GetProperty("title").GetString());
71+
Assert.AreEqual("movie.mkv - saved 500 MB", root.GetProperty("body").GetString());
72+
Assert.AreEqual("movie.mkv", root.GetProperty("fileName").GetString());
73+
Assert.AreEqual("/data/media/movie.mkv", root.GetProperty("filePath").GetString());
74+
Assert.AreEqual(2000000000, root.GetProperty("sizeBefore").GetInt64());
75+
Assert.AreEqual(1500000000, root.GetProperty("sizeAfter").GetInt64());
76+
Assert.AreEqual(500000000, root.GetProperty("sizeSaved").GetInt64());
77+
Assert.AreEqual(JsonValueKind.Null, root.GetProperty("error").ValueKind);
78+
}
79+
80+
[TestMethod]
81+
public async Task SendAsync_WithNullFilePath_SerializesNullFilePath()
82+
{
83+
var handler = new CapturingHttpMessageHandler();
84+
using var client = new HttpClient(handler);
85+
var provider = new WebhookProvider();
86+
var config = new NotificationConfig
87+
{
88+
Provider = "Webhook",
89+
Settings = new Dictionary<string, string>
90+
{
91+
["Url"] = "https://example.com/webhook"
92+
}
93+
};
94+
95+
var payload = new NotificationPayload
96+
{
97+
Title = "Conversion Started",
98+
Body = "movie.mkv",
99+
EventType = NotificationEventType.Started,
100+
FileName = "movie.mkv",
101+
FilePath = null
102+
};
103+
104+
await provider.SendAsync(client, config, payload);
105+
106+
Assert.IsNotNull(handler.CapturedBody);
107+
using var doc = JsonDocument.Parse(handler.CapturedBody);
108+
var root = doc.RootElement;
109+
110+
Assert.IsTrue(root.TryGetProperty("filePath", out var filePathProp));
111+
Assert.AreEqual(JsonValueKind.Null, filePathProp.ValueKind);
112+
}
113+
114+
[TestMethod]
115+
public async Task SendAsync_WithAuthorizationHeader_SetsAuthorizationHeader()
116+
{
117+
var handler = new CapturingHttpMessageHandler();
118+
using var client = new HttpClient(handler);
119+
var provider = new WebhookProvider();
120+
var config = new NotificationConfig
121+
{
122+
Provider = "Webhook",
123+
Settings = new Dictionary<string, string>
124+
{
125+
["Url"] = "https://example.com/webhook",
126+
["Authorization"] = "Bearer token123"
127+
}
128+
};
129+
130+
var payload = new NotificationPayload
131+
{
132+
Title = "Test",
133+
Body = "Test message"
134+
};
135+
136+
await provider.SendAsync(client, config, payload);
137+
138+
Assert.IsNotNull(handler.CapturedRequest);
139+
Assert.IsTrue(handler.CapturedRequest.Headers.Contains("Authorization"));
140+
CollectionAssert.Contains(handler.CapturedRequest.Headers.GetValues("Authorization").ToArray(), "Bearer token123");
141+
}
142+
143+
[TestMethod]
144+
public async Task SendAsync_WithoutAuthorizationHeader_OmitsAuthorizationHeader()
145+
{
146+
var handler = new CapturingHttpMessageHandler();
147+
using var client = new HttpClient(handler);
148+
var provider = new WebhookProvider();
149+
var config = new NotificationConfig
150+
{
151+
Provider = "Webhook",
152+
Settings = new Dictionary<string, string>
153+
{
154+
["Url"] = "https://example.com/webhook",
155+
["Authorization"] = ""
156+
}
157+
};
158+
159+
var payload = new NotificationPayload
160+
{
161+
Title = "Test",
162+
Body = "Test message"
163+
};
164+
165+
await provider.SendAsync(client, config, payload);
166+
167+
Assert.IsNotNull(handler.CapturedRequest);
168+
Assert.IsFalse(handler.CapturedRequest.Headers.Contains("Authorization"));
169+
}
170+
}

Muxarr.Web/Services/Notifications/Providers/WebhookProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ protected override async Task SendCoreAsync(HttpClient client, WebhookSettings s
2626
title = payload.Title,
2727
body = payload.Body,
2828
fileName = payload.FileName,
29+
filePath = payload.FilePath,
2930
sizeBefore = payload.SizeBefore,
3031
sizeAfter = payload.SizeAfter,
3132
sizeSaved = payload.SizeSaved,

0 commit comments

Comments
 (0)