Files
sql-utilities/tests/Strata.SqlTools.EFCore.Tests/QueryBreakdownRepositoryTests.cs
T
Thom LambandClaude Opus 4.7 6af239035b chore(sonar): use concrete return types where binary-safe (CA1859)
CA1859 has no `dotnet format` batch fixer, so applied manually after
verifying each site is private/internal/test (no public-surface impact):

- Markdown.TryParseLogicalOperation: Expression? -> BoolExpr?  (private)
- Markdown.TryParseComparison:       Expression? -> Comparison? (private)
- RuleSet.GetAllSingleRules(IGroup): IEnumerable<SingleRule> -> List<SingleRule> (private overload)
- SqlExpressionClause.SplitOnComma:  IEnumerable<string> -> List<string> (private)
- QueryBreakdownRepositoryTests._repository: IQueryBreakdownRepository -> QueryBreakdownRepository (test private field)
- UnitTest1.StartsWith(...,string):  Expression -> MethodCallExpression (test private helper)

The public `RuleSet.GetAllSingleRules()` overload still returns
IEnumerable<SingleRule> — only the private recursive helper was tightened.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 15:49:20 -05:00

165 lines
4.6 KiB
C#

using Microsoft.EntityFrameworkCore;
using NUnit.Framework;
using Strata.SqlTools.Breakdowns.SqlServer;
using Strata.SqlTools.EFCore.Abstractions;
using Strata.SqlTools.EFCore.Services;
namespace Strata.SqlTools.EFCore.Tests;
[TestFixture]
public class QueryBreakdownRepositoryTests
{
private DbContext _dbContext = null!;
private IQueryBreakdownMapper _mapper = null!;
private QueryBreakdownRepository _repository = null!;
[SetUp]
public void Setup()
{
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
_dbContext = new TestDbContext(options);
_dbContext.Database.EnsureCreated();
_mapper = new QueryBreakdownMapper();
_repository = new QueryBreakdownRepository(_dbContext, _mapper);
}
[TearDown]
public void TearDown()
{
_dbContext.Dispose();
}
[Test]
public async Task AddAsync_WithValidQuery_ReturnsValidId()
{
// Arrange
var queryBreakdown = new QueryBreakdown("ID, Name", "Users");
// Act
int id = await _repository.AddAsync(queryBreakdown);
// Assert
Assert.That(id, Is.GreaterThan(0));
}
[Test]
public async Task GetByIdAsync_WithExistingId_ReturnsQueryBreakdown()
{
// Arrange
var queryBreakdown = new QueryBreakdown("ID, Name", "Users");
int id = await _repository.AddAsync(queryBreakdown);
// Act
var retrieved = await _repository.GetByIdAsync(id);
// Assert
Assert.That(retrieved, Is.Not.Null);
Assert.That(retrieved?.SelectClause?.Clause, Is.EqualTo("ID, Name"));
Assert.That(retrieved?.FromClause?.Clause, Is.EqualTo("Users"));
}
[Test]
public async Task GetByIdAsync_WithNonExistentId_ReturnsNull()
{
// Act
var retrieved = await _repository.GetByIdAsync(999);
// Assert
Assert.That(retrieved, Is.Null);
}
[Test]
public async Task GetAllAsync_WithMultipleQueries_ReturnsAllQueries()
{
// Arrange
var query1 = new QueryBreakdown("ID", "Users");
var query2 = new QueryBreakdown("OrderID, Total", "Orders");
await _repository.AddAsync(query1);
await _repository.AddAsync(query2);
// Act
var allQueries = await _repository.GetAllAsync();
// Assert
Assert.That(allQueries, Has.Count.EqualTo(2));
}
[Test]
public async Task UpdateAsync_WithExistingQuery_UpdatesData()
{
// Arrange
var queryBreakdown = new QueryBreakdown("ID, Name", "Users");
int id = await _repository.AddAsync(queryBreakdown);
var updatedQuery = new QueryBreakdown("ID, Name, Email", "Users");
// Act
await _repository.UpdateAsync(id, updatedQuery);
var retrieved = await _repository.GetByIdAsync(id);
// Assert
Assert.That(retrieved?.SelectClause?.Clause, Is.EqualTo("ID, Name, Email"));
}
[Test]
public async Task DeleteAsync_WithExistingId_DeletesQuery()
{
// Arrange
var queryBreakdown = new QueryBreakdown("ID, Name", "Users");
int id = await _repository.AddAsync(queryBreakdown);
// Act
bool deleted = await _repository.DeleteAsync(id);
var retrieved = await _repository.GetByIdAsync(id);
// Assert
Assert.That(deleted, Is.True);
Assert.That(retrieved, Is.Null);
}
[Test]
public async Task DeleteAsync_WithNonExistentId_ReturnsFalse()
{
// Act
bool deleted = await _repository.DeleteAsync(999);
// Assert
Assert.That(deleted, Is.False);
}
[Test]
public async Task GetCountAsync_WithMultipleQueries_ReturnsCorrectCount()
{
// Arrange
await _repository.AddAsync(new QueryBreakdown("ID", "Users"));
await _repository.AddAsync(new QueryBreakdown("OrderID", "Orders"));
await _repository.AddAsync(new QueryBreakdown("ProductID", "Products"));
// Act
int count = await _repository.GetCountAsync();
// Assert
Assert.That(count, Is.EqualTo(3));
}
[Test]
public async Task AddAsync_WithParameters_PersistsParameters()
{
// Arrange
var queryBreakdown = new QueryBreakdown("ID, Name", "Users");
queryBreakdown.AddParameter("UserId", 123);
// Act
int id = await _repository.AddAsync(queryBreakdown);
var retrieved = await _repository.GetByIdAsync(id);
// Assert
Assert.That(retrieved?.Parameters, Does.ContainKey("@UserId"));
}
}