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