feat(files): add per-channel storage quota [CI]
ci/woodpecker/pr/web-build Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful

This commit is contained in:
justme committed 2026-10-14 20:42:08 +08:00
1 parent 441ed0e5f0
commit a6f078d009
19 files changed
+172 -15

No files matched your search

@@ -163,6 +163,28 @@ public class ChannelServiceTests : IDisposable
Assert.Equal("Team space", Svc.GetChannel(channel.Id, channel.Owner(_ownerEp)).Settings.Name);
}
[Fact]
public async Task FileGroupQuotaIsPerWorkspaceChannelAndFreedOnDelete()
{
_env.Limits.MaxWorkspaceChannelBytes = 200;
var space = _env.Create(_ownerEp, ChannelMode.Raw);
var owner = space.Owner(_ownerEp);
var channelId = Svc.GetWorkspace(space.Id, owner).DefaultChannelId!;
var first = TestEnv.NewId(); var second = TestEnv.NewId();
Svc.DeclareObject(space.Id, owner, new ObjectEnvelope { ItemId = first.ToBase64Url(), ChannelId = channelId, Domain = CryptoDomain.Files, Epoch = 0, KeyEnvelope = "" });
Svc.DeclareObject(space.Id, owner, new ObjectEnvelope { ItemId = second.ToBase64Url(), ChannelId = channelId, Domain = CryptoDomain.Files, Epoch = 0, KeyEnvelope = "" });
byte[] firstFrame = TestEnv.Frame(first, 0, FrameFlags.Final, 120);
await Svc.AppendFrameAsync(space.Id, owner, firstFrame, null);
Assert.Equal(firstFrame.Length, Svc.GetWorkspace(space.Id, owner).Channels.Single().FileBytes);
await AssertCode(ErrorCode.TooLarge, () => Svc.AppendFrameAsync(space.Id, owner, TestEnv.Frame(second, 0, FrameFlags.Final, 60), null));
Svc.DeleteItem(space.Id, owner, first);
Assert.Equal(0, Svc.GetWorkspace(space.Id, owner).Channels.Single().FileBytes);
await Svc.AppendFrameAsync(space.Id, owner, TestEnv.Frame(second, 0, FrameFlags.Final, 60), null);
Assert.Equal(86, Svc.GetWorkspace(space.Id, owner).Channels.Single().FileBytes);
}
[Fact]
public async Task ItemIdsAndFramesAreScopedToTheirChannel()
{