using Omika.Data.Configuration;
using Omika.Data.Connection;
using Omika.Data.Repositories.Technical;
namespace Omika.Tests.Repositories;
///
/// Tests du repository de licence pour la résolution multi-client de l'URL API
/// (ClientBase.CL_IDWebServiceMobile → ServeurWebService.WS_AdresseAWP).
///
public class LicenceRepositoryTests
{
[Fact]
public async Task GetMobileApiUrlForClientAsync_JointureParametree_RetourneAdresse()
{
var connection = new FakeHfsqlConnection(HfsqlConnectionState.Open);
connection.QueryResult =
[
new Dictionary { ["WS_PKID"] = 10L, ["WS_AdresseAWP"] = "https://api-a.example.test" }
];
var repository = new LicenceRepository(connection);
string? url = await repository.GetMobileApiUrlForClientAsync("CLIENT.A");
Assert.Equal("https://api-a.example.test", url);
Assert.Contains("JOIN ServeurWebService", connection.LastSql);
Assert.Contains("ClientBase.CL_Code = ?", connection.LastSql);
Assert.DoesNotContain("CLIENT.A", connection.LastSql); // CodeClient non concaténé
Assert.NotNull(connection.LastParameters);
Assert.Single(connection.LastParameters!);
Assert.Equal("CLIENT.A", connection.LastParameters![0]);
}
[Fact]
public async Task GetMobileApiUrlForClientAsync_AucuneLigne_RetourneNull()
{
var connection = new FakeHfsqlConnection(HfsqlConnectionState.Open);
connection.QueryResult = [];
var repository = new LicenceRepository(connection);
Assert.Null(await repository.GetMobileApiUrlForClientAsync("CLIENT.INCONNU"));
}
[Fact]
public async Task GetMobileApiUrlForClientAsync_CodeVide_RetourneNullSansRequete()
{
var connection = new FakeHfsqlConnection(HfsqlConnectionState.Open);
var repository = new LicenceRepository(connection);
Assert.Null(await repository.GetMobileApiUrlForClientAsync(" "));
Assert.Equal(0, connection.QueryCount);
}
private sealed class FakeHfsqlConnection : IHfsqlConnection
{
public FakeHfsqlConnection(HfsqlConnectionState state) => State = state;
public HfsqlOptions Options => new();
public HfsqlConnectionState State { get; private set; }
public string? LastSql { get; private set; }
public IReadOnlyList