using MongoDB.Driver; using MongoDB.Entities; using PrivaPub.Federation.Actors; using PrivaPub.Infrastructure.Data; using PrivaPub.Infrastructure.Data.Migrations; using PrivaPub.Models; using PrivaPub.Models.Federation; using PrivaPub.Models.User; using PrivaPub.StaticServices; using PrivaPub.Tests.Support; namespace PrivaPub.Tests.Infrastructure { [Trait("Category", "Integration")] public class IndexTests { [Fact] public async Task Duplicates_are_removed_and_the_unique_indexes_then_hold() { Assert.SkipUnless(MongoFixture.Enabled, MongoFixture.Skip); var token = TestContext.Current.CancellationToken; var actorUri = $"https://r.example/users/{Guid.NewGuid():N}"; var localId = Guid.NewGuid().ToString("N")[..24]; await DB.Default.SaveAsync(new[] { new ForeignAvatar { ActorURI = actorUri, Name = "old", UpdatedAt = DateTime.UtcNow.AddDays(-2) }, new ForeignAvatar { ActorURI = actorUri, Name = "new", UpdatedAt = DateTime.UtcNow } }, token); await DB.Default.SaveAsync(new[] { new Follower { LocalActorId = localId, ActorURI = actorUri, IsAccepted = false }, new Follower { LocalActorId = localId, ActorURI = actorUri, IsAccepted = true } }, token); await new _001_deduplicate_before_unique_indexes().UpgradeAsync(); await Indexes.Create(token); Assert.Equal("new", (await DB.Default.Find().Match(a => a.ActorURI == actorUri).ExecuteSingleAsync(token)).Name); Assert.True((await DB.Default.Find().Match(f => f.LocalActorId == localId).ExecuteSingleAsync(token)).IsAccepted); var duplicate = await Assert.ThrowsAsync(async () => await DB.Default.SaveAsync(new ForeignAvatar { ActorURI = actorUri }, token)); Assert.Equal(ServerErrorCategory.DuplicateKey, duplicate.WriteError.Category); } [Fact] public async Task A_username_is_reserved_once_across_personas_and_groups() { Assert.SkipUnless(MongoFixture.Enabled, MongoFixture.Skip); var token = TestContext.Current.CancellationToken; await Indexes.Create(token); var local = new LocalActorService(new DbEntities(), new StaticOptions(new AppConfiguration { BackendBaseAddress = "https://privapub.test" })); var name = $"n{Guid.NewGuid():N}"[..20]; Assert.True(await local.TryReserveUserName(name, LocalActorKind.Person, "a", token)); Assert.False(await local.TryReserveUserName(name.ToUpperInvariant(), LocalActorKind.Group, "b", token)); Assert.True(await local.IsUserNameTaken(name, token)); Assert.False(await local.TryReserveUserName("admin", LocalActorKind.Person, "c", token)); Assert.False(await local.TryReserveUserName(LocalActorService.InstanceUserName, LocalActorKind.Person, "c", token)); } } }