diff --git a/src/GmRelay.Shared/DapperAotModule.cs b/src/GmRelay.Shared/DapperAotModule.cs new file mode 100644 index 0000000..551e875 --- /dev/null +++ b/src/GmRelay.Shared/DapperAotModule.cs @@ -0,0 +1 @@ +[module: Dapper.DapperAot] diff --git a/src/GmRelay.Shared/GmRelay.Shared.csproj b/src/GmRelay.Shared/GmRelay.Shared.csproj index e9d03bc..b2767b6 100644 --- a/src/GmRelay.Shared/GmRelay.Shared.csproj +++ b/src/GmRelay.Shared/GmRelay.Shared.csproj @@ -5,10 +5,12 @@ enable enable preview + $(InterceptorsPreviewNamespaces);Dapper.AOT + diff --git a/src/GmRelay.Shared/packages.lock.json b/src/GmRelay.Shared/packages.lock.json index e4562f5..e4a2a9e 100644 --- a/src/GmRelay.Shared/packages.lock.json +++ b/src/GmRelay.Shared/packages.lock.json @@ -8,6 +8,12 @@ "resolved": "2.1.72", "contentHash": "ns4mGqQd9a/MhP8m6w556vVlZIa0/MfUu03zrxjZC/jlr1uVCsUac8bkdB+Fs98Llbd56rRSo1eZH5VVmeGZyw==" }, + "Dapper.AOT": { + "type": "Direct", + "requested": "[1.0.48, )", + "resolved": "1.0.48", + "contentHash": "rsLM3yKr4g+YKKox9lhc8D+kz67P7Q9+xdyn1LmCsoYr1kYpJSm+Nt6slo5UrfUrcTiGJ57zUlyO8XUdV7G7iA==" + }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", "requested": "[10.0.5, )", diff --git a/tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/SharedDapperAotConfigurationTests.cs b/tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/SharedDapperAotConfigurationTests.cs new file mode 100644 index 0000000..a9ac79a --- /dev/null +++ b/tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/SharedDapperAotConfigurationTests.cs @@ -0,0 +1,66 @@ +using System.Xml.Linq; + +namespace GmRelay.Bot.Tests.Features.Sessions.CreateSession; + +public sealed class SharedDapperAotConfigurationTests +{ + [Fact] + public void SharedProject_ShouldEnableDapperAotForSessionInteractionHandlers() + { + var repoRoot = FindRepositoryRoot(); + var sharedProjectPath = Path.Combine(repoRoot, "src", "GmRelay.Shared", "GmRelay.Shared.csproj"); + var joinHandler = File.ReadAllText(Path.Combine( + repoRoot, + "src", + "GmRelay.Shared", + "Features", + "Sessions", + "CreateSession", + "JoinSessionHandler.cs")); + var leaveHandler = File.ReadAllText(Path.Combine( + repoRoot, + "src", + "GmRelay.Shared", + "Features", + "Sessions", + "CreateSession", + "LeaveSessionHandler.cs")); + + Assert.Contains("using Dapper;", joinHandler, StringComparison.Ordinal); + Assert.Contains("using Dapper;", leaveHandler, StringComparison.Ordinal); + + var project = XDocument.Load(sharedProjectPath); + var packageReferences = project + .Descendants("PackageReference") + .Select(reference => reference.Attribute("Include")?.Value) + .ToArray(); + var interceptorNamespaces = project + .Descendants("InterceptorsPreviewNamespaces") + .Select(element => element.Value) + .ToArray(); + var moduleAttributeFiles = Directory + .EnumerateFiles(Path.GetDirectoryName(sharedProjectPath)!, "*.cs", SearchOption.AllDirectories) + .Select(File.ReadAllText) + .ToArray(); + + Assert.Contains("Dapper.AOT", packageReferences); + Assert.Contains(interceptorNamespaces, value => value.Contains("Dapper.AOT", StringComparison.Ordinal)); + Assert.Contains(moduleAttributeFiles, source => source.Contains("[module: Dapper.DapperAot]", StringComparison.Ordinal)); + } + + private static string FindRepositoryRoot() + { + var directory = new DirectoryInfo(AppContext.BaseDirectory); + while (directory is not null) + { + if (File.Exists(Path.Combine(directory.FullName, "Directory.Build.props"))) + { + return directory.FullName; + } + + directory = directory.Parent; + } + + throw new InvalidOperationException("Could not locate repository root."); + } +}