From 0647c191e287d0c2b5b28d7302cd41150880fcac Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Wed, 6 May 2026 07:15:33 +1000 Subject: [PATCH 1/3] add DisableSqlFormatting --- readme.md | 17 ++++++ .../GlobalUsings.cs | 3 ++ .../ModuleInitializer.cs | 21 ++++++++ ...DisableSqlFormattingQueryable.verified.sql | 3 ++ ...DisableSqlFormattingQueryable.verified.txt | 1 + ...DisableSqlFormattingRecording.verified.txt | 10 ++++ .../StaticSettingsTests.cs | 53 +++++++++++++++++++ ...EntityFramework.StaticSettingsTests.csproj | 21 ++++++++ src/Verify.EntityFramework.slnx | 1 + .../Converters/LogEntryConverter.cs | 2 +- .../VerifyEntityFramework.cs | 7 +++ 11 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 src/Verify.EntityFramework.StaticSettingsTests/GlobalUsings.cs create mode 100644 src/Verify.EntityFramework.StaticSettingsTests/ModuleInitializer.cs create mode 100644 src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingQueryable.verified.sql create mode 100644 src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingQueryable.verified.txt create mode 100644 src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingRecording.verified.txt create mode 100644 src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.cs create mode 100644 src/Verify.EntityFramework.StaticSettingsTests/Verify.EntityFramework.StaticSettingsTests.csproj diff --git a/readme.md b/readme.md index d1a75049..3b9bdfae 100644 --- a/readme.md +++ b/readme.md @@ -852,6 +852,23 @@ await Verify(target) +## DisableSqlFormatting + +By default SQL captured against SQL Server is reformatted via [SqlFormatter](https://github.com/SimonCropp/SqlFormatter) before being written to the snapshot. This applies to both [Recording](#recording) output and [Queryable](#queryable) `.sql` files. + +Reformatting can be disabled globally: + + + +```cs +VerifyEntityFramework.DisableSqlFormatting = true; +``` +snippet source | anchor + + +When disabled, the SQL is written verbatim as produced by EntityFramework. + + ## Icon [Database](https://thenounproject.com/term/database/310841/) designed by [Creative Stall](https://thenounproject.com/creativestall/) from [The Noun Project](https://thenounproject.com). diff --git a/src/Verify.EntityFramework.StaticSettingsTests/GlobalUsings.cs b/src/Verify.EntityFramework.StaticSettingsTests/GlobalUsings.cs new file mode 100644 index 00000000..bdc5b06d --- /dev/null +++ b/src/Verify.EntityFramework.StaticSettingsTests/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using System.ComponentModel.DataAnnotations.Schema; +global using Argon; +global using Microsoft.EntityFrameworkCore; diff --git a/src/Verify.EntityFramework.StaticSettingsTests/ModuleInitializer.cs b/src/Verify.EntityFramework.StaticSettingsTests/ModuleInitializer.cs new file mode 100644 index 00000000..ab4babd9 --- /dev/null +++ b/src/Verify.EntityFramework.StaticSettingsTests/ModuleInitializer.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore.Metadata; + +public static class ModuleInitializer +{ + static IModel GetDbModel() + { + var options = new DbContextOptionsBuilder(); + options.UseSqlServer("fake"); + using var data = new SampleDbContext(options.Options); + return data.Model; + } + + [ModuleInitializer] + public static void Init() + { + var model = GetDbModel(); + VerifyEntityFramework.Initialize(model); + VerifierSettings.InitializePlugins(); + Recording.IgnoreNames("sql"); + } +} diff --git a/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingQueryable.verified.sql b/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingQueryable.verified.sql new file mode 100644 index 00000000..336f0670 --- /dev/null +++ b/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingQueryable.verified.sql @@ -0,0 +1,3 @@ +SELECT [c].[Id], [c].[Name] +FROM [Companies] AS [c] +WHERE [c].[Name] = N'Title' \ No newline at end of file diff --git a/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingQueryable.verified.txt b/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingQueryable.verified.txt new file mode 100644 index 00000000..ad47dbb9 --- /dev/null +++ b/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingQueryable.verified.txt @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingRecording.verified.txt b/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingRecording.verified.txt new file mode 100644 index 00000000..86fe8348 --- /dev/null +++ b/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.DisableSqlFormattingRecording.verified.txt @@ -0,0 +1,10 @@ +{ + ef: { + Type: ReaderExecutedAsync, + HasTransaction: false, + Text: +SELECT [c].[Id], [c].[Name] +FROM [Companies] AS [c] +WHERE [c].[Name] = N'Title' + } +} \ No newline at end of file diff --git a/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.cs b/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.cs new file mode 100644 index 00000000..ca849a4e --- /dev/null +++ b/src/Verify.EntityFramework.StaticSettingsTests/StaticSettingsTests.cs @@ -0,0 +1,53 @@ +[TestFixture] +[NonParallelizable] +public class StaticSettingsTests +{ + static SqlInstance sqlInstance = new( + buildTemplate: data => data.Database.EnsureCreatedAsync(), + constructInstance: builder => + { + builder.EnableRecording(); + return new(builder.Options); + }); + + [TearDown] + public void TearDown() => + VerifyEntityFramework.DisableSqlFormatting = false; + + [Test] + public async Task DisableSqlFormattingRecording() + { + #region DisableSqlFormatting + + VerifyEntityFramework.DisableSqlFormatting = true; + + #endregion + + await using var database = await sqlInstance.Build(); + var data = database.Context; + + Recording.Start(); + + await data + .Companies + .Where(_ => _.Name == "Title") + .ToListAsync(); + + await Verify(); + } + + [Test] + public async Task DisableSqlFormattingQueryable() + { + VerifyEntityFramework.DisableSqlFormatting = true; + + await using var database = await sqlInstance.Build(); + var data = database.Context; + + var queryable = data + .Companies + .Where(_ => _.Name == "Title"); + + await Verify(queryable); + } +} diff --git a/src/Verify.EntityFramework.StaticSettingsTests/Verify.EntityFramework.StaticSettingsTests.csproj b/src/Verify.EntityFramework.StaticSettingsTests/Verify.EntityFramework.StaticSettingsTests.csproj new file mode 100644 index 00000000..65dad1a6 --- /dev/null +++ b/src/Verify.EntityFramework.StaticSettingsTests/Verify.EntityFramework.StaticSettingsTests.csproj @@ -0,0 +1,21 @@ + + + net10.0 + + + + + + + + + + + + + + + + + + diff --git a/src/Verify.EntityFramework.slnx b/src/Verify.EntityFramework.slnx index 5e68fc85..9c58881d 100644 --- a/src/Verify.EntityFramework.slnx +++ b/src/Verify.EntityFramework.slnx @@ -11,6 +11,7 @@ + diff --git a/src/Verify.EntityFramework/Converters/LogEntryConverter.cs b/src/Verify.EntityFramework/Converters/LogEntryConverter.cs index a74e7b5e..f8e5f51e 100644 --- a/src/Verify.EntityFramework/Converters/LogEntryConverter.cs +++ b/src/Verify.EntityFramework/Converters/LogEntryConverter.cs @@ -8,7 +8,7 @@ public override void Write(VerifyJsonWriter writer, LogEntry logEntry) writer.WriteMember(logEntry, logEntry.HasTransaction, "HasTransaction"); writer.WriteMember(logEntry, logEntry.Exception, "Exception"); writer.WriteMember(logEntry, logEntry.Parameters, "Parameters"); - if (logEntry.IsSqlServer) + if (logEntry.IsSqlServer && !VerifyEntityFramework.DisableSqlFormatting) { var text = SqlFormatter.Format(logEntry.Text); writer.WriteMember(logEntry, text.ToString(), "Text"); diff --git a/src/Verify.EntityFramework/VerifyEntityFramework.cs b/src/Verify.EntityFramework/VerifyEntityFramework.cs index 4d98a8ca..8f7d8d83 100644 --- a/src/Verify.EntityFramework/VerifyEntityFramework.cs +++ b/src/Verify.EntityFramework/VerifyEntityFramework.cs @@ -54,6 +54,8 @@ public static void IgnoreNavigationProperties(this VerifySettings settings, IMod } } + public static bool DisableSqlFormatting { get; set; } + public static void ScrubInlineEfDateTimes() => VerifierSettings.ScrubInlineDateTimes("yyyy-MM-ddTHH:mm:ss.fffffffZ"); @@ -155,6 +157,11 @@ static ConversionResult QueryableToSql(object arg, IReadOnlyDictionary Date: Fri, 8 May 2026 13:27:12 +1000 Subject: [PATCH 2/3] refs or cleanup --- src/Directory.Packages.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 5b66d8fb..e41c75c0 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -4,8 +4,8 @@ true - - + + @@ -18,7 +18,7 @@ - + From 3f8f83e734e287b69e518dd774af609edb5e7c6a Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sat, 9 May 2026 12:07:28 +1000 Subject: [PATCH 3/3] refs or cleanup --- src/Directory.Packages.props | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index e41c75c0..1c1cd466 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -18,16 +18,16 @@ - + - + - + - +