using System.Linq; using System.Threading.Tasks; using FluentValidation; using MediatR; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using ReC.Application.RecActions.Commands; using ReC.Application.Results.Queries; namespace ReC.Tests.Application.RecActions; [TestFixture] public class InvokeBatchDuplicateGuardTests : RecApplicationTestBase { private const long ProfileId = 3; private (ISender Sender, IServiceScope Scope) CreateScopedSender() { var scope = ServiceProvider.CreateScope(); var sender = scope.ServiceProvider.GetRequiredService(); return (sender, scope); } [Test] public async Task Invoke_with_existing_batchId_throws_ValidationException() { var (sender, scope) = CreateScopedSender(); using var _ = scope; // Arrange: read an existing result to get a real BatchId from the database var results = await sender.Send(new ReadResultViewQuery { ProfileId = ProfileId, IncludeAction = false, LastBatch = true }); var existingBatchId = results.FirstOrDefault()?.BatchId; Assert.That(existingBatchId, Is.Not.Null.And.Not.Empty, $"No results with a BatchId found for ProfileId {ProfileId}. Ensure test data exists in the database."); // Act & Assert: invoking with the same BatchId should throw ValidationException var ex = Assert.ThrowsAsync(async () => await sender.Send(new InvokeBatchRecActionViewsCommand { ProfileId = ProfileId, References = new InvokeReferences { BatchId = existingBatchId! } })); Assert.That(ex!.Errors.Any(e => e.PropertyName.Contains("BatchId"))); } [Test] public void Invoke_with_new_batchId_does_not_throw_duplicate_guard() { var (sender, scope) = CreateScopedSender(); using var _ = scope; var uniqueBatchId = $"test-{System.Guid.NewGuid():N}"; // This should NOT throw ValidationException for duplicate BatchId. // It may throw other exceptions (e.g., no actions found, endpoint errors), // but the duplicate guard should pass. try { sender.Send(new InvokeBatchRecActionViewsCommand { ProfileId = ProfileId, References = new InvokeReferences { BatchId = uniqueBatchId } }).GetAwaiter().GetResult(); } catch (ValidationException valEx) when (valEx.Errors.Any(e => e.PropertyName.Contains("BatchId"))) { Assert.Fail("Duplicate guard should not trigger for a unique BatchId."); } catch { // Other exceptions (endpoint errors, etc.) are acceptable } } }