diff --git a/ManagerService.Tests/Controllers/AiControllerTests.cs b/ManagerService.Tests/Controllers/AiControllerTests.cs index 665a4ab..bc28bf4 100644 --- a/ManagerService.Tests/Controllers/AiControllerTests.cs +++ b/ManagerService.Tests/Controllers/AiControllerTests.cs @@ -140,6 +140,42 @@ namespace ManagerService.Tests.Controllers Assert.Equal(42, db.Instances.First().AiTokensThisMonth); } + /// + /// Deux tours d'une même conversation partagent leur ConversationId — c'est le seul + /// lien entre eux côté serveur, l'historique étant reconstruit par le client. + /// ⚠️ Aucun client ne l'envoyait jusqu'au 2026-08-13 : le repli `Guid.NewGuid()` + /// s'appliquait à chaque appel, donc chaque question formait sa propre conversation. + /// + [Fact] + public async Task Chat_SameConversationId_LinksBothTurns() + { + using var db = DbContextFactory.Create(); + SeedAssistantInstance(db); + + var controller = BuildController(db); + var first = MakeRequest("i1"); + first.ConversationId = "conv-1"; + var second = MakeRequest("i1"); + second.ConversationId = "conv-1"; + + await controller.Chat(first); + await controller.Chat(second); + + Assert.Equal(2, db.VisitorQuestions.Count()); + Assert.All(db.VisitorQuestions, q => Assert.Equal("conv-1", q.ConversationId)); + } + + [Fact] + public async Task Chat_NoConversationId_FallsBackToAGeneratedOne() + { + using var db = DbContextFactory.Create(); + SeedAssistantInstance(db); + + await BuildController(db).Chat(MakeRequest("i1")); + + Assert.False(string.IsNullOrWhiteSpace(db.VisitorQuestions.First().ConversationId)); + } + private static void SeedAssistantInstance(MyInfoMateDbContext db) { db.Instances.Add(new Instance