using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using PrivaPub.Infrastructure; using PrivaPub.Tests.Support; using PrivaPub.Tests.Support.Host; using System.Net; namespace PrivaPub.Tests.Http { [Trait("Category", "Integration")] public sealed class RegistrationsTests : IAsyncLifetime { WebApplicationFactory _closed; public async ValueTask InitializeAsync() { Assert.SkipUnless(MongoFixture.Enabled, MongoFixture.Skip); var shared = await PrivaPubHost.Shared(); _closed = shared.WithWebHostBuilder(builder => builder.UseSetting("Registrations:Mode", nameof(RegistrationMode.Invitations))); } public async ValueTask DisposeAsync() { if (_closed != default) await _closed.DisposeAsync(); } [Fact] public async Task Invitations_only_refuses_sign_up_and_every_document_says_closed() { using var client = _closed.CreateClient(new WebApplicationFactoryClientOptions { BaseAddress = new Uri(PrivaPubHost.Base + "/"), AllowAutoRedirect = false }); client.DefaultRequestHeaders.Add(PrivaPubHost.ClientHeader, $"10.9.{Random.Shared.Next(256)}.{Random.Shared.Next(1, 255)}"); var signUp = await client.PostJson("/clientapi/user/signup", new { userName = $"closed{Guid.NewGuid():N}"[..20], password = "Closed-Door-Pass-1" }); var nodeInfo = (await client.Get("/nodeinfo/2.1")).Ok().Body; var v1 = (await client.Get("/api/v1/instance")).Ok().Body; var v2 = (await client.Get("/api/v2/instance")).Ok().Body; Assert.Equal(HttpStatusCode.Forbidden, signUp.StatusCode); Assert.Contains("invitation", await signUp.Content.ReadAsStringAsync(TestContext.Current.CancellationToken)); Assert.False(nodeInfo.Flag("openRegistrations")); Assert.False(v1.Flag("registrations")); Assert.True(v1.Flag("invites_enabled")); Assert.False(v2["registrations"].Flag("enabled")); Assert.Equal(RegistrationOptions.ClosedMessage, v2["registrations"].Text("message")); } } }