test(db): add validation stored procedure tests

This commit is contained in:
Joseph Doherty
2026-01-06 13:48:16 -05:00
parent 795c15df56
commit 832911c5f2
@@ -0,0 +1,111 @@
using Dapper;
using FluentAssertions;
using JdeScoping.Core.Models.Search;
using JdeScoping.Database.Tests.Infrastructure;
using Microsoft.Data.SqlClient;
namespace JdeScoping.Database.Tests.Procedures;
/// <summary>
/// Tests for usp_ValidateSearchCriteria stored procedure.
/// Validates that the procedure throws appropriate errors for invalid search criteria.
/// </summary>
[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<SqlException>();
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<SqlException>();
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<SqlException>();
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<SqlException>();
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();
}
}