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»"); } }