using System.Net.Http.Json;
using System.Text.Json;
using FluentAssertions;
using foodmarket.IntegrationTests.Support;
using Xunit;
namespace foodmarket.IntegrationTests;
/// Регистрация сохраняет выбранный тариф и бесплатный период (90 дней),
/// а для «Бизнес» — конфигурацию конструктора. Settings-эндпоинт отдаёт их
/// read-only для показа в кабинете владельца. Биллинга/блокировки нет.
/// Решение владельца 12.10.
[Collection(ApiCollection.Name)]
public class PlanSignupTests
{
private readonly ApiFactory _factory;
public PlanSignupTests(ApiFactory factory) => _factory = factory;
private async Task SignupWithPlanAndGetSettingsAsync(ApiActor api, string slug, object body)
{
var resp = await api.Http.PostAsJsonAsync("/api/auth/signup", body);
resp.IsSuccessStatusCode.Should().BeTrue(await resp.Content.ReadAsStringAsync());
api.UseToken(await api.TokenAsync($"{slug}@example.kz", "Passw0rd!"));
return await api.GetJsonAsync("/api/organization/settings");
}
[Fact]
public async Task Business_signup_saves_plan_trial_and_config()
{
var api = new ApiActor(_factory.CreateClient());
var slug = $"plan-biz-{Guid.NewGuid():N}";
var s = await SignupWithPlanAndGetSettingsAsync(api, slug, new
{
email = $"{slug}@example.kz", password = "Passw0rd!", organizationName = $"Org {slug}",
phone = "+77010000000", plan = "business",
shops = 3, cashes = 4, warehouses = 2, employees = 25,
});
s.GetProperty("plan").GetString().Should().Be("business");
s.GetProperty("planShops").GetInt32().Should().Be(3);
s.GetProperty("planCashes").GetInt32().Should().Be(4);
s.GetProperty("planWarehouses").GetInt32().Should().Be(2);
s.GetProperty("planEmployees").GetInt32().Should().Be(25);
var trial = s.GetProperty("freeTrialEndsAt").GetDateTime();
var expected = DateTime.UtcNow.AddDays(90);
trial.Should().BeCloseTo(expected, TimeSpan.FromHours(1), "бесплатный период = регистрация + 90 дней");
}
[Fact]
public async Task Start_signup_saves_plan_without_config()
{
var api = new ApiActor(_factory.CreateClient());
var slug = $"plan-start-{Guid.NewGuid():N}";
var s = await SignupWithPlanAndGetSettingsAsync(api, slug, new
{
email = $"{slug}@example.kz", password = "Passw0rd!", organizationName = $"Org {slug}",
phone = "+77010000000", plan = "start",
});
s.GetProperty("plan").GetString().Should().Be("start");
s.GetProperty("freeTrialEndsAt").ValueKind.Should().Be(JsonValueKind.String, "дата бесплатного периода проставлена");
// Конфигурация «Бизнес» не относится к «Старт» — поля null.
s.GetProperty("planShops").ValueKind.Should().Be(JsonValueKind.Null);
s.GetProperty("planEmployees").ValueKind.Should().Be(JsonValueKind.Null);
}
[Fact]
public async Task Unknown_plan_falls_back_to_start()
{
var api = new ApiActor(_factory.CreateClient());
var slug = $"plan-unk-{Guid.NewGuid():N}";
var s = await SignupWithPlanAndGetSettingsAsync(api, slug, new
{
email = $"{slug}@example.kz", password = "Passw0rd!", organizationName = $"Org {slug}",
phone = "+77010000000", plan = "enterprise-xxl",
});
s.GetProperty("plan").GetString().Should().Be("start", "неизвестный тариф нормализуется к «start»");
}
}