using Dapper; using FluentAssertions; using JdeScoping.Core.Models.Search; using JdeScoping.Database.Tests.Infrastructure; using Microsoft.Data.SqlClient; namespace JdeScoping.Database.Tests.Procedures; /// /// Tests for usp_ValidateSearchCriteria stored procedure. /// Validates that the procedure throws appropriate errors for invalid search criteria. /// [Collection("DatabaseTests")] public class ValidateSearchCriteriaProcedureTests : DatabaseTestBase { [Fact] public async Task usp_ValidateSearchCriteria_ValidSearch_Succeeds() { // Arrange var criteria = new SearchCriteria { WorkOrderNumbers = [12345] }; var searchId = await InsertTestSearchAsync(criteria); // Act var act = async () => await Connection.ExecuteAsync( "EXEC dbo.usp_ValidateSearchCriteria @SearchId", new { SearchId = searchId }); // Assert await act.Should().NotThrowAsync(); } [Fact] public async Task usp_ValidateSearchCriteria_SearchNotFound_ThrowsError50001() { // Act var act = async () => await Connection.ExecuteAsync( "EXEC dbo.usp_ValidateSearchCriteria @SearchId", new { SearchId = 99999 }); // Assert var ex = await act.Should().ThrowAsync(); ex.Which.Number.Should().Be(50001); ex.Which.Message.Should().Contain("Search ID 99999 not found"); } [Fact] public async Task usp_ValidateSearchCriteria_NullCriteria_ThrowsError50002() { // Arrange var searchId = await InsertTestSearchWithRawCriteriaAsync(null); // Act var act = async () => await Connection.ExecuteAsync( "EXEC dbo.usp_ValidateSearchCriteria @SearchId", new { SearchId = searchId }); // Assert var ex = await act.Should().ThrowAsync(); ex.Which.Number.Should().Be(50002); ex.Which.Message.Should().Contain("has no criteria"); } [Fact] public async Task usp_ValidateSearchCriteria_EmptyCriteria_ThrowsError50002() { // Arrange var searchId = await InsertTestSearchWithRawCriteriaAsync(""); // Act var act = async () => await Connection.ExecuteAsync( "EXEC dbo.usp_ValidateSearchCriteria @SearchId", new { SearchId = searchId }); // Assert var ex = await act.Should().ThrowAsync(); ex.Which.Number.Should().Be(50002); ex.Which.Message.Should().Contain("has no criteria"); } [Fact] public async Task usp_ValidateSearchCriteria_InvalidJson_ThrowsError50003() { // Arrange var searchId = await InsertTestSearchWithRawCriteriaAsync("not valid json {{{"); // Act var act = async () => await Connection.ExecuteAsync( "EXEC dbo.usp_ValidateSearchCriteria @SearchId", new { SearchId = searchId }); // Assert var ex = await act.Should().ThrowAsync(); ex.Which.Number.Should().Be(50003); ex.Which.Message.Should().Contain("has invalid JSON"); } [Fact] public async Task usp_ValidateSearchCriteria_EmptyJsonObject_Succeeds() { // Arrange - empty JSON object is valid var searchId = await InsertTestSearchWithRawCriteriaAsync("{}"); // Act var act = async () => await Connection.ExecuteAsync( "EXEC dbo.usp_ValidateSearchCriteria @SearchId", new { SearchId = searchId }); // Assert await act.Should().NotThrowAsync(); } }