using ManagerService.Controllers; using ManagerService.Data; using ManagerService.Helpers; using ManagerService.Services; using ManagerService.Tests.Infrastructure; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Moq; using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Xunit; namespace ManagerService.Tests.Controllers { /// /// Les deux gardes du portail de facturation. L'appel à Stripe lui-même n'est pas couvert : /// il part sur le réseau, et ces tests s'arrêtent avant — c'est justement ce qui compte, /// un client sans compte Stripe ne doit jamais atteindre l'API. /// public class OnboardingControllerTests { private OnboardingController BuildController(MyInfoMateDbContext db, string callerInstanceId = "i1") { var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { ["AppUrls:ManagerApp"] = "https://manager.myinfomate.be" }) .Build(); var stripeService = new StripeService(Options.Create(new StripeSettings { SecretKey = "sk_test_dummy", WebhookSecret = "whsec_dummy", EssentielPriceId = "price_dummy" })); var controller = new OnboardingController( db, new ProfileLogic(NullLogger.Instance), new Mock().Object, configuration, NullLogger.Instance, new Mock().Object, stripeService); FakeUser.SetUser(controller, FakeUser.Create(Permissions.SuperAdmin, callerInstanceId)); return controller; } [Fact] public async Task CreateBillingPortalSession_UnknownInstance_Returns404() { using var db = DbContextFactory.Create(); var result = await BuildController(db, "unknown").CreateBillingPortalSession(); Assert.IsType(result); } [Fact] public async Task CreateBillingPortalSession_NoStripeCustomer_Returns409() { using var db = DbContextFactory.Create(); db.Instances.Add(new Instance { Id = "i1", Name = "Musée", DateCreation = DateTime.UtcNow }); db.SaveChanges(); var result = await BuildController(db).CreateBillingPortalSession(); Assert.IsType(result); } } }