diff --git a/PrivaPub.Tests/Http/MediaLifecycleTests.cs b/PrivaPub.Tests/Http/MediaLifecycleTests.cs index 0cbd82b..245a888 100644 --- a/PrivaPub.Tests/Http/MediaLifecycleTests.cs +++ b/PrivaPub.Tests/Http/MediaLifecycleTests.cs @@ -101,9 +101,16 @@ namespace PrivaPub.Tests.Http Assert.Equal("it", edited.Body.Text("language")); Assert.Equal("a red square", (await DB.Default.Find().OneAsync(id, Token)).Description); - // an edit that doesn't send media keeps them, described as they were + // an edit that doesn't send media keeps them, described as they were; an empty media_ids takes them away var kept = (await alice.Client.Put($"/api/v1/statuses/{statusId}", ("status", "media kept"))).Ok(); Assert.Equal("a red square", kept.Body["media_attachments"]![0]!.Text("description")); + var bare = (await alice.Client.Json(HttpMethod.Put, $"/api/v1/statuses/{statusId}", new System.Text.Json.Nodes.JsonObject + { + ["status"] = "no picture now", + ["media_ids"] = new System.Text.Json.Nodes.JsonArray() + })).Ok(); + Assert.Empty(bare.Body["media_attachments"]!.AsArray()); + Assert.Equal("edited out", (await DB.Default.Find().OneAsync(id, Token)).TrashReason); } [Fact] diff --git a/PrivaPub/Api/Mastodon/Infrastructure/MastodonParams.cs b/PrivaPub/Api/Mastodon/Infrastructure/MastodonParams.cs index 4b4e1c2..b62ef7e 100644 --- a/PrivaPub/Api/Mastodon/Infrastructure/MastodonParams.cs +++ b/PrivaPub/Api/Mastodon/Infrastructure/MastodonParams.cs @@ -89,6 +89,9 @@ namespace PrivaPub.Api.Mastodon.Infrastructure Flatten(values, prefix == default ? property.Name : $"{prefix}[{property.Name}]", property.Value); break; case JsonValueKind.Array: + // an empty array is still said: media_ids: [] on an edit takes every attachment away + if (prefix != default && element.GetArrayLength() == 0) + values.TryAdd(prefix, new List()); foreach (var item in element.EnumerateArray()) { if (item.ValueKind is JsonValueKind.Object or JsonValueKind.Array)