From a6180ab896f2afb368b00abbc4328a68f060232b Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 7 Feb 2023 17:59:37 +0100
Subject: [PATCH 01/82] Increment version to 5.1.3 (used for pre-release builds
from ci)
---
Directory.Build.props | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index a9d5421..e2ea325 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -4,7 +4,7 @@
6.0.*
5.1.2
2.15.0
- 5.1.2
+ 5.1.3
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
9999
enable
From 4fbff188e3239d77d42653f1a6a145ea2f72f883 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 7 Feb 2023 18:25:59 +0100
Subject: [PATCH 02/82] Package updates
---
.config/dotnet-tools.json | 6 +++---
Directory.Build.props | 6 +++---
test/TestBuildingBlocks/FakerContainer.cs | 2 +-
test/TestBuildingBlocks/TestBuildingBlocks.csproj | 2 +-
4 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index d914fc3..da7dc3d 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,13 +3,13 @@
"isRoot": true,
"tools": {
"jetbrains.resharper.globaltools": {
- "version": "2022.2.3",
+ "version": "2022.2.4",
"commands": [
"jb"
]
},
"regitlint": {
- "version": "6.1.1",
+ "version": "6.3.10",
"commands": [
"regitlint"
]
@@ -21,7 +21,7 @@
]
},
"dotnet-reportgenerator-globaltool": {
- "version": "5.1.3",
+ "version": "5.1.15",
"commands": [
"reportgenerator"
]
diff --git a/Directory.Build.props b/Directory.Build.props
index e2ea325..580412e 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -31,8 +31,8 @@
- 3.2.0
- 4.16.1
- 17.4.0
+ 3.2.*
+ 4.18.*
+ 17.4.*
diff --git a/test/TestBuildingBlocks/FakerContainer.cs b/test/TestBuildingBlocks/FakerContainer.cs
index 99cce6e..72f9a05 100644
--- a/test/TestBuildingBlocks/FakerContainer.cs
+++ b/test/TestBuildingBlocks/FakerContainer.cs
@@ -12,7 +12,7 @@ static FakerContainer()
{
// Setting the system DateTime to kind Utc, so that faker calls like PastOffset() don't depend on the system time zone.
// See https://docs.microsoft.com/en-us/dotnet/api/system.datetimeoffset.op_implicit?view=net-6.0#remarks
- Date.SystemClock = () => 1.January(2020).AsUtc();
+ Date.SystemClock = () => 1.January(2020).At(1, 1, 1).AsUtc();
}
protected static int GetFakerSeed()
diff --git a/test/TestBuildingBlocks/TestBuildingBlocks.csproj b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
index db9e8da..a9701e2 100644
--- a/test/TestBuildingBlocks/TestBuildingBlocks.csproj
+++ b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
@@ -10,7 +10,7 @@
-
+
From c959baa128c58767aa06598d675d7068c0c1f59c Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Wed, 29 Mar 2023 02:09:50 +0200
Subject: [PATCH 03/82] Refresh NuGet API key
---
appveyor.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/appveyor.yml b/appveyor.yml
index 2593740..91678d5 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -32,14 +32,14 @@ for:
- provider: NuGet
skip_symbols: false
api_key:
- secure: S9fkLwmhi7w+DGouXYqYq/1PGocnYo8UBUKwv+BGpWHnzE6yHZEYth3j/XJ9Ydsa
+ secure: oy2i3qo34xygjtxsjq5q5mcxpispceluvorutzd7kkxejm
on:
branch: master
appveyor_repo_tag: true
- provider: NuGet
skip_symbols: false
api_key:
- secure: S9fkLwmhi7w+DGouXYqYq/1PGocnYo8UBUKwv+BGpWHnzE6yHZEYth3j/XJ9Ydsa
+ secure: oy2i3qo34xygjtxsjq5q5mcxpispceluvorutzd7kkxejm
on:
branch: /release\/.+/
appveyor_repo_tag: true
From 3ba88b29a39ad7540a7d1f38aa1fd46f71597b7c Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Wed, 29 Mar 2023 21:02:14 +0200
Subject: [PATCH 04/82] Refresh leaked NuGet API key
---
appveyor.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/appveyor.yml b/appveyor.yml
index 91678d5..18aa690 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -32,14 +32,14 @@ for:
- provider: NuGet
skip_symbols: false
api_key:
- secure: oy2i3qo34xygjtxsjq5q5mcxpispceluvorutzd7kkxejm
+ secure: hlP/zkfkHzmutSXPYAiINmPdv+QEj3TpAjKewHEkCtQnHnA2tSo+Xey0g6FVM6S5
on:
branch: master
appveyor_repo_tag: true
- provider: NuGet
skip_symbols: false
api_key:
- secure: oy2i3qo34xygjtxsjq5q5mcxpispceluvorutzd7kkxejm
+ secure: hlP/zkfkHzmutSXPYAiINmPdv+QEj3TpAjKewHEkCtQnHnA2tSo+Xey0g6FVM6S5
on:
branch: /release\/.+/
appveyor_repo_tag: true
From 76e27d2ab775b8ddad61ec24ad48efdd9a45fcaf Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Thu, 18 May 2023 16:47:21 +0200
Subject: [PATCH 05/82] Package updates
---
.config/dotnet-tools.json | 6 +++---
Directory.Build.props | 6 +++---
test/TestBuildingBlocks/TestBuildingBlocks.csproj | 2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index da7dc3d..9278758 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,13 +3,13 @@
"isRoot": true,
"tools": {
"jetbrains.resharper.globaltools": {
- "version": "2022.2.4",
+ "version": "2023.1.2",
"commands": [
"jb"
]
},
"regitlint": {
- "version": "6.3.10",
+ "version": "6.3.11",
"commands": [
"regitlint"
]
@@ -21,7 +21,7 @@
]
},
"dotnet-reportgenerator-globaltool": {
- "version": "5.1.15",
+ "version": "5.1.20",
"commands": [
"reportgenerator"
]
diff --git a/Directory.Build.props b/Directory.Build.props
index 580412e..21b3f73 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -2,7 +2,7 @@
net6.0
6.0.*
- 5.1.2
+ 5.2.0
2.15.0
5.1.3
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
@@ -15,7 +15,7 @@
-
+
@@ -33,6 +33,6 @@
3.2.*
4.18.*
- 17.4.*
+ 17.6.*
diff --git a/test/TestBuildingBlocks/TestBuildingBlocks.csproj b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
index a9701e2..9dccdb2 100644
--- a/test/TestBuildingBlocks/TestBuildingBlocks.csproj
+++ b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
@@ -10,7 +10,7 @@
-
+
From 6616ee5860f4841628555d5b1518e6e9b7689954 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Thu, 18 May 2023 17:52:19 +0200
Subject: [PATCH 06/82] Update to JADNC v5.2.0
---
.editorconfig | 9 ++++++---
Build.ps1 | 9 +++------
Directory.Build.props | 1 -
JetBrainsInspectCodeTransform.xslt | 4 ++++
JsonApiDotNetCore.MongoDb.sln.DotSettings | 16 +++++++++++-----
WarningSeverities.DotSettings | 14 ++++++++++++++
.../Properties/launchSettings.json | 4 ++--
src/Examples/GettingStarted/appsettings.json | 2 ++
.../Definitions/TodoItemDefinition.cs | 2 +-
.../Models/TodoItem.cs | 3 +++
.../Models/TodoItemPriority.cs | 6 +++---
.../JsonApiDotNetCoreMongoDbExample/Program.cs | 7 +++++--
.../Properties/AssemblyInfo.cs | 4 ----
.../Properties/launchSettings.json | 8 ++++----
.../appsettings.json | 2 ++
.../MongoQueryExpressionValidator.cs | 2 +-
.../IntegrationTests/Meta/TopLevelCountTests.cs | 13 ++-----------
.../Filtering/FilterDataTypeTests.cs | 7 ++++---
.../Pagination/PaginationWithTotalCountTests.cs | 2 +-
.../SparseFieldSets/SparseFieldSetTests.cs | 2 +-
.../Reading/ResourceDefinitionReadTests.cs | 13 ++-----------
.../ObjectAssertionsExtensions.cs | 11 +++++++++++
test/TestBuildingBlocks/appsettings.json | 5 ++++-
23 files changed, 86 insertions(+), 60 deletions(-)
delete mode 100644 src/Examples/JsonApiDotNetCoreMongoDbExample/Properties/AssemblyInfo.cs
diff --git a/.editorconfig b/.editorconfig
index ca191cf..86cbbc3 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -66,15 +66,18 @@ csharp_indent_case_contents_when_block = false
csharp_preserve_single_line_statements = false
# 'var' usage preferences
-csharp_style_var_for_built_in_types = false:suggestion
-csharp_style_var_when_type_is_apparent = true:suggestion
-csharp_style_var_elsewhere = false:suggestion
+csharp_style_var_for_built_in_types = false:none
+csharp_style_var_when_type_is_apparent = true:none
+csharp_style_var_elsewhere = false:none
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:suggestion
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion
dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:suggestion
+# Expression value is never used
+dotnet_diagnostic.IDE0058.severity = none
+
#### Naming Style ####
dotnet_diagnostic.IDE1006.severity = warning
diff --git a/Build.ps1 b/Build.ps1
index ce11718..623cfa7 100644
--- a/Build.ps1
+++ b/Build.ps1
@@ -23,7 +23,7 @@ function RunInspectCode {
$issueType = $xml.report.IssueTypes.SelectSingleNode("IssueType[@Id='$($_.TypeId)']")
$severity = $_.Severity ?? $issueType.Severity
- Write-Output "[$severity] $($_.File):$($_.Line) $($_.Message)"
+ Write-Output "[$severity] $($_.File):$($_.Line) $($_.TypeId): $($_.Message)"
})
})
}
@@ -104,11 +104,8 @@ CheckLastExitCode
dotnet build -c Release
CheckLastExitCode
-# https://youtrack.jetbrains.com/issue/RSRP-488628/Breaking-InspectCode-fails-with-Roslyn-Worker-process-exited-unexpectedly-after-update
-if ($IsWindows) {
- RunInspectCode
- RunCleanupCode
-}
+RunInspectCode
+RunCleanupCode
dotnet test -c Release --no-build --collect:"XPlat Code Coverage"
CheckLastExitCode
diff --git a/Directory.Build.props b/Directory.Build.props
index 21b3f73..be5871c 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -32,7 +32,6 @@
3.2.*
- 4.18.*
17.6.*
diff --git a/JetBrainsInspectCodeTransform.xslt b/JetBrainsInspectCodeTransform.xslt
index 098821f..28fa772 100644
--- a/JetBrainsInspectCodeTransform.xslt
+++ b/JetBrainsInspectCodeTransform.xslt
@@ -25,6 +25,7 @@
File |
Line Number |
+ Type |
Message |
@@ -35,6 +36,9 @@
|
+
+
+ |
|
diff --git a/JsonApiDotNetCore.MongoDb.sln.DotSettings b/JsonApiDotNetCore.MongoDb.sln.DotSettings
index 8e80299..8e89021 100644
--- a/JsonApiDotNetCore.MongoDb.sln.DotSettings
+++ b/JsonApiDotNetCore.MongoDb.sln.DotSettings
@@ -28,6 +28,7 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
SUGGESTION
SUGGESTION
WARNING
+ WARNING
SUGGESTION
SUGGESTION
SUGGESTION
@@ -54,16 +55,16 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
WARNING
WARNING
WARNING
+ SUGGESTION
HINT
WARNING
DO_NOT_SHOW
HINT
SUGGESTION
- WARNING
- WARNING
+ SUGGESTION
+ SUGGESTION
WARNING
WARNING
- SUGGESTION
WARNING
SUGGESTION
SUGGESTION
@@ -76,6 +77,7 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
SUGGESTION
SUGGESTION
SUGGESTION
+ WARNING
WARNING
WARNING
WARNING
@@ -88,8 +90,10 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
WARNING
WARNING
WARNING
+ SUGGESTION
+ SUGGESTION
WARNING
- <?xml version="1.0" encoding="utf-16"?><Profile name="JADNC Full Cleanup"><XMLReformatCode>True</XMLReformatCode><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" /><CssAlphabetizeProperties>True</CssAlphabetizeProperties><JsInsertSemicolon>True</JsInsertSemicolon><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><JsReformatCode>True</JsReformatCode><JsFormatDocComments>True</JsFormatDocComments><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs><AsInsteadOfCastTs>True</AsInsteadOfCastTs><HtmlReformatCode>True</HtmlReformatCode><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSMakeAutoPropertyGetOnly>True</CSMakeAutoPropertyGetOnly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CssReformatCode>True</CssReformatCode><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSharpFormatDocComments>True</CSharpFormatDocComments><CSReorderTypeMembers>True</CSReorderTypeMembers><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags></Profile>
+ <?xml version="1.0" encoding="utf-16"?><Profile name="JADNC Full Cleanup"><XMLReformatCode>True</XMLReformatCode><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" ArrangeNullCheckingPattern="True" /><CssAlphabetizeProperties>True</CssAlphabetizeProperties><JsInsertSemicolon>True</JsInsertSemicolon><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><JsReformatCode>True</JsReformatCode><JsFormatDocComments>True</JsFormatDocComments><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs><AsInsteadOfCastTs>True</AsInsteadOfCastTs><HtmlReformatCode>True</HtmlReformatCode><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSMakeAutoPropertyGetOnly>True</CSMakeAutoPropertyGetOnly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CssReformatCode>True</CssReformatCode><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSharpFormatDocComments>True</CSharpFormatDocComments><CSReorderTypeMembers>True</CSReorderTypeMembers><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags><CSReformatInactiveBranches>True</CSReformatInactiveBranches></Profile>
JADNC Full Cleanup
Required
Required
@@ -116,6 +120,7 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
False
False
False
+ False
False
False
False
@@ -134,6 +139,7 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
False
False
CHOP_ALWAYS
+ False
True
True
True
@@ -641,7 +647,7 @@ $left$ = $right$;
True
CSHARP
False
- JsonApiDotNetCore.ArgumentGuard.NotNull($argument$);
+ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($argument$);
if ($argument$ is null) throw new ArgumentNullException(nameof($argument$));
WARNING
True
diff --git a/WarningSeverities.DotSettings b/WarningSeverities.DotSettings
index 0d4eeba..96f358d 100644
--- a/WarningSeverities.DotSettings
+++ b/WarningSeverities.DotSettings
@@ -13,6 +13,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -70,6 +71,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -82,6 +84,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -97,8 +100,13 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -109,12 +117,14 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -135,6 +145,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -152,6 +163,8 @@
WARNING
WARNING
WARNING
+ WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -240,6 +253,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
diff --git a/src/Examples/GettingStarted/Properties/launchSettings.json b/src/Examples/GettingStarted/Properties/launchSettings.json
index ad97b55..b82968b 100644
--- a/src/Examples/GettingStarted/Properties/launchSettings.json
+++ b/src/Examples/GettingStarted/Properties/launchSettings.json
@@ -10,7 +10,7 @@
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
- "launchBrowser": false,
+ "launchBrowser": true,
"launchUrl": "api/books",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
@@ -18,7 +18,7 @@
},
"Kestrel": {
"commandName": "Project",
- "launchBrowser": false,
+ "launchBrowser": true,
"launchUrl": "api/books",
"applicationUrl": "http://localhost:24141",
"environmentVariables": {
diff --git a/src/Examples/GettingStarted/appsettings.json b/src/Examples/GettingStarted/appsettings.json
index 31455b7..4db298e 100644
--- a/src/Examples/GettingStarted/appsettings.json
+++ b/src/Examples/GettingStarted/appsettings.json
@@ -6,7 +6,9 @@
"Logging": {
"LogLevel": {
"Default": "Warning",
+ // Include server startup and incoming requests.
"Microsoft.Hosting.Lifetime": "Information",
+ "Microsoft.AspNetCore.Hosting.Diagnostics": "Information",
"Microsoft.EntityFrameworkCore": "Critical"
}
},
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Definitions/TodoItemDefinition.cs b/src/Examples/JsonApiDotNetCoreMongoDbExample/Definitions/TodoItemDefinition.cs
index 8079def..61027b4 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Definitions/TodoItemDefinition.cs
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/Definitions/TodoItemDefinition.cs
@@ -29,7 +29,7 @@ private SortExpression GetDefaultSortOrder()
{
return CreateSortExpressionFromLambda(new PropertySortOrder
{
- (todoItem => todoItem.Priority, ListSortDirection.Descending),
+ (todoItem => todoItem.Priority, ListSortDirection.Ascending),
(todoItem => todoItem.LastModifiedAt, ListSortDirection.Descending)
});
}
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Models/TodoItem.cs b/src/Examples/JsonApiDotNetCoreMongoDbExample/Models/TodoItem.cs
index 7dc654c..9b0e8d6 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Models/TodoItem.cs
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/Models/TodoItem.cs
@@ -16,6 +16,9 @@ public sealed class TodoItem : HexStringMongoIdentifiable
[Required]
public TodoItemPriority? Priority { get; set; }
+ [Attr]
+ public long? DurationInHours { get; set; }
+
[Attr(Capabilities = AttrCapabilities.AllowFilter | AttrCapabilities.AllowSort | AttrCapabilities.AllowView)]
public DateTimeOffset CreatedAt { get; set; }
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Models/TodoItemPriority.cs b/src/Examples/JsonApiDotNetCoreMongoDbExample/Models/TodoItemPriority.cs
index a782897..3bb17ed 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Models/TodoItemPriority.cs
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/Models/TodoItemPriority.cs
@@ -5,7 +5,7 @@ namespace JsonApiDotNetCoreMongoDbExample.Models;
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
public enum TodoItemPriority
{
- Low,
- Medium,
- High
+ High = 1,
+ Medium = 2,
+ Low = 3
}
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs b/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
index 5f4b0dc..9820cb1 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
@@ -1,3 +1,4 @@
+using System.Diagnostics.CodeAnalysis;
using System.Text.Json.Serialization;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.MongoDb.Configuration;
@@ -6,6 +7,8 @@
using Microsoft.AspNetCore.Authentication;
using MongoDB.Driver;
+[assembly: ExcludeFromCodeCoverage]
+
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// Add services to the container.
@@ -37,13 +40,13 @@
static void ConfigureJsonApiOptions(JsonApiOptions options)
{
- options.Namespace = "api/v1";
+ options.Namespace = "api";
options.UseRelativeLinks = true;
options.IncludeTotalResourceCount = true;
- options.SerializerOptions.WriteIndented = true;
options.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
#if DEBUG
options.IncludeExceptionStackTraceInErrors = true;
options.IncludeRequestBodyInErrors = true;
+ options.SerializerOptions.WriteIndented = true;
#endif
}
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Properties/AssemblyInfo.cs b/src/Examples/JsonApiDotNetCoreMongoDbExample/Properties/AssemblyInfo.cs
deleted file mode 100644
index 82d1291..0000000
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,4 +0,0 @@
-using System.Diagnostics.CodeAnalysis;
-
-// https://github.com/coverlet-coverage/coverlet/blob/master/Documentation/MSBuildIntegration.md#excluding-from-coverage
-[assembly: ExcludeFromCodeCoverage]
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Properties/launchSettings.json b/src/Examples/JsonApiDotNetCoreMongoDbExample/Properties/launchSettings.json
index f155249..c14bdd1 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Properties/launchSettings.json
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/Properties/launchSettings.json
@@ -11,16 +11,16 @@
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
- "launchBrowser": false,
- "launchUrl": "api/v1/todoItems",
+ "launchBrowser": true,
+ "launchUrl": "api/todoItems",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Kestrel": {
"commandName": "Project",
- "launchBrowser": false,
- "launchUrl": "api/v1/todoItems",
+ "launchBrowser": true,
+ "launchUrl": "api/todoItems",
"applicationUrl": "https://localhost:44340;http://localhost:24140",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/appsettings.json b/src/Examples/JsonApiDotNetCoreMongoDbExample/appsettings.json
index dde4b49..b8ed43e 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/appsettings.json
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/appsettings.json
@@ -6,7 +6,9 @@
"Logging": {
"LogLevel": {
"Default": "Warning",
+ // Include server startup and incoming requests.
"Microsoft.Hosting.Lifetime": "Information",
+ "Microsoft.AspNetCore.Hosting.Diagnostics": "Information",
"Microsoft.EntityFrameworkCore": "Critical"
}
},
diff --git a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs
index 58081c6..5e17cff 100644
--- a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs
@@ -62,7 +62,7 @@ private void ValidateExpression(QueryExpression? expression)
public override QueryExpression? VisitComparison(ComparisonExpression expression, object? argument)
{
- if (expression.Left is ResourceFieldChainExpression && expression.Right is ResourceFieldChainExpression)
+ if (expression is { Left: ResourceFieldChainExpression, Right: ResourceFieldChainExpression })
{
throw new AttributeComparisonInFilterNotSupportedException();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
index 6b1c1c7..c486d0d 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
@@ -1,5 +1,4 @@
using System.Net;
-using System.Text.Json;
using FluentAssertions;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Resources;
@@ -54,11 +53,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
responseDocument.Meta.ShouldNotBeNull();
- responseDocument.Meta.ShouldContainKey("total").With(value =>
- {
- JsonElement element = value.Should().BeOfType().Subject;
- element.GetInt32().Should().Be(1);
- });
+ responseDocument.Meta.Should().ContainTotal(1);
}
[Fact]
@@ -80,11 +75,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
responseDocument.Meta.ShouldNotBeNull();
- responseDocument.Meta.ShouldContainKey("total").With(value =>
- {
- JsonElement element = value.Should().BeOfType().Subject;
- element.GetInt32().Should().Be(0);
- });
+ responseDocument.Meta.Should().ContainTotal(0);
}
[Fact]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
index 3e97ce3..c8e6a05 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
@@ -237,7 +237,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
}
[Fact]
- public async Task Cannot_filter_equality_on_incompatible_value()
+ public async Task Cannot_filter_equality_on_incompatible_values()
{
// Arrange
var resource = new FilterableResource
@@ -264,9 +264,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
ErrorObject error = responseDocument.Errors[0];
error.StatusCode.Should().Be(HttpStatusCode.BadRequest);
- error.Title.Should().Be("Query creation failed due to incompatible types.");
+ error.Title.Should().Be("The specified filter is invalid.");
error.Detail.Should().Be("Failed to convert 'ABC' of type 'String' to type 'Int32'.");
- error.Source.Should().BeNull();
+ error.Source.ShouldNotBeNull();
+ error.Source.Parameter.Should().Be("filter");
}
[Theory]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs
index cb54c88..d638555 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs
@@ -94,7 +94,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
}
[Fact]
- public async Task Returns_all_resources_when_paging_is_disabled()
+ public async Task Returns_all_resources_when_pagination_is_disabled()
{
// Arrange
var options = (JsonApiOptions)_testContext.Factory.Services.GetRequiredService();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
index b5b2344..dca4609 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
@@ -300,7 +300,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
}
[Fact]
- public async Task Retrieves_all_properties_when_fieldset_contains_readonly_attribute()
+ public async Task Fetches_all_scalar_properties_when_fieldset_contains_readonly_attribute()
{
// Arrange
var store = _testContext.Factory.Services.GetRequiredService();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
index 521da09..d9b54c4 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
@@ -1,5 +1,4 @@
using System.Net;
-using System.Text.Json;
using FluentAssertions;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
@@ -70,11 +69,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
responseDocument.Data.ManyValue[0].Id.Should().Be(planets[1].StringId);
responseDocument.Data.ManyValue[1].Id.Should().Be(planets[3].StringId);
- responseDocument.Meta.ShouldContainKey("total").With(value =>
- {
- JsonElement element = value.Should().BeOfType().Subject;
- element.GetInt32().Should().Be(2);
- });
+ responseDocument.Meta.Should().ContainTotal(2);
hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[]
{
@@ -129,11 +124,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
responseDocument.Data.ManyValue.ShouldHaveCount(1);
responseDocument.Data.ManyValue[0].Id.Should().Be(planets[3].StringId);
- responseDocument.Meta.ShouldContainKey("total").With(value =>
- {
- JsonElement element = value.Should().BeOfType().Subject;
- element.GetInt32().Should().Be(1);
- });
+ responseDocument.Meta.Should().ContainTotal(1);
hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[]
{
diff --git a/test/TestBuildingBlocks/ObjectAssertionsExtensions.cs b/test/TestBuildingBlocks/ObjectAssertionsExtensions.cs
index c78a005..1e833be 100644
--- a/test/TestBuildingBlocks/ObjectAssertionsExtensions.cs
+++ b/test/TestBuildingBlocks/ObjectAssertionsExtensions.cs
@@ -1,4 +1,6 @@
+using System.Text.Json;
using FluentAssertions;
+using FluentAssertions.Collections;
using FluentAssertions.Numeric;
using JetBrains.Annotations;
@@ -19,4 +21,13 @@ public static AndConstraint> BeApproximately(
{
return parent.BeApproximately(expectedValue, NumericPrecision, because, becauseArgs);
}
+
+ ///
+ /// Asserts that a "meta" dictionary contains a single element named "total" with the specified value.
+ ///
+ [CustomAssertion]
+ public static void ContainTotal(this GenericDictionaryAssertions, string, object?> source, int expectedTotal)
+ {
+ source.ContainKey("total").WhoseValue.Should().BeOfType().Subject.GetInt32().Should().Be(expectedTotal);
+ }
}
diff --git a/test/TestBuildingBlocks/appsettings.json b/test/TestBuildingBlocks/appsettings.json
index edbd7e4..5c69fe7 100644
--- a/test/TestBuildingBlocks/appsettings.json
+++ b/test/TestBuildingBlocks/appsettings.json
@@ -2,8 +2,11 @@
"Logging": {
"LogLevel": {
"Default": "Warning",
+ // Disable logging to keep the output from C/I build clean. Errors are expected to occur while testing failure handling.
+ "Microsoft.AspNetCore.Hosting.Diagnostics": "None",
"Microsoft.Hosting.Lifetime": "Warning",
- "Microsoft.EntityFrameworkCore": "Critical"
+ "Microsoft.EntityFrameworkCore": "Critical",
+ "JsonApiDotNetCore": "Critical"
}
}
}
From 621883c2117a5f29c288574b5c1e4e2a19312d36 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Thu, 18 May 2023 18:55:56 +0200
Subject: [PATCH 07/82] Add test throttling (reduces the duration of running
all tests from 2:37 to 0:30 on my system)
---
.../AtomicOperationsFixture.cs | 12 +++++--
.../JsonApiDotNetCoreMongoDbTests.csproj | 6 ----
.../xunit.runner.json | 4 ---
test/TestBuildingBlocks/IntegrationTest.cs | 25 +++++++++++--
.../IntegrationTestContext.cs | 35 +++++++++++--------
5 files changed, 53 insertions(+), 29 deletions(-)
delete mode 100644 test/JsonApiDotNetCoreMongoDbTests/xunit.runner.json
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
index e10e17d..c9029bb 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
@@ -1,11 +1,12 @@
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using TestBuildingBlocks;
+using Xunit;
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations;
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
-public sealed class AtomicOperationsFixture : IDisposable
+public sealed class AtomicOperationsFixture : IAsyncLifetime
{
internal IntegrationTestContext TestContext { get; }
@@ -21,8 +22,13 @@ public AtomicOperationsFixture()
TestContext.ConfigureServicesAfterStartup(services => services.AddSingleton());
}
- public void Dispose()
+ public Task InitializeAsync()
{
- TestContext.Dispose();
+ return Task.CompletedTask;
+ }
+
+ public async Task DisposeAsync()
+ {
+ await TestContext.DisposeAsync();
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj b/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
index c202a91..dbfe9fa 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
+++ b/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
@@ -3,12 +3,6 @@
$(TargetFrameworkName)
-
-
- PreserveNewest
-
-
-
diff --git a/test/JsonApiDotNetCoreMongoDbTests/xunit.runner.json b/test/JsonApiDotNetCoreMongoDbTests/xunit.runner.json
deleted file mode 100644
index 9db029b..0000000
--- a/test/JsonApiDotNetCoreMongoDbTests/xunit.runner.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "parallelizeAssembly": false,
- "parallelizeTestCollections": false
-}
diff --git a/test/TestBuildingBlocks/IntegrationTest.cs b/test/TestBuildingBlocks/IntegrationTest.cs
index c66e6c5..a42877a 100644
--- a/test/TestBuildingBlocks/IntegrationTest.cs
+++ b/test/TestBuildingBlocks/IntegrationTest.cs
@@ -2,16 +2,26 @@
using System.Text;
using System.Text.Json;
using JsonApiDotNetCore.Middleware;
+using Xunit;
namespace TestBuildingBlocks;
///
-/// A base class for tests that conveniently enables to execute HTTP requests against JSON:API endpoints.
+/// A base class for tests that conveniently enables to execute HTTP requests against JSON:API endpoints. It throttles tests that are running in parallel
+/// to avoid exceeding the maximum active database connections.
///
-public abstract class IntegrationTest
+public abstract class IntegrationTest : IAsyncLifetime
{
+ private static readonly SemaphoreSlim ThrottleSemaphore;
+
protected abstract JsonSerializerOptions SerializerOptions { get; }
+ static IntegrationTest()
+ {
+ int maxConcurrentTestRuns = Environment.GetEnvironmentVariable("APPVEYOR") != null ? 32 : 64;
+ ThrottleSemaphore = new SemaphoreSlim(maxConcurrentTestRuns);
+ }
+
public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteGetAsync(string requestUrl,
Action? setRequestHeaders = null)
{
@@ -99,4 +109,15 @@ public abstract class IntegrationTest
throw new FormatException($"Failed to deserialize response body to JSON:\n{responseText}", exception);
}
}
+
+ public async Task InitializeAsync()
+ {
+ await ThrottleSemaphore.WaitAsync();
+ }
+
+ public virtual Task DisposeAsync()
+ {
+ _ = ThrottleSemaphore.Release();
+ return Task.CompletedTask;
+ }
}
diff --git a/test/TestBuildingBlocks/IntegrationTestContext.cs b/test/TestBuildingBlocks/IntegrationTestContext.cs
index 2e3cc72..826447d 100644
--- a/test/TestBuildingBlocks/IntegrationTestContext.cs
+++ b/test/TestBuildingBlocks/IntegrationTestContext.cs
@@ -28,7 +28,7 @@ namespace TestBuildingBlocks;
/// .
///
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
-public class IntegrationTestContext : IntegrationTest, IDisposable
+public class IntegrationTestContext : IntegrationTest
where TStartup : class
where TMongoDbContextShim : MongoDbContextShim
{
@@ -125,19 +125,6 @@ private void ConfigureJsonApiOptions(JsonApiOptions options)
options.SerializerOptions.WriteIndented = true;
}
- public void Dispose()
- {
- if (_lazyFactory.IsValueCreated)
- {
- _lazyFactory.Value.Dispose();
- }
-
- if (_runner.IsValueCreated)
- {
- _runner.Value.Dispose();
- }
- }
-
public void ConfigureServicesAfterStartup(Action servicesConfiguration)
{
_afterServicesConfiguration = servicesConfiguration;
@@ -151,6 +138,26 @@ public async Task RunOnDatabaseAsync(Func asyncAction
await asyncAction(mongoDbContextShim);
}
+ public override async Task DisposeAsync()
+ {
+ try
+ {
+ if (_lazyFactory.IsValueCreated)
+ {
+ await _lazyFactory.Value.DisposeAsync();
+ }
+
+ if (_runner.IsValueCreated)
+ {
+ _runner.Value.Dispose();
+ }
+ }
+ finally
+ {
+ await base.DisposeAsync();
+ }
+ }
+
private sealed class IntegrationTestWebApplicationFactory : WebApplicationFactory
{
private Action? _beforeServicesConfiguration;
From ab732781d7a4e29dec0f1168ddfc9cfb73cce260 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 21:30:15 +0200
Subject: [PATCH 08/82] Package updates
---
Directory.Build.props | 4 ++--
test/TestBuildingBlocks/TestBuildingBlocks.csproj | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index be5871c..d8ee665 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -14,7 +14,7 @@
-
+
@@ -31,7 +31,7 @@
- 3.2.*
+ 6.0.*
17.6.*
diff --git a/test/TestBuildingBlocks/TestBuildingBlocks.csproj b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
index 9dccdb2..629c236 100644
--- a/test/TestBuildingBlocks/TestBuildingBlocks.csproj
+++ b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
@@ -14,7 +14,7 @@
-
-
+
+
From e764e086c24da3107abc3bcc7ff7631793855df8 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 21:28:34 +0200
Subject: [PATCH 09/82] Update to build against JsonApiDotNetCore v5.3.0
---
Directory.Build.props | 2 +-
.../Configuration/ServiceCollectionExtensions.cs | 2 +-
.../HideRelationshipsSparseFieldSetCache.cs | 1 -
.../Repositories/MongoRepository.cs | 14 +++++++-------
.../Transactions/LyricRepository.cs | 6 ++++--
.../Transactions/MusicTrackRepository.cs | 6 ++++--
.../QueryStrings/Filtering/FilterDataTypeTests.cs | 2 +-
.../SparseFieldSets/ResultCapturingRepository.cs | 5 +++--
8 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index d8ee665..e53af2e 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -2,7 +2,7 @@
net6.0
6.0.*
- 5.2.0
+ 5.3.0
2.15.0
5.1.3
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
diff --git a/src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs b/src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs
index f914f91..836cf87 100644
--- a/src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs
@@ -3,7 +3,7 @@
using JsonApiDotNetCore.MongoDb.AtomicOperations;
using JsonApiDotNetCore.MongoDb.Queries.Internal;
using JsonApiDotNetCore.MongoDb.Repositories;
-using JsonApiDotNetCore.Queries.Internal;
+using JsonApiDotNetCore.Queries;
using Microsoft.Extensions.DependencyInjection;
namespace JsonApiDotNetCore.MongoDb.Configuration;
diff --git a/src/JsonApiDotNetCore.MongoDb/Queries/Internal/HideRelationshipsSparseFieldSetCache.cs b/src/JsonApiDotNetCore.MongoDb/Queries/Internal/HideRelationshipsSparseFieldSetCache.cs
index fcd9d8a..505bf89 100644
--- a/src/JsonApiDotNetCore.MongoDb/Queries/Internal/HideRelationshipsSparseFieldSetCache.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Queries/Internal/HideRelationshipsSparseFieldSetCache.cs
@@ -2,7 +2,6 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.MongoDb.Resources;
using JsonApiDotNetCore.Queries;
-using JsonApiDotNetCore.Queries.Internal;
using JsonApiDotNetCore.Resources;
using JsonApiDotNetCore.Resources.Annotations;
diff --git a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
index 6bd64e3..ea673c0 100644
--- a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
@@ -7,7 +7,7 @@
using JsonApiDotNetCore.MongoDb.Resources;
using JsonApiDotNetCore.Queries;
using JsonApiDotNetCore.Queries.Expressions;
-using JsonApiDotNetCore.Queries.Internal.QueryableBuilding;
+using JsonApiDotNetCore.Queries.QueryableBuilding;
using JsonApiDotNetCore.Repositories;
using JsonApiDotNetCore.Resources;
using JsonApiDotNetCore.Resources.Annotations;
@@ -29,6 +29,7 @@ public class MongoRepository : IResourceRepository _constraintProviders;
private readonly IResourceDefinitionAccessor _resourceDefinitionAccessor;
+ private readonly IQueryableBuilder _queryableBuilder;
protected virtual IMongoCollection Collection => _mongoDataAccess.MongoDatabase.GetCollection(typeof(TResource).Name);
@@ -36,7 +37,7 @@ public class MongoRepository : IResourceRepository _mongoDataAccess.TransactionId;
public MongoRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targetedFields, IResourceGraph resourceGraph, IResourceFactory resourceFactory,
- IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor)
+ IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor, IQueryableBuilder queryableBuilder)
{
ArgumentGuard.NotNull(mongoDataAccess);
ArgumentGuard.NotNull(targetedFields);
@@ -44,6 +45,7 @@ public MongoRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targete
ArgumentGuard.NotNull(resourceFactory);
ArgumentGuard.NotNull(constraintProviders);
ArgumentGuard.NotNull(resourceDefinitionAccessor);
+ ArgumentGuard.NotNull(queryableBuilder);
_mongoDataAccess = mongoDataAccess;
_targetedFields = targetedFields;
@@ -51,6 +53,7 @@ public MongoRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targete
_resourceFactory = resourceFactory;
_constraintProviders = constraintProviders;
_resourceDefinitionAccessor = resourceDefinitionAccessor;
+ _queryableBuilder = queryableBuilder;
if (!typeof(TResource).IsAssignableTo(typeof(IMongoIdentifiable)))
{
@@ -112,12 +115,9 @@ protected virtual IMongoQueryable ApplyQueryLayer(QueryLayer queryLay
source = queryableHandler.Apply(source);
}
- var nameFactory = new LambdaParameterNameFactory();
+ var context = QueryableBuilderContext.CreateRoot(source, typeof(Queryable), new MongoModel(_resourceGraph), null);
+ Expression expression = _queryableBuilder.ApplyQuery(queryLayer, context);
- var builder = new QueryableBuilder(source.Expression, source.ElementType, typeof(Queryable), nameFactory, _resourceFactory,
- new MongoModel(_resourceGraph));
-
- Expression expression = builder.ApplyQuery(queryLayer);
return (IMongoQueryable)source.Provider.CreateQuery(expression);
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
index c1275be..93e31b2 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
@@ -4,6 +4,7 @@
using JsonApiDotNetCore.MongoDb.AtomicOperations;
using JsonApiDotNetCore.MongoDb.Repositories;
using JsonApiDotNetCore.Queries;
+using JsonApiDotNetCore.Queries.QueryableBuilding;
using JsonApiDotNetCore.Resources;
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Transactions;
@@ -19,8 +20,9 @@ public sealed class LyricRepository : MongoRepository, IAsyncDis
public override string TransactionId => _transaction.TransactionId;
public LyricRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targetedFields, IResourceGraph resourceGraph, IResourceFactory resourceFactory,
- IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor)
- : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor)
+ IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor,
+ IQueryableBuilder queryableBuilder)
+ : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor, queryableBuilder)
{
IMongoDataAccess otherDataAccess = new MongoDataAccess(mongoDataAccess.MongoDatabase);
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/MusicTrackRepository.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/MusicTrackRepository.cs
index 09164f2..5d40f37 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/MusicTrackRepository.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/MusicTrackRepository.cs
@@ -2,6 +2,7 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.MongoDb.Repositories;
using JsonApiDotNetCore.Queries;
+using JsonApiDotNetCore.Queries.QueryableBuilding;
using JsonApiDotNetCore.Resources;
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Transactions;
@@ -14,8 +15,9 @@ public sealed class MusicTrackRepository : MongoRepository
public override string? TransactionId => null;
public MusicTrackRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targetedFields, IResourceGraph resourceGraph,
- IResourceFactory resourceFactory, IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor)
- : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor)
+ IResourceFactory resourceFactory, IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor,
+ IQueryableBuilder queryableBuilder)
+ : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor, queryableBuilder)
{
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
index c8e6a05..5dc1442 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
@@ -265,7 +265,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
ErrorObject error = responseDocument.Errors[0];
error.StatusCode.Should().Be(HttpStatusCode.BadRequest);
error.Title.Should().Be("The specified filter is invalid.");
- error.Detail.Should().Be("Failed to convert 'ABC' of type 'String' to type 'Int32'.");
+ error.Detail.Should().StartWith("Failed to convert 'ABC' of type 'String' to type 'Int32'.");
error.Source.ShouldNotBeNull();
error.Source.Parameter.Should().Be("filter");
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/ResultCapturingRepository.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/ResultCapturingRepository.cs
index 400ee49..b88cd2e 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/ResultCapturingRepository.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/ResultCapturingRepository.cs
@@ -2,6 +2,7 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.MongoDb.Repositories;
using JsonApiDotNetCore.Queries;
+using JsonApiDotNetCore.Queries.QueryableBuilding;
using JsonApiDotNetCore.Resources;
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.QueryStrings.SparseFieldSets;
@@ -17,8 +18,8 @@ public sealed class ResultCapturingRepository : MongoRepository<
public ResultCapturingRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targetedFields, IResourceGraph resourceGraph,
IResourceFactory resourceFactory, IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor,
- ResourceCaptureStore captureStore)
- : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor)
+ IQueryableBuilder queryableBuilder, ResourceCaptureStore captureStore)
+ : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor, queryableBuilder)
{
_captureStore = captureStore;
}
From eb7247d986134293cf75cae757815c5dcc305ed6 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 22:01:17 +0200
Subject: [PATCH 10/82] Add missing controller annotations in tests
---
.../IntegrationTests/QueryStrings/AccountPreferences.cs | 1 +
.../IntegrationTests/QueryStrings/Label.cs | 1 +
.../IntegrationTests/QueryStrings/LoginAttempt.cs | 1 +
.../IntegrationTests/ReadWrite/WorkTag.cs | 1 +
4 files changed, 4 insertions(+)
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/AccountPreferences.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/AccountPreferences.cs
index 0cd5aa2..73ea764 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/AccountPreferences.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/AccountPreferences.cs
@@ -5,6 +5,7 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.QueryStrings;
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
+[Resource(ControllerNamespace = "JsonApiDotNetCoreMongoDbTests.IntegrationTests.QueryStrings")]
public sealed class AccountPreferences : HexStringMongoIdentifiable
{
[Attr]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Label.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Label.cs
index 5c267fb..1cc8ce3 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Label.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Label.cs
@@ -6,6 +6,7 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.QueryStrings;
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
+[Resource(ControllerNamespace = "JsonApiDotNetCoreMongoDbTests.IntegrationTests.QueryStrings")]
public sealed class Label : HexStringMongoIdentifiable
{
[Attr]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/LoginAttempt.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/LoginAttempt.cs
index 5e06cea..412b964 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/LoginAttempt.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/LoginAttempt.cs
@@ -5,6 +5,7 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.QueryStrings;
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
+[Resource(ControllerNamespace = "JsonApiDotNetCoreMongoDbTests.IntegrationTests.QueryStrings")]
public sealed class LoginAttempt : HexStringMongoIdentifiable
{
[Attr]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/WorkTag.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/WorkTag.cs
index 48de6cf..bbd12e5 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/WorkTag.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/WorkTag.cs
@@ -6,6 +6,7 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite;
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
+[Resource(ControllerNamespace = "JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite")]
public sealed class WorkTag : HexStringMongoIdentifiable
{
[Attr]
From 7e29252dd52421f211288a9dac1e5af6e61f8e09 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 22:06:11 +0200
Subject: [PATCH 11/82] Add readme to NuGet package
---
PackageReadme.md | 1 +
.../JsonApiDotNetCore.MongoDb.csproj | 7 +++----
2 files changed, 4 insertions(+), 4 deletions(-)
create mode 100644 PackageReadme.md
diff --git a/PackageReadme.md b/PackageReadme.md
new file mode 100644
index 0000000..6c9ce84
--- /dev/null
+++ b/PackageReadme.md
@@ -0,0 +1 @@
+Persistence layer implementation for use of [MongoDB](https://www.mongodb.com/) in APIs using [JsonApiDotNetCore](https://www.jsonapi.net/).
diff --git a/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj b/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
index 2cc225f..ab3c7f6 100644
--- a/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
+++ b/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
@@ -15,16 +15,15 @@
false
See https://github.com/json-api-dotnet/JsonApiDotNetCore.MongoDb/releases.
logo.png
+ PackageReadme.md
true
true
embedded
-
- True
-
-
+
+
From 5449118cb675fa6cc4d6bda6c160746882ca1598 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 22:11:07 +0200
Subject: [PATCH 12/82] Deterministic CI-builds
---
.../JsonApiDotNetCore.MongoDb.csproj | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj b/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
index ab3c7f6..7b9f43a 100644
--- a/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
+++ b/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
@@ -21,6 +21,10 @@
embedded
+
+ true
+
+
From f32d1b07bfc05236009d8ee6a580d376ffdd0266 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 22:12:33 +0200
Subject: [PATCH 13/82] Adapt for corrected nullability annotation in .NET 8
---
.../ResourceDefinitions/Reading/MoonDefinition.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs
index b2b8fa6..26dcdb5 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs
@@ -29,7 +29,7 @@ public override QueryStringParameterHandlers OnRegisterQueryableHandlersFo
private static IQueryable FilterByRadius(IQueryable source, StringValues parameterValue)
{
- bool isFilterOnLargerThan = bool.Parse(parameterValue);
+ bool isFilterOnLargerThan = bool.Parse(parameterValue.ToString());
return isFilterOnLargerThan ? source.Where(moon => moon.SolarRadius > 1m) : source.Where(moon => moon.SolarRadius <= 1m);
}
}
From da00cd5cde84eeb5c35d305f5e1b74bac97285bf Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 22:24:36 +0200
Subject: [PATCH 14/82] Update MongoDB.Driver package due to a known moderate
severity vulnerability in v2.15.0, which was fixed in v2.19.0
---
Directory.Build.props | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index e53af2e..160cbe7 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -3,7 +3,7 @@
net6.0
6.0.*
5.3.0
- 2.15.0
+ 2.20.0
5.1.3
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
9999
From e7ac033417b8ae67adf931a013185d48f2f45df8 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 23:08:39 +0200
Subject: [PATCH 15/82] Update version to 5.3.0
---
Directory.Build.props | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index 160cbe7..218247a 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -4,7 +4,7 @@
6.0.*
5.3.0
2.20.0
- 5.1.3
+ 5.3.0
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
9999
enable
From d9ad095bc72fa9660608108e2800cb126161063d Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 25 Jul 2023 23:13:36 +0200
Subject: [PATCH 16/82] Increment version to 5.3.1 (used for pre-release builds
from ci)
---
Directory.Build.props | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index 218247a..c56c8eb 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -4,7 +4,7 @@
6.0.*
5.3.0
2.20.0
- 5.3.0
+ 5.3.1
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
9999
enable
From b1b321a696042c3c0d95f79bddd9a44e969eb24f Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Mon, 25 Sep 2023 04:20:07 +0200
Subject: [PATCH 17/82] Update to JADNC v5.4.0
---
.config/dotnet-tools.json | 12 +-
.editorconfig | 2 +-
.github/FUNDING.yml | 1 +
.github/ISSUE_TEMPLATE.md | 21 --
.github/ISSUE_TEMPLATE/bug_report.md | 32 +++
.github/ISSUE_TEMPLATE/feature_request.md | 22 ++
.github/ISSUE_TEMPLATE/question.md | 39 +++
.github/dependabot.yml | 21 ++
.github/workflows/build.yml | 253 ++++++++++++++++++
Build.ps1 | 121 ++-------
CSharpGuidelinesAnalyzer.config | 2 +-
Directory.Build.props | 62 +++--
LICENSE | 31 +--
NuGet.config | 7 -
README.md | 31 ++-
appveyor.yml | 50 +---
cleanupcode.ps1 | 4 +-
inspectcode.ps1 | 8 +-
.../ArgumentGuard.cs | 1 -
.../AtomicOperations/MongoTransaction.cs | 2 +-
.../JsonApiDotNetCore.MongoDb.csproj | 12 +-
.../HideRelationshipsSparseFieldSetCache.cs | 2 +-
.../Repositories/MongoDataAccess.cs | 2 +-
.../MongoQueryExpressionValidator.cs | 2 +-
.../Repositories/MongoRepository.cs | 11 +-
...rAtomicOperationsTestsThatChangeOptions.cs | 85 ++++++
.../Creating/AtomicCreateResourceTests.cs | 5 -
...reateResourceWithClientGeneratedIdTests.cs | 5 +-
.../Mixed/MaximumOperationsPerRequestTests.cs | 3 +-
.../AtomicOperations/OperationsFakers.cs | 83 +++---
.../IntegrationTests/Meta/MetaFakers.cs | 11 +-
.../QueryStrings/QueryStringFakers.cs | 37 ++-
.../ReadWrite/Creating/CreateResourceTests.cs | 5 -
...reateResourceWithClientGeneratedIdTests.cs | 2 +-
.../ReadWrite/ReadWriteFakers.cs | 61 ++---
.../Reading/MoonDefinition.cs | 2 +
.../Reading/StarDefinition.cs | 6 +-
.../Reading/UniverseFakers.cs | 39 ++-
.../JsonApiDotNetCoreMongoDbTests.csproj | 3 +-
test/TestBuildingBlocks/IntegrationTest.cs | 2 +-
.../IntegrationTestContext.cs | 7 +-
.../TestBuildingBlocks.csproj | 13 +-
42 files changed, 702 insertions(+), 418 deletions(-)
create mode 100644 .github/FUNDING.yml
delete mode 100644 .github/ISSUE_TEMPLATE.md
create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md
create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md
create mode 100644 .github/ISSUE_TEMPLATE/question.md
create mode 100644 .github/dependabot.yml
create mode 100644 .github/workflows/build.yml
delete mode 100644 NuGet.config
create mode 100644 test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/BaseForAtomicOperationsTestsThatChangeOptions.cs
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 9278758..ea2c34b 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,25 +3,19 @@
"isRoot": true,
"tools": {
"jetbrains.resharper.globaltools": {
- "version": "2023.1.2",
+ "version": "2023.2.1",
"commands": [
"jb"
]
},
"regitlint": {
- "version": "6.3.11",
+ "version": "6.3.12",
"commands": [
"regitlint"
]
},
- "codecov.tool": {
- "version": "1.13.0",
- "commands": [
- "codecov"
- ]
- },
"dotnet-reportgenerator-globaltool": {
- "version": "5.1.20",
+ "version": "5.1.25",
"commands": [
"reportgenerator"
]
diff --git a/.editorconfig b/.editorconfig
index 86cbbc3..5a036d1 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -8,7 +8,7 @@ charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
-[*.{config,csproj,css,js,json,props,ruleset,xslt}]
+[*.{config,csproj,css,js,json,props,ruleset,xslt,html}]
indent_size = 2
[*.{cs}]
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..b065d30
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: json-api-dotnet
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 103a247..0000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-#### DESCRIPTION
-
-_Describe your bug or feature request here._
-
-#### STEPS TO REPRODUCE
-
-_Consider to include your code here, such as models, DbContext, controllers, resource services, repositories, resource definitions etc. Please also include the request URL with body (if applicable) and the full exception stack trace (set `options.IncludeExceptionStackTraceInErrors` to `true`) in case of errors._
-
-1.
-2.
-3.
-
-#### EXPECTED BEHAVIOR
-
-#### ACTUAL BEHAVIOR
-
-#### VERSIONS USED
-- JsonApiDotNetCore.MongoDb version:
-- JsonApiDotNetCore version:
-- ASP.NET Core version:
-- MongoDB version:
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..a45d71e
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,32 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: 'bug'
+assignees: ''
+
+---
+
+
+
+#### DESCRIPTION
+
+
+#### STEPS TO REPRODUCE
+
+
+1.
+2.
+3.
+
+#### EXPECTED BEHAVIOR
+
+
+#### ACTUAL BEHAVIOR
+
+
+#### VERSIONS USED
+- JsonApiDotNetCore.MongoDb version:
+- JsonApiDotNetCore version:
+- ASP.NET Core version:
+- MongoDB version:
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..f629ca4
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,22 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: 'enhancement'
+assignees: ''
+
+---
+
+
+
+**Is your feature request related to a problem? Please describe.**
+
+
+**Describe the solution you'd like**
+
+
+**Describe alternatives you've considered**
+
+
+**Additional context**
+
diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
new file mode 100644
index 0000000..76b3998
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/question.md
@@ -0,0 +1,39 @@
+---
+name: Question
+about: Ask a question
+title: ''
+labels: 'question'
+assignees: ''
+
+---
+
+
+
+#### SUMMARY
+
+
+#### DETAILS
+
+
+
+#### STEPS TO REPRODUCE
+
+
+1.
+2.
+3.
+
+#### VERSIONS USED
+- JsonApiDotNetCore.MongoDb version:
+- JsonApiDotNetCore version:
+- ASP.NET Core version:
+- MongoDB version:
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..ecd4217
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,21 @@
+version: 2
+updates:
+- package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ pull-request-branch-name:
+ separator: "-"
+- package-ecosystem: nuget
+ directory: "/"
+ schedule:
+ interval: daily
+ pull-request-branch-name:
+ separator: "-"
+ open-pull-requests-limit: 25
+ ignore:
+ # Block updates to all exposed dependencies of the NuGet packages we produce, as updating them would be a breaking change.
+ - dependency-name: 'JsonApiDotNetCore*'
+ # Block major updates of packages that require a matching .NET version.
+ - dependency-name: 'Microsoft.AspNetCore*'
+ update-types: ["version-update:semver-major"]
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..c56fa3d
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,253 @@
+# General links
+# https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
+# https://docs.github.com/en/actions/learn-github-actions/contexts#github-context
+# https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads
+# https://docs.github.com/en/actions/learn-github-actions/expressions
+# https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions
+# https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs
+
+name: Build
+
+on:
+ push:
+ branches: [ 'master', 'release/**' ]
+ pull_request:
+ branches: [ 'master', 'release/**' ]
+ release:
+ types: [published]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+env:
+ DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
+ DOTNET_CLI_TELEMETRY_OPTOUT: true
+
+jobs:
+ build-and-test:
+ timeout-minutes: 60
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, windows-latest, macos-latest]
+ runs-on: ${{ matrix.os }}
+ permissions:
+ contents: read
+ steps:
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: 6.0.x
+ - name: Setup PowerShell (Ubuntu)
+ if: matrix.os == 'ubuntu-latest'
+ run: |
+ dotnet tool install --global PowerShell
+ - name: Find latest PowerShell version (Windows)
+ if: matrix.os == 'windows-latest'
+ shell: pwsh
+ run: |
+ $packageName = "powershell"
+ $outputText = dotnet tool search $packageName --take 1
+ $outputLine = ("" + $outputText)
+ $indexOfVersionLine = $outputLine.IndexOf($packageName)
+ $latestVersion = $outputLine.substring($indexOfVersionLine + $packageName.length).trim().split(" ")[0].trim()
+
+ Write-Output "Found PowerShell version: $latestVersion"
+ Write-Output "POWERSHELL_LATEST_VERSION=$latestVersion" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
+ - name: Setup PowerShell (Windows)
+ if: matrix.os == 'windows-latest'
+ shell: cmd
+ run: |
+ set DOWNLOAD_LINK=https://github.com/PowerShell/PowerShell/releases/download/v%POWERSHELL_LATEST_VERSION%/PowerShell-%POWERSHELL_LATEST_VERSION%-win-x64.msi
+ set OUTPUT_PATH=%RUNNER_TEMP%\PowerShell-%POWERSHELL_LATEST_VERSION%-win-x64.msi
+ echo Downloading from: %DOWNLOAD_LINK% to: %OUTPUT_PATH%
+ curl --location --output %OUTPUT_PATH% %DOWNLOAD_LINK%
+ msiexec.exe /package %OUTPUT_PATH% /quiet USE_MU=1 ENABLE_MU=1 ADD_PATH=1 DISABLE_TELEMETRY=1
+ - name: Setup PowerShell (macOS)
+ if: matrix.os == 'macos-latest'
+ run: |
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+ brew install --cask powershell
+ - name: Show installed versions
+ shell: pwsh
+ run: |
+ Write-Host "$(pwsh --version) is installed at $PSHOME"
+ Write-Host "Active .NET SDK: $(dotnet --version)"
+ - name: Git checkout
+ uses: actions/checkout@v4
+ - name: Restore tools
+ run: |
+ dotnet tool restore
+ - name: Restore packages
+ run: |
+ dotnet restore
+ - name: Calculate version suffix
+ shell: pwsh
+ run: |
+ if ($env:GITHUB_REF_TYPE -eq 'tag') {
+ # Get the version prefix/suffix from the git tag. For example: 'v1.0.0-preview1-final' => '1.0.0' and 'preview1-final'
+ $segments = $env:GITHUB_REF_NAME -split "-"
+ $versionPrefix = $segments[0].TrimStart('v')
+ $versionSuffix = $segments.Length -eq 1 ? '' : $segments[1..$($segments.Length - 1)] -join '-'
+
+ [xml]$xml = Get-Content Directory.Build.props
+ $configuredVersionPrefix = $xml.Project.PropertyGroup[0].JsonApiDotNetCoreMongoDbVersionPrefix
+ if ($configuredVersionPrefix -ne $versionPrefix) {
+ Write-Error "Version prefix from git release tag '$versionPrefix' does not match version prefix '$configuredVersionPrefix' stored in Directory.Build.props."
+ # To recover from this:
+ # - Delete the GitHub release
+ # - Run: git push --delete origin the-invalid-tag-name
+ # - Adjust JsonApiDotNetCoreVersionPrefix in Directory.Build.props, commit and push
+ # - Recreate the GitHub release
+ }
+ }
+ else {
+ # Get the version suffix from the auto-incrementing build number. For example: '123' => 'master-00123'
+ $revision = "{0:D5}" -f [convert]::ToInt32($env:GITHUB_RUN_NUMBER, 10)
+ $branchName = ![string]::IsNullOrEmpty($env:GITHUB_HEAD_REF) ? $env:GITHUB_HEAD_REF : $env:GITHUB_REF_NAME
+ $safeName = $branchName.Replace('/', '-').Replace('_', '-')
+ $versionSuffix = "$safeName-$revision"
+ }
+ Write-Output "Using version suffix: $versionSuffix"
+ Write-Output "PACKAGE_VERSION_SUFFIX=$versionSuffix" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
+ - name: Build
+ shell: pwsh
+ run: |
+ dotnet build --no-restore --configuration Release /p:VersionSuffix=$env:PACKAGE_VERSION_SUFFIX
+ - name: Test
+ run: |
+ dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" --logger "GitHubActions;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.DeterministicReport=true
+ - name: Upload coverage to codecov.io
+ if: matrix.os == 'ubuntu-latest'
+ uses: codecov/codecov-action@v3
+ - name: Generate packages
+ shell: pwsh
+ run: |
+ dotnet pack --no-build --configuration Release --output $env:GITHUB_WORKSPACE/artifacts/packages /p:VersionSuffix=$env:PACKAGE_VERSION_SUFFIX
+ - name: Upload packages to artifacts
+ if: matrix.os == 'ubuntu-latest'
+ uses: actions/upload-artifact@v3
+ with:
+ name: packages
+ path: artifacts/packages
+
+ inspect-code:
+ timeout-minutes: 60
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, windows-latest, macos-latest]
+ runs-on: ${{ matrix.os }}
+ permissions:
+ contents: read
+ steps:
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: 6.0.x
+ - name: Git checkout
+ uses: actions/checkout@v4
+ - name: Restore tools
+ run: |
+ dotnet tool restore
+ - name: InspectCode
+ shell: pwsh
+ run: |
+ $inspectCodeOutputPath = Join-Path $env:RUNNER_TEMP 'jetbrains-inspectcode-results.xml'
+ Write-Output "INSPECT_CODE_OUTPUT_PATH=$inspectCodeOutputPath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
+ dotnet jb inspectcode JsonApiDotNetCore.MongoDb.sln --build --output="$inspectCodeOutputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --properties:ContinuousIntegrationBuild=false --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
+ - name: Verify outcome
+ shell: pwsh
+ run: |
+ [xml]$xml = Get-Content $env:INSPECT_CODE_OUTPUT_PATH
+ if ($xml.report.Issues -and $xml.report.Issues.Project) {
+ foreach ($project in $xml.report.Issues.Project) {
+ if ($project.Issue.Count -gt 0) {
+ $project.ForEach({
+ Write-Output "`nProject $($project.Name)"
+ $failed = $true
+
+ $_.Issue.ForEach({
+ $issueType = $xml.report.IssueTypes.SelectSingleNode("IssueType[@Id='$($_.TypeId)']")
+ $severity = $_.Severity ?? $issueType.Severity
+
+ Write-Output "[$severity] $($_.File):$($_.Line) $($_.TypeId): $($_.Message)"
+ })
+ })
+ }
+ }
+
+ if ($failed) {
+ Write-Error "One or more projects failed code inspection."
+ }
+ }
+
+ cleanup-code:
+ timeout-minutes: 60
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, windows-latest, macos-latest]
+ runs-on: ${{ matrix.os }}
+ permissions:
+ contents: read
+ steps:
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: 6.0.x
+ - name: Git checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 2
+ - name: Restore tools
+ run: |
+ dotnet tool restore
+ - name: Restore packages
+ run: |
+ dotnet restore
+ - name: CleanupCode (on PR diff)
+ if: github.event_name == 'pull_request'
+ shell: pwsh
+ run: |
+ # Not using the environment variables for SHAs, because they may be outdated. This may happen on force-push after the build is queued, but before it starts.
+ # The below works because HEAD is detached (at the merge commit), so HEAD~1 is at the base branch. When a PR contains no commits, this job will not run.
+ $headCommitHash = git rev-parse HEAD
+ $baseCommitHash = git rev-parse HEAD~1
+
+ Write-Output "Running code cleanup on commit range $baseCommitHash..$headCommitHash in pull request."
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f commits -a $headCommitHash -b $baseCommitHash --fail-on-diff --print-diff
+ - name: CleanupCode (on branch)
+ if: github.event_name == 'push' || github.event_name == 'release'
+ shell: pwsh
+ run: |
+ Write-Output "Running code cleanup on all files."
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN --fail-on-diff --print-diff
+
+ publish:
+ timeout-minutes: 60
+ runs-on: ubuntu-latest
+ needs: [ build-and-test, inspect-code, cleanup-code ]
+ if: ${{ !github.event.pull_request.head.repo.fork }}
+ permissions:
+ packages: write
+ contents: write
+ steps:
+ - name: Download artifacts
+ uses: actions/download-artifact@v3
+ - name: Publish to GitHub Packages
+ if: github.event_name == 'push' || github.event_name == 'release'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ shell: pwsh
+ run: |
+ dotnet nuget add source --username 'json-api-dotnet' --password "$env:GITHUB_TOKEN" --store-password-in-clear-text --name 'github' 'https://nuget.pkg.github.com/json-api-dotnet/index.json'
+ dotnet nuget push "$env:GITHUB_WORKSPACE/packages/*.nupkg" --api-key "$env:GITHUB_TOKEN" --source 'github'
+ - name: Publish to NuGet
+ if: github.event_name == 'release' && startsWith(github.ref, 'refs/tags/v')
+ env:
+ NUGET_ORG_API_KEY: ${{ secrets.NUGET_ORG_API_KEY }}
+ shell: pwsh
+ run: |
+ dotnet nuget push "$env:GITHUB_WORKSPACE/packages/*.nupkg" --api-key "$env:NUGET_ORG_API_KEY" --source 'nuget.org'
diff --git a/Build.ps1 b/Build.ps1
index 623cfa7..4854651 100644
--- a/Build.ps1
+++ b/Build.ps1
@@ -1,115 +1,26 @@
-function CheckLastExitCode {
- param ([int[]]$SuccessCodes = @(0), [scriptblock]$CleanupScript=$null)
+$versionSuffix="pre"
- if ($SuccessCodes -notcontains $LastExitCode) {
- throw "Executable returned exit code $LastExitCode"
+function VerifySuccessExitCode {
+ if ($LastExitCode -ne 0) {
+ throw "Command failed with exit code $LastExitCode."
}
}
-function RunInspectCode {
- $outputPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), 'jetbrains-inspectcode-results.xml')
- dotnet jb inspectcode JsonApiDotNetCore.MongoDb.sln --no-build --output="$outputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
- CheckLastExitCode
-
- [xml]$xml = Get-Content "$outputPath"
- if ($xml.report.Issues -and $xml.report.Issues.Project) {
- foreach ($project in $xml.report.Issues.Project) {
- if ($project.Issue.Count -gt 0) {
- $project.ForEach({
- Write-Output "`nProject $($project.Name)"
- $failed = $true
-
- $_.Issue.ForEach({
- $issueType = $xml.report.IssueTypes.SelectSingleNode("IssueType[@Id='$($_.TypeId)']")
- $severity = $_.Severity ?? $issueType.Severity
-
- Write-Output "[$severity] $($_.File):$($_.Line) $($_.TypeId): $($_.Message)"
- })
- })
- }
- }
-
- if ($failed) {
- throw "One or more projects failed code inspection.";
- }
- }
-}
-
-function RunCleanupCode {
- # When running in cibuild for a pull request, this reformats only the files changed in the PR and fails if the reformat produces changes.
-
- if ($env:APPVEYOR_PULL_REQUEST_HEAD_COMMIT) {
- # In the past, we used $env:APPVEYOR_PULL_REQUEST_HEAD_COMMIT for the merge commit hash. That is the pinned hash at the time the build is enqueued.
- # When a force-push happens after that, while the build hasn't yet started, this hash becomes invalid during the build, resulting in a lookup error.
- # To prevent failing the build for unobvious reasons we use HEAD, which is always a detached head (the PR merge result).
-
- $headCommitHash = git rev-parse HEAD
- CheckLastExitCode
-
- $baseCommitHash = git rev-parse "$env:APPVEYOR_REPO_BRANCH"
- CheckLastExitCode
-
- if ($baseCommitHash -ne $headCommitHash) {
- Write-Output "Running code cleanup on commit range $baseCommitHash..$headCommitHash in pull request."
- dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f commits -a $headCommitHash -b $baseCommitHash --fail-on-diff --print-diff
- CheckLastExitCode
- }
- }
-}
-
-function ReportCodeCoverage {
- if ($env:APPVEYOR) {
- if ($IsWindows) {
- dotnet codecov -f "**\coverage.cobertura.xml"
- }
- }
- else {
- dotnet reportgenerator -reports:**\coverage.cobertura.xml -targetdir:artifacts\coverage
- }
-
- CheckLastExitCode
-}
-
-function CreateNuGetPackage {
- if ($env:APPVEYOR_REPO_TAG -eq $true) {
- # Get the version suffix from the repo tag. Example: v1.0.0-preview1-final => preview1-final
- $segments = $env:APPVEYOR_REPO_TAG_NAME -split "-"
- $suffixSegments = $segments[1..2]
- $versionSuffix = $suffixSegments -join "-"
- }
- else {
- # Get the version suffix from the auto-incrementing build number. Example: "123" => "master-0123".
- if ($env:APPVEYOR_BUILD_NUMBER) {
- $revision = "{0:D4}" -f [convert]::ToInt32($env:APPVEYOR_BUILD_NUMBER, 10)
- $versionSuffix = "$($env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH ?? $env:APPVEYOR_REPO_BRANCH)-$revision"
- }
- else {
- $versionSuffix = "pre-0001"
- }
- }
-
- if ([string]::IsNullOrWhitespace($versionSuffix)) {
- dotnet pack --no-restore --no-build --configuration Release --output .\artifacts
- }
- else {
- dotnet pack --no-restore --no-build --configuration Release --output .\artifacts --version-suffix=$versionSuffix
- }
-
- CheckLastExitCode
-}
+Write-Host "$(pwsh --version)"
+Write-Host "Active .NET SDK: $(dotnet --version)"
+Write-Host "Using version suffix: $versionSuffix"
dotnet tool restore
-CheckLastExitCode
-
-dotnet build -c Release
-CheckLastExitCode
+VerifySuccessExitCode
-RunInspectCode
-RunCleanupCode
+dotnet build --configuration Release /p:VersionSuffix=$versionSuffix
+VerifySuccessExitCode
-dotnet test -c Release --no-build --collect:"XPlat Code Coverage"
-CheckLastExitCode
+dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.DeterministicReport=true
+VerifySuccessExitCode
-ReportCodeCoverage
+dotnet reportgenerator -reports:**\coverage.cobertura.xml -targetdir:artifacts\coverage -filefilters:-*.g.cs
+VerifySuccessExitCode
-CreateNuGetPackage
+dotnet pack --no-build --configuration Release --output artifacts/packages /p:VersionSuffix=$versionSuffix
+VerifySuccessExitCode
diff --git a/CSharpGuidelinesAnalyzer.config b/CSharpGuidelinesAnalyzer.config
index acd0856..89b568e 100644
--- a/CSharpGuidelinesAnalyzer.config
+++ b/CSharpGuidelinesAnalyzer.config
@@ -1,5 +1,5 @@
-
+
diff --git a/Directory.Build.props b/Directory.Build.props
index c56c8eb..3983af1 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,37 +1,53 @@
-
- net6.0
- 6.0.*
- 5.3.0
- 2.20.0
- 5.3.1
- $(MSBuildThisFileDirectory)CodingGuidelines.ruleset
- 9999
- enable
- enable
- false
- false
+
+ $(NoWarn);AV2210
-
-
-
-
-
-
- $(NoWarn);1591;NU5104
+ $(NoWarn);1591
true
true
-
- $(NoWarn);AV2210
+
+ true
-
+
+ net6.0
+ 5.4.0
+ 2.20.0
+
+ 4.1.0
+
+
+ 6.0.*
+ 34.0.*
+ 3.8.*
6.0.*
- 17.6.*
+ 6.12.*
+ 2.3.*
+ 1.3.*
+ 2023.2.*
+ 3.1.3
+ 1.1.*
+ 17.7.*
+ 2.5.*
+
+
+
+
+
+
+
+
+
+ enable
+ enable
+ false
+ false
+ $(MSBuildThisFileDirectory)CodingGuidelines.ruleset
+ 5.4.0
diff --git a/LICENSE b/LICENSE
index 509975f..7bfce65 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,22 @@
-The MIT License (MIT)
Copyright (c) 2020 Alvaro Nicoli
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without restriction,
-including without limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of the Software,
-and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
+MIT License
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-USE OR OTHER DEALINGS IN THE SOFTWARE.
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/NuGet.config b/NuGet.config
deleted file mode 100644
index aacab5d..0000000
--- a/NuGet.config
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/README.md b/README.md
index a1f85f9..8e93d08 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
Plug-n-play implementation of `IResourceRepository` allowing you to use [MongoDB](https://www.mongodb.com/) with your [JsonApiDotNetCore](https://github.com/json-api-dotnet/JsonApiDotNetCore) APIs.
-[](https://ci.appveyor.com/project/json-api-dotnet/jsonapidotnetcore-mongodb/branch/master)
+[](https://github.com/json-api-dotnet/JsonApiDotNetCore.MongoDb/actions/workflows/build.yml?query=branch%3Amaster)
[](https://codecov.io/gh/json-api-dotnet/JsonApiDotNetCore.MongoDb)
[](https://www.nuget.org/packages/JsonApiDotNetCore.MongoDb/)
@@ -93,15 +93,24 @@ Have a question, found a bug or want to submit code changes? See our [contributi
## Trying out the latest build
-After each commit to the master branch, a new prerelease NuGet package is automatically published to AppVeyor at https://ci.appveyor.com/nuget/jsonapidotnetcore-mongodb. To try it out, follow the next steps:
-
-* In Visual Studio: **Tools**, **NuGet Package Manager**, **Package Manager Settings**, **Package Sources**
- * Click **+**
- * Name: **AppVeyor JADNC MongoDb**, Source: **https://ci.appveyor.com/nuget/jsonapidotnetcore-mongodb**
- * Click **Update**, **Ok**
-* Open the NuGet package manager console (**Tools**, **NuGet Package Manager**, **Package Manager Console**)
- * Select **AppVeyor JADNC MongoDb** as package source
- * Run command: `Install-Package JonApiDotNetCore -pre`
+After each commit to the master branch, a new pre-release NuGet package is automatically published to [GitHub Packages](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry).
+To try it out, follow the steps below:
+
+1. [Create a Personal Access Token (classic)](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic) with at least `read:packages` scope.
+1. Add our package source to your local user-specific `nuget.config` file by running:
+ ```bash
+ dotnet nuget add source https://nuget.pkg.github.com/json-api-dotnet/index.json --name github-json-api --username YOUR-GITHUB-USERNAME --password YOUR-PAT-CLASSIC
+ ```
+ In the command above:
+ - Replace YOUR-GITHUB-USERNAME with the username you use to login your GitHub account.
+ - Replace YOUR-PAT-CLASSIC with the token your created above.
+
+ :warning: If the above command doesn't give you access in the next step, remove the package source by running:
+ ```bash
+ dotnet nuget remove source github-json-api
+ ```
+ and retry with the `--store-password-in-clear-text` switch added.
+1. Restart your IDE, open your project, and browse the list of packages from the github-json-api feed (make sure pre-release packages are included).
## Development
@@ -129,7 +138,7 @@ And then to run the API:
dotnet run --project src/Examples/GettingStarted
```
-Alternatively, to build and validate the code, run all tests, generate code coverage and produce the NuGet package:
+Alternatively, to build, run all tests, generate code coverage and NuGet packages:
```bash
pwsh Build.ps1
diff --git a/appveyor.yml b/appveyor.yml
index 18aa690..1ad1455 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,54 +1,12 @@
-image:
- - Ubuntu2004
- - Visual Studio 2022
+image: Visual Studio 2022
version: '{build}'
branches:
only:
- master
- - develop
- - unstable
- /release\/.+/
-pull_requests:
- do_not_increment_build_number: true
-
-nuget:
- disable_publish_on_pr: true
-
-matrix:
- fast_finish: true
-
-for:
--
- matrix:
- only:
- - image: Visual Studio 2022
- artifacts:
- - path: .\**\artifacts\**\*.nupkg
- name: NuGet
- deploy:
- - provider: NuGet
- skip_symbols: false
- api_key:
- secure: hlP/zkfkHzmutSXPYAiINmPdv+QEj3TpAjKewHEkCtQnHnA2tSo+Xey0g6FVM6S5
- on:
- branch: master
- appveyor_repo_tag: true
- - provider: NuGet
- skip_symbols: false
- api_key:
- secure: hlP/zkfkHzmutSXPYAiINmPdv+QEj3TpAjKewHEkCtQnHnA2tSo+Xey0g6FVM6S5
- on:
- branch: /release\/.+/
- appveyor_repo_tag: true
-
-build_script:
-- pwsh: |
- Write-Output ".NET version:"
- dotnet --version
-
- .\Build.ps1
-
-test: off
\ No newline at end of file
+build: off
+test: off
+deploy: off
diff --git a/cleanupcode.ps1 b/cleanupcode.ps1
index 717f369..23f2a36 100644
--- a/cleanupcode.ps1
+++ b/cleanupcode.ps1
@@ -28,12 +28,12 @@ if ($revision) {
if ($baseCommitHash -eq $headCommitHash) {
Write-Output "Running code cleanup on staged/unstaged files."
- dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified
VerifySuccessExitCode
}
else {
Write-Output "Running code cleanup on commit range $baseCommitHash..$headCommitHash, including staged/unstaged files."
- dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified,commits -a $headCommitHash -b $baseCommitHash
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified,commits -a $headCommitHash -b $baseCommitHash
VerifySuccessExitCode
}
}
diff --git a/inspectcode.ps1 b/inspectcode.ps1
index 0c55d7b..dc81b09 100644
--- a/inspectcode.ps1
+++ b/inspectcode.ps1
@@ -4,16 +4,16 @@
dotnet tool restore
-if ($LASTEXITCODE -ne 0) {
- throw "Tool restore failed with exit code $LASTEXITCODE"
+if ($LastExitCode -ne 0) {
+ throw "Tool restore failed with exit code $LastExitCode"
}
$outputPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), 'jetbrains-inspectcode-results.xml')
$resultPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), 'jetbrains-inspectcode-results.html')
dotnet jb inspectcode JsonApiDotNetCore.MongoDb.sln --build --output="$outputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
-if ($LASTEXITCODE -ne 0) {
- throw "Code inspection failed with exit code $LASTEXITCODE"
+if ($LastExitCode -ne 0) {
+ throw "Code inspection failed with exit code $LastExitCode"
}
[xml]$xml = Get-Content "$outputPath"
diff --git a/src/JsonApiDotNetCore.MongoDb/ArgumentGuard.cs b/src/JsonApiDotNetCore.MongoDb/ArgumentGuard.cs
index c7c9908..5063b63 100644
--- a/src/JsonApiDotNetCore.MongoDb/ArgumentGuard.cs
+++ b/src/JsonApiDotNetCore.MongoDb/ArgumentGuard.cs
@@ -3,7 +3,6 @@
using SysNotNull = System.Diagnostics.CodeAnalysis.NotNullAttribute;
#pragma warning disable AV1008 // Class should not be static
-#pragma warning disable AV1553 // Do not use optional parameters with default value null for strings, collections or tasks
namespace JsonApiDotNetCore.MongoDb;
diff --git a/src/JsonApiDotNetCore.MongoDb/AtomicOperations/MongoTransaction.cs b/src/JsonApiDotNetCore.MongoDb/AtomicOperations/MongoTransaction.cs
index 7aa1388..3514e87 100644
--- a/src/JsonApiDotNetCore.MongoDb/AtomicOperations/MongoTransaction.cs
+++ b/src/JsonApiDotNetCore.MongoDb/AtomicOperations/MongoTransaction.cs
@@ -4,7 +4,7 @@
namespace JsonApiDotNetCore.MongoDb.AtomicOperations;
-///
+///
[PublicAPI]
public sealed class MongoTransaction : IOperationsTransaction
{
diff --git a/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj b/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
index 7b9f43a..50df50f 100644
--- a/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
+++ b/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
@@ -21,10 +21,6 @@
embedded
-
- true
-
-
@@ -35,9 +31,9 @@
-
-
-
-
+
+
+
+
diff --git a/src/JsonApiDotNetCore.MongoDb/Queries/Internal/HideRelationshipsSparseFieldSetCache.cs b/src/JsonApiDotNetCore.MongoDb/Queries/Internal/HideRelationshipsSparseFieldSetCache.cs
index 505bf89..aeebe64 100644
--- a/src/JsonApiDotNetCore.MongoDb/Queries/Internal/HideRelationshipsSparseFieldSetCache.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Queries/Internal/HideRelationshipsSparseFieldSetCache.cs
@@ -7,7 +7,7 @@
namespace JsonApiDotNetCore.MongoDb.Queries.Internal;
-///
+///
public sealed class HideRelationshipsSparseFieldSetCache : ISparseFieldSetCache
{
private readonly SparseFieldSetCache _innerCache;
diff --git a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoDataAccess.cs b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoDataAccess.cs
index fcbff6d..8db3558 100644
--- a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoDataAccess.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoDataAccess.cs
@@ -2,7 +2,7 @@
namespace JsonApiDotNetCore.MongoDb.Repositories;
-///
+///
public sealed class MongoDataAccess : IMongoDataAccess
{
///
diff --git a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs
index 5e17cff..fe8ce6c 100644
--- a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs
@@ -50,7 +50,7 @@ private void ValidateExpression(QueryExpression? expression)
}
}
- public override QueryExpression? VisitResourceFieldChain(ResourceFieldChainExpression expression, object? argument)
+ public override QueryExpression VisitResourceFieldChain(ResourceFieldChainExpression expression, object? argument)
{
if (expression.Fields.Count > 1 || expression.Fields.First() is RelationshipAttribute)
{
diff --git a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
index ea673c0..f983cef 100644
--- a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
@@ -98,7 +98,7 @@ protected virtual IMongoQueryable ApplyQueryLayer(QueryLayer queryLay
IQueryable source = GetAll();
// @formatter:wrap_chained_method_calls chop_always
- // @formatter:keep_existing_linebreaks true
+ // @formatter:wrap_before_first_method_call true
QueryableHandlerExpression[] queryableHandlers = _constraintProviders
.SelectMany(provider => provider.GetConstraints())
@@ -107,7 +107,7 @@ protected virtual IMongoQueryable ApplyQueryLayer(QueryLayer queryLay
.OfType()
.ToArray();
- // @formatter:keep_existing_linebreaks restore
+ // @formatter:wrap_before_first_method_call restore
// @formatter:wrap_chained_method_calls restore
foreach (QueryableHandlerExpression queryableHandler in queryableHandlers)
@@ -131,17 +131,16 @@ private void AssertNoRelationshipsInSparseFieldSets()
ResourceType resourceType = _resourceGraph.GetResourceType();
// @formatter:wrap_chained_method_calls chop_always
- // @formatter:keep_existing_linebreaks true
+ // @formatter:wrap_before_first_method_call true
bool hasRelationshipSelectors = _constraintProviders
.SelectMany(provider => provider.GetConstraints())
.Select(expressionInScope => expressionInScope.Expression)
.OfType()
- .Any(fieldTable =>
- fieldTable.Table.Keys.Any(targetResourceType => !resourceType.Equals(targetResourceType)) ||
+ .Any(fieldTable => fieldTable.Table.Keys.Any(targetResourceType => !resourceType.Equals(targetResourceType)) ||
fieldTable.Table.Values.Any(fieldSet => fieldSet.Fields.Any(field => field is RelationshipAttribute)));
- // @formatter:keep_existing_linebreaks restore
+ // @formatter:wrap_before_first_method_call restore
// @formatter:wrap_chained_method_calls restore
if (hasRelationshipSelectors)
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/BaseForAtomicOperationsTestsThatChangeOptions.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/BaseForAtomicOperationsTestsThatChangeOptions.cs
new file mode 100644
index 0000000..9aa74e8
--- /dev/null
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/BaseForAtomicOperationsTestsThatChangeOptions.cs
@@ -0,0 +1,85 @@
+using JsonApiDotNetCore.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations;
+
+public abstract class BaseForAtomicOperationsTestsThatChangeOptions : IDisposable
+{
+ private readonly JsonApiOptionsScope _optionsScope;
+
+ protected BaseForAtomicOperationsTestsThatChangeOptions(AtomicOperationsFixture fixture)
+ {
+ var options = (JsonApiOptions)fixture.TestContext.Factory.Services.GetRequiredService();
+ _optionsScope = new JsonApiOptionsScope(options);
+ }
+
+ public void Dispose()
+ {
+ _optionsScope.Dispose();
+ }
+
+ private sealed class JsonApiOptionsScope : IDisposable
+ {
+ private readonly JsonApiOptions _options;
+ private readonly JsonApiOptions _backupValues;
+
+ public JsonApiOptionsScope(IJsonApiOptions options)
+ {
+ _options = (JsonApiOptions)options;
+
+ _backupValues = new JsonApiOptions
+ {
+ Namespace = options.Namespace,
+ DefaultAttrCapabilities = options.DefaultAttrCapabilities,
+ DefaultHasOneCapabilities = options.DefaultHasOneCapabilities,
+ DefaultHasManyCapabilities = options.DefaultHasManyCapabilities,
+ IncludeJsonApiVersion = options.IncludeJsonApiVersion,
+ IncludeExceptionStackTraceInErrors = options.IncludeExceptionStackTraceInErrors,
+ IncludeRequestBodyInErrors = options.IncludeRequestBodyInErrors,
+ UseRelativeLinks = options.UseRelativeLinks,
+ TopLevelLinks = options.TopLevelLinks,
+ ResourceLinks = options.ResourceLinks,
+ RelationshipLinks = options.RelationshipLinks,
+ IncludeTotalResourceCount = options.IncludeTotalResourceCount,
+ DefaultPageSize = options.DefaultPageSize,
+ MaximumPageSize = options.MaximumPageSize,
+ MaximumPageNumber = options.MaximumPageNumber,
+ ValidateModelState = options.ValidateModelState,
+ ClientIdGeneration = options.ClientIdGeneration,
+ AllowUnknownQueryStringParameters = options.AllowUnknownQueryStringParameters,
+ AllowUnknownFieldsInRequestBody = options.AllowUnknownFieldsInRequestBody,
+ EnableLegacyFilterNotation = options.EnableLegacyFilterNotation,
+ MaximumIncludeDepth = options.MaximumIncludeDepth,
+ MaximumOperationsPerRequest = options.MaximumOperationsPerRequest,
+ TransactionIsolationLevel = options.TransactionIsolationLevel
+ };
+ }
+
+ public void Dispose()
+ {
+ _options.Namespace = _backupValues.Namespace;
+ _options.DefaultAttrCapabilities = _backupValues.DefaultAttrCapabilities;
+ _options.DefaultHasOneCapabilities = _backupValues.DefaultHasOneCapabilities;
+ _options.DefaultHasManyCapabilities = _backupValues.DefaultHasManyCapabilities;
+ _options.IncludeJsonApiVersion = _backupValues.IncludeJsonApiVersion;
+ _options.IncludeExceptionStackTraceInErrors = _backupValues.IncludeExceptionStackTraceInErrors;
+ _options.IncludeRequestBodyInErrors = _backupValues.IncludeRequestBodyInErrors;
+ _options.UseRelativeLinks = _backupValues.UseRelativeLinks;
+ _options.TopLevelLinks = _backupValues.TopLevelLinks;
+ _options.ResourceLinks = _backupValues.ResourceLinks;
+ _options.RelationshipLinks = _backupValues.RelationshipLinks;
+ _options.IncludeTotalResourceCount = _backupValues.IncludeTotalResourceCount;
+ _options.DefaultPageSize = _backupValues.DefaultPageSize;
+ _options.MaximumPageSize = _backupValues.MaximumPageSize;
+ _options.MaximumPageNumber = _backupValues.MaximumPageNumber;
+ _options.ValidateModelState = _backupValues.ValidateModelState;
+ _options.ClientIdGeneration = _backupValues.ClientIdGeneration;
+ _options.AllowUnknownQueryStringParameters = _backupValues.AllowUnknownQueryStringParameters;
+ _options.AllowUnknownFieldsInRequestBody = _backupValues.AllowUnknownFieldsInRequestBody;
+ _options.EnableLegacyFilterNotation = _backupValues.EnableLegacyFilterNotation;
+ _options.MaximumIncludeDepth = _backupValues.MaximumIncludeDepth;
+ _options.MaximumOperationsPerRequest = _backupValues.MaximumOperationsPerRequest;
+ _options.TransactionIsolationLevel = _backupValues.TransactionIsolationLevel;
+ }
+ }
+}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceTests.cs
index a103a42..4a7e660 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceTests.cs
@@ -1,8 +1,6 @@
using System.Net;
using FluentAssertions;
-using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
-using Microsoft.Extensions.DependencyInjection;
using MongoDB.Bson;
using TestBuildingBlocks;
using Xunit;
@@ -18,9 +16,6 @@ public sealed class AtomicCreateResourceTests
public AtomicCreateResourceTests(AtomicOperationsFixture fixture)
{
_testContext = fixture.TestContext;
-
- var options = (JsonApiOptions)fixture.TestContext.Factory.Services.GetRequiredService();
- options.AllowClientGeneratedIds = false;
}
[Fact]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
index 4f83dfb..bfd4a4e 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
@@ -9,17 +9,18 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Creating;
[Collection("AtomicOperationsFixture")]
-public sealed class AtomicCreateResourceWithClientGeneratedIdTests
+public sealed class AtomicCreateResourceWithClientGeneratedIdTests : BaseForAtomicOperationsTestsThatChangeOptions
{
private readonly IntegrationTestContext _testContext;
private readonly OperationsFakers _fakers = new();
public AtomicCreateResourceWithClientGeneratedIdTests(AtomicOperationsFixture fixture)
+ : base(fixture)
{
_testContext = fixture.TestContext;
var options = (JsonApiOptions)fixture.TestContext.Factory.Services.GetRequiredService();
- options.AllowClientGeneratedIds = true;
+ options.ClientIdGeneration = ClientIdGenerationMode.Required;
}
[Fact]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Mixed/MaximumOperationsPerRequestTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Mixed/MaximumOperationsPerRequestTests.cs
index c9205a3..b3f8d35 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Mixed/MaximumOperationsPerRequestTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Mixed/MaximumOperationsPerRequestTests.cs
@@ -8,11 +8,12 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Mixed;
[Collection("AtomicOperationsFixture")]
-public sealed class MaximumOperationsPerRequestTests
+public sealed class MaximumOperationsPerRequestTests : BaseForAtomicOperationsTestsThatChangeOptions
{
private readonly IntegrationTestContext _testContext;
public MaximumOperationsPerRequestTests(AtomicOperationsFixture fixture)
+ : base(fixture)
{
_testContext = fixture.TestContext;
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/OperationsFakers.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/OperationsFakers.cs
index b26135e..9804a9e 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/OperationsFakers.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/OperationsFakers.cs
@@ -2,57 +2,48 @@
using Bogus;
using TestBuildingBlocks;
-// @formatter:wrap_chained_method_calls chop_always
-// @formatter:keep_existing_linebreaks true
+// @formatter:wrap_chained_method_calls chop_if_long
+// @formatter:wrap_before_first_method_call true
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations;
internal sealed class OperationsFakers : FakerContainer
{
- private static readonly Lazy> LazyLanguageIsoCodes =
- new(() => CultureInfo
- .GetCultures(CultureTypes.NeutralCultures)
- .Where(culture => !string.IsNullOrEmpty(culture.Name))
- .Select(culture => culture.Name)
- .ToArray());
-
- private readonly Lazy> _lazyPlaylistFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(playlist => playlist.Name, faker => faker.Lorem.Sentence()));
-
- private readonly Lazy> _lazyMusicTrackFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(musicTrack => musicTrack.Title, faker => faker.Lorem.Word())
- .RuleFor(musicTrack => musicTrack.LengthInSeconds, faker => faker.Random.Decimal(3 * 60, 5 * 60))
- .RuleFor(musicTrack => musicTrack.Genre, faker => faker.Lorem.Word())
- .RuleFor(musicTrack => musicTrack.ReleasedAt, faker => faker.Date.PastOffset()
- .TruncateToWholeMilliseconds()));
-
- private readonly Lazy> _lazyLyricFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(lyric => lyric.Text, faker => faker.Lorem.Text())
- .RuleFor(lyric => lyric.Format, "LRC"));
-
- private readonly Lazy> _lazyTextLanguageFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(textLanguage => textLanguage.IsoCode, faker => faker.PickRandom(LazyLanguageIsoCodes.Value)));
-
- private readonly Lazy> _lazyPerformerFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(performer => performer.ArtistName, faker => faker.Name.FullName())
- .RuleFor(performer => performer.BornAt, faker => faker.Date.PastOffset()
- .TruncateToWholeMilliseconds()));
-
- private readonly Lazy> _lazyRecordCompanyFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(recordCompany => recordCompany.Name, faker => faker.Company.CompanyName())
- .RuleFor(recordCompany => recordCompany.CountryOfResidence, faker => faker.Address.Country()));
+ private static readonly Lazy> LazyLanguageIsoCodes = new(() => CultureInfo
+ .GetCultures(CultureTypes.NeutralCultures)
+ .Where(culture => !string.IsNullOrEmpty(culture.Name))
+ .Select(culture => culture.Name)
+ .ToArray());
+
+ private readonly Lazy> _lazyPlaylistFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(playlist => playlist.Name, faker => faker.Lorem.Sentence()));
+
+ private readonly Lazy> _lazyMusicTrackFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(musicTrack => musicTrack.Title, faker => faker.Lorem.Word())
+ .RuleFor(musicTrack => musicTrack.LengthInSeconds, faker => faker.Random.Decimal(3 * 60, 5 * 60))
+ .RuleFor(musicTrack => musicTrack.Genre, faker => faker.Lorem.Word())
+ .RuleFor(musicTrack => musicTrack.ReleasedAt, faker => faker.Date.PastOffset().TruncateToWholeMilliseconds()));
+
+ private readonly Lazy> _lazyLyricFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(lyric => lyric.Text, faker => faker.Lorem.Text())
+ .RuleFor(lyric => lyric.Format, "LRC"));
+
+ private readonly Lazy> _lazyTextLanguageFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(textLanguage => textLanguage.IsoCode, faker => faker.PickRandom(LazyLanguageIsoCodes.Value)));
+
+ private readonly Lazy> _lazyPerformerFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(performer => performer.ArtistName, faker => faker.Name.FullName())
+ .RuleFor(performer => performer.BornAt, faker => faker.Date.PastOffset().TruncateToWholeMilliseconds()));
+
+ private readonly Lazy> _lazyRecordCompanyFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(recordCompany => recordCompany.Name, faker => faker.Company.CompanyName())
+ .RuleFor(recordCompany => recordCompany.CountryOfResidence, faker => faker.Address.Country()));
public Faker Playlist => _lazyPlaylistFaker.Value;
public Faker MusicTrack => _lazyMusicTrackFaker.Value;
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/MetaFakers.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/MetaFakers.cs
index 8c85a0c..5f29687 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/MetaFakers.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/MetaFakers.cs
@@ -1,17 +1,16 @@
using Bogus;
using TestBuildingBlocks;
-// @formatter:wrap_chained_method_calls chop_always
-// @formatter:keep_existing_linebreaks true
+// @formatter:wrap_chained_method_calls chop_if_long
+// @formatter:wrap_before_first_method_call true
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.Meta;
internal sealed class MetaFakers : FakerContainer
{
- private readonly Lazy> _lazySupportTicketFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(supportTicket => supportTicket.Description, faker => faker.Lorem.Paragraph()));
+ private readonly Lazy> _lazySupportTicketFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(supportTicket => supportTicket.Description, faker => faker.Lorem.Paragraph()));
public Faker SupportTicket => _lazySupportTicketFaker.Value;
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/QueryStringFakers.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/QueryStringFakers.cs
index e0b6004..3026b37 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/QueryStringFakers.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/QueryStringFakers.cs
@@ -1,33 +1,30 @@
using Bogus;
using TestBuildingBlocks;
-// @formatter:wrap_chained_method_calls chop_always
-// @formatter:keep_existing_linebreaks true
+// @formatter:wrap_chained_method_calls chop_if_long
+// @formatter:wrap_before_first_method_call true
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.QueryStrings;
internal sealed class QueryStringFakers : FakerContainer
{
- private readonly Lazy> _lazyBlogFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(blog => blog.Title, faker => faker.Lorem.Word())
- .RuleFor(blog => blog.PlatformName, faker => faker.Company.CompanyName()));
+ private readonly Lazy> _lazyBlogFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(blog => blog.Title, faker => faker.Lorem.Word())
+ .RuleFor(blog => blog.PlatformName, faker => faker.Company.CompanyName()));
- private readonly Lazy> _lazyBlogPostFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(blogPost => blogPost.Caption, faker => faker.Lorem.Sentence())
- .RuleFor(blogPost => blogPost.Url, faker => faker.Internet.Url()));
+ private readonly Lazy> _lazyBlogPostFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(blogPost => blogPost.Caption, faker => faker.Lorem.Sentence())
+ .RuleFor(blogPost => blogPost.Url, faker => faker.Internet.Url()));
- private readonly Lazy> _lazyWebAccountFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(webAccount => webAccount.UserName, faker => faker.Person.UserName)
- .RuleFor(webAccount => webAccount.Password, faker => faker.Internet.Password())
- .RuleFor(webAccount => webAccount.DisplayName, faker => faker.Person.FullName)
- .RuleFor(webAccount => webAccount.DateOfBirth, faker => faker.Person.DateOfBirth.TruncateToWholeMilliseconds())
- .RuleFor(webAccount => webAccount.EmailAddress, faker => faker.Internet.Email()));
+ private readonly Lazy> _lazyWebAccountFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(webAccount => webAccount.UserName, faker => faker.Person.UserName)
+ .RuleFor(webAccount => webAccount.Password, faker => faker.Internet.Password())
+ .RuleFor(webAccount => webAccount.DisplayName, faker => faker.Person.FullName)
+ .RuleFor(webAccount => webAccount.DateOfBirth, faker => faker.Person.DateOfBirth.TruncateToWholeMilliseconds())
+ .RuleFor(webAccount => webAccount.EmailAddress, faker => faker.Internet.Email()));
public Faker Blog => _lazyBlogFaker.Value;
public Faker BlogPost => _lazyBlogPostFaker.Value;
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceTests.cs
index 571b318..7797e79 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceTests.cs
@@ -1,8 +1,6 @@
using System.Net;
using FluentAssertions;
-using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
-using Microsoft.Extensions.DependencyInjection;
using TestBuildingBlocks;
using Xunit;
@@ -20,9 +18,6 @@ public CreateResourceTests(IntegrationTestContext();
testContext.UseController();
testContext.UseController();
-
- var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService();
- options.AllowClientGeneratedIds = false;
}
[Fact]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
index 06f0ef8..9993e03 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
@@ -26,7 +26,7 @@ public CreateResourceWithClientGeneratedIdTests(IntegrationTestContext();
- options.AllowClientGeneratedIds = true;
+ options.ClientIdGeneration = ClientIdGenerationMode.Required;
}
[Fact]
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ReadWriteFakers.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ReadWriteFakers.cs
index 6742754..504b9c3 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ReadWriteFakers.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ReadWriteFakers.cs
@@ -2,45 +2,38 @@
using MongoDB.Bson;
using TestBuildingBlocks;
-// @formatter:wrap_chained_method_calls chop_always
-// @formatter:keep_existing_linebreaks true
+// @formatter:wrap_chained_method_calls chop_if_long
+// @formatter:wrap_before_first_method_call true
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite;
internal sealed class ReadWriteFakers : FakerContainer
{
- private readonly Lazy> _lazyWorkItemFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(workItem => workItem.Description, faker => faker.Lorem.Sentence())
- .RuleFor(workItem => workItem.DueAt, faker => faker.Date.Future()
- .TruncateToWholeMilliseconds())
- .RuleFor(workItem => workItem.Priority, faker => faker.PickRandom()));
-
- private readonly Lazy> _lazyWorkTagFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(workTag => workTag.Text, faker => faker.Lorem.Word())
- .RuleFor(workTag => workTag.IsBuiltIn, faker => faker.Random.Bool()));
-
- private readonly Lazy> _lazyUserAccountFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(userAccount => userAccount.FirstName, faker => faker.Name.FirstName())
- .RuleFor(userAccount => userAccount.LastName, faker => faker.Name.LastName()));
-
- private readonly Lazy> _lazyWorkItemGroupFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(group => group.Name, faker => faker.Lorem.Word())
- .RuleFor(group => group.IsPublic, faker => faker.Random.Bool()));
-
- private readonly Lazy> _lazyRgbColorFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(color => color.Id, faker => ObjectId.GenerateNewId(faker.Date.Past())
- .ToString())
- .RuleFor(color => color.DisplayName, faker => faker.Commerce.Color()));
+ private readonly Lazy> _lazyWorkItemFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(workItem => workItem.Description, faker => faker.Lorem.Sentence())
+ .RuleFor(workItem => workItem.DueAt, faker => faker.Date.Future().TruncateToWholeMilliseconds())
+ .RuleFor(workItem => workItem.Priority, faker => faker.PickRandom()));
+
+ private readonly Lazy> _lazyWorkTagFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(workTag => workTag.Text, faker => faker.Lorem.Word())
+ .RuleFor(workTag => workTag.IsBuiltIn, faker => faker.Random.Bool()));
+
+ private readonly Lazy> _lazyUserAccountFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(userAccount => userAccount.FirstName, faker => faker.Name.FirstName())
+ .RuleFor(userAccount => userAccount.LastName, faker => faker.Name.LastName()));
+
+ private readonly Lazy> _lazyWorkItemGroupFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(group => group.Name, faker => faker.Lorem.Word())
+ .RuleFor(group => group.IsPublic, faker => faker.Random.Bool()));
+
+ private readonly Lazy> _lazyRgbColorFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(color => color.Id, faker => ObjectId.GenerateNewId(faker.Date.Past()).ToString())
+ .RuleFor(color => color.DisplayName, faker => faker.Commerce.Color()));
public Faker WorkItem => _lazyWorkItemFaker.Value;
public Faker WorkTag => _lazyWorkTagFaker.Value;
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs
index 26dcdb5..55340ea 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs
@@ -29,6 +29,8 @@ public override QueryStringParameterHandlers OnRegisterQueryableHandlersFo
private static IQueryable FilterByRadius(IQueryable source, StringValues parameterValue)
{
+ // Workaround for https://youtrack.jetbrains.com/issue/RSRP-493256/Incorrect-possible-null-assignment
+ // ReSharper disable once AssignNullToNotNullAttribute
bool isFilterOnLargerThan = bool.Parse(parameterValue.ToString());
return isFilterOnLargerThan ? source.Where(moon => moon.SolarRadius > 1m) : source.Where(moon => moon.SolarRadius <= 1m);
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs
index 455a089..5ca6551 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs
@@ -52,12 +52,14 @@ public override PaginationExpression OnApplyPagination(PaginationExpression? exi
{
base.OnApplySparseFieldSet(existingSparseFieldSet);
- // @formatter:keep_existing_linebreaks true
+ // @formatter:wrap_chained_method_calls chop_always
+ // @formatter:wrap_before_first_method_call true
return existingSparseFieldSet
.Including(star => star.Kind, ResourceGraph)
.Excluding(star => star.IsVisibleFromEarth, ResourceGraph);
- // @formatter:keep_existing_linebreaks restore
+ // @formatter:wrap_before_first_method_call restore
+ // @formatter:wrap_chained_method_calls restore
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/UniverseFakers.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/UniverseFakers.cs
index 1fbd3c2..61164d4 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/UniverseFakers.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/UniverseFakers.cs
@@ -1,34 +1,31 @@
using Bogus;
using TestBuildingBlocks;
-// @formatter:wrap_chained_method_calls chop_always
-// @formatter:keep_existing_linebreaks true
+// @formatter:wrap_chained_method_calls chop_if_long
+// @formatter:wrap_before_first_method_call true
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.ResourceDefinitions.Reading;
internal sealed class UniverseFakers : FakerContainer
{
- private readonly Lazy> _lazyStarFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(star => star.Name, faker => faker.Random.Word())
- .RuleFor(star => star.Kind, faker => faker.PickRandom())
- .RuleFor(star => star.SolarRadius, faker => faker.Random.Decimal(.01M, 1000M))
- .RuleFor(star => star.SolarMass, faker => faker.Random.Decimal(.001M, 100M))
- .RuleFor(star => star.IsVisibleFromEarth, faker => faker.Random.Bool()));
+ private readonly Lazy> _lazyStarFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(star => star.Name, faker => faker.Random.Word())
+ .RuleFor(star => star.Kind, faker => faker.PickRandom())
+ .RuleFor(star => star.SolarRadius, faker => faker.Random.Decimal(.01M, 1000M))
+ .RuleFor(star => star.SolarMass, faker => faker.Random.Decimal(.001M, 100M))
+ .RuleFor(star => star.IsVisibleFromEarth, faker => faker.Random.Bool()));
- private readonly Lazy> _lazyPlanetFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(planet => planet.PublicName, faker => faker.Random.Word())
- .RuleFor(planet => planet.HasRingSystem, faker => faker.Random.Bool())
- .RuleFor(planet => planet.SolarMass, faker => faker.Random.Decimal(.001M, 100M)));
+ private readonly Lazy> _lazyPlanetFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(planet => planet.PublicName, faker => faker.Random.Word())
+ .RuleFor(planet => planet.HasRingSystem, faker => faker.Random.Bool())
+ .RuleFor(planet => planet.SolarMass, faker => faker.Random.Decimal(.001M, 100M)));
- private readonly Lazy> _lazyMoonFaker = new(() =>
- new Faker()
- .UseSeed(GetFakerSeed())
- .RuleFor(moon => moon.Name, faker => faker.Random.Word())
- .RuleFor(moon => moon.SolarRadius, faker => faker.Random.Decimal(.01M, 1000M)));
+ private readonly Lazy> _lazyMoonFaker = new(() => new Faker()
+ .UseSeed(GetFakerSeed())
+ .RuleFor(moon => moon.Name, faker => faker.Random.Word())
+ .RuleFor(moon => moon.SolarRadius, faker => faker.Random.Decimal(.01M, 1000M)));
public Faker Star => _lazyStarFaker.Value;
public Faker Planet => _lazyPlanetFaker.Value;
diff --git a/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj b/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
index dbfe9fa..b8d099f 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
+++ b/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
@@ -10,7 +10,8 @@
-
+
+
diff --git a/test/TestBuildingBlocks/IntegrationTest.cs b/test/TestBuildingBlocks/IntegrationTest.cs
index a42877a..50fc3fd 100644
--- a/test/TestBuildingBlocks/IntegrationTest.cs
+++ b/test/TestBuildingBlocks/IntegrationTest.cs
@@ -18,7 +18,7 @@ public abstract class IntegrationTest : IAsyncLifetime
static IntegrationTest()
{
- int maxConcurrentTestRuns = Environment.GetEnvironmentVariable("APPVEYOR") != null ? 32 : 64;
+ int maxConcurrentTestRuns = OperatingSystem.IsWindows() && Environment.GetEnvironmentVariable("CI") != null ? 32 : 64;
ThrottleSemaphore = new SemaphoreSlim(maxConcurrentTestRuns);
}
diff --git a/test/TestBuildingBlocks/IntegrationTestContext.cs b/test/TestBuildingBlocks/IntegrationTestContext.cs
index 826447d..ba40a67 100644
--- a/test/TestBuildingBlocks/IntegrationTestContext.cs
+++ b/test/TestBuildingBlocks/IntegrationTestContext.cs
@@ -176,9 +176,10 @@ public void ConfigureServicesAfterStartup(Action? servicesCo
protected override IHostBuilder CreateHostBuilder()
{
// @formatter:wrap_chained_method_calls chop_always
- // @formatter:keep_existing_linebreaks true
+ // @formatter:wrap_before_first_method_call true
- return Host.CreateDefaultBuilder(null)
+ return Host
+ .CreateDefaultBuilder(null)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureServices(services =>
@@ -195,7 +196,7 @@ protected override IHostBuilder CreateHostBuilder()
});
// @formatter:keep_existing_linebreaks restore
- // @formatter:wrap_chained_method_calls restore
+ // @formatter:wrap_before_first_method_call restore
}
}
}
diff --git a/test/TestBuildingBlocks/TestBuildingBlocks.csproj b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
index 629c236..4e59b38 100644
--- a/test/TestBuildingBlocks/TestBuildingBlocks.csproj
+++ b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
@@ -8,13 +8,14 @@
-
+
-
-
+
+
+
-
-
-
+
+
+
From e38b221883785b946e687ab84662b7f7230fa81c Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Mon, 25 Sep 2023 23:45:56 +0200
Subject: [PATCH 18/82] Replace Mongo2Go with EphemeralMongo
---
Directory.Build.props | 2 +-
.../AtomicOperationsFixture.cs | 7 +-
.../AtomicTransactionConsistencyTests.cs | 2 -
.../IntegrationTestContext.cs | 27 +----
.../TestBuildingBlocks/MongoRunnerProvider.cs | 101 ++++++++++++++++++
.../TestBuildingBlocks.csproj | 5 +-
6 files changed, 112 insertions(+), 32 deletions(-)
create mode 100644 test/TestBuildingBlocks/MongoRunnerProvider.cs
diff --git a/Directory.Build.props b/Directory.Build.props
index 3983af1..b5169a9 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -26,11 +26,11 @@
34.0.*
3.8.*
6.0.*
+ 1.1.*
6.12.*
2.3.*
1.3.*
2023.2.*
- 3.1.3
1.1.*
17.7.*
2.5.*
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
index c9029bb..e727573 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
@@ -8,15 +8,10 @@ namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations;
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
public sealed class AtomicOperationsFixture : IAsyncLifetime
{
- internal IntegrationTestContext TestContext { get; }
+ internal IntegrationTestContext TestContext { get; } = new();
public AtomicOperationsFixture()
{
- TestContext = new IntegrationTestContext
- {
- StartMongoDbInSingleNodeReplicaSetMode = true
- };
-
TestContext.UseController();
TestContext.ConfigureServicesAfterStartup(services => services.AddSingleton());
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
index 6445fe8..4d89d74 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
@@ -19,8 +19,6 @@ public AtomicTransactionConsistencyTests(IntegrationTestContext();
- testContext.StartMongoDbInSingleNodeReplicaSetMode = true;
-
testContext.ConfigureServicesAfterStartup(services =>
{
services.AddSingleton();
diff --git a/test/TestBuildingBlocks/IntegrationTestContext.cs b/test/TestBuildingBlocks/IntegrationTestContext.cs
index ba40a67..f97fd98 100644
--- a/test/TestBuildingBlocks/IntegrationTestContext.cs
+++ b/test/TestBuildingBlocks/IntegrationTestContext.cs
@@ -1,5 +1,5 @@
-using System.Runtime.InteropServices;
using System.Text.Json;
+using EphemeralMongo;
using JetBrains.Annotations;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.MongoDb.Configuration;
@@ -11,7 +11,6 @@
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
-using Mongo2Go;
using MongoDB.Driver;
namespace TestBuildingBlocks;
@@ -32,7 +31,7 @@ public class IntegrationTestContext : Integration
where TStartup : class
where TMongoDbContextShim : MongoDbContextShim
{
- private readonly Lazy _runner;
+ private readonly Lazy _runner;
private readonly Lazy> _lazyFactory;
private readonly TestControllerProvider _testControllerProvider = new();
@@ -49,31 +48,15 @@ protected override JsonSerializerOptions SerializerOptions
public WebApplicationFactory Factory => _lazyFactory.Value;
- ///
- /// Set this to true to enable transactions support in MongoDB.
- ///
- public bool StartMongoDbInSingleNodeReplicaSetMode { get; set; }
-
public IntegrationTestContext()
{
- _runner = new Lazy(StartMongoDb);
+ _runner = new Lazy(StartMongoDb);
_lazyFactory = new Lazy>(CreateFactory);
}
- private MongoDbRunner StartMongoDb()
+ private IMongoRunner StartMongoDb()
{
- // Increasing maxTransactionLockRequestTimeoutMillis (default=5) as workaround for occasional
- // "Unable to acquire lock" error when running tests locally.
- string arguments = "--quiet --setParameter maxTransactionLockRequestTimeoutMillis=40";
-
- if (!StartMongoDbInSingleNodeReplicaSetMode)
- {
- // MongoDbRunner watches console output to detect when the replica set has stabilized. So we can only fully
- // suppress console output if not running in this mode.
- arguments += RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? " --logappend --logpath NUL" : " --logpath /dev/null";
- }
-
- return MongoDbRunner.Start(singleNodeReplSet: StartMongoDbInSingleNodeReplicaSetMode, additionalMongodArguments: arguments);
+ return MongoRunnerProvider.Instance.Get();
}
public void UseController()
diff --git a/test/TestBuildingBlocks/MongoRunnerProvider.cs b/test/TestBuildingBlocks/MongoRunnerProvider.cs
new file mode 100644
index 0000000..9565815
--- /dev/null
+++ b/test/TestBuildingBlocks/MongoRunnerProvider.cs
@@ -0,0 +1,101 @@
+using EphemeralMongo;
+
+#pragma warning disable AV1553 // Do not use optional parameters with default value null for strings, collections or tasks
+
+namespace TestBuildingBlocks;
+
+// Based on https://gist.github.com/asimmon/612b2d54f1a0d2b4e1115590d456e0be.
+internal sealed class MongoRunnerProvider
+{
+ public static readonly MongoRunnerProvider Instance = new();
+
+ private readonly object _lockObject = new();
+ private IMongoRunner? _runner;
+ private int _useCounter;
+
+ private MongoRunnerProvider()
+ {
+ }
+
+ public IMongoRunner Get()
+ {
+ lock (_lockObject)
+ {
+ if (_runner == null)
+ {
+ var runnerOptions = new MongoRunnerOptions
+ {
+ // Single-node replica set mode is required for transaction support in MongoDB.
+ UseSingleNodeReplicaSet = true,
+ KillMongoProcessesWhenCurrentProcessExits = true,
+ AdditionalArguments = "--quiet"
+ };
+
+ _runner = MongoRunner.Run(runnerOptions);
+ }
+
+ _useCounter++;
+ return new MongoRunnerWrapper(this, _runner);
+ }
+ }
+
+ private void Detach()
+ {
+ lock (_lockObject)
+ {
+ if (_runner != null)
+ {
+ _useCounter--;
+
+ if (_useCounter == 0)
+ {
+ _runner.Dispose();
+ _runner = null;
+ }
+ }
+ }
+ }
+
+ private sealed class MongoRunnerWrapper : IMongoRunner
+ {
+ private readonly MongoRunnerProvider _owner;
+ private IMongoRunner? _underlyingMongoRunner;
+
+ public string ConnectionString => _underlyingMongoRunner?.ConnectionString ?? throw new ObjectDisposedException(nameof(IMongoRunner));
+
+ public MongoRunnerWrapper(MongoRunnerProvider owner, IMongoRunner underlyingMongoRunner)
+ {
+ _owner = owner;
+ _underlyingMongoRunner = underlyingMongoRunner;
+ }
+
+ public void Import(string database, string collection, string inputFilePath, string? additionalArguments = null, bool drop = false)
+ {
+ if (_underlyingMongoRunner == null)
+ {
+ throw new ObjectDisposedException(nameof(IMongoRunner));
+ }
+
+ _underlyingMongoRunner.Import(database, collection, inputFilePath, additionalArguments, drop);
+ }
+
+ public void Export(string database, string collection, string outputFilePath, string? additionalArguments = null)
+ {
+ if (_underlyingMongoRunner == null)
+ {
+ throw new ObjectDisposedException(nameof(IMongoRunner));
+ }
+
+ _underlyingMongoRunner.Export(database, collection, outputFilePath, additionalArguments);
+ }
+
+ public void Dispose()
+ {
+ if (_underlyingMongoRunner != null)
+ {
+ _underlyingMongoRunner = null;
+ _owner.Detach();
+ }
+ }
+ }
+}
diff --git a/test/TestBuildingBlocks/TestBuildingBlocks.csproj b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
index 4e59b38..ecb2125 100644
--- a/test/TestBuildingBlocks/TestBuildingBlocks.csproj
+++ b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
@@ -10,11 +10,14 @@
+
+
+
+
-
From 76d82e192606793a52e1500b00b66619993d4c94 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 26 Sep 2023 00:29:55 +0200
Subject: [PATCH 19/82] Run tests against the latest version of MongoDB.Driver
---
.github/dependabot.yml | 1 +
Directory.Build.props | 1 +
test/TestBuildingBlocks/TestBuildingBlocks.csproj | 1 +
3 files changed, 3 insertions(+)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index ecd4217..53356ab 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -16,6 +16,7 @@ updates:
ignore:
# Block updates to all exposed dependencies of the NuGet packages we produce, as updating them would be a breaking change.
- dependency-name: 'JsonApiDotNetCore*'
+ - dependency-name: 'MongoDB.Driver*'
# Block major updates of packages that require a matching .NET version.
- dependency-name: 'Microsoft.AspNetCore*'
update-types: ["version-update:semver-major"]
diff --git a/Directory.Build.props b/Directory.Build.props
index b5169a9..c2e8807 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -31,6 +31,7 @@
2.3.*
1.3.*
2023.2.*
+ 2.21.*
1.1.*
17.7.*
2.5.*
diff --git a/test/TestBuildingBlocks/TestBuildingBlocks.csproj b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
index ecb2125..9d30f13 100644
--- a/test/TestBuildingBlocks/TestBuildingBlocks.csproj
+++ b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
@@ -18,6 +18,7 @@
+
From ba5d205afed227d6fe1e9dbcdc10307d8f12255d Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 26 Sep 2023 01:47:39 +0200
Subject: [PATCH 20/82] GitHub Actions build: fix version detection
---
.github/workflows/build.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c56fa3d..dc41703 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -92,7 +92,8 @@ jobs:
$versionSuffix = $segments.Length -eq 1 ? '' : $segments[1..$($segments.Length - 1)] -join '-'
[xml]$xml = Get-Content Directory.Build.props
- $configuredVersionPrefix = $xml.Project.PropertyGroup[0].JsonApiDotNetCoreMongoDbVersionPrefix
+ $configuredVersionPrefix = $xml.Project.PropertyGroup.JsonApiDotNetCoreMongoDbVersionPrefix | Select-Object -First 1
+
if ($configuredVersionPrefix -ne $versionPrefix) {
Write-Error "Version prefix from git release tag '$versionPrefix' does not match version prefix '$configuredVersionPrefix' stored in Directory.Build.props."
# To recover from this:
From 32dd852e86ef1f2d73610230cc574ce907e0d08b Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 26 Sep 2023 02:03:52 +0200
Subject: [PATCH 21/82] Increment version to 5.4.1 (used for pre-release builds
from ci)
---
Directory.Build.props | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index c2e8807..675fb8b 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -49,6 +49,6 @@
false
false
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
- 5.4.0
+ 5.4.1
From 82d39b758e835d0c95495c53c8ac21f5a75510bb Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 26 Sep 2023 21:37:53 +0000
Subject: [PATCH 22/82] Bump jetbrains.resharper.globaltools from 2023.2.1 to
2023.2.2 (#26)
---
.config/dotnet-tools.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index ea2c34b..5d87b8a 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"jetbrains.resharper.globaltools": {
- "version": "2023.2.1",
+ "version": "2023.2.2",
"commands": [
"jb"
]
From e928e62ff8164edd76d2cbbca1f56dc78b45f368 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Wed, 27 Sep 2023 03:24:35 +0200
Subject: [PATCH 23/82] Dynamic access of JsonApiOptions properties in tests
---
...rAtomicOperationsTestsThatChangeOptions.cs | 75 ++++++-------------
1 file changed, 24 insertions(+), 51 deletions(-)
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/BaseForAtomicOperationsTestsThatChangeOptions.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/BaseForAtomicOperationsTestsThatChangeOptions.cs
index 9aa74e8..44397df 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/BaseForAtomicOperationsTestsThatChangeOptions.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/BaseForAtomicOperationsTestsThatChangeOptions.cs
@@ -1,3 +1,4 @@
+using System.Reflection;
using JsonApiDotNetCore.Configuration;
using Microsoft.Extensions.DependencyInjection;
@@ -20,66 +21,38 @@ public void Dispose()
private sealed class JsonApiOptionsScope : IDisposable
{
+ private static readonly List PropertyCache = typeof(JsonApiOptions).GetProperties().Where(IsAccessibleProperty).ToList();
+
private readonly JsonApiOptions _options;
private readonly JsonApiOptions _backupValues;
- public JsonApiOptionsScope(IJsonApiOptions options)
+ public JsonApiOptionsScope(JsonApiOptions options)
{
- _options = (JsonApiOptions)options;
+ _options = options;
+ _backupValues = new JsonApiOptions();
- _backupValues = new JsonApiOptions
- {
- Namespace = options.Namespace,
- DefaultAttrCapabilities = options.DefaultAttrCapabilities,
- DefaultHasOneCapabilities = options.DefaultHasOneCapabilities,
- DefaultHasManyCapabilities = options.DefaultHasManyCapabilities,
- IncludeJsonApiVersion = options.IncludeJsonApiVersion,
- IncludeExceptionStackTraceInErrors = options.IncludeExceptionStackTraceInErrors,
- IncludeRequestBodyInErrors = options.IncludeRequestBodyInErrors,
- UseRelativeLinks = options.UseRelativeLinks,
- TopLevelLinks = options.TopLevelLinks,
- ResourceLinks = options.ResourceLinks,
- RelationshipLinks = options.RelationshipLinks,
- IncludeTotalResourceCount = options.IncludeTotalResourceCount,
- DefaultPageSize = options.DefaultPageSize,
- MaximumPageSize = options.MaximumPageSize,
- MaximumPageNumber = options.MaximumPageNumber,
- ValidateModelState = options.ValidateModelState,
- ClientIdGeneration = options.ClientIdGeneration,
- AllowUnknownQueryStringParameters = options.AllowUnknownQueryStringParameters,
- AllowUnknownFieldsInRequestBody = options.AllowUnknownFieldsInRequestBody,
- EnableLegacyFilterNotation = options.EnableLegacyFilterNotation,
- MaximumIncludeDepth = options.MaximumIncludeDepth,
- MaximumOperationsPerRequest = options.MaximumOperationsPerRequest,
- TransactionIsolationLevel = options.TransactionIsolationLevel
- };
+ CopyPropertyValues(_options, _backupValues);
+ }
+
+ private static bool IsAccessibleProperty(PropertyInfo property)
+ {
+ return property.GetMethod != null && property.SetMethod != null && property.GetCustomAttribute() == null;
}
public void Dispose()
{
- _options.Namespace = _backupValues.Namespace;
- _options.DefaultAttrCapabilities = _backupValues.DefaultAttrCapabilities;
- _options.DefaultHasOneCapabilities = _backupValues.DefaultHasOneCapabilities;
- _options.DefaultHasManyCapabilities = _backupValues.DefaultHasManyCapabilities;
- _options.IncludeJsonApiVersion = _backupValues.IncludeJsonApiVersion;
- _options.IncludeExceptionStackTraceInErrors = _backupValues.IncludeExceptionStackTraceInErrors;
- _options.IncludeRequestBodyInErrors = _backupValues.IncludeRequestBodyInErrors;
- _options.UseRelativeLinks = _backupValues.UseRelativeLinks;
- _options.TopLevelLinks = _backupValues.TopLevelLinks;
- _options.ResourceLinks = _backupValues.ResourceLinks;
- _options.RelationshipLinks = _backupValues.RelationshipLinks;
- _options.IncludeTotalResourceCount = _backupValues.IncludeTotalResourceCount;
- _options.DefaultPageSize = _backupValues.DefaultPageSize;
- _options.MaximumPageSize = _backupValues.MaximumPageSize;
- _options.MaximumPageNumber = _backupValues.MaximumPageNumber;
- _options.ValidateModelState = _backupValues.ValidateModelState;
- _options.ClientIdGeneration = _backupValues.ClientIdGeneration;
- _options.AllowUnknownQueryStringParameters = _backupValues.AllowUnknownQueryStringParameters;
- _options.AllowUnknownFieldsInRequestBody = _backupValues.AllowUnknownFieldsInRequestBody;
- _options.EnableLegacyFilterNotation = _backupValues.EnableLegacyFilterNotation;
- _options.MaximumIncludeDepth = _backupValues.MaximumIncludeDepth;
- _options.MaximumOperationsPerRequest = _backupValues.MaximumOperationsPerRequest;
- _options.TransactionIsolationLevel = _backupValues.TransactionIsolationLevel;
+ CopyPropertyValues(_backupValues, _options);
+ }
+
+ private static void CopyPropertyValues(JsonApiOptions source, JsonApiOptions destination)
+ {
+ foreach (PropertyInfo property in PropertyCache)
+ {
+ property.SetMethod!.Invoke(destination, new[]
+ {
+ property.GetMethod!.Invoke(source, null)
+ });
+ }
}
}
}
From e8c9ff67194c2cdef656a1b3dc75f387efdf050b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 7 Oct 2023 08:06:30 +0000
Subject: [PATCH 24/82] Bump dotnet-reportgenerator-globaltool from 5.1.25 to
5.1.26 (#27)
---
.config/dotnet-tools.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 5d87b8a..5468441 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -15,7 +15,7 @@
]
},
"dotnet-reportgenerator-globaltool": {
- "version": "5.1.25",
+ "version": "5.1.26",
"commands": [
"reportgenerator"
]
From 7a1f84a0bf1e136d0c4dc58db20d1cda4c1f478d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 8 Nov 2023 10:42:42 +0000
Subject: [PATCH 25/82] Bump jetbrains.resharper.globaltools from 2023.2.2 to
2023.2.3 (#30)
---
.config/dotnet-tools.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 5468441..0c4152f 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"jetbrains.resharper.globaltools": {
- "version": "2023.2.2",
+ "version": "2023.2.3",
"commands": [
"jb"
]
From 37ffb908204d5ade65770af7f6a38a0d82bea87a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 8 Nov 2023 18:26:00 +0000
Subject: [PATCH 26/82] Update JetBrains.Annotations requirement from 2023.2.*
to 2023.3.* (#31)
---
Directory.Build.props | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index 675fb8b..48012d3 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -30,7 +30,7 @@
6.12.*
2.3.*
1.3.*
- 2023.2.*
+ 2023.3.*
2.21.*
1.1.*
17.7.*
From 886e8f2b96406b2131b8f1fddca19611fd0b0181 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 9 Nov 2023 17:26:16 +0000
Subject: [PATCH 27/82] Update Microsoft.NET.Test.Sdk requirement from 17.7.*
to 17.8.* (#32)
---
Directory.Build.props | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index 48012d3..2b53cab 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -33,7 +33,7 @@
2023.3.*
2.21.*
1.1.*
- 17.7.*
+ 17.8.*
2.5.*
From f5b5d8b183de4d10a882ad062658e51b04b3e2b1 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Wed, 22 Nov 2023 15:07:48 +0100
Subject: [PATCH 28/82] Fix mixed-up IoC container registrations in tests (turn
off auto-discovery)
---
.../AtomicOperationsFixture.cs | 12 ++-
...reateResourceWithClientGeneratedIdTests.cs | 2 +-
...mplicitlyChangingTextLanguageDefinition.cs | 47 +++++------
.../Meta/TextLanguageMetaDefinition.cs | 2 +-
.../AtomicTransactionConsistencyTests.cs | 8 +-
.../Transactions/LyricRepository.cs | 35 ++++----
.../Transactions/MusicTrackRepository.cs | 19 ++---
.../Transactions/PerformerRepository.cs | 84 +++++++++----------
.../Resources/AtomicUpdateResourceTests.cs | 2 +-
.../Meta/ResourceMetaTests.cs | 4 +
.../Meta/TopLevelCountTests.cs | 3 +-
.../Filtering/FilterDataTypeTests.cs | 2 +
.../Filtering/FilterDepthTests.cs | 2 +
.../Filtering/FilterOperatorTests.cs | 2 +
.../QueryStrings/Filtering/FilterTests.cs | 2 +
.../QueryStrings/Includes/IncludeTests.cs | 2 +
.../PaginationWithTotalCountTests.cs | 2 +
.../Pagination/RangeValidationTests.cs | 2 +
.../QueryStrings/Sorting/SortTests.cs | 2 +
.../SparseFieldSets/SparseFieldSetTests.cs | 2 +
.../ReadWrite/Creating/CreateResourceTests.cs | 2 +
...reateResourceWithClientGeneratedIdTests.cs | 8 +-
...eateResourceWithToManyRelationshipTests.cs | 2 +
...reateResourceWithToOneRelationshipTests.cs | 2 +
.../ReadWrite/Deleting/DeleteResourceTests.cs | 2 +
.../Fetching/FetchRelationshipTests.cs | 2 +
.../ReadWrite/Fetching/FetchResourceTests.cs | 2 +
.../ImplicitlyChangingWorkItemDefinition.cs | 44 +++++-----
...plicitlyChangingWorkItemGroupDefinition.cs | 43 +++++-----
.../AddToToManyRelationshipTests.cs | 2 +
.../RemoveFromToManyRelationshipTests.cs | 2 +
.../ReplaceToManyRelationshipTests.cs | 2 +
.../UpdateToOneRelationshipTests.cs | 2 +
.../ReplaceToManyRelationshipTests.cs | 2 +
.../Updating/Resources/UpdateResourceTests.cs | 12 +--
.../Resources/UpdateToOneRelationshipTests.cs | 2 +
.../Reading/ResourceDefinitionReadTests.cs | 6 ++
.../IntegrationTestContext.cs | 21 ++++-
test/TestBuildingBlocks/ResourceTypeFinder.cs | 31 +++++++
39 files changed, 260 insertions(+), 165 deletions(-)
create mode 100644 test/TestBuildingBlocks/ResourceTypeFinder.cs
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
index e727573..7b0c76b 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
@@ -1,4 +1,6 @@
using JetBrains.Annotations;
+using JsonApiDotNetCore.Configuration;
+using JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Meta;
using Microsoft.Extensions.DependencyInjection;
using TestBuildingBlocks;
using Xunit;
@@ -12,9 +14,17 @@ public sealed class AtomicOperationsFixture : IAsyncLifetime
public AtomicOperationsFixture()
{
+ TestContext.UseResourceTypesInNamespace(typeof(MusicTrack).Namespace);
+
TestContext.UseController();
- TestContext.ConfigureServicesAfterStartup(services => services.AddSingleton());
+ TestContext.ConfigureServicesAfterStartup(services =>
+ {
+ services.AddSingleton();
+
+ services.AddResourceDefinition();
+ services.AddResourceDefinition();
+ });
}
public Task InitializeAsync()
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
index bfd4a4e..7fdf996 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
@@ -58,7 +58,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_sid
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
- string isoCode = $"{newLanguage.IsoCode}{ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingTextLanguageDefinition.Suffix}";
+ string isoCode = $"{newLanguage.IsoCode}{ImplicitlyChangingTextLanguageDefinition.Suffix}";
responseDocument.Results.ShouldHaveCount(1);
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/ImplicitlyChangingTextLanguageDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/ImplicitlyChangingTextLanguageDefinition.cs
index dc5ada1..946bc14 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/ImplicitlyChangingTextLanguageDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/ImplicitlyChangingTextLanguageDefinition.cs
@@ -6,39 +6,34 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations;
-[UsedImplicitly]
-public sealed class ContainerTypeToHideFromAutoDiscovery
+///
+/// Used to simulate side effects that occur in the database while saving, typically caused by database triggers.
+///
+[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
+public abstract class ImplicitlyChangingTextLanguageDefinition : HitCountingResourceDefinition
{
- ///
- /// Used to simulate side effects that occur in the database while saving, typically caused by database triggers.
- ///
- [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
- public abstract class ImplicitlyChangingTextLanguageDefinition : HitCountingResourceDefinition
- {
- internal const string Suffix = " (changed)";
+ internal const string Suffix = " (changed)";
- private readonly IMongoDataAccess _mongoDataAccess;
+ private readonly IMongoDataAccess _mongoDataAccess;
- protected ImplicitlyChangingTextLanguageDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter,
- IMongoDataAccess mongoDataAccess)
- : base(resourceGraph, hitCounter)
- {
- _mongoDataAccess = mongoDataAccess;
- }
+ protected ImplicitlyChangingTextLanguageDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter, IMongoDataAccess mongoDataAccess)
+ : base(resourceGraph, hitCounter)
+ {
+ _mongoDataAccess = mongoDataAccess;
+ }
- public override async Task OnWriteSucceededAsync(TextLanguage resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
- {
- await base.OnWriteSucceededAsync(resource, writeOperation, cancellationToken);
+ public override async Task OnWriteSucceededAsync(TextLanguage resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
+ {
+ await base.OnWriteSucceededAsync(resource, writeOperation, cancellationToken);
- if (writeOperation is not WriteOperationKind.DeleteResource)
- {
- resource.IsoCode += Suffix;
+ if (writeOperation is not WriteOperationKind.DeleteResource)
+ {
+ resource.IsoCode += Suffix;
- FilterDefinition filter = Builders.Filter.Eq(item => item.Id, resource.Id);
+ FilterDefinition filter = Builders.Filter.Eq(item => item.Id, resource.Id);
- IMongoCollection collection = _mongoDataAccess.MongoDatabase.GetCollection(nameof(TextLanguage));
- await collection.ReplaceOneAsync(_mongoDataAccess.ActiveSession, filter, resource, cancellationToken: cancellationToken);
- }
+ IMongoCollection collection = _mongoDataAccess.MongoDatabase.GetCollection(nameof(TextLanguage));
+ await collection.ReplaceOneAsync(_mongoDataAccess.ActiveSession, filter, resource, cancellationToken: cancellationToken);
}
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs
index ef3db2a..bf1bd66 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs
@@ -5,7 +5,7 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Meta;
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
-public sealed class TextLanguageMetaDefinition : ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingTextLanguageDefinition
+public sealed class TextLanguageMetaDefinition : ImplicitlyChangingTextLanguageDefinition
{
internal const string NoticeText = "See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes for ISO 639-1 language codes.";
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
index 4d89d74..a942fae 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
@@ -17,15 +17,17 @@ public AtomicTransactionConsistencyTests(IntegrationTestContext();
testContext.ConfigureServicesAfterStartup(services =>
{
services.AddSingleton();
- services.AddResourceRepository();
- services.AddResourceRepository();
- services.AddResourceRepository();
+ services.AddResourceRepository();
+ services.AddResourceRepository();
+ services.AddResourceRepository();
});
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
index 93e31b2..cda8d04 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
@@ -9,30 +9,25 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Transactions;
-[UsedImplicitly]
-internal sealed partial class ContainerTypeToHideFromAutoDiscovery
+[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
+public sealed class LyricRepository : MongoRepository, IAsyncDisposable
{
- [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
- public sealed class LyricRepository : MongoRepository, IAsyncDisposable
- {
- private readonly IOperationsTransaction _transaction;
+ private readonly IOperationsTransaction _transaction;
- public override string TransactionId => _transaction.TransactionId;
+ public override string TransactionId => _transaction.TransactionId;
- public LyricRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targetedFields, IResourceGraph resourceGraph, IResourceFactory resourceFactory,
- IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor,
- IQueryableBuilder queryableBuilder)
- : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor, queryableBuilder)
- {
- IMongoDataAccess otherDataAccess = new MongoDataAccess(mongoDataAccess.MongoDatabase);
+ public LyricRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targetedFields, IResourceGraph resourceGraph, IResourceFactory resourceFactory,
+ IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor, IQueryableBuilder queryableBuilder)
+ : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor, queryableBuilder)
+ {
+ IMongoDataAccess otherDataAccess = new MongoDataAccess(mongoDataAccess.MongoDatabase);
- var factory = new MongoTransactionFactory(otherDataAccess);
- _transaction = factory.BeginTransactionAsync(CancellationToken.None).Result;
- }
+ var factory = new MongoTransactionFactory(otherDataAccess);
+ _transaction = factory.BeginTransactionAsync(CancellationToken.None).Result;
+ }
- public async ValueTask DisposeAsync()
- {
- await _transaction.DisposeAsync();
- }
+ public async ValueTask DisposeAsync()
+ {
+ await _transaction.DisposeAsync();
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/MusicTrackRepository.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/MusicTrackRepository.cs
index 5d40f37..9595112 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/MusicTrackRepository.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/MusicTrackRepository.cs
@@ -7,18 +7,15 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Transactions;
-internal sealed partial class ContainerTypeToHideFromAutoDiscovery
+[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
+public sealed class MusicTrackRepository : MongoRepository
{
- [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
- public sealed class MusicTrackRepository : MongoRepository
- {
- public override string? TransactionId => null;
+ public override string? TransactionId => null;
- public MusicTrackRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targetedFields, IResourceGraph resourceGraph,
- IResourceFactory resourceFactory, IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor,
- IQueryableBuilder queryableBuilder)
- : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor, queryableBuilder)
- {
- }
+ public MusicTrackRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targetedFields, IResourceGraph resourceGraph,
+ IResourceFactory resourceFactory, IEnumerable constraintProviders, IResourceDefinitionAccessor resourceDefinitionAccessor,
+ IQueryableBuilder queryableBuilder)
+ : base(mongoDataAccess, targetedFields, resourceGraph, resourceFactory, constraintProviders, resourceDefinitionAccessor, queryableBuilder)
+ {
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/PerformerRepository.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/PerformerRepository.cs
index c4d2e26..2f73d74 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/PerformerRepository.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/PerformerRepository.cs
@@ -6,60 +6,56 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Transactions;
-internal sealed partial class ContainerTypeToHideFromAutoDiscovery
+[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
+public sealed class PerformerRepository : IResourceRepository
{
- [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
- public sealed class PerformerRepository : IResourceRepository
+ public Task> GetAsync(QueryLayer queryLayer, CancellationToken cancellationToken)
{
- public Task> GetAsync(QueryLayer queryLayer, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ throw new NotImplementedException();
+ }
- public Task CountAsync(FilterExpression? filter, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task CountAsync(FilterExpression? filter, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
- public Task GetForCreateAsync(Type resourceClrType, string? id, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task GetForCreateAsync(Type resourceClrType, string? id, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
- public Task CreateAsync(Performer resourceFromRequest, Performer resourceForDatabase, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task CreateAsync(Performer resourceFromRequest, Performer resourceForDatabase, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
- public Task GetForUpdateAsync(QueryLayer queryLayer, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task GetForUpdateAsync(QueryLayer queryLayer, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
- public Task UpdateAsync(Performer resourceFromRequest, Performer resourceFromDatabase, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task UpdateAsync(Performer resourceFromRequest, Performer resourceFromDatabase, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
- public Task DeleteAsync(Performer? resourceFromDatabase, string? id, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task DeleteAsync(Performer? resourceFromDatabase, string? id, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
- public Task SetRelationshipAsync(Performer leftResource, object? rightValue, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task SetRelationshipAsync(Performer leftResource, object? rightValue, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
- public Task AddToToManyRelationshipAsync(Performer? leftResource, string? leftId, ISet rightResourceIds,
- CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task AddToToManyRelationshipAsync(Performer? leftResource, string? leftId, ISet rightResourceIds, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
- public Task RemoveFromToManyRelationshipAsync(Performer leftResource, ISet rightResourceIds, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
+ public Task RemoveFromToManyRelationshipAsync(Performer leftResource, ISet rightResourceIds, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs
index a6cec5b..95a65e9 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs
@@ -295,7 +295,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
responseDocument.Results.ShouldHaveCount(1);
- string isoCode = $"{newIsoCode}{ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingTextLanguageDefinition.Suffix}";
+ string isoCode = $"{newIsoCode}{ImplicitlyChangingTextLanguageDefinition.Suffix}";
responseDocument.Results[0].Data.SingleValue.ShouldNotBeNull().With(resource =>
{
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/ResourceMetaTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/ResourceMetaTests.cs
index 3a3edca..68b8478 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/ResourceMetaTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/ResourceMetaTests.cs
@@ -1,5 +1,6 @@
using System.Net;
using FluentAssertions;
+using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
using Microsoft.Extensions.DependencyInjection;
using TestBuildingBlocks;
@@ -16,11 +17,14 @@ public ResourceMetaTests(IntegrationTestContext
{
_testContext = testContext;
+ testContext.UseResourceTypesInNamespace(typeof(SupportTicket).Namespace);
+
testContext.UseController();
testContext.ConfigureServicesAfterStartup(services =>
{
services.AddSingleton();
+ services.AddResourceDefinition();
});
var hitCounter = _testContext.Factory.Services.GetRequiredService();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
index c486d0d..03406ed 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
@@ -18,11 +18,12 @@ public TopLevelCountTests(IntegrationTestContext
{
_testContext = testContext;
+ testContext.UseResourceTypesInNamespace(typeof(SupportTicket).Namespace);
+
testContext.UseController();
testContext.ConfigureServicesAfterStartup(services =>
{
- services.AddSingleton();
services.AddScoped(typeof(IResourceChangeTracker<>), typeof(NeverSameResourceChangeTracker<>));
});
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
index 5dc1442..a74e6ee 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDataTypeTests.cs
@@ -19,6 +19,8 @@ public FilterDataTypeTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDepthTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDepthTests.cs
index 888cd6c..fccf739 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDepthTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterDepthTests.cs
@@ -15,6 +15,8 @@ public FilterDepthTests(IntegrationTestContext();
testContext.UseController();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterOperatorTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterOperatorTests.cs
index 60e10e7..efc7075 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterOperatorTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterOperatorTests.cs
@@ -39,6 +39,8 @@ public FilterOperatorTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterTests.cs
index 9be84ed..c432a77 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Filtering/FilterTests.cs
@@ -15,6 +15,8 @@ public FilterTests(IntegrationTestContext
{
_testContext = testContext;
+ testContext.UseResourceTypesInNamespace(typeof(Blog).Namespace);
+
testContext.UseController();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Includes/IncludeTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Includes/IncludeTests.cs
index 63c5c1f..2fcbfe5 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Includes/IncludeTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Includes/IncludeTests.cs
@@ -14,6 +14,8 @@ public IncludeTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs
index d638555..96e031b 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs
@@ -19,6 +19,8 @@ public PaginationWithTotalCountTests(IntegrationTestContext();
var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/RangeValidationTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/RangeValidationTests.cs
index 63ec7c6..28a7c06 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/RangeValidationTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Pagination/RangeValidationTests.cs
@@ -15,6 +15,8 @@ public RangeValidationTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Sorting/SortTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Sorting/SortTests.cs
index f0846b7..a5269d7 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Sorting/SortTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/Sorting/SortTests.cs
@@ -15,6 +15,8 @@ public SortTests(IntegrationTestContext t
{
_testContext = testContext;
+ testContext.UseResourceTypesInNamespace(typeof(Blog).Namespace);
+
testContext.UseController();
testContext.UseController();
testContext.UseController();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
index dca4609..d6ee238 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
@@ -17,6 +17,8 @@ public SparseFieldSetTests(IntegrationTestContext();
testContext.UseController();
testContext.UseController();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceTests.cs
index 7797e79..ccc1ec6 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceTests.cs
@@ -15,6 +15,8 @@ public CreateResourceTests(IntegrationTestContext();
testContext.UseController();
testContext.UseController();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
index 9993e03..2fc6b88 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
@@ -17,12 +17,14 @@ public CreateResourceWithClientGeneratedIdTests(IntegrationTestContext();
testContext.UseController();
testContext.ConfigureServicesAfterStartup(services =>
{
- services.AddResourceDefinition();
+ services.AddResourceDefinition();
});
var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService();
@@ -57,7 +59,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_sid
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.Created);
- string groupName = $"{newGroup.Name}{ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingWorkItemGroupDefinition.Suffix}";
+ string groupName = $"{newGroup.Name}{ImplicitlyChangingWorkItemGroupDefinition.Suffix}";
responseDocument.Data.SingleValue.ShouldNotBeNull();
responseDocument.Data.SingleValue.Type.Should().Be("workItemGroups");
@@ -101,7 +103,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_sid
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.Created);
- string groupName = $"{newGroup.Name}{ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingWorkItemGroupDefinition.Suffix}";
+ string groupName = $"{newGroup.Name}{ImplicitlyChangingWorkItemGroupDefinition.Suffix}";
responseDocument.Data.SingleValue.ShouldNotBeNull();
responseDocument.Data.SingleValue.Type.Should().Be("workItemGroups");
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToManyRelationshipTests.cs
index 626547c..e0d92de 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToManyRelationshipTests.cs
@@ -15,6 +15,8 @@ public CreateResourceWithToManyRelationshipTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToOneRelationshipTests.cs
index 337d48a..be6732c 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToOneRelationshipTests.cs
@@ -15,6 +15,8 @@ public CreateResourceWithToOneRelationshipTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Deleting/DeleteResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Deleting/DeleteResourceTests.cs
index 99cac72..3e1bb87 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Deleting/DeleteResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Deleting/DeleteResourceTests.cs
@@ -15,6 +15,8 @@ public DeleteResourceTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchRelationshipTests.cs
index 884349d..6a9e32c 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchRelationshipTests.cs
@@ -15,6 +15,8 @@ public FetchRelationshipTests(IntegrationTestContext();
testContext.UseController();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchResourceTests.cs
index e254772..39a52d6 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchResourceTests.cs
@@ -15,6 +15,8 @@ public FetchResourceTests(IntegrationTestContext();
testContext.UseController();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs
index 4e9f358..4ccfb12 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs
@@ -6,37 +6,33 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite;
-[UsedImplicitly]
-internal sealed partial class ContainerTypeToHideFromAutoDiscovery
+///
+/// Used to simulate side effects that occur in the database while saving, typically caused by database triggers.
+///
+[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
+public sealed class ImplicitlyChangingWorkItemDefinition : JsonApiResourceDefinition
{
- ///
- /// Used to simulate side effects that occur in the database while saving, typically caused by database triggers.
- ///
- [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
- public sealed class ImplicitlyChangingWorkItemDefinition : JsonApiResourceDefinition
- {
- internal const string Suffix = " (changed)";
+ internal const string Suffix = " (changed)";
- private readonly ReadWriteDbContext _dbContext;
+ private readonly ReadWriteDbContext _dbContext;
- public ImplicitlyChangingWorkItemDefinition(IResourceGraph resourceGraph, ReadWriteDbContext dbContext)
- : base(resourceGraph)
- {
- _dbContext = dbContext;
- }
+ public ImplicitlyChangingWorkItemDefinition(IResourceGraph resourceGraph, ReadWriteDbContext dbContext)
+ : base(resourceGraph)
+ {
+ _dbContext = dbContext;
+ }
- public override async Task OnWriteSucceededAsync(WorkItem resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
+ public override async Task OnWriteSucceededAsync(WorkItem resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
+ {
+ if (writeOperation is not WriteOperationKind.DeleteResource)
{
- if (writeOperation is not WriteOperationKind.DeleteResource)
+ await _dbContext.WorkItems.ExecuteAsync(async collection =>
{
- await _dbContext.WorkItems.ExecuteAsync(async collection =>
- {
- resource.Description += Suffix;
+ resource.Description += Suffix;
- FilterDefinition filter = Builders.Filter.Eq(item => item.Id, resource.Id);
- await collection.ReplaceOneAsync(filter, resource, cancellationToken: cancellationToken);
- });
- }
+ FilterDefinition filter = Builders.Filter.Eq(item => item.Id, resource.Id);
+ await collection.ReplaceOneAsync(filter, resource, cancellationToken: cancellationToken);
+ });
}
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemGroupDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemGroupDefinition.cs
index e9abd46..a01c45e 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemGroupDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemGroupDefinition.cs
@@ -6,36 +6,33 @@
namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite;
-internal sealed partial class ContainerTypeToHideFromAutoDiscovery
+///
+/// Used to simulate side effects that occur in the database while saving, typically caused by database triggers.
+///
+[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
+public sealed class ImplicitlyChangingWorkItemGroupDefinition : JsonApiResourceDefinition
{
- ///
- /// Used to simulate side effects that occur in the database while saving, typically caused by database triggers.
- ///
- [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
- public sealed class ImplicitlyChangingWorkItemGroupDefinition : JsonApiResourceDefinition
- {
- internal const string Suffix = " (changed)";
+ internal const string Suffix = " (changed)";
- private readonly ReadWriteDbContext _dbContext;
+ private readonly ReadWriteDbContext _dbContext;
- public ImplicitlyChangingWorkItemGroupDefinition(IResourceGraph resourceGraph, ReadWriteDbContext dbContext)
- : base(resourceGraph)
- {
- _dbContext = dbContext;
- }
+ public ImplicitlyChangingWorkItemGroupDefinition(IResourceGraph resourceGraph, ReadWriteDbContext dbContext)
+ : base(resourceGraph)
+ {
+ _dbContext = dbContext;
+ }
- public override async Task OnWriteSucceededAsync(WorkItemGroup resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
+ public override async Task OnWriteSucceededAsync(WorkItemGroup resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
+ {
+ if (writeOperation is not WriteOperationKind.DeleteResource)
{
- if (writeOperation is not WriteOperationKind.DeleteResource)
+ await _dbContext.Groups.ExecuteAsync(async collection =>
{
- await _dbContext.Groups.ExecuteAsync(async collection =>
- {
- resource.Name += Suffix;
+ resource.Name += Suffix;
- FilterDefinition filter = Builders.Filter.Eq(group => group.Id, resource.Id);
- await collection.ReplaceOneAsync(filter, resource, cancellationToken: cancellationToken);
- });
- }
+ FilterDefinition filter = Builders.Filter.Eq(group => group.Id, resource.Id);
+ await collection.ReplaceOneAsync(filter, resource, cancellationToken: cancellationToken);
+ });
}
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/AddToToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/AddToToManyRelationshipTests.cs
index 7487ca4..c2fd820 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/AddToToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/AddToToManyRelationshipTests.cs
@@ -15,6 +15,8 @@ public AddToToManyRelationshipTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs
index 0de1b7b..eab8111 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs
@@ -15,6 +15,8 @@ public RemoveFromToManyRelationshipTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/ReplaceToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/ReplaceToManyRelationshipTests.cs
index 2c78ccd..9df3deb 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/ReplaceToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/ReplaceToManyRelationshipTests.cs
@@ -15,6 +15,8 @@ public ReplaceToManyRelationshipTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/UpdateToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/UpdateToOneRelationshipTests.cs
index 0e76c43..ddd0f1d 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/UpdateToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/UpdateToOneRelationshipTests.cs
@@ -15,6 +15,8 @@ public UpdateToOneRelationshipTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/ReplaceToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/ReplaceToManyRelationshipTests.cs
index ed39b18..f7fa710 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/ReplaceToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/ReplaceToManyRelationshipTests.cs
@@ -15,6 +15,8 @@ public ReplaceToManyRelationshipTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
index 4faf659..555e59e 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
@@ -16,6 +16,8 @@ public UpdateResourceTests(IntegrationTestContext();
testContext.UseController();
testContext.UseController();
@@ -23,8 +25,8 @@ public UpdateResourceTests(IntegrationTestContext
{
- services.AddResourceDefinition();
- services.AddResourceDefinition();
+ services.AddResourceDefinition();
+ services.AddResourceDefinition();
});
}
@@ -108,7 +110,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
- string groupName = $"{newName}{ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingWorkItemGroupDefinition.Suffix}";
+ string groupName = $"{newName}{ImplicitlyChangingWorkItemGroupDefinition.Suffix}";
responseDocument.Data.SingleValue.ShouldNotBeNull();
responseDocument.Data.SingleValue.Type.Should().Be("workItemGroups");
@@ -251,7 +253,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
- string itemDescription = $"{newDescription}{ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingWorkItemDefinition.Suffix}";
+ string itemDescription = $"{newDescription}{ImplicitlyChangingWorkItemDefinition.Suffix}";
responseDocument.Data.SingleValue.ShouldNotBeNull();
responseDocument.Data.SingleValue.Type.Should().Be("workItems");
@@ -307,7 +309,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
- string itemDescription = $"{newDescription}{ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingWorkItemDefinition.Suffix}";
+ string itemDescription = $"{newDescription}{ImplicitlyChangingWorkItemDefinition.Suffix}";
responseDocument.Data.SingleValue.ShouldNotBeNull();
responseDocument.Data.SingleValue.Type.Should().Be("workItems");
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateToOneRelationshipTests.cs
index 2a0faf2..c1e99fc 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateToOneRelationshipTests.cs
@@ -15,6 +15,8 @@ public UpdateToOneRelationshipTests(IntegrationTestContext();
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
index d9b54c4..6392c4b 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
@@ -17,6 +17,8 @@ public ResourceDefinitionReadTests(IntegrationTestContext();
testContext.UseController();
testContext.UseController();
@@ -25,6 +27,10 @@ public ResourceDefinitionReadTests(IntegrationTestContext();
services.AddSingleton();
+
+ services.AddResourceDefinition();
+ services.AddResourceDefinition();
+ services.AddResourceDefinition();
});
var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService();
diff --git a/test/TestBuildingBlocks/IntegrationTestContext.cs b/test/TestBuildingBlocks/IntegrationTestContext.cs
index f97fd98..fd69d9d 100644
--- a/test/TestBuildingBlocks/IntegrationTestContext.cs
+++ b/test/TestBuildingBlocks/IntegrationTestContext.cs
@@ -1,3 +1,4 @@
+using System.Reflection;
using System.Text.Json;
using EphemeralMongo;
using JetBrains.Annotations;
@@ -33,6 +34,7 @@ public class IntegrationTestContext : Integration
{
private readonly Lazy _runner;
private readonly Lazy> _lazyFactory;
+ private readonly HashSet _resourceClrTypes = new();
private readonly TestControllerProvider _testControllerProvider = new();
private Action? _afterServicesConfiguration;
@@ -59,6 +61,16 @@ private IMongoRunner StartMongoDb()
return MongoRunnerProvider.Instance.Get();
}
+ public void UseResourceTypesInNamespace(string? codeNamespace)
+ {
+ Assembly assembly = typeof(TStartup).Assembly;
+
+ foreach (Type resourceClrType in ResourceTypeFinder.GetResourceClrTypesInNamespace(assembly, codeNamespace))
+ {
+ _resourceClrTypes.Add(resourceClrType);
+ }
+ }
+
public void UseController()
where TController : ControllerBase
{
@@ -84,7 +96,14 @@ private WebApplicationFactory CreateFactory()
return client.GetDatabase($"JsonApiDotNetCore_MongoDb_{new Random().Next()}_Test");
});
- services.AddJsonApi(ConfigureJsonApiOptions, facade => facade.AddAssembly(typeof(TStartup).Assembly));
+ services.AddJsonApi(ConfigureJsonApiOptions, resources: builder =>
+ {
+ foreach (Type resourceClrType in _resourceClrTypes)
+ {
+ builder.Add(resourceClrType);
+ }
+ });
+
services.AddJsonApiMongoDb();
services.AddScoped(typeof(IResourceReadRepository<,>), typeof(MongoRepository<,>));
diff --git a/test/TestBuildingBlocks/ResourceTypeFinder.cs b/test/TestBuildingBlocks/ResourceTypeFinder.cs
new file mode 100644
index 0000000..c4d6ecf
--- /dev/null
+++ b/test/TestBuildingBlocks/ResourceTypeFinder.cs
@@ -0,0 +1,31 @@
+using System.Collections.Concurrent;
+using System.Reflection;
+using JsonApiDotNetCore.Resources;
+
+#pragma warning disable AV1008 // Class should not be static
+
+namespace TestBuildingBlocks;
+
+internal static class ResourceTypeFinder
+{
+ private static readonly ConcurrentDictionary> ResourceTypesPerAssembly = new();
+ private static readonly ConcurrentDictionary> ResourceTypesPerNamespace = new();
+
+ public static IReadOnlySet GetResourceClrTypesInNamespace(Assembly assembly, string? codeNamespace)
+ {
+ IReadOnlySet resourceClrTypesInAssembly = ResourceTypesPerAssembly.GetOrAdd(assembly, GetResourceClrTypesInAssembly);
+
+ string namespaceKey = codeNamespace ?? string.Empty;
+ return ResourceTypesPerNamespace.GetOrAdd(namespaceKey, _ => FilterTypesInNamespace(resourceClrTypesInAssembly, codeNamespace).ToHashSet());
+ }
+
+ private static IReadOnlySet GetResourceClrTypesInAssembly(Assembly assembly)
+ {
+ return assembly.GetTypes().Where(type => type.IsAssignableTo(typeof(IIdentifiable))).ToHashSet();
+ }
+
+ private static IEnumerable FilterTypesInNamespace(IEnumerable resourceClrTypesInAssembly, string? codeNamespace)
+ {
+ return resourceClrTypesInAssembly.Where(resourceClrType => resourceClrType.Namespace == codeNamespace);
+ }
+}
From 27249fb68bbc6a5d121e658e483d276e2a64b5fa Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Thu, 23 Nov 2023 02:32:11 +0100
Subject: [PATCH 29/82] Update to JADNC v5.5.0
---
.config/dotnet-tools.json | 4 +-
.github/ISSUE_TEMPLATE/bug_report.md | 2 +-
.github/ISSUE_TEMPLATE/config.yml | 14 ++++++
.github/ISSUE_TEMPLATE/feature_request.md | 2 +-
.github/ISSUE_TEMPLATE/question.md | 2 +-
.github/workflows/build.yml | 23 +++++++---
.github/workflows/codeql.yml | 43 +++++++++++++++++++
.github/workflows/deps-review.yml | 14 ++++++
Build.ps1 | 5 ++-
Directory.Build.props | 36 +++-------------
JsonApiDotNetCore.MongoDb.sln | 2 +
JsonApiDotNetCore.MongoDb.sln.DotSettings | 6 +++
WarningSeverities.DotSettings | 5 +++
cleanupcode.ps1 | 6 +--
inspectcode.ps1 | 2 +-
package-versions.props | 29 +++++++++++++
run-docker-mongodb.ps1 | 9 ++--
.../GettingStarted/GettingStarted.csproj | 4 +-
.../Definitions/TodoItemDefinition.cs | 23 +++++++---
.../JsonApiDotNetCoreMongoDbExample.csproj | 4 +-
.../Program.cs | 15 +++++--
.../JsonApiDotNetCore.MongoDb.csproj | 4 +-
.../JsonApiDotNetCoreMongoDbTests.csproj | 4 +-
.../TestBuildingBlocks.csproj | 4 +-
tests.runsettings | 16 +++++++
25 files changed, 210 insertions(+), 68 deletions(-)
create mode 100644 .github/ISSUE_TEMPLATE/config.yml
create mode 100644 .github/workflows/codeql.yml
create mode 100644 .github/workflows/deps-review.yml
create mode 100644 package-versions.props
create mode 100644 tests.runsettings
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 0c4152f..ad52741 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"jetbrains.resharper.globaltools": {
- "version": "2023.2.3",
+ "version": "2023.3.0-eap08",
"commands": [
"jb"
]
@@ -15,7 +15,7 @@
]
},
"dotnet-reportgenerator-globaltool": {
- "version": "5.1.26",
+ "version": "5.2.0",
"commands": [
"reportgenerator"
]
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index a45d71e..d204896 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,6 +1,6 @@
---
name: Bug report
-about: Create a report to help us improve
+about: Create a report to help us improve.
title: ''
labels: 'bug'
assignees: ''
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..8bf0a91
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,14 @@
+blank_issues_enabled: true
+contact_links:
+- name: Documentation
+ url: https://www.jsonapi.net/usage/resources/index.html
+ about: Read our comprehensive documentation.
+- name: Sponsor JsonApiDotNetCore
+ url: https://github.com/sponsors/json-api-dotnet
+ about: Help the continued development.
+- name: Ask on Gitter
+ url: https://gitter.im/json-api-dotnet-core/Lobby
+ about: Get in touch with the whole community.
+- name: Ask on Stack Overflow
+ url: https://stackoverflow.com/questions/tagged/json-api
+ about: The best place for asking general-purpose questions.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index f629ca4..019f7a9 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -1,6 +1,6 @@
---
name: Feature request
-about: Suggest an idea for this project
+about: Suggest an idea for this project.
title: ''
labels: 'enhancement'
assignees: ''
diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
index 76b3998..2520ad8 100644
--- a/.github/ISSUE_TEMPLATE/question.md
+++ b/.github/ISSUE_TEMPLATE/question.md
@@ -1,6 +1,6 @@
---
name: Question
-about: Ask a question
+about: Ask a question.
title: ''
labels: 'question'
assignees: ''
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index dc41703..881e2ed 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -38,7 +38,9 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
- dotnet-version: 6.0.x
+ dotnet-version: |
+ 6.0.x
+ 8.0.x
- name: Setup PowerShell (Ubuntu)
if: matrix.os == 'ubuntu-latest'
run: |
@@ -118,10 +120,13 @@ jobs:
dotnet build --no-restore --configuration Release /p:VersionSuffix=$env:PACKAGE_VERSION_SUFFIX
- name: Test
run: |
- dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" --logger "GitHubActions;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.DeterministicReport=true
+ dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" --logger "GitHubActions;summary.includeSkippedTests=true"
- name: Upload coverage to codecov.io
if: matrix.os == 'ubuntu-latest'
uses: codecov/codecov-action@v3
+ with:
+ fail_ci_if_error: true
+ verbose: true
- name: Generate packages
shell: pwsh
run: |
@@ -146,7 +151,9 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
- dotnet-version: 6.0.x
+ dotnet-version: |
+ 6.0.x
+ 8.0.x
- name: Git checkout
uses: actions/checkout@v4
- name: Restore tools
@@ -157,7 +164,7 @@ jobs:
run: |
$inspectCodeOutputPath = Join-Path $env:RUNNER_TEMP 'jetbrains-inspectcode-results.xml'
Write-Output "INSPECT_CODE_OUTPUT_PATH=$inspectCodeOutputPath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- dotnet jb inspectcode JsonApiDotNetCore.MongoDb.sln --build --output="$inspectCodeOutputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --properties:ContinuousIntegrationBuild=false --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
+ dotnet jb inspectcode JsonApiDotNetCore.MongoDb.sln --build --dotnetcoresdk=$(dotnet --version) --output="$inspectCodeOutputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --properties:ContinuousIntegrationBuild=false --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
- name: Verify outcome
shell: pwsh
run: |
@@ -197,7 +204,9 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
- dotnet-version: 6.0.x
+ dotnet-version: |
+ 6.0.x
+ 8.0.x
- name: Git checkout
uses: actions/checkout@v4
with:
@@ -218,13 +227,13 @@ jobs:
$baseCommitHash = git rev-parse HEAD~1
Write-Output "Running code cleanup on commit range $baseCommitHash..$headCommitHash in pull request."
- dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f commits -a $headCommitHash -b $baseCommitHash --fail-on-diff --print-diff
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f commits -a $headCommitHash -b $baseCommitHash --fail-on-diff --print-diff
- name: CleanupCode (on branch)
if: github.event_name == 'push' || github.event_name == 'release'
shell: pwsh
run: |
Write-Output "Running code cleanup on all files."
- dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN --fail-on-diff --print-diff
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN --fail-on-diff --print-diff
publish:
timeout-minutes: 60
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..5b1868e
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,43 @@
+name: "CodeQL"
+
+on:
+ push:
+ branches: [ 'master', 'release/**' ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ 'master', 'release/**' ]
+ schedule:
+ - cron: '0 0 * * 5'
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: 'ubuntu-latest'
+ timeout-minutes: 60
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [ 'csharp' ]
+ steps:
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: |
+ 6.0.x
+ 8.0.x
+ - name: Git checkout
+ uses: actions/checkout@v4
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: ${{ matrix.language }}
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v2
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
+ with:
+ category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/deps-review.yml b/.github/workflows/deps-review.yml
new file mode 100644
index 0000000..b994508
--- /dev/null
+++ b/.github/workflows/deps-review.yml
@@ -0,0 +1,14 @@
+name: 'Dependency Review'
+on: [pull_request]
+
+permissions:
+ contents: read
+
+jobs:
+ dependency-review:
+ runs-on: ubuntu-latest
+ steps:
+ - name: 'Checkout Repository'
+ uses: actions/checkout@v4
+ - name: 'Dependency Review'
+ uses: actions/dependency-review-action@v3
diff --git a/Build.ps1 b/Build.ps1
index 4854651..3abc926 100644
--- a/Build.ps1
+++ b/Build.ps1
@@ -10,13 +10,16 @@ Write-Host "$(pwsh --version)"
Write-Host "Active .NET SDK: $(dotnet --version)"
Write-Host "Using version suffix: $versionSuffix"
+Remove-Item -Recurse -Force artifacts -ErrorAction SilentlyContinue
+Remove-Item -Recurse -Force * -Include coverage.cobertura.xml
+
dotnet tool restore
VerifySuccessExitCode
dotnet build --configuration Release /p:VersionSuffix=$versionSuffix
VerifySuccessExitCode
-dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.DeterministicReport=true
+dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage"
VerifySuccessExitCode
dotnet reportgenerator -reports:**\coverage.cobertura.xml -targetdir:artifacts\coverage -filefilters:-*.g.cs
diff --git a/Directory.Build.props b/Directory.Build.props
index 2b53cab..dbaf920 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,9 +1,9 @@
-
+
$(NoWarn);AV2210
-
+
$(NoWarn);1591
true
true
@@ -13,42 +13,20 @@
true
-
-
- net6.0
- 5.4.0
- 2.20.0
-
- 4.1.0
-
-
- 6.0.*
- 34.0.*
- 3.8.*
- 6.0.*
- 1.1.*
- 6.12.*
- 2.3.*
- 1.3.*
- 2023.3.*
- 2.21.*
- 1.1.*
- 17.8.*
- 2.5.*
-
-
-
-
+
+
enable
+ latest
enable
false
false
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
- 5.4.1
+ $(MSBuildThisFileDirectory)tests.runsettings
+ 5.5.0
diff --git a/JsonApiDotNetCore.MongoDb.sln b/JsonApiDotNetCore.MongoDb.sln
index 0f6c7b7..81b5b78 100644
--- a/JsonApiDotNetCore.MongoDb.sln
+++ b/JsonApiDotNetCore.MongoDb.sln
@@ -26,6 +26,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
CodingGuidelines.ruleset = CodingGuidelines.ruleset
CSharpGuidelinesAnalyzer.config = CSharpGuidelinesAnalyzer.config
Directory.Build.props = Directory.Build.props
+ tests.runsettings = tests.runsettings
+ package-versions.props = package-versions.props
EndProjectSection
EndProject
Global
diff --git a/JsonApiDotNetCore.MongoDb.sln.DotSettings b/JsonApiDotNetCore.MongoDb.sln.DotSettings
index 8e89021..d7699ea 100644
--- a/JsonApiDotNetCore.MongoDb.sln.DotSettings
+++ b/JsonApiDotNetCore.MongoDb.sln.DotSettings
@@ -66,6 +66,7 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
WARNING
WARNING
WARNING
+ SUGGESTION
SUGGESTION
SUGGESTION
DO_NOT_SHOW
@@ -92,7 +93,9 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
WARNING
SUGGESTION
SUGGESTION
+ SUGGESTION
WARNING
+ SUGGESTION
<?xml version="1.0" encoding="utf-16"?><Profile name="JADNC Full Cleanup"><XMLReformatCode>True</XMLReformatCode><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" ArrangeNullCheckingPattern="True" /><CssAlphabetizeProperties>True</CssAlphabetizeProperties><JsInsertSemicolon>True</JsInsertSemicolon><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><JsReformatCode>True</JsReformatCode><JsFormatDocComments>True</JsFormatDocComments><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs><AsInsteadOfCastTs>True</AsInsteadOfCastTs><HtmlReformatCode>True</HtmlReformatCode><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSMakeAutoPropertyGetOnly>True</CSMakeAutoPropertyGetOnly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CssReformatCode>True</CssReformatCode><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSharpFormatDocComments>True</CSharpFormatDocComments><CSReorderTypeMembers>True</CSReorderTypeMembers><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags><CSReformatInactiveBranches>True</CSReformatInactiveBranches></Profile>
JADNC Full Cleanup
Required
@@ -113,6 +116,7 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
True
True
True
+ INDENT
1
1
False
@@ -125,6 +129,7 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
False
False
True
+ 1
NEVER
NEVER
False
@@ -145,6 +150,7 @@ JsonApiDotNetCore.MongoDb.ArgumentGuard.NotNull($EXPR$);
True
WRAP_IF_LONG
160
+ CHOP_IF_LONG
WRAP_IF_LONG
CHOP_ALWAYS
CHOP_ALWAYS
diff --git a/WarningSeverities.DotSettings b/WarningSeverities.DotSettings
index 96f358d..5c641e6 100644
--- a/WarningSeverities.DotSettings
+++ b/WarningSeverities.DotSettings
@@ -124,6 +124,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -163,6 +164,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -240,6 +242,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -258,10 +261,12 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
WARNING
WARNING
WARNING
+ WARNING
\ No newline at end of file
diff --git a/cleanupcode.ps1 b/cleanupcode.ps1
index 23f2a36..a593bd9 100644
--- a/cleanupcode.ps1
+++ b/cleanupcode.ps1
@@ -28,17 +28,17 @@ if ($revision) {
if ($baseCommitHash -eq $headCommitHash) {
Write-Output "Running code cleanup on staged/unstaged files."
- dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified
VerifySuccessExitCode
}
else {
Write-Output "Running code cleanup on commit range $baseCommitHash..$headCommitHash, including staged/unstaged files."
- dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified,commits -a $headCommitHash -b $baseCommitHash
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified,commits -a $headCommitHash -b $baseCommitHash
VerifySuccessExitCode
}
}
else {
Write-Output "Running code cleanup on all files."
- dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN
+ dotnet regitlint -s JsonApiDotNetCore.MongoDb.sln --print-command --skip-tool-check --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN
VerifySuccessExitCode
}
diff --git a/inspectcode.ps1 b/inspectcode.ps1
index dc81b09..13f0abb 100644
--- a/inspectcode.ps1
+++ b/inspectcode.ps1
@@ -10,7 +10,7 @@ if ($LastExitCode -ne 0) {
$outputPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), 'jetbrains-inspectcode-results.xml')
$resultPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), 'jetbrains-inspectcode-results.html')
-dotnet jb inspectcode JsonApiDotNetCore.MongoDb.sln --build --output="$outputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
+dotnet jb inspectcode JsonApiDotNetCore.MongoDb.sln --dotnetcoresdk=$(dotnet --version) --build --output="$outputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
if ($LastExitCode -ne 0) {
throw "Code inspection failed with exit code $LastExitCode"
diff --git a/package-versions.props b/package-versions.props
new file mode 100644
index 0000000..6d226f5
--- /dev/null
+++ b/package-versions.props
@@ -0,0 +1,29 @@
+
+
+
+ 5.5.0
+ 2.20.0
+
+
+ 34.0.*
+ 6.0.*
+ 1.1.*
+ 6.12.*
+ 2.3.*
+ 1.3.*
+ 2.22.*
+ 8.0.*
+ 17.8.*
+ 2.5.*
+
+
+
+
+ 8.0.*
+
+
+
+
+ 6.0.*
+
+
diff --git a/run-docker-mongodb.ps1 b/run-docker-mongodb.ps1
index b1092b4..215b048 100644
--- a/run-docker-mongodb.ps1
+++ b/run-docker-mongodb.ps1
@@ -1,9 +1,6 @@
#Requires -Version 7.0
-# This script starts a docker container with MongoDB database, used for running tests.
+# This script starts a MongoDB database in a docker container, which is required for running examples locally.
-docker container stop jsonapi-dotnet-core-mongodb-testing
-
-docker run --rm --name jsonapi-dotnet-core-mongodb-testing `
- -p 27017:27017 `
- mongo:latest
+docker container stop jsonapi-mongo-db
+docker run --pull always --rm --detach --name jsonapi-mongo-db -p 27017:27017 mongo:latest
diff --git a/src/Examples/GettingStarted/GettingStarted.csproj b/src/Examples/GettingStarted/GettingStarted.csproj
index a5b25ea..0f6b40f 100644
--- a/src/Examples/GettingStarted/GettingStarted.csproj
+++ b/src/Examples/GettingStarted/GettingStarted.csproj
@@ -1,8 +1,10 @@
- $(TargetFrameworkName)
+ net8.0;net6.0
+
+
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Definitions/TodoItemDefinition.cs b/src/Examples/JsonApiDotNetCoreMongoDbExample/Definitions/TodoItemDefinition.cs
index 61027b4..970a061 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Definitions/TodoItemDefinition.cs
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/Definitions/TodoItemDefinition.cs
@@ -5,20 +5,30 @@
using JsonApiDotNetCore.Queries.Expressions;
using JsonApiDotNetCore.Resources;
using JsonApiDotNetCoreMongoDbExample.Models;
+#if NET6_0
using Microsoft.AspNetCore.Authentication;
+#endif
namespace JsonApiDotNetCoreMongoDbExample.Definitions;
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
public sealed class TodoItemDefinition : JsonApiResourceDefinition
{
- private readonly ISystemClock _systemClock;
+ private readonly Func _getUtcNow;
+#if NET6_0
public TodoItemDefinition(IResourceGraph resourceGraph, ISystemClock systemClock)
: base(resourceGraph)
{
- _systemClock = systemClock;
+ _getUtcNow = () => systemClock.UtcNow;
}
+#else
+ public TodoItemDefinition(IResourceGraph resourceGraph, TimeProvider timeProvider)
+ : base(resourceGraph)
+ {
+ _getUtcNow = timeProvider.GetUtcNow;
+ }
+#endif
public override SortExpression OnApplySort(SortExpression? existingSort)
{
@@ -27,22 +37,21 @@ public override SortExpression OnApplySort(SortExpression? existingSort)
private SortExpression GetDefaultSortOrder()
{
- return CreateSortExpressionFromLambda(new PropertySortOrder
- {
+ return CreateSortExpressionFromLambda([
(todoItem => todoItem.Priority, ListSortDirection.Ascending),
(todoItem => todoItem.LastModifiedAt, ListSortDirection.Descending)
- });
+ ]);
}
public override Task OnWritingAsync(TodoItem resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
{
if (writeOperation == WriteOperationKind.CreateResource)
{
- resource.CreatedAt = _systemClock.UtcNow;
+ resource.CreatedAt = _getUtcNow();
}
else if (writeOperation == WriteOperationKind.UpdateResource)
{
- resource.LastModifiedAt = _systemClock.UtcNow;
+ resource.LastModifiedAt = _getUtcNow();
}
return Task.CompletedTask;
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/JsonApiDotNetCoreMongoDbExample.csproj b/src/Examples/JsonApiDotNetCoreMongoDbExample/JsonApiDotNetCoreMongoDbExample.csproj
index a5b25ea..0f6b40f 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/JsonApiDotNetCoreMongoDbExample.csproj
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/JsonApiDotNetCoreMongoDbExample.csproj
@@ -1,8 +1,10 @@
- $(TargetFrameworkName)
+ net8.0;net6.0
+
+
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs b/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
index 9820cb1..e9a8026 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
@@ -4,8 +4,11 @@
using JsonApiDotNetCore.MongoDb.Configuration;
using JsonApiDotNetCore.MongoDb.Repositories;
using JsonApiDotNetCore.Repositories;
-using Microsoft.AspNetCore.Authentication;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using MongoDB.Driver;
+#if NET6_0
+using Microsoft.AspNetCore.Authentication;
+#endif
[assembly: ExcludeFromCodeCoverage]
@@ -13,12 +16,16 @@
// Add services to the container.
-builder.Services.AddSingleton();
+#if NET6_0
+builder.Services.TryAddSingleton();
+#else
+builder.Services.TryAddSingleton(TimeProvider.System);
+#endif
builder.Services.AddSingleton(_ =>
{
- var client = new MongoClient(builder.Configuration.GetSection("DatabaseSettings:ConnectionString").Value);
- return client.GetDatabase(builder.Configuration.GetSection("DatabaseSettings:Database").Value);
+ var client = new MongoClient(builder.Configuration.GetValue("DatabaseSettings:ConnectionString"));
+ return client.GetDatabase(builder.Configuration.GetValue("DatabaseSettings:Database"));
});
builder.Services.AddJsonApi(ConfigureJsonApiOptions, facade => facade.AddCurrentAssembly());
diff --git a/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj b/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
index 50df50f..07d7077 100644
--- a/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
+++ b/src/JsonApiDotNetCore.MongoDb/JsonApiDotNetCore.MongoDb.csproj
@@ -1,10 +1,12 @@
- $(TargetFrameworkName)
+ net8.0;net6.0
true
true
+
+
$(JsonApiDotNetCoreMongoDbVersionPrefix)
jsonapi;json:api;dotnet;asp.net;rest;web-api;MongoDB
diff --git a/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj b/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
index b8d099f..d25aea3 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
+++ b/test/JsonApiDotNetCoreMongoDbTests/JsonApiDotNetCoreMongoDbTests.csproj
@@ -1,8 +1,10 @@
- $(TargetFrameworkName)
+ net8.0;net6.0
+
+
diff --git a/test/TestBuildingBlocks/TestBuildingBlocks.csproj b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
index 9d30f13..954ef72 100644
--- a/test/TestBuildingBlocks/TestBuildingBlocks.csproj
+++ b/test/TestBuildingBlocks/TestBuildingBlocks.csproj
@@ -1,8 +1,10 @@
- $(TargetFrameworkName)
+ net8.0;net6.0
+
+
diff --git a/tests.runsettings b/tests.runsettings
new file mode 100644
index 0000000..db83eb9
--- /dev/null
+++ b/tests.runsettings
@@ -0,0 +1,16 @@
+
+
+
+ true
+
+
+
+
+
+ ObsoleteAttribute,GeneratedCodeAttribute
+ true
+
+
+
+
+
From 69ab6cea742abec1ad7b4f6ce01db052cd1d35fc Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Thu, 23 Nov 2023 03:40:35 +0100
Subject: [PATCH 30/82] Only register IoC services when not already provided
---
src/Examples/GettingStarted/Program.cs | 3 +-
.../Program.cs | 10 ++--
.../ServiceCollectionExtensions.cs | 5 +-
.../AtomicOperationsFixture.cs | 6 +-
.../AtomicTransactionConsistencyTests.cs | 6 +-
.../Meta/ResourceMetaTests.cs | 5 +-
.../Meta/TopLevelCountTests.cs | 5 +-
.../SparseFieldSets/SparseFieldSetTests.cs | 5 +-
...reateResourceWithClientGeneratedIdTests.cs | 2 +-
.../Updating/Resources/UpdateResourceTests.cs | 2 +-
.../Reading/ResourceDefinitionReadTests.cs | 7 ++-
.../IntegrationTestContext.cs | 55 +++++++------------
12 files changed, 52 insertions(+), 59 deletions(-)
diff --git a/src/Examples/GettingStarted/Program.cs b/src/Examples/GettingStarted/Program.cs
index e28c933..220d664 100644
--- a/src/Examples/GettingStarted/Program.cs
+++ b/src/Examples/GettingStarted/Program.cs
@@ -2,13 +2,14 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.MongoDb.Configuration;
using JsonApiDotNetCore.MongoDb.Repositories;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using MongoDB.Driver;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// Add services to the container.
-builder.Services.AddSingleton(_ =>
+builder.Services.TryAddSingleton(_ =>
{
var client = new MongoClient(builder.Configuration.GetSection("DatabaseSettings:ConnectionString").Value);
return client.GetDatabase(builder.Configuration.GetSection("DatabaseSettings:Database").Value);
diff --git a/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs b/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
index e9a8026..95ec278 100644
--- a/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
+++ b/src/Examples/JsonApiDotNetCoreMongoDbExample/Program.cs
@@ -22,19 +22,19 @@
builder.Services.TryAddSingleton(TimeProvider.System);
#endif
-builder.Services.AddSingleton(_ =>
+builder.Services.TryAddSingleton(_ =>
{
var client = new MongoClient(builder.Configuration.GetValue("DatabaseSettings:ConnectionString"));
return client.GetDatabase(builder.Configuration.GetValue("DatabaseSettings:Database"));
});
+builder.Services.TryAddScoped(typeof(IResourceReadRepository<,>), typeof(MongoRepository<,>));
+builder.Services.TryAddScoped(typeof(IResourceWriteRepository<,>), typeof(MongoRepository<,>));
+builder.Services.TryAddScoped(typeof(IResourceRepository<,>), typeof(MongoRepository<,>));
+
builder.Services.AddJsonApi(ConfigureJsonApiOptions, facade => facade.AddCurrentAssembly());
builder.Services.AddJsonApiMongoDb();
-builder.Services.AddScoped(typeof(IResourceReadRepository<,>), typeof(MongoRepository<,>));
-builder.Services.AddScoped(typeof(IResourceWriteRepository<,>), typeof(MongoRepository<,>));
-builder.Services.AddScoped(typeof(IResourceRepository<,>), typeof(MongoRepository<,>));
-
WebApplication app = builder.Build();
// Configure the HTTP request pipeline.
diff --git a/src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs b/src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs
index 836cf87..d39c8c7 100644
--- a/src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs
@@ -5,6 +5,7 @@
using JsonApiDotNetCore.MongoDb.Repositories;
using JsonApiDotNetCore.Queries;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
namespace JsonApiDotNetCore.MongoDb.Configuration;
@@ -16,7 +17,9 @@ public static class ServiceCollectionExtensions
[PublicAPI]
public static IServiceCollection AddJsonApiMongoDb(this IServiceCollection services)
{
- services.AddScoped();
+ services.TryAddScoped();
+
+ // Replace the built-in implementations from JsonApiDotNetCore.
services.AddScoped();
services.AddScoped();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
index 7b0c76b..262a2b6 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
@@ -1,7 +1,7 @@
using JetBrains.Annotations;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations.Meta;
-using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using TestBuildingBlocks;
using Xunit;
@@ -18,9 +18,9 @@ public AtomicOperationsFixture()
TestContext.UseController();
- TestContext.ConfigureServicesAfterStartup(services =>
+ TestContext.ConfigureServices(services =>
{
- services.AddSingleton();
+ services.TryAddSingleton();
services.AddResourceDefinition();
services.AddResourceDefinition();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
index a942fae..5475fcb 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicTransactionConsistencyTests.cs
@@ -2,7 +2,7 @@
using FluentAssertions;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
-using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using TestBuildingBlocks;
using Xunit;
@@ -21,9 +21,9 @@ public AtomicTransactionConsistencyTests(IntegrationTestContext();
- testContext.ConfigureServicesAfterStartup(services =>
+ testContext.ConfigureServices(services =>
{
- services.AddSingleton();
+ services.TryAddSingleton();
services.AddResourceRepository();
services.AddResourceRepository();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/ResourceMetaTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/ResourceMetaTests.cs
index 68b8478..d92419c 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/ResourceMetaTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/ResourceMetaTests.cs
@@ -3,6 +3,7 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using TestBuildingBlocks;
using Xunit;
@@ -21,9 +22,9 @@ public ResourceMetaTests(IntegrationTestContext
testContext.UseController();
- testContext.ConfigureServicesAfterStartup(services =>
+ testContext.ConfigureServices(services =>
{
- services.AddSingleton();
+ services.TryAddSingleton();
services.AddResourceDefinition();
});
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
index 03406ed..2e6a9f3 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
@@ -4,6 +4,7 @@
using JsonApiDotNetCore.Resources;
using JsonApiDotNetCore.Serialization.Objects;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using TestBuildingBlocks;
using Xunit;
@@ -22,9 +23,9 @@ public TopLevelCountTests(IntegrationTestContext
testContext.UseController();
- testContext.ConfigureServicesAfterStartup(services =>
+ testContext.ConfigureServices(services =>
{
- services.AddScoped(typeof(IResourceChangeTracker<>), typeof(NeverSameResourceChangeTracker<>));
+ services.TryAddScoped(typeof(IResourceChangeTracker<>), typeof(NeverSameResourceChangeTracker<>));
});
var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
index d6ee238..13eba01 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
@@ -3,6 +3,7 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using TestBuildingBlocks;
using Xunit;
@@ -23,9 +24,9 @@ public SparseFieldSetTests(IntegrationTestContext();
testContext.UseController();
- testContext.ConfigureServicesAfterStartup(services =>
+ testContext.ConfigureServices(services =>
{
- services.AddSingleton();
+ services.TryAddSingleton();
services.AddResourceRepository>();
services.AddResourceRepository>();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
index 2fc6b88..bbfbafe 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
@@ -22,7 +22,7 @@ public CreateResourceWithClientGeneratedIdTests(IntegrationTestContext();
testContext.UseController();
- testContext.ConfigureServicesAfterStartup(services =>
+ testContext.ConfigureServices(services =>
{
services.AddResourceDefinition();
});
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
index 555e59e..672b836 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
@@ -23,7 +23,7 @@ public UpdateResourceTests(IntegrationTestContext();
testContext.UseController();
- testContext.ConfigureServicesAfterStartup(services =>
+ testContext.ConfigureServices(services =>
{
services.AddResourceDefinition();
services.AddResourceDefinition();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
index 6392c4b..df3364e 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
@@ -3,6 +3,7 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using TestBuildingBlocks;
using Xunit;
@@ -23,10 +24,10 @@ public ResourceDefinitionReadTests(IntegrationTestContext();
testContext.UseController();
- testContext.ConfigureServicesAfterStartup(services =>
+ testContext.ConfigureServices(services =>
{
- services.AddSingleton();
- services.AddSingleton();
+ services.TryAddSingleton();
+ services.TryAddSingleton();
services.AddResourceDefinition();
services.AddResourceDefinition();
diff --git a/test/TestBuildingBlocks/IntegrationTestContext.cs b/test/TestBuildingBlocks/IntegrationTestContext.cs
index fd69d9d..ceeed97 100644
--- a/test/TestBuildingBlocks/IntegrationTestContext.cs
+++ b/test/TestBuildingBlocks/IntegrationTestContext.cs
@@ -11,6 +11,7 @@
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using MongoDB.Driver;
@@ -36,8 +37,7 @@ public class IntegrationTestContext : Integration
private readonly Lazy> _lazyFactory;
private readonly HashSet _resourceClrTypes = new();
private readonly TestControllerProvider _testControllerProvider = new();
-
- private Action? _afterServicesConfiguration;
+ private Action? _configureServices;
protected override JsonSerializerOptions SerializerOptions
{
@@ -86,16 +86,24 @@ private WebApplicationFactory CreateFactory()
{
var factory = new IntegrationTestWebApplicationFactory();
- factory.ConfigureServicesBeforeStartup(services =>
+ factory.ConfigureServices(services =>
{
+ _configureServices?.Invoke(services);
+
services.ReplaceControllers(_testControllerProvider);
- services.AddSingleton(_ =>
+ services.TryAddSingleton(_ =>
{
var client = new MongoClient(_runner.Value.ConnectionString);
- return client.GetDatabase($"JsonApiDotNetCore_MongoDb_{new Random().Next()}_Test");
+ return client.GetDatabase($"JsonApiDotNetCore_MongoDb_{Random.Shared.Next()}_Test");
});
+ services.TryAddScoped();
+
+ services.TryAddScoped(typeof(IResourceReadRepository<,>), typeof(MongoRepository<,>));
+ services.TryAddScoped(typeof(IResourceWriteRepository<,>), typeof(MongoRepository<,>));
+ services.TryAddScoped(typeof(IResourceRepository<,>), typeof(MongoRepository<,>));
+
services.AddJsonApi(ConfigureJsonApiOptions, resources: builder =>
{
foreach (Type resourceClrType in _resourceClrTypes)
@@ -105,16 +113,8 @@ private WebApplicationFactory CreateFactory()
});
services.AddJsonApiMongoDb();
-
- services.AddScoped(typeof(IResourceReadRepository<,>), typeof(MongoRepository<,>));
- services.AddScoped(typeof(IResourceWriteRepository<,>), typeof(MongoRepository<,>));
- services.AddScoped(typeof(IResourceRepository<,>), typeof(MongoRepository<,>));
-
- services.AddScoped();
});
- factory.ConfigureServicesAfterStartup(_afterServicesConfiguration);
-
// We have placed an appsettings.json in the TestBuildingBlock project folder and set the content root to there. Note that controllers
// are not discovered in the content root but are registered manually using IntegrationTestContext.UseController.
return factory.WithWebHostBuilder(builder => builder.UseSolutionRelativeContentRoot($"test/{nameof(TestBuildingBlocks)}"));
@@ -127,9 +127,9 @@ private void ConfigureJsonApiOptions(JsonApiOptions options)
options.SerializerOptions.WriteIndented = true;
}
- public void ConfigureServicesAfterStartup(Action servicesConfiguration)
+ public void ConfigureServices(Action configureServices)
{
- _afterServicesConfiguration = servicesConfiguration;
+ _configureServices = configureServices;
}
public async Task RunOnDatabaseAsync(Func asyncAction)
@@ -162,17 +162,11 @@ public override async Task DisposeAsync()
private sealed class IntegrationTestWebApplicationFactory : WebApplicationFactory
{
- private Action? _beforeServicesConfiguration;
- private Action? _afterServicesConfiguration;
-
- public void ConfigureServicesBeforeStartup(Action? servicesConfiguration)
- {
- _beforeServicesConfiguration = servicesConfiguration;
- }
+ private Action? _configureServices;
- public void ConfigureServicesAfterStartup(Action? servicesConfiguration)
+ public void ConfigureServices(Action? configureServices)
{
- _afterServicesConfiguration = servicesConfiguration;
+ _configureServices = configureServices;
}
protected override IHostBuilder CreateHostBuilder()
@@ -184,21 +178,12 @@ protected override IHostBuilder CreateHostBuilder()
.CreateDefaultBuilder(null)
.ConfigureWebHostDefaults(webBuilder =>
{
- webBuilder.ConfigureServices(services =>
- {
- _beforeServicesConfiguration?.Invoke(services);
- });
-
+ webBuilder.ConfigureServices(services => _configureServices?.Invoke(services));
webBuilder.UseStartup();
-
- webBuilder.ConfigureServices(services =>
- {
- _afterServicesConfiguration?.Invoke(services);
- });
});
- // @formatter:keep_existing_linebreaks restore
// @formatter:wrap_before_first_method_call restore
+ // @formatter:wrap_chained_method_calls restore
}
}
}
From b95817446d6b59d5fd92269a56420a1a37489d04 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Thu, 23 Nov 2023 02:47:41 +0100
Subject: [PATCH 31/82] Resharper: Replace async method with Task return
---
.../AtomicOperations/MongoTransaction.cs | 12 ++++++----
.../Repositories/MongoRepository.cs | 6 ++---
.../AtomicOperationsFixture.cs | 4 ++--
...reateResourceWithClientGeneratedIdTests.cs | 4 ++--
...eateResourceWithToManyRelationshipTests.cs | 4 ++--
...reateResourceWithToOneRelationshipTests.cs | 4 ++--
.../Deleting/AtomicDeleteResourceTests.cs | 4 ++--
.../Meta/AtomicResourceMetaTests.cs | 4 ++--
.../Transactions/AtomicRollbackTests.cs | 8 +++----
.../Transactions/LyricRepository.cs | 4 ++--
.../AtomicAddToToManyRelationshipTests.cs | 8 +++----
...AtomicRemoveFromToManyRelationshipTests.cs | 8 +++----
.../AtomicReplaceToManyRelationshipTests.cs | 8 +++----
.../AtomicUpdateToOneRelationshipTests.cs | 4 ++--
.../AtomicReplaceToManyRelationshipTests.cs | 4 ++--
.../Resources/AtomicUpdateResourceTests.cs | 16 ++++++-------
.../AtomicUpdateToOneRelationshipTests.cs | 4 ++--
.../Meta/TopLevelCountTests.cs | 8 +++----
.../SparseFieldSets/SparseFieldSetTests.cs | 20 ++++++++--------
...reateResourceWithClientGeneratedIdTests.cs | 4 ++--
...eateResourceWithToManyRelationshipTests.cs | 4 ++--
...reateResourceWithToOneRelationshipTests.cs | 4 ++--
.../ReadWrite/Deleting/DeleteResourceTests.cs | 4 ++--
.../Fetching/FetchRelationshipTests.cs | 12 +++++-----
.../ReadWrite/Fetching/FetchResourceTests.cs | 16 ++++++-------
.../ImplicitlyChangingWorkItemDefinition.cs | 6 +++--
...plicitlyChangingWorkItemGroupDefinition.cs | 6 +++--
.../AddToToManyRelationshipTests.cs | 8 +++----
.../RemoveFromToManyRelationshipTests.cs | 8 +++----
.../ReplaceToManyRelationshipTests.cs | 8 +++----
.../UpdateToOneRelationshipTests.cs | 4 ++--
.../ReplaceToManyRelationshipTests.cs | 8 +++----
.../Updating/Resources/UpdateResourceTests.cs | 24 +++++++++----------
.../Resources/UpdateToOneRelationshipTests.cs | 4 ++--
.../Reading/ResourceDefinitionReadTests.cs | 20 ++++++++--------
test/TestBuildingBlocks/IntegrationTest.cs | 24 +++++++++----------
test/TestBuildingBlocks/MongoDbContextShim.cs | 4 ++--
test/TestBuildingBlocks/MongoDbSetShim.cs | 12 +++++-----
38 files changed, 161 insertions(+), 153 deletions(-)
diff --git a/src/JsonApiDotNetCore.MongoDb/AtomicOperations/MongoTransaction.cs b/src/JsonApiDotNetCore.MongoDb/AtomicOperations/MongoTransaction.cs
index 3514e87..3ea882d 100644
--- a/src/JsonApiDotNetCore.MongoDb/AtomicOperations/MongoTransaction.cs
+++ b/src/JsonApiDotNetCore.MongoDb/AtomicOperations/MongoTransaction.cs
@@ -35,20 +35,24 @@ public Task AfterProcessOperationAsync(CancellationToken cancellationToken)
}
///
- public async Task CommitAsync(CancellationToken cancellationToken)
+ public Task CommitAsync(CancellationToken cancellationToken)
{
if (_ownsTransaction && _mongoDataAccess.ActiveSession != null)
{
- await _mongoDataAccess.ActiveSession.CommitTransactionAsync(cancellationToken);
+ return _mongoDataAccess.ActiveSession.CommitTransactionAsync(cancellationToken);
}
+
+ return Task.CompletedTask;
}
///
- public async ValueTask DisposeAsync()
+ public ValueTask DisposeAsync()
{
if (_ownsTransaction)
{
- await _mongoDataAccess.DisposeAsync();
+ return _mongoDataAccess.DisposeAsync();
}
+
+ return ValueTask.CompletedTask;
}
}
diff --git a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
index f983cef..88f3d5e 100644
--- a/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
+++ b/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs
@@ -173,11 +173,11 @@ public virtual async Task CreateAsync(TResource resourceFromRequest, TResource r
await _resourceDefinitionAccessor.OnWritingAsync(resourceForDatabase, WriteOperationKind.CreateResource, cancellationToken);
- await SaveChangesAsync(async () =>
+ await SaveChangesAsync(() =>
{
- await (_mongoDataAccess.ActiveSession != null
+ return _mongoDataAccess.ActiveSession != null
? Collection.InsertOneAsync(_mongoDataAccess.ActiveSession, resourceForDatabase, cancellationToken: cancellationToken)
- : Collection.InsertOneAsync(resourceForDatabase, cancellationToken: cancellationToken));
+ : Collection.InsertOneAsync(resourceForDatabase, cancellationToken: cancellationToken);
}, cancellationToken);
await _resourceDefinitionAccessor.OnWriteSucceededAsync(resourceForDatabase, WriteOperationKind.CreateResource, cancellationToken);
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
index 262a2b6..21db655 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/AtomicOperationsFixture.cs
@@ -32,8 +32,8 @@ public Task InitializeAsync()
return Task.CompletedTask;
}
- public async Task DisposeAsync()
+ public Task DisposeAsync()
{
- await TestContext.DisposeAsync();
+ return TestContext.DisposeAsync();
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
index 7fdf996..27813bc 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs
@@ -132,10 +132,10 @@ public async Task Cannot_create_resource_for_existing_client_generated_ID()
string newIsoCode = _fakers.TextLanguage.Generate().IsoCode!;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.TextLanguages.Add(existingLanguage);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToManyRelationshipTests.cs
index 94eabe3..ad022d4 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToManyRelationshipTests.cs
@@ -25,10 +25,10 @@ public async Task Cannot_create_ToMany_relationship()
string newTitle = _fakers.MusicTrack.Generate().Title;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Performers.Add(existingPerformer);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToOneRelationshipTests.cs
index dd7cf9e..209cdea 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToOneRelationshipTests.cs
@@ -25,10 +25,10 @@ public async Task Cannot_create_ToOne_relationship()
string newLyricText = _fakers.Lyric.Generate().Text;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Deleting/AtomicDeleteResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Deleting/AtomicDeleteResourceTests.cs
index 5721c1b..14f62fb 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Deleting/AtomicDeleteResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Deleting/AtomicDeleteResourceTests.cs
@@ -23,10 +23,10 @@ public async Task Can_delete_existing_resource()
// Arrange
Performer existingPerformer = _fakers.Performer.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Performers.Add(existingPerformer);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs
index a701256..ed87024 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs
@@ -112,10 +112,10 @@ public async Task Returns_resource_meta_in_update_resource_with_side_effects()
TextLanguage existingLanguage = _fakers.TextLanguage.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.TextLanguages.Add(existingLanguage);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicRollbackTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicRollbackTests.cs
index b9db4b1..294df73 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicRollbackTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicRollbackTests.cs
@@ -26,9 +26,9 @@ public async Task Can_rollback_created_resource_on_error()
string newArtistName = _fakers.Performer.Generate().ArtistName!;
DateTimeOffset newBornAt = _fakers.Performer.Generate().BornAt;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
- await dbContext.ClearTableAsync();
+ return dbContext.ClearTableAsync();
});
string unknownPerformerId = Unknown.StringId.For();
@@ -94,10 +94,10 @@ public async Task Can_rollback_updated_resource_on_error()
string newArtistName = _fakers.Performer.Generate().ArtistName!;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Performers.Add(existingPerformer);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string unknownPerformerId = Unknown.StringId.For();
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
index cda8d04..d738e8d 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/LyricRepository.cs
@@ -26,8 +26,8 @@ public LyricRepository(IMongoDataAccess mongoDataAccess, ITargetedFields targete
_transaction = factory.BeginTransactionAsync(CancellationToken.None).Result;
}
- public async ValueTask DisposeAsync()
+ public ValueTask DisposeAsync()
{
- await _transaction.DisposeAsync();
+ return _transaction.DisposeAsync();
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicAddToToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicAddToToManyRelationshipTests.cs
index bf4edda..d15f9d0 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicAddToToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicAddToToManyRelationshipTests.cs
@@ -24,11 +24,11 @@ public async Task Cannot_add_to_OneToMany_relationship()
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
Performer existingPerformer = _fakers.Performer.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Performers.Add(existingPerformer);
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -81,11 +81,11 @@ public async Task Cannot_add_to_ManyToMany_relationship()
Playlist existingPlaylist = _fakers.Playlist.Generate();
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.MusicTracks.Add(existingTrack);
dbContext.Playlists.Add(existingPlaylist);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicRemoveFromToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicRemoveFromToManyRelationshipTests.cs
index cb17dcd..857f7c5 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicRemoveFromToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicRemoveFromToManyRelationshipTests.cs
@@ -24,11 +24,11 @@ public async Task Cannot_remove_from_OneToMany_relationship()
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
existingTrack.Performers = _fakers.Performer.Generate(1);
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Performers.Add(existingTrack.Performers[0]);
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -81,11 +81,11 @@ public async Task Cannot_remove_from_ManyToMany_relationship()
Playlist existingPlaylist = _fakers.Playlist.Generate();
existingPlaylist.Tracks = _fakers.MusicTrack.Generate(1);
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.MusicTracks.Add(existingPlaylist.Tracks[0]);
dbContext.Playlists.Add(existingPlaylist);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicReplaceToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicReplaceToManyRelationshipTests.cs
index 27d679a..b716339 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicReplaceToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicReplaceToManyRelationshipTests.cs
@@ -24,11 +24,11 @@ public async Task Cannot_replace_OneToMany_relationship()
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
Performer existingPerformer = _fakers.Performer.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Performers.Add(existingPerformer);
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -81,11 +81,11 @@ public async Task Cannot_replace_ManyToMany_relationship()
Playlist existingPlaylist = _fakers.Playlist.Generate();
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.MusicTracks.Add(existingTrack);
dbContext.Playlists.Add(existingPlaylist);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicUpdateToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicUpdateToOneRelationshipTests.cs
index 0f80aee..dccab27 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicUpdateToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Relationships/AtomicUpdateToOneRelationshipTests.cs
@@ -24,11 +24,11 @@ public async Task Cannot_create_ManyToOne_relationship()
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
RecordCompany existingCompany = _fakers.RecordCompany.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.RecordCompanies.Add(existingCompany);
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicReplaceToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicReplaceToManyRelationshipTests.cs
index 162bacb..833bdd3 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicReplaceToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicReplaceToManyRelationshipTests.cs
@@ -24,11 +24,11 @@ public async Task Cannot_replace_ToMany_relationship()
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
Performer existingPerformer = _fakers.Performer.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Performers.Add(existingPerformer);
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs
index 95a65e9..7ae1426 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs
@@ -89,10 +89,10 @@ public async Task Can_update_resource_without_attributes_or_relationships()
// Arrange
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -144,10 +144,10 @@ public async Task Can_partially_update_resource_without_side_effects()
string newGenre = _fakers.MusicTrack.Generate().Genre!;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -202,10 +202,10 @@ public async Task Can_completely_update_resource_without_side_effects()
string newGenre = _fakers.MusicTrack.Generate().Genre!;
DateTimeOffset newReleasedAt = _fakers.MusicTrack.Generate().ReleasedAt;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.MusicTracks.Add(existingTrack);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -259,10 +259,10 @@ public async Task Can_update_resource_with_side_effects()
TextLanguage existingLanguage = _fakers.TextLanguage.Generate();
string newIsoCode = _fakers.TextLanguage.Generate().IsoCode!;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.TextLanguages.Add(existingLanguage);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateToOneRelationshipTests.cs
index 0e0562a..df60664 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateToOneRelationshipTests.cs
@@ -24,11 +24,11 @@ public async Task Cannot_create_ToOne_relationship()
Lyric existingLyric = _fakers.Lyric.Generate();
MusicTrack existingTrack = _fakers.MusicTrack.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.MusicTracks.Add(existingTrack);
dbContext.Lyrics.Add(existingLyric);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
index 2e6a9f3..a1d9dde 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/Meta/TopLevelCountTests.cs
@@ -62,9 +62,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
public async Task Renders_resource_count_for_empty_collection()
{
// Arrange
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
- await dbContext.ClearTableAsync();
+ return dbContext.ClearTableAsync();
});
const string route = "/supportTickets";
@@ -117,10 +117,10 @@ public async Task Hides_resource_count_in_update_resource_response()
string newDescription = _fakers.SupportTicket.Generate().Description;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.SupportTickets.Add(existingTicket);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
index 13eba01..2e6b7be 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/QueryStrings/SparseFieldSets/SparseFieldSetTests.cs
@@ -120,10 +120,10 @@ public async Task Can_select_attribute_in_primary_resource_by_ID()
BlogPost post = _fakers.BlogPost.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Posts.Add(post);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/blogPosts/{post.StringId}?fields[blogPosts]=url";
@@ -151,10 +151,10 @@ public async Task Cannot_select_fields_of_ManyToOne_relationship()
// Arrange
BlogPost post = _fakers.BlogPost.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Posts.Add(post);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/blogPosts/{post.StringId}?fields[webAccounts]=displayName,emailAddress,preferences";
@@ -180,10 +180,10 @@ public async Task Cannot_select_fields_of_OneToMany_relationship()
// Arrange
WebAccount account = _fakers.WebAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Accounts.Add(account);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/webAccounts/{account.StringId}?fields[blogPosts]=caption,labels";
@@ -209,10 +209,10 @@ public async Task Cannot_select_fields_of_ManyToMany_relationship()
// Arrange
BlogPost post = _fakers.BlogPost.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Posts.Add(post);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/blogPosts/{post.StringId}?fields[labels]=color";
@@ -312,10 +312,10 @@ public async Task Fetches_all_scalar_properties_when_fieldset_contains_readonly_
Blog blog = _fakers.Blog.Generate();
blog.IsPublished = true;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Blogs.Add(blog);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/blogs/{blog.StringId}?fields[blogs]=showAdvertisements";
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
index bbfbafe..0152168 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs
@@ -205,10 +205,10 @@ public async Task Cannot_create_resource_for_existing_client_generated_ID()
string newDisplayName = _fakers.RgbColor.Generate().DisplayName;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.RgbColors.Add(existingColor);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToManyRelationshipTests.cs
index e0d92de..f021d9b 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToManyRelationshipTests.cs
@@ -26,10 +26,10 @@ public async Task Cannot_create_resource_with_ToMany_relationship()
// Arrange
UserAccount? existingUserAccount = _fakers.UserAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(existingUserAccount);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToOneRelationshipTests.cs
index be6732c..f02131d 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithToOneRelationshipTests.cs
@@ -29,11 +29,11 @@ public async Task Cannot_create_resource_with_ToOne_relationship()
string newGroupName = _fakers.WorkItemGroup.Generate().Name;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.RgbColors.Add(existingGroup.Color);
dbContext.Groups.Add(existingGroup);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Deleting/DeleteResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Deleting/DeleteResourceTests.cs
index 3e1bb87..c00fd07 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Deleting/DeleteResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Deleting/DeleteResourceTests.cs
@@ -26,10 +26,10 @@ public async Task Can_delete_existing_resource()
// Arrange
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/workItems/{existingWorkItem.StringId}";
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchRelationshipTests.cs
index 6a9e32c..a7f74eb 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchRelationshipTests.cs
@@ -26,10 +26,10 @@ public async Task Cannot_get_ManyToOne_relationship()
{
WorkItem workItem = _fakers.WorkItem.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkItems.Add(workItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/workItems/{workItem.StringId}/relationships/assignee";
@@ -55,10 +55,10 @@ public async Task Cannot_get_OneToMany_relationship()
// Arrange
UserAccount userAccount = _fakers.UserAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(userAccount);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/userAccounts/{userAccount.StringId}/relationships/assignedItems";
@@ -84,10 +84,10 @@ public async Task Cannot_get_ManyToMany_relationship()
// Arrange
WorkItem workItem = _fakers.WorkItem.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkItems.Add(workItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/workItems/{workItem.StringId}/relationships/tags";
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchResourceTests.cs
index 39a52d6..c8ff584 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Fetching/FetchResourceTests.cs
@@ -65,10 +65,10 @@ public async Task Can_get_primary_resource_by_ID()
// Arrange
WorkItem workItem = _fakers.WorkItem.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkItems.Add(workItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/workItems/{workItem.StringId}";
@@ -116,10 +116,10 @@ public async Task Cannot_get_secondary_ManyToOne_resource()
// Arrange
WorkItem workItem = _fakers.WorkItem.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkItems.Add(workItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/workItems/{workItem.StringId}/assignee";
@@ -145,10 +145,10 @@ public async Task Cannot_get_secondary_OneToMany_resources()
// Arrange
UserAccount userAccount = _fakers.UserAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(userAccount);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/userAccounts/{userAccount.StringId}/assignedItems";
@@ -174,10 +174,10 @@ public async Task Cannot_get_secondary_ManyToMany_resources()
// Arrange
WorkItem workItem = _fakers.WorkItem.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkItems.Add(workItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/workItems/{workItem.StringId}/tags";
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs
index 4ccfb12..61f68e1 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs
@@ -22,11 +22,11 @@ public ImplicitlyChangingWorkItemDefinition(IResourceGraph resourceGraph, ReadWr
_dbContext = dbContext;
}
- public override async Task OnWriteSucceededAsync(WorkItem resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
+ public override Task OnWriteSucceededAsync(WorkItem resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
{
if (writeOperation is not WriteOperationKind.DeleteResource)
{
- await _dbContext.WorkItems.ExecuteAsync(async collection =>
+ return _dbContext.WorkItems.ExecuteAsync(async collection =>
{
resource.Description += Suffix;
@@ -34,5 +34,7 @@ await _dbContext.WorkItems.ExecuteAsync(async collection =>
await collection.ReplaceOneAsync(filter, resource, cancellationToken: cancellationToken);
});
}
+
+ return Task.CompletedTask;
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemGroupDefinition.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemGroupDefinition.cs
index a01c45e..3d4e846 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemGroupDefinition.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemGroupDefinition.cs
@@ -22,11 +22,11 @@ public ImplicitlyChangingWorkItemGroupDefinition(IResourceGraph resourceGraph, R
_dbContext = dbContext;
}
- public override async Task OnWriteSucceededAsync(WorkItemGroup resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
+ public override Task OnWriteSucceededAsync(WorkItemGroup resource, WriteOperationKind writeOperation, CancellationToken cancellationToken)
{
if (writeOperation is not WriteOperationKind.DeleteResource)
{
- await _dbContext.Groups.ExecuteAsync(async collection =>
+ return _dbContext.Groups.ExecuteAsync(async collection =>
{
resource.Name += Suffix;
@@ -34,5 +34,7 @@ await _dbContext.Groups.ExecuteAsync(async collection =>
await collection.ReplaceOneAsync(filter, resource, cancellationToken: cancellationToken);
});
}
+
+ return Task.CompletedTask;
}
}
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/AddToToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/AddToToManyRelationshipTests.cs
index c2fd820..970c893 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/AddToToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/AddToToManyRelationshipTests.cs
@@ -27,11 +27,11 @@ public async Task Cannot_add_to_OneToMany_relationship()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
UserAccount existingSubscriber = _fakers.UserAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(existingSubscriber);
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -70,11 +70,11 @@ public async Task Cannot_add_to_ManyToMany_relationship()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
WorkTag existingTag = _fakers.WorkTag.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkTags.Add(existingTag);
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs
index eab8111..22dd312 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs
@@ -27,11 +27,11 @@ public async Task Cannot_remove_from_OneToMany_relationship()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
existingWorkItem.Subscribers = _fakers.UserAccount.Generate(1).ToHashSet();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(existingWorkItem.Subscribers.ElementAt(0));
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -70,11 +70,11 @@ public async Task Cannot_remove_from_ManyToMany_relationship()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
existingWorkItem.Tags = _fakers.WorkTag.Generate(1).ToHashSet();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkTags.Add(existingWorkItem.Tags.ElementAt(0));
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/ReplaceToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/ReplaceToManyRelationshipTests.cs
index 9df3deb..0d623d7 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/ReplaceToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/ReplaceToManyRelationshipTests.cs
@@ -27,11 +27,11 @@ public async Task Cannot_replace_OneToMany_relationship()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
UserAccount existingSubscriber = _fakers.UserAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(existingSubscriber);
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -70,11 +70,11 @@ public async Task Cannot_replace_ManyToMany_relationship()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
WorkTag existingTag = _fakers.WorkTag.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkTags.Add(existingTag);
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/UpdateToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/UpdateToOneRelationshipTests.cs
index ddd0f1d..38168eb 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/UpdateToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Relationships/UpdateToOneRelationshipTests.cs
@@ -27,11 +27,11 @@ public async Task Cannot_replace_ToOne_relationship()
WorkItemGroup existingGroup = _fakers.WorkItemGroup.Generate();
RgbColor existingColor = _fakers.RgbColor.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.RgbColors.Add(existingColor);
dbContext.Groups.Add(existingGroup);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/ReplaceToManyRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/ReplaceToManyRelationshipTests.cs
index f7fa710..fe61fa8 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/ReplaceToManyRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/ReplaceToManyRelationshipTests.cs
@@ -27,11 +27,11 @@ public async Task Cannot_replace_OneToMany_relationship()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
UserAccount existingSubscriber = _fakers.UserAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(existingSubscriber);
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -81,11 +81,11 @@ public async Task Cannot_replace_ManyToMany_relationship()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
WorkTag existingTag = _fakers.WorkTag.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkTags.Add(existingTag);
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
index 672b836..6163c5e 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateResourceTests.cs
@@ -36,10 +36,10 @@ public async Task Can_update_resource_without_attributes_or_relationships()
// Arrange
UserAccount existingUserAccount = _fakers.UserAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(existingUserAccount);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -83,10 +83,10 @@ public async Task Can_partially_update_resource_with_string_ID()
WorkItemGroup existingGroup = _fakers.WorkItemGroup.Generate();
string newName = _fakers.WorkItemGroup.Generate().Name;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Groups.Add(existingGroup);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -135,10 +135,10 @@ public async Task Can_completely_update_resource_with_string_ID()
RgbColor existingColor = _fakers.RgbColor.Generate();
string newDisplayName = _fakers.RgbColor.Generate().DisplayName;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.RgbColors.Add(existingColor);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -179,10 +179,10 @@ public async Task Can_update_resource_without_side_effects()
UserAccount existingUserAccount = _fakers.UserAccount.Generate();
UserAccount newUserAccount = _fakers.UserAccount.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.UserAccounts.Add(existingUserAccount);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -225,10 +225,10 @@ public async Task Can_update_resource_with_side_effects()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
string newDescription = _fakers.WorkItem.Generate().Description!;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
@@ -281,10 +281,10 @@ public async Task Can_update_resource_with_side_effects_with_primary_fieldset()
WorkItem existingWorkItem = _fakers.WorkItem.Generate();
string newDescription = _fakers.WorkItem.Generate().Description!;
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.WorkItems.Add(existingWorkItem);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateToOneRelationshipTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateToOneRelationshipTests.cs
index c1e99fc..de4ddbc 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateToOneRelationshipTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Updating/Resources/UpdateToOneRelationshipTests.cs
@@ -27,11 +27,11 @@ public async Task Cannot_create_ToOne_relationship()
WorkItemGroup existingGroup = _fakers.WorkItemGroup.Generate();
RgbColor existingColor = _fakers.RgbColor.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.RgbColors.Add(existingColor);
dbContext.Groups.Add(existingGroup);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
var requestBody = new
diff --git a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
index df3364e..69bc808 100644
--- a/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
+++ b/test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs
@@ -300,10 +300,10 @@ public async Task Attribute_inclusion_from_resource_definition_is_applied_for_om
Star star = _fakers.Star.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Stars.Add(star);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/stars/{star.StringId}";
@@ -340,10 +340,10 @@ public async Task Attribute_inclusion_from_resource_definition_is_applied_for_fi
Star star = _fakers.Star.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Stars.Add(star);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/stars/{star.StringId}?fields[stars]=name,solarRadius";
@@ -381,10 +381,10 @@ public async Task Attribute_exclusion_from_resource_definition_is_applied_for_om
Star star = _fakers.Star.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Stars.Add(star);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/stars/{star.StringId}";
@@ -421,10 +421,10 @@ public async Task Attribute_exclusion_from_resource_definition_is_applied_for_fi
Star star = _fakers.Star.Generate();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Stars.Add(star);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/stars/{star.StringId}?fields[stars]=name,isVisibleFromEarth";
@@ -558,10 +558,10 @@ public async Task Queryable_parameter_handler_from_resource_definition_is_not_ap
Planet planet = _fakers.Planet.Generate();
planet.Moons = _fakers.Moon.Generate(1).ToHashSet();
- await _testContext.RunOnDatabaseAsync(async dbContext =>
+ await _testContext.RunOnDatabaseAsync(dbContext =>
{
dbContext.Planets.Add(planet);
- await dbContext.SaveChangesAsync();
+ return dbContext.SaveChangesAsync();
});
string route = $"/planets/{planet.StringId}/moons?isLargerThanTheSun=false";
diff --git a/test/TestBuildingBlocks/IntegrationTest.cs b/test/TestBuildingBlocks/IntegrationTest.cs
index 50fc3fd..2080a47 100644
--- a/test/TestBuildingBlocks/IntegrationTest.cs
+++ b/test/TestBuildingBlocks/IntegrationTest.cs
@@ -22,34 +22,34 @@ static IntegrationTest()
ThrottleSemaphore = new SemaphoreSlim(maxConcurrentTestRuns);
}
- public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteGetAsync(string requestUrl,
+ public Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteGetAsync(string requestUrl,
Action? setRequestHeaders = null)
{
- return await ExecuteRequestAsync(HttpMethod.Get, requestUrl, null, null, setRequestHeaders);
+ return ExecuteRequestAsync(HttpMethod.Get, requestUrl, null, null, setRequestHeaders);
}
- public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePostAsync(string requestUrl,
+ public Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePostAsync(string requestUrl,
object requestBody, string contentType = HeaderConstants.MediaType, Action? setRequestHeaders = null)
{
- return await ExecuteRequestAsync(HttpMethod.Post, requestUrl, requestBody, contentType, setRequestHeaders);
+ return ExecuteRequestAsync(HttpMethod.Post, requestUrl, requestBody, contentType, setRequestHeaders);
}
- public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePostAtomicAsync(string requestUrl,
+ public Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePostAtomicAsync(string requestUrl,
object requestBody, string contentType = HeaderConstants.AtomicOperationsMediaType, Action? setRequestHeaders = null)
{
- return await ExecuteRequestAsync(HttpMethod.Post, requestUrl, requestBody, contentType, setRequestHeaders);
+ return ExecuteRequestAsync(HttpMethod.Post, requestUrl, requestBody, contentType, setRequestHeaders);
}
- public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePatchAsync(string requestUrl,
+ public Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecutePatchAsync(string requestUrl,
object requestBody, string contentType = HeaderConstants.MediaType, Action? setRequestHeaders = null)
{
- return await ExecuteRequestAsync(HttpMethod.Patch, requestUrl, requestBody, contentType, setRequestHeaders);
+ return ExecuteRequestAsync(HttpMethod.Patch, requestUrl, requestBody, contentType, setRequestHeaders);
}
- public async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteDeleteAsync(string requestUrl,
+ public Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteDeleteAsync(string requestUrl,
object? requestBody = null, string contentType = HeaderConstants.MediaType, Action? setRequestHeaders = null)
{
- return await ExecuteRequestAsync(HttpMethod.Delete, requestUrl, requestBody, contentType, setRequestHeaders);
+ return ExecuteRequestAsync(HttpMethod.Delete, requestUrl, requestBody, contentType, setRequestHeaders);
}
private async Task<(HttpResponseMessage httpResponse, TResponseDocument responseDocument)> ExecuteRequestAsync(HttpMethod method,
@@ -110,9 +110,9 @@ static IntegrationTest()
}
}
- public async Task InitializeAsync()
+ public Task InitializeAsync()
{
- await ThrottleSemaphore.WaitAsync();
+ return ThrottleSemaphore.WaitAsync();
}
public virtual Task DisposeAsync()
diff --git a/test/TestBuildingBlocks/MongoDbContextShim.cs b/test/TestBuildingBlocks/MongoDbContextShim.cs
index 323af40..0800553 100644
--- a/test/TestBuildingBlocks/MongoDbContextShim.cs
+++ b/test/TestBuildingBlocks/MongoDbContextShim.cs
@@ -27,10 +27,10 @@ protected MongoDbSetShim Set()
return dbSetShim;
}
- public async Task ClearTableAsync()
+ public Task ClearTableAsync()
where TEntity : IMongoIdentifiable
{
- await _database.DropCollectionAsync(typeof(TEntity).Name);
+ return _database.DropCollectionAsync(typeof(TEntity).Name);
}
public async Task SaveChangesAsync(CancellationToken cancellation = default)
diff --git a/test/TestBuildingBlocks/MongoDbSetShim.cs b/test/TestBuildingBlocks/MongoDbSetShim.cs
index 7e58223..b78de5d 100644
--- a/test/TestBuildingBlocks/MongoDbSetShim.cs
+++ b/test/TestBuildingBlocks/MongoDbSetShim.cs
@@ -57,9 +57,9 @@ internal override async Task PersistAsync(CancellationToken cancellationToken)
}
}
- public async Task ExecuteAsync(Func, Task> action)
+ public Task ExecuteAsync(Func, Task> action)
{
- await action(_collection);
+ return action(_collection);
}
public async Task FirstWithIdAsync(string? id, CancellationToken cancellationToken = default)
@@ -79,13 +79,13 @@ public async Task