diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 04289df..f7a38d2 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -32,6 +32,17 @@ jobs: -p ${{ secrets.GG_NUGET_SOURCE_USER_PASSWORD }} --store-password-in-clear-text + # Api.Core.SqlDialect + + - name: Restore Api.Core.SqlDialect + run: dotnet restore ./src/*/*/SqlDialect.csproj + + - name: Build Api.Core.SqlDialect + run: dotnet build ./src/*/*/SqlDialect.csproj --no-restore -c Release + + - name: Pack Api.Core.SqlDialect + run: dotnet pack ./src/*/*/SqlDialect.csproj --no-restore -o ~/nuget -c Release + # Api.Core.DbEntity - name: Restore Api.Core.DbEntity diff --git a/src/Directory.Build.props b/src/Directory.Build.props index d63cc19..54b744e 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -6,7 +6,7 @@ enable true true - $(NoWarn);IDE0130;CA1859 + $(NoWarn);IDE0130;CA1859;xUnit1044 \ No newline at end of file diff --git a/src/Infra.SqlApi.sln b/src/Infra.SqlApi.sln index a489364..6cfd723 100644 --- a/src/Infra.SqlApi.sln +++ b/src/Infra.SqlApi.sln @@ -33,6 +33,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Api", "api\Api\Api.csproj", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Provider.Abstractions", "api-abstractions\Provider.Abstractions\Provider.Abstractions.csproj", "{BA79F60A-3473-40A1-846D-707CB5AF96DA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDialect", "api-core\SqlDialect\SqlDialect.csproj", "{50AA8E70-0E6F-484D-A09A-BF4AE280CEC6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -87,6 +89,10 @@ Global {BA79F60A-3473-40A1-846D-707CB5AF96DA}.Debug|Any CPU.Build.0 = Debug|Any CPU {BA79F60A-3473-40A1-846D-707CB5AF96DA}.Release|Any CPU.ActiveCfg = Release|Any CPU {BA79F60A-3473-40A1-846D-707CB5AF96DA}.Release|Any CPU.Build.0 = Release|Any CPU + {50AA8E70-0E6F-484D-A09A-BF4AE280CEC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50AA8E70-0E6F-484D-A09A-BF4AE280CEC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50AA8E70-0E6F-484D-A09A-BF4AE280CEC6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50AA8E70-0E6F-484D-A09A-BF4AE280CEC6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -104,6 +110,7 @@ Global {A41B8ECF-8AE0-4C25-BF3A-30A63453C6F5} = {5E4F5B1C-D629-4D34-B81A-65F7951AE426} {B0B8E4C3-C17A-4D6A-90D0-52657FDF0115} = {5E4F5B1C-D629-4D34-B81A-65F7951AE426} {BA79F60A-3473-40A1-846D-707CB5AF96DA} = {6106F9AD-BAA7-4F24-AD96-17D27BFC486D} + {50AA8E70-0E6F-484D-A09A-BF4AE280CEC6} = {53EEC557-BEA5-4E2C-8F1A-F96404E2FDA1} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EBFE5C85-563F-4917-95A1-4501407AD8D8} diff --git a/src/api-abstractions/Abstractions.ExecuteNonQuery/Abstractions.ExecuteNonQuery.csproj b/src/api-abstractions/Abstractions.ExecuteNonQuery/Abstractions.ExecuteNonQuery.csproj index 62ba36b..a52d0f5 100644 --- a/src/api-abstractions/Abstractions.ExecuteNonQuery/Abstractions.ExecuteNonQuery.csproj +++ b/src/api-abstractions/Abstractions.ExecuteNonQuery/Abstractions.ExecuteNonQuery.csproj @@ -4,11 +4,11 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api.Abstractions.ExecuteNonQuery - 2.3.0 + 3.0.0 - + diff --git a/src/api-abstractions/Abstractions.QueryEntity/Abstractions.QueryEntity.csproj b/src/api-abstractions/Abstractions.QueryEntity/Abstractions.QueryEntity.csproj index e2fbbff..84e9156 100644 --- a/src/api-abstractions/Abstractions.QueryEntity/Abstractions.QueryEntity.csproj +++ b/src/api-abstractions/Abstractions.QueryEntity/Abstractions.QueryEntity.csproj @@ -4,12 +4,12 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api.Abstractions.QueryEntity - 2.3.0 + 3.0.0 - - + + diff --git a/src/api-abstractions/Abstractions.QueryEntitySet/Abstractions.QueryEntitySet.csproj b/src/api-abstractions/Abstractions.QueryEntitySet/Abstractions.QueryEntitySet.csproj index 491c91b..2e1af28 100644 --- a/src/api-abstractions/Abstractions.QueryEntitySet/Abstractions.QueryEntitySet.csproj +++ b/src/api-abstractions/Abstractions.QueryEntitySet/Abstractions.QueryEntitySet.csproj @@ -4,12 +4,12 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api.Abstractions.QueryEntitySet - 2.3.0 + 3.0.0 - - + + diff --git a/src/api-abstractions/Abstractions/Abstractions.csproj b/src/api-abstractions/Abstractions/Abstractions.csproj index 867fba2..179df26 100644 --- a/src/api-abstractions/Abstractions/Abstractions.csproj +++ b/src/api-abstractions/Abstractions/Abstractions.csproj @@ -4,14 +4,14 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api.Abstractions - 2.4.0 + 3.0.0 - - - + + + \ No newline at end of file diff --git a/src/api-abstractions/Provider.Abstractions/IDbProvider.T.cs b/src/api-abstractions/Provider.Abstractions/IDbProvider.T.cs index 947d317..417a1b6 100644 --- a/src/api-abstractions/Provider.Abstractions/IDbProvider.T.cs +++ b/src/api-abstractions/Provider.Abstractions/IDbProvider.T.cs @@ -4,7 +4,7 @@ namespace GarageGroup.Infra; -public interface IDbProvider +public interface IDbProvider : ISqlDialectProvider where TDbConnection : DbConnection { TDbConnection GetDbConnection(); diff --git a/src/api-abstractions/Provider.Abstractions/ISqlDialectProvider.cs b/src/api-abstractions/Provider.Abstractions/ISqlDialectProvider.cs new file mode 100644 index 0000000..73e0068 --- /dev/null +++ b/src/api-abstractions/Provider.Abstractions/ISqlDialectProvider.cs @@ -0,0 +1,6 @@ +namespace GarageGroup.Infra; + +public interface ISqlDialectProvider +{ + SqlDialect Dialect { get; } +} \ No newline at end of file diff --git a/src/api-abstractions/Provider.Abstractions/Provider.Abstractions.csproj b/src/api-abstractions/Provider.Abstractions/Provider.Abstractions.csproj index 81d8ea6..a8090c3 100644 --- a/src/api-abstractions/Provider.Abstractions/Provider.Abstractions.csproj +++ b/src/api-abstractions/Provider.Abstractions/Provider.Abstractions.csproj @@ -4,11 +4,12 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api.Provider.Abstractions - 2.2.0 + 3.0.0 - + + \ No newline at end of file diff --git a/src/api-core/DbEntity.Test/DbEntity.Test.csproj b/src/api-core/DbEntity.Test/DbEntity.Test.csproj index 803d66d..4ced3a4 100644 --- a/src/api-core/DbEntity.Test/DbEntity.Test.csproj +++ b/src/api-core/DbEntity.Test/DbEntity.Test.csproj @@ -13,15 +13,15 @@ - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/api-core/DbEntity/DbEntity.csproj b/src/api-core/DbEntity/DbEntity.csproj index b365d82..3f806fd 100644 --- a/src/api-core/DbEntity/DbEntity.csproj +++ b/src/api-core/DbEntity/DbEntity.csproj @@ -4,7 +4,7 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api.Core.DbEntity - 2.0.1 + 3.0.0 \ No newline at end of file diff --git a/src/api-core/DbParameter/DbParameter.csproj b/src/api-core/DbParameter/DbParameter.csproj index b51c71b..bbee622 100644 --- a/src/api-core/DbParameter/DbParameter.csproj +++ b/src/api-core/DbParameter/DbParameter.csproj @@ -4,7 +4,7 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api.Core.DbParameter - 2.0.1 + 3.0.0 \ No newline at end of file diff --git a/src/api-core/DbQuery.Test/DbQuery.Test.csproj b/src/api-core/DbQuery.Test/DbQuery.Test.csproj index 0b20040..9f796f0 100644 --- a/src/api-core/DbQuery.Test/DbQuery.Test.csproj +++ b/src/api-core/DbQuery.Test/DbQuery.Test.csproj @@ -13,13 +13,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/api-core/DbQuery.Test/Test.DbQuery/Test.GetParameters.cs b/src/api-core/DbQuery.Test/Test.DbQuery/Test.GetParameters.cs index abf814e..4c4620e 100644 --- a/src/api-core/DbQuery.Test/Test.DbQuery/Test.GetParameters.cs +++ b/src/api-core/DbQuery.Test/Test.DbQuery/Test.GetParameters.cs @@ -56,8 +56,11 @@ public static TheoryData> ParametersTestData { new( query: "Some query", - new("SomeName1", "One"), - new("SomeName2", null)), + parameters: + [ + new("SomeName1", "One"), + new("SomeName2", null) + ]), [ new("SomeName1", "One"), new("SomeName2", null) diff --git a/src/api-core/DbQuery.Test/Test.DbQuery/Test.GetSqlQuery.cs b/src/api-core/DbQuery.Test/Test.DbQuery/Test.GetSqlQuery.cs index c3b6203..9cd2fee 100644 --- a/src/api-core/DbQuery.Test/Test.DbQuery/Test.GetSqlQuery.cs +++ b/src/api-core/DbQuery.Test/Test.DbQuery/Test.GetSqlQuery.cs @@ -6,26 +6,30 @@ partial class DbQueryTest { [Theory] [MemberData(nameof(SqlQueryTestData))] - public static void GetFilterSqlQuery_TypesAreInRange_ExpectCorrectSqlQuery(DbQuery source, string expected) + public static void GetFilterSqlQuery_TypesAreInRange_ExpectCorrectSqlQuery( + DbQuery source, SqlDialect dialect, string expected) { - var actual = source.GetSqlQuery(); + var actual = source.GetSqlQuery(dialect); Assert.Equal(expected, actual); } - public static TheoryData SqlQueryTestData + public static TheoryData SqlQueryTestData => new() { { new(null!), + SqlDialect.TransactSql, string.Empty }, { new(string.Empty), + SqlDialect.PostgreSql, string.Empty }, { new("Some SQL Query"), + SqlDialect.TransactSql, "Some SQL Query" }, { @@ -36,6 +40,7 @@ public static TheoryData SqlQueryTestData new("P1", 15), new("P2", "Some text") ]), + SqlDialect.TransactSql, string.Empty }, { @@ -45,6 +50,7 @@ public static TheoryData SqlQueryTestData [ new("SomeName", null) ]), + (SqlDialect)37, string.Empty }, { @@ -55,6 +61,7 @@ public static TheoryData SqlQueryTestData new("SomeName1", "One"), new("SomeName2", null) ]), + SqlDialect.PostgreSql, "Some query" } }; diff --git a/src/api-core/DbQuery/DbQuery.cs b/src/api-core/DbQuery/DbQuery.cs index f8542a0..1ea2f34 100644 --- a/src/api-core/DbQuery/DbQuery.cs +++ b/src/api-core/DbQuery/DbQuery.cs @@ -22,7 +22,7 @@ public DbQuery(string query, params FlatArray parameters) public int? TimeoutInSeconds { get; init; } - public string GetSqlQuery() + public string GetSqlQuery(SqlDialect dialect) => Query; diff --git a/src/api-core/DbQuery/DbQuery.csproj b/src/api-core/DbQuery/DbQuery.csproj index ea97d17..4964552 100644 --- a/src/api-core/DbQuery/DbQuery.csproj +++ b/src/api-core/DbQuery/DbQuery.csproj @@ -4,11 +4,12 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api.Core.DbQuery - 2.2.0 + 3.0.0 - + + diff --git a/src/api-core/DbQuery/IDbQuery.cs b/src/api-core/DbQuery/IDbQuery.cs index 9e2f897..00dda16 100644 --- a/src/api-core/DbQuery/IDbQuery.cs +++ b/src/api-core/DbQuery/IDbQuery.cs @@ -4,7 +4,7 @@ namespace GarageGroup.Infra; public interface IDbQuery { - string GetSqlQuery(); + string GetSqlQuery(SqlDialect dialect); FlatArray GetParameters(); diff --git a/src/api-core/SqlDialect/SqlDialect.cs b/src/api-core/SqlDialect/SqlDialect.cs new file mode 100644 index 0000000..16d1737 --- /dev/null +++ b/src/api-core/SqlDialect/SqlDialect.cs @@ -0,0 +1,8 @@ +namespace GarageGroup.Infra; + +public enum SqlDialect +{ + TransactSql, + + PostgreSql +} \ No newline at end of file diff --git a/src/api-core/SqlDialect/SqlDialect.csproj b/src/api-core/SqlDialect/SqlDialect.csproj new file mode 100644 index 0000000..888e6fd --- /dev/null +++ b/src/api-core/SqlDialect/SqlDialect.csproj @@ -0,0 +1,10 @@ + + + + net8.0;net9.0 + GarageGroup.Infra + GarageGroup.Infra.Sql.Api.Core.SqlDialect + 1.0.0 + + + \ No newline at end of file diff --git a/src/api/Api.Test/Api.Test.csproj b/src/api/Api.Test/Api.Test.csproj index 1c33130..6ca0b93 100644 --- a/src/api/Api.Test/Api.Test.csproj +++ b/src/api/Api.Test/Api.Test.csproj @@ -13,15 +13,15 @@ - + - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/api/Api.Test/Internal.Stub/StubDbQuery.cs b/src/api/Api.Test/Internal.Stub/StubDbQuery.cs index af7ae95..467aeb4 100644 --- a/src/api/Api.Test/Internal.Stub/StubDbQuery.cs +++ b/src/api/Api.Test/Internal.Stub/StubDbQuery.cs @@ -1,24 +1,25 @@ using System; +using System.Collections.Generic; namespace GarageGroup.Infra.Sql.Api.Provider.Api.Test; internal sealed record class StubDbQuery : IDbQuery { - private readonly string query; + private readonly IReadOnlyDictionary queries; private readonly FlatArray parameters; - internal StubDbQuery(string query, FlatArray parameters) + internal StubDbQuery(IReadOnlyDictionary queries, FlatArray parameters) { - this.query = query; + this.queries = queries; this.parameters = parameters; } public int? TimeoutInSeconds { get; init; } - public string GetSqlQuery() + public string GetSqlQuery(SqlDialect dialect) => - query; + queries[dialect]; public FlatArray GetParameters() => diff --git a/src/api/Api.Test/Source.SqlApi/Source.Command.cs b/src/api/Api.Test/Source.SqlApi/Source.Command.cs index 6a04e67..ff5e841 100644 --- a/src/api/Api.Test/Source.SqlApi/Source.Command.cs +++ b/src/api/Api.Test/Source.SqlApi/Source.Command.cs @@ -1,17 +1,21 @@ -using PrimeFuncPack.UnitTest; +using System.Collections.Generic; +using PrimeFuncPack.UnitTest; using Xunit; namespace GarageGroup.Infra.Sql.Api.Provider.Api.Test; partial class SqlApiTestSource { - public static TheoryData DbCommandTestData + public static TheoryData DbCommandTestData => new() { { new( - query: string.Empty, + queries: new Dictionary + { + [SqlDialect.TransactSql] = string.Empty + }, parameters: [ new("FirstParam", 71), @@ -22,6 +26,7 @@ public static TheoryData DbCommandTestData { TimeoutInSeconds = 51 }, + SqlDialect.TransactSql, new() { CommandText = string.Empty, @@ -36,11 +41,15 @@ public static TheoryData DbCommandTestData }, { new( - query: "SELECT * From Product", + queries: new Dictionary + { + [SqlDialect.PostgreSql] = "SELECT * From Product" + }, parameters: default) { TimeoutInSeconds = null }, + SqlDialect.PostgreSql, new() { CommandText = "SELECT * From Product", diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetByte.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetByte.cs index 2a9622f..1373c0b 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetByte.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetByte.cs @@ -31,7 +31,7 @@ public static void GetByte_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 54, "OtherName"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetDateOnly.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetDateOnly.cs index f7a8968..f2419d9 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetDateOnly.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetDateOnly.cs @@ -31,7 +31,7 @@ public static void GetDateOnly_ExceptionIsThrown_ExpectInvalidOperationException using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 27, "SomeName"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetDateTime.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetDateTime.cs index 8d6a164..d6b54bf 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetDateTime.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetDateTime.cs @@ -31,7 +31,7 @@ public static void GetDateTime_ExceptionIsThrown_ExpectInvalidOperationException using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 681, "SomeField"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetDateTimeOffset.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetDateTimeOffset.cs index 67ccc6b..48fa0bb 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetDateTimeOffset.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetDateTimeOffset.cs @@ -31,7 +31,7 @@ public static void GetDateTimeOffset_ExceptionIsThrown_ExpectInvalidOperationExc using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 695, "SomeName"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetDecimal.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetDecimal.cs index 4ab5647..730f4f6 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetDecimal.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetDecimal.cs @@ -31,7 +31,7 @@ public static void GetDecimal_ExceptionIsThrown_ExpectInvalidOperationException( using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 73, "SomeName"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetDouble.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetDouble.cs index 73912b1..0caba93 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetDouble.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetDouble.cs @@ -31,7 +31,7 @@ public static void GetDouble_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 73, "SomeName"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetFloat.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetFloat.cs index 1d42119..29bd325 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetFloat.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetFloat.cs @@ -31,7 +31,7 @@ public static void GetFloat_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 73, "SomeName"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetGuid.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetGuid.cs index 312e452..7a2e2ed 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetGuid.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetGuid.cs @@ -31,7 +31,7 @@ public static void GetGuid_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 681, "SomeField"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetInt16.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetInt16.cs index 1d20544..4f12fc0 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetInt16.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetInt16.cs @@ -31,7 +31,7 @@ public static void GetInt16_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 81, "Some Field"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetInt32.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetInt32.cs index db72bac..a2a4953 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetInt32.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetInt32.cs @@ -31,7 +31,7 @@ public static void GetInt32_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 62, "SomeField"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetInt64.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetInt64.cs index c8ba5d3..9a17449 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetInt64.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetInt64.cs @@ -31,7 +31,7 @@ public static void GetInt64_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 36, "SomeField"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.GetString.cs b/src/api/Api.Test/Test.DbValueProvider/Test.GetString.cs index db454cf..80dbcad 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.GetString.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.GetString.cs @@ -33,7 +33,7 @@ public static void GetString_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 25, "Some name"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.DbValueProvider/Test.IsNull.cs b/src/api/Api.Test/Test.DbValueProvider/Test.IsNull.cs index ee78422..e066dcb 100644 --- a/src/api/Api.Test/Test.DbValueProvider/Test.IsNull.cs +++ b/src/api/Api.Test/Test.DbValueProvider/Test.IsNull.cs @@ -31,7 +31,7 @@ public static void IsNull_ExceptionIsThrown_ExpectInvalidOperationException() using var dbDataReader = new StubDbDataReader(mockDbDataReader.Object); var dbValueProvider = new DbValueProvider(dbDataReader, 23, "Some name"); - + var ex = Assert.Throws(Test); Assert.Same(sourceException, ex.InnerException); diff --git a/src/api/Api.Test/Test.SqlApi/SqlApiTest.cs b/src/api/Api.Test/Test.SqlApi/SqlApiTest.cs index 769687e..7faf561 100644 --- a/src/api/Api.Test/Test.SqlApi/SqlApiTest.cs +++ b/src/api/Api.Test/Test.SqlApi/SqlApiTest.cs @@ -11,7 +11,11 @@ public static partial class SqlApiTest private static readonly StubDbQuery SomeDbQuery = new( - query: "Some SQL", + queries: new Dictionary + { + [SqlDialect.TransactSql] = "Some TransactSql", + [SqlDialect.PostgreSql] = "Some PostgreSql" + }, parameters: [ new("First", 3781.5m), @@ -84,16 +88,16 @@ private static Mock CreateMockDbConnection(Exception exceptio } private static Mock> CreateMockDbProvider( - DbConnection dbConnection, DbCommand dbCommand, Action?>? dbParametersCallback = null) + SqlDialect dialect, DbConnection dbConnection, DbCommand dbCommand, Action?>? dbParametersCallback = null) { var mock = new Mock>(); - _ = mock.Setup(db => db.GetDbConnection()).Returns(dbConnection); + _ = mock.Setup(static db => db.GetDbConnection()).Returns(dbConnection); var m = mock.Setup( db => db.GetDbCommand( It.IsAny(), It.IsAny(), It.IsAny?>(), It.IsAny())) - .Returns(dbCommand); + .Returns(dbCommand); if (dbParametersCallback is not null) { @@ -101,6 +105,8 @@ private static Mock> CreateMockDbProvider( (_, _, actual, _) => dbParametersCallback.Invoke(actual)); } + _ = mock.SetupGet(static db => db.Dialect).Returns(dialect); + return mock; } } \ No newline at end of file diff --git a/src/api/Api.Test/Test.SqlApi/Test.ExecuteNonQuery.cs b/src/api/Api.Test/Test.SqlApi/Test.ExecuteNonQuery.cs index 9ca74f0..839324b 100644 --- a/src/api/Api.Test/Test.SqlApi/Test.ExecuteNonQuery.cs +++ b/src/api/Api.Test/Test.SqlApi/Test.ExecuteNonQuery.cs @@ -19,7 +19,7 @@ public static async Task ExecuteNonQueryAsync_QueryIsNull_ExpectArgumentNullExce var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: false); @@ -40,7 +40,7 @@ public static void ExecuteNonQueryAsync_CancellationTokenIsCanceled_ExpectCancel var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: true); @@ -57,7 +57,7 @@ public static async Task ExecuteNonQueryAsync_CancellationTokenIsNotCanceled_Exp var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.ExecuteNonQueryAsync(SomeDbQuery, default); @@ -67,14 +67,14 @@ public static async Task ExecuteNonQueryAsync_CancellationTokenIsNotCanceled_Exp [Theory] [MemberData(nameof(SqlApiTestSource.DbCommandTestData), MemberType = typeof(SqlApiTestSource))] internal static async Task ExecuteNonQueryAsync_CancellationTokenIsNotCanceled_ExpectDbCommandGetCalledOnce( - StubDbQuery dbQuery, StubDbCommandRequest expectedRequest) + StubDbQuery dbQuery, SqlDialect dialect, StubDbCommandRequest expectedRequest) { using var dbCommand = CreateDbCommand(73); var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand, OnCommandGet); + var mockDbProvider = CreateMockDbProvider(dialect, dbConnection, dbCommand, OnCommandGet); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.ExecuteNonQueryAsync(dbQuery, default); @@ -100,7 +100,7 @@ public static async Task ExecuteNonQueryAsync_CancellationTokenIsNotCanceled_Exp var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.ExecuteNonQueryAsync(SomeDbQuery, default); diff --git a/src/api/Api.Test/Test.SqlApi/Test.ExecuteNonQueryOrFailure.cs b/src/api/Api.Test/Test.SqlApi/Test.ExecuteNonQueryOrFailure.cs index 8f0d893..3369812 100644 --- a/src/api/Api.Test/Test.SqlApi/Test.ExecuteNonQueryOrFailure.cs +++ b/src/api/Api.Test/Test.SqlApi/Test.ExecuteNonQueryOrFailure.cs @@ -19,7 +19,7 @@ public static async Task ExecuteNonQueryOrFailureAsync_QueryIsNull_ExpectArgumen var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: false); @@ -40,7 +40,7 @@ public static void ExecuteNonQueryOrFailureAsync_CancellationTokenIsCanceled_Exp var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); @@ -58,7 +58,7 @@ public static async Task ExecuteNonQueryOrFailureAsync_CancellationTokenIsNotCan var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: false); @@ -76,7 +76,7 @@ public static async Task ExecuteNonQueryOrFailureAsync_ConnectionThrowsException using var dbConnection = new StubDbConnection(mockDbConnection.Object); using var dbCommand = CreateDbCommand(347); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); @@ -89,14 +89,14 @@ public static async Task ExecuteNonQueryOrFailureAsync_ConnectionThrowsException [Theory] [MemberData(nameof(SqlApiTestSource.DbCommandTestData), MemberType = typeof(SqlApiTestSource))] internal static async Task ExecuteNonQueryOrFailureAsync_ConnectionDoesNotThrowException_ExpectDbCommandGetCalledOnce( - StubDbQuery dbQuery, StubDbCommandRequest expectedRequest) + StubDbQuery dbQuery, SqlDialect dialect, StubDbCommandRequest expectedRequest) { using var dbCommand = CreateDbCommand(573); var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand, OnCommandGet); + var mockDbProvider = CreateMockDbProvider(dialect, dbConnection, dbCommand, OnCommandGet); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.ExecuteNonQueryOrFailureAsync(dbQuery, default); @@ -119,7 +119,7 @@ public static async Task ExecuteNonQueryOrFailureAsync_CommandThrowsException_Ex var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.ExecuteNonQueryOrFailureAsync(SomeDbQuery, default); @@ -140,7 +140,7 @@ public static async Task ExecuteNonQueryOrFailureAsync_CommandDoesNotThrowExcept var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.ExecuteNonQueryOrFailureAsync(SomeDbQuery, default); diff --git a/src/api/Api.Test/Test.SqlApi/Test.Ping.cs b/src/api/Api.Test/Test.SqlApi/Test.Ping.cs index 4f67f54..4e0b817 100644 --- a/src/api/Api.Test/Test.SqlApi/Test.Ping.cs +++ b/src/api/Api.Test/Test.SqlApi/Test.Ping.cs @@ -18,7 +18,7 @@ public static void PingAsync_CancellationTokenIsCanceled_ExpectCanceledValueTask var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: true); @@ -35,7 +35,7 @@ public static async Task PingAsync_CancellationTokenIsNotCanceled_ExpectConnecti var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: false); @@ -53,7 +53,7 @@ public static async Task PingAsync_ConnectionThrowsException_ExpectFailure() using var dbConnection = new StubDbConnection(mockDbConnection.Object); using var dbCommand = CreateDbCommand(57); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); @@ -63,15 +63,19 @@ public static async Task PingAsync_ConnectionThrowsException_ExpectFailure() Assert.StrictEqual(expected, actual); } - [Fact] - public static async Task PingAsync_ConnectionDoesNotThrowException_ExpectDbCommandGetCalledOnce() + [Theory] + [InlineData(SqlDialect.TransactSql)] + [InlineData(SqlDialect.PostgreSql)] + [InlineData((SqlDialect)371)] + public static async Task PingAsync_ConnectionDoesNotThrowException_ExpectDbCommandGetCalledOnce( + SqlDialect dialect) { using var dbCommand = CreateDbCommand(10); var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(dialect, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.PingAsync(default, default); @@ -87,7 +91,7 @@ public static async Task PingAsync_CommandThrowsException_ExpectFailure() var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.PingAsync(default, default); @@ -108,7 +112,7 @@ public static async Task PingAsync_CommandDoesNotThrowException_ExpectSuccessRes var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.PingAsync(default, default); diff --git a/src/api/Api.Test/Test.SqlApi/Test.QueryEntity.cs b/src/api/Api.Test/Test.SqlApi/Test.QueryEntity.cs index bdbce5c..cde2eda 100644 --- a/src/api/Api.Test/Test.SqlApi/Test.QueryEntity.cs +++ b/src/api/Api.Test/Test.SqlApi/Test.QueryEntity.cs @@ -19,7 +19,7 @@ public static async Task QueryEntityOrAbsentAsync_QueryIsNull_ExpectArgumentNull var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: false); @@ -41,7 +41,7 @@ public static void QueryEntityOrAbsentAsync_CancellationTokenIsCanceled_ExpectCa var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: true); @@ -59,7 +59,7 @@ public static async Task QueryEntityOrAbsentAsync_CancellationTokenIsNotCanceled var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.QueryEntityOrAbsentAsync(SomeDbQuery, default); @@ -69,7 +69,7 @@ public static async Task QueryEntityOrAbsentAsync_CancellationTokenIsNotCanceled [Theory] [MemberData(nameof(SqlApiTestSource.DbCommandTestData), MemberType = typeof(SqlApiTestSource))] internal static async Task QueryEntityOrAbsentAsync_CancellationTokenIsNotCanceled_ExpectDbCommandGetCalledOnce( - StubDbQuery dbQuery, StubDbCommandRequest expectedRequest) + StubDbQuery dbQuery, SqlDialect dialect, StubDbCommandRequest expectedRequest) { using var dbDataReader = CreateDbDataReader(5, "Field01", "Field02"); using var dbCommand = CreateDbCommand(dbDataReader); @@ -77,7 +77,7 @@ internal static async Task QueryEntityOrAbsentAsync_CancellationTokenIsNotCancel var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand, OnCommandGet); + var mockDbProvider = CreateMockDbProvider(dialect, dbConnection, dbCommand, OnCommandGet); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.QueryEntityOrAbsentAsync(dbQuery, default); @@ -100,7 +100,7 @@ public static async Task QueryEntityOrAbsentAsync_DbDataReaderIsEmpty_ExpectAbse var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntityOrAbsentAsync(SomeDbQuery, default); @@ -118,7 +118,7 @@ public static async Task QueryEntityOrAbsentAsync_DbDataReaderIsNotEmpty_ExpectS var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntityOrAbsentAsync(SomeDbQuery, default); diff --git a/src/api/Api.Test/Test.SqlApi/Test.QueryEntityOrFailure.cs b/src/api/Api.Test/Test.SqlApi/Test.QueryEntityOrFailure.cs index b33a7b4..e3eeac8 100644 --- a/src/api/Api.Test/Test.SqlApi/Test.QueryEntityOrFailure.cs +++ b/src/api/Api.Test/Test.SqlApi/Test.QueryEntityOrFailure.cs @@ -19,7 +19,7 @@ public static async Task QueryEntityOrFailureAsync_QueryIsNull_ExpectArgumentNul var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: false); @@ -41,7 +41,7 @@ public static void QueryEntityOrFailureAsync_CancellationTokenIsCanceled_ExpectC var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: true); @@ -59,7 +59,7 @@ public static async Task QueryEntityOrFailureAsync_CancellationTokenIsNotCancele var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.QueryEntityOrFailureAsync(SomeDbQuery, default); @@ -77,7 +77,7 @@ public static async Task QueryEntityOrFailureAsync_ConnectionThrowsException_Exp using var dbDataReader = CreateDbDataReader(7, SomeFieldNames); using var dbCommand = CreateDbCommand(dbDataReader); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntityOrFailureAsync(SomeDbQuery, default); @@ -93,7 +93,7 @@ public static async Task QueryEntityOrFailureAsync_ConnectionThrowsException_Exp [Theory] [MemberData(nameof(SqlApiTestSource.DbCommandTestData), MemberType = typeof(SqlApiTestSource))] internal static async Task QueryEntityOrFailureAsync_ConnectionDoesNotThrowException_ExpectDbCommandGetCalledOnce( - StubDbQuery dbQuery, StubDbCommandRequest expectedRequest) + StubDbQuery dbQuery, SqlDialect dialect, StubDbCommandRequest expectedRequest) { using var dbDataReader = CreateDbDataReader(5, "Field01", "Field02"); using var dbCommand = CreateDbCommand(dbDataReader); @@ -101,7 +101,7 @@ internal static async Task QueryEntityOrFailureAsync_ConnectionDoesNotThrowExcep var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand, OnCommandGet); + var mockDbProvider = CreateMockDbProvider(dialect, dbConnection, dbCommand, OnCommandGet); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.QueryEntityOrFailureAsync(dbQuery, default); @@ -124,7 +124,7 @@ public static async Task QueryEntityOrFailureAsync_CommandThrowsException_Expect var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntityOrFailureAsync(SomeDbQuery, default); @@ -145,7 +145,7 @@ public static async Task QueryEntityOrFailureAsync_DbDataReaderIsEmpty_ExpectAbs var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntityOrFailureAsync(SomeDbQuery, default); @@ -163,7 +163,7 @@ public static async Task QueryEntityOrFailureAsync_DbDataReaderIsNotEmpty_Expect var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntityOrFailureAsync(SomeDbQuery, default); diff --git a/src/api/Api.Test/Test.SqlApi/Test.QueryEntitySet.cs b/src/api/Api.Test/Test.SqlApi/Test.QueryEntitySet.cs index b6b1f87..32c96a6 100644 --- a/src/api/Api.Test/Test.SqlApi/Test.QueryEntitySet.cs +++ b/src/api/Api.Test/Test.SqlApi/Test.QueryEntitySet.cs @@ -19,7 +19,7 @@ public static async Task QueryEntitySetAsync_QueryIsNull_ExpectArgumentNullExcep var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: false); @@ -41,7 +41,7 @@ public static void QueryEntitySetAsync_CancellationTokenIsCanceled_ExpectCancele var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: true); @@ -59,7 +59,7 @@ public static async Task QueryEntitySetAsync_CancellationTokenIsNotCanceled_Expe var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.QueryEntitySetAsync(SomeDbQuery, default); @@ -69,7 +69,7 @@ public static async Task QueryEntitySetAsync_CancellationTokenIsNotCanceled_Expe [Theory] [MemberData(nameof(SqlApiTestSource.DbCommandTestData), MemberType = typeof(SqlApiTestSource))] internal static async Task QueryEntitySetAsync_CancellationTokenIsNotCanceled_ExpectDbCommandGetCalledOnce( - StubDbQuery dbQuery, StubDbCommandRequest expectedRequest) + StubDbQuery dbQuery, SqlDialect dialect, StubDbCommandRequest expectedRequest) { using var dbDataReader = CreateDbDataReader(3, "Param01", "Param02"); using var dbCommand = CreateDbCommand(dbDataReader); @@ -77,7 +77,7 @@ internal static async Task QueryEntitySetAsync_CancellationTokenIsNotCanceled_Ex var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand, OnCommandGet); + var mockDbProvider = CreateMockDbProvider(dialect, dbConnection, dbCommand, OnCommandGet); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.QueryEntitySetAsync(dbQuery, default); @@ -103,7 +103,7 @@ public static async Task QueryEntitySetAsync_CancellationTokenIsNotCanceled_Expe var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.PostgreSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntitySetAsync(SomeDbQuery, default); diff --git a/src/api/Api.Test/Test.SqlApi/Test.QueryEntitySetOrFailure.cs b/src/api/Api.Test/Test.SqlApi/Test.QueryEntitySetOrFailure.cs index 7ca7a97..6e8b65a 100644 --- a/src/api/Api.Test/Test.SqlApi/Test.QueryEntitySetOrFailure.cs +++ b/src/api/Api.Test/Test.SqlApi/Test.QueryEntitySetOrFailure.cs @@ -19,7 +19,7 @@ public static async Task QueryEntitySetOrFailureAsync_QueryIsNull_ExpectArgument var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: false); @@ -41,7 +41,7 @@ public static void QueryEntitySetOrFailureAsync_CancellationTokenIsCanceled_Expe var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var cancellationToken = new CancellationToken(canceled: true); @@ -59,7 +59,7 @@ public static async Task QueryEntitySetOrFailureAsync_CancellationTokenIsNotCanc var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.QueryEntitySetOrFailureAsync(SomeDbQuery, default); @@ -77,7 +77,7 @@ public static async Task QueryEntitySetOrFailureAsync_ConnectionThrowsException_ using var dbDataReader = CreateDbDataReader(3, SomeFieldNames); using var dbCommand = CreateDbCommand(dbDataReader); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntitySetOrFailureAsync(SomeDbQuery, default); @@ -89,7 +89,7 @@ public static async Task QueryEntitySetOrFailureAsync_ConnectionThrowsException_ [Theory] [MemberData(nameof(SqlApiTestSource.DbCommandTestData), MemberType = typeof(SqlApiTestSource))] internal static async Task QueryEntitySetOrFailureAsync_ConnectionDoesNotThrowException_ExpectDbCommandGetCalledOnce( - StubDbQuery dbQuery, StubDbCommandRequest expectedRequest) + StubDbQuery dbQuery, SqlDialect dialect, StubDbCommandRequest expectedRequest) { using var dbDataReader = CreateDbDataReader(3, "Param01", "Param02"); using var dbCommand = CreateDbCommand(dbDataReader); @@ -97,7 +97,7 @@ internal static async Task QueryEntitySetOrFailureAsync_ConnectionDoesNotThrowEx var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand, OnCommandGet); + var mockDbProvider = CreateMockDbProvider(dialect, dbConnection, dbCommand, OnCommandGet); var sqlApi = new SqlApi(mockDbProvider.Object); _ = await sqlApi.QueryEntitySetOrFailureAsync(dbQuery, default); @@ -120,7 +120,7 @@ public static async Task QueryEntitySetOrFailureAsync_CommandThrowsException_Exp var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntitySetOrFailureAsync(SomeDbQuery, default); @@ -141,7 +141,7 @@ public static async Task QueryEntitySetOrFailureAsync_CommandDoesNotThrowExcepti var mockDbConnection = CreateMockDbConnection(dbCommand); using var dbConnection = new StubDbConnection(mockDbConnection.Object); - var mockDbProvider = CreateMockDbProvider(dbConnection, dbCommand); + var mockDbProvider = CreateMockDbProvider(SqlDialect.TransactSql, dbConnection, dbCommand); var sqlApi = new SqlApi(mockDbProvider.Object); var actual = await sqlApi.QueryEntitySetOrFailureAsync(SomeDbQuery, default); diff --git a/src/api/Api/Api.csproj b/src/api/Api/Api.csproj index 81211af..1b04d63 100644 --- a/src/api/Api/Api.csproj +++ b/src/api/Api/Api.csproj @@ -4,13 +4,13 @@ net8.0;net9.0 GarageGroup.Infra GarageGroup.Infra.Sql.Api - 2.7.0 + 3.0.0 - - - + + + diff --git a/src/api/Api/SqlApi/SqlApi.cs b/src/api/Api/SqlApi/SqlApi.cs index 942f96b..a5d4ead 100644 --- a/src/api/Api/SqlApi/SqlApi.cs +++ b/src/api/Api/SqlApi/SqlApi.cs @@ -17,7 +17,7 @@ internal sealed partial class SqlApi : ISqlApi internal SqlApi(IDbProvider dbProvider, ILoggerFactory? loggerFactory = null) { this.dbProvider = dbProvider; - logger = loggerFactory?.CreateLogger>(); + logger = loggerFactory?.CreateLogger("GarageGroup.Infra.SqlApi"); } private DbCommand CreateDbCommand(TDbConnection dbConnection, IDbQuery query) @@ -49,7 +49,7 @@ private DbCommand CreateDbCommand(TDbConnection dbConnection, IDbQuery query) parameterLogBuilder.Append(dbParameter.Name).Append(": '").Append(dbParameter.Value).Append('\''); } - var commandText = query.GetSqlQuery(); + var commandText = query.GetSqlQuery(dbProvider.Dialect); logger?.LogDebug("SQL: {sql}. Parameters: {parameters}", commandText, parameterLogBuilder?.ToString()); return dbProvider.GetDbCommand(dbConnection, commandText, dbNameParameters.Values, query.TimeoutInSeconds); diff --git a/src/api/Api/SqlApiDependency.cs b/src/api/Api/SqlApiDependency.cs index 96747dc..9099bcb 100644 --- a/src/api/Api/SqlApiDependency.cs +++ b/src/api/Api/SqlApiDependency.cs @@ -31,24 +31,29 @@ public static Dependency UseSqlApi(this Dependency(CreateSqlApi); + return dependency.Map(InnerCreateSqlApi); - ILoggerFactory? GetLoggerFactory(IServiceProvider serviceProvider) - => - useLogging ? serviceProvider.GetServiceOrAbsent().OrDefault() : null; + SqlApi InnerCreateSqlApi(IServiceProvider serviceProvider, IDbProvider dbProvider) + { + ArgumentNullException.ThrowIfNull(serviceProvider); + ArgumentNullException.ThrowIfNull(dbProvider); + + return new( + dbProvider: dbProvider, + loggerFactory: useLogging ? serviceProvider.GetServiceOrThrow() : null); + } } public static Dependency UseSqlApi(this Dependency, ILoggerFactory> dependency) where TDbConnection : DbConnection { ArgumentNullException.ThrowIfNull(dependency); - return dependency.Fold(CreateSqlApi); - } + return dependency.Fold(InnerCreateSqlApi); - private static SqlApi CreateSqlApi(IDbProvider dbProvider, ILoggerFactory? loggerFactory) - where TDbConnection : DbConnection - { - ArgumentNullException.ThrowIfNull(dbProvider); - return new(dbProvider, loggerFactory); + static SqlApi InnerCreateSqlApi(IDbProvider dbProvider, ILoggerFactory? loggerFactory) + { + ArgumentNullException.ThrowIfNull(dbProvider); + return new(dbProvider, loggerFactory); + } } } \ No newline at end of file