diff --git a/src/.config/dotnet-tools.json b/src/.config/dotnet-tools.json index 14534e3a..642de1e2 100644 --- a/src/.config/dotnet-tools.json +++ b/src/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": false, "tools": { "dotnet-grpc": { - "version": "2.62.0", + "version": "2.66.0", "commands": [ "dotnet-grpc" ] diff --git a/src/ProjectOrigin.WalletSystem.IntegrationTests/ApiTests/ApiTests.cs b/src/ProjectOrigin.WalletSystem.IntegrationTests/ApiTests/ApiTests.cs index 0e5e7765..5e9f4d17 100644 --- a/src/ProjectOrigin.WalletSystem.IntegrationTests/ApiTests/ApiTests.cs +++ b/src/ProjectOrigin.WalletSystem.IntegrationTests/ApiTests/ApiTests.cs @@ -303,7 +303,9 @@ public async Task can_query_claims() var settings = new VerifySettings(); settings.ScrubMember("UpdatedAt"); await Verifier.Verify(resultWithoutFiltersContent, settings); - resultWithUpdatedSince.Result.Should().NotBeEmpty(); + + resultWithUpdatedSince.Should().NotBeNull(); + resultWithUpdatedSince!.Result.Should().NotBeEmpty(); resultWithUpdatedSince.Result.Should().BeInAscendingOrder(x => x.UpdatedAt); resultWithoutFiltersJson.Should().Be(resultWithFilterStart); resultWithoutFiltersJson.Should().Be(resultWithFilterEnd); diff --git a/src/ProjectOrigin.WalletSystem.IntegrationTests/ApiTests/ApiTests.open_api_specification_not_changed.verified.txt b/src/ProjectOrigin.WalletSystem.IntegrationTests/ApiTests/ApiTests.open_api_specification_not_changed.verified.txt index 698e0b25..e9ba43ef 100644 --- a/src/ProjectOrigin.WalletSystem.IntegrationTests/ApiTests/ApiTests.open_api_specification_not_changed.verified.txt +++ b/src/ProjectOrigin.WalletSystem.IntegrationTests/ApiTests/ApiTests.open_api_specification_not_changed.verified.txt @@ -223,6 +223,7 @@ "name": "TimeAggregate", "in": "query", "description": "The size of each bucket in the aggregation.", + "required": true, "schema": { "$ref": "#/components/schemas/TimeAggregate" } @@ -231,6 +232,7 @@ "name": "TimeZone", "in": "query", "description": "The time zone. See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for a list of valid time zones.", + "required": true, "schema": { "type": "string" } @@ -484,6 +486,7 @@ "name": "TimeAggregate", "in": "query", "description": "The size of each bucket in the aggregation", + "required": true, "schema": { "$ref": "#/components/schemas/TimeAggregate" } @@ -492,6 +495,7 @@ "name": "TimeZone", "in": "query", "description": "The time zone. See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for a list of valid time zones.", + "required": true, "schema": { "type": "string" } @@ -831,6 +835,7 @@ "name": "TimeAggregate", "in": "query", "description": "The size of each bucket in the aggregation", + "required": true, "schema": { "$ref": "#/components/schemas/TimeAggregate" } @@ -839,6 +844,7 @@ "name": "TimeZone", "in": "query", "description": "The time zone. See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for a list of valid time zones.", + "required": true, "schema": { "type": "string" } @@ -1109,6 +1115,12 @@ "components": { "schemas": { "AggregatedCertificates": { + "required": [ + "end", + "quantity", + "start", + "type" + ], "type": "object", "properties": { "start": { @@ -1134,6 +1146,10 @@ "description": "A result of aggregated certificates that is available to use in the wallet." }, "AggregatedCertificatesPageInfoResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1149,6 +1165,11 @@ "additionalProperties": false }, "AggregatedClaims": { + "required": [ + "end", + "quantity", + "start" + ], "type": "object", "properties": { "start": { @@ -1171,6 +1192,10 @@ "description": "A result of aggregated claims." }, "AggregatedClaimsPageInfoResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1186,6 +1211,11 @@ "additionalProperties": false }, "AggregatedTransfers": { + "required": [ + "end", + "quantity", + "start" + ], "type": "object", "properties": { "start": { @@ -1208,6 +1238,10 @@ "description": "A result of aggregated transfers." }, "AggregatedTransfersPageInfoResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1245,6 +1279,13 @@ "type": "string" }, "Claim": { + "required": [ + "claimId", + "consumptionCertificate", + "productionCertificate", + "quantity", + "updatedAt" + ], "type": "object", "properties": { "claimId": { @@ -1270,6 +1311,10 @@ "description": "A claim record representing a claim of a production and consumption certificate." }, "ClaimPageInfoCursorResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1285,6 +1330,10 @@ "additionalProperties": false }, "ClaimPageInfoResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1300,6 +1349,11 @@ "additionalProperties": false }, "ClaimRequest": { + "required": [ + "consumptionCertificateId", + "productionCertificateId", + "quantity" + ], "type": "object", "properties": { "productionCertificateId": { @@ -1318,6 +1372,9 @@ "description": "A request to claim a production and consumption certificate." }, "ClaimResponse": { + "required": [ + "claimRequestId" + ], "type": "object", "properties": { "claimRequestId": { @@ -1330,6 +1387,13 @@ "description": "A response to a claim request." }, "ClaimedCertificate": { + "required": [ + "attributes", + "end", + "federatedStreamId", + "gridArea", + "start" + ], "type": "object", "properties": { "federatedStreamId": { @@ -1361,6 +1425,10 @@ "description": "Info record of a claimed certificate." }, "CreateExternalEndpointRequest": { + "required": [ + "textReference", + "walletReference" + ], "type": "object", "properties": { "walletReference": { @@ -1375,6 +1443,9 @@ "description": "Request to create a new external endpoint." }, "CreateExternalEndpointResponse": { + "required": [ + "receiverId" + ], "type": "object", "properties": { "receiverId": { @@ -1387,6 +1458,9 @@ "description": "Response to create a new external endpoint." }, "CreateWalletEndpointResponse": { + "required": [ + "walletReference" + ], "type": "object", "properties": { "walletReference": { @@ -1422,6 +1496,10 @@ "description": "Response to create a new wallet." }, "FederatedStreamId": { + "required": [ + "registry", + "streamId" + ], "type": "object", "properties": { "registry": { @@ -1435,6 +1513,15 @@ "additionalProperties": false }, "GranularCertificate": { + "required": [ + "attributes", + "certificateType", + "end", + "federatedStreamId", + "gridArea", + "quantity", + "start" + ], "type": "object", "properties": { "federatedStreamId": { @@ -1474,6 +1561,10 @@ "description": "A certificate that is available to use in the wallet." }, "GranularCertificatePageInfoCursorResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1489,6 +1580,10 @@ "additionalProperties": false }, "GranularCertificatePageInfoResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1504,6 +1599,11 @@ "additionalProperties": false }, "HashedAttribute": { + "required": [ + "key", + "salt", + "value" + ], "type": "object", "properties": { "key": { @@ -1528,6 +1628,12 @@ "additionalProperties": false }, "PageInfo": { + "required": [ + "count", + "limit", + "offset", + "total" + ], "type": "object", "properties": { "count": { @@ -1550,6 +1656,12 @@ "additionalProperties": false }, "PageInfoCursor": { + "required": [ + "count", + "limit", + "total", + "updatedAt" + ], "type": "object", "properties": { "count": { @@ -1600,6 +1712,14 @@ "additionalProperties": { } }, "ReceiveRequest": { + "required": [ + "certificateId", + "hashedAttributes", + "position", + "publicKey", + "quantity", + "randomR" + ], "type": "object", "properties": { "publicKey": { @@ -1645,6 +1765,9 @@ "type": "string" }, "RequestStatusResponse": { + "required": [ + "status" + ], "type": "object", "properties": { "status": { @@ -1668,6 +1791,14 @@ "type": "string" }, "Transfer": { + "required": [ + "end", + "federatedStreamId", + "gridArea", + "quantity", + "receiverId", + "start" + ], "type": "object", "properties": { "federatedStreamId": { @@ -1696,6 +1827,10 @@ "description": "A transfer record of a transfer of a part of a certificate to another wallet." }, "TransferPageInfoCursorResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1711,6 +1846,10 @@ "additionalProperties": false }, "TransferPageInfoResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { @@ -1726,6 +1865,12 @@ "additionalProperties": false }, "TransferRequest": { + "required": [ + "certificateId", + "hashedAttributes", + "quantity", + "receiverId" + ], "type": "object", "properties": { "certificateId": { @@ -1753,6 +1898,9 @@ "description": "A request to transfer a certificate to another wallet." }, "TransferResponse": { + "required": [ + "transferRequestId" + ], "type": "object", "properties": { "transferRequestId": { @@ -1765,6 +1913,11 @@ "description": "A response to a transfer request." }, "WalletEndpointReference": { + "required": [ + "endpoint", + "publicKey", + "version" + ], "type": "object", "properties": { "version": { @@ -1784,6 +1937,10 @@ "additionalProperties": false }, "WalletRecord": { + "required": [ + "id", + "publicKey" + ], "type": "object", "properties": { "id": { @@ -1798,6 +1955,10 @@ "description": "A wallet record" }, "WalletRecordPageInfoResultList": { + "required": [ + "metadata", + "result" + ], "type": "object", "properties": { "result": { diff --git a/src/ProjectOrigin.WalletSystem.IntegrationTests/CommandHandlers/VerifySliceCommandHandlerTests.cs b/src/ProjectOrigin.WalletSystem.IntegrationTests/CommandHandlers/VerifySliceCommandHandlerTests.cs index e3228de4..d0e80956 100644 --- a/src/ProjectOrigin.WalletSystem.IntegrationTests/CommandHandlers/VerifySliceCommandHandlerTests.cs +++ b/src/ProjectOrigin.WalletSystem.IntegrationTests/CommandHandlers/VerifySliceCommandHandlerTests.cs @@ -78,7 +78,7 @@ public async Task DisposeAsync() } [Fact] - public async void WhenWalletSliceIsValid_ExpectIsConvertedToSliceAndCertificateIsCreated() + public async Task WhenWalletSliceIsValid_ExpectIsConvertedToSliceAndCertificateIsCreated() { // Arrange var certId = Guid.NewGuid(); @@ -137,7 +137,7 @@ await _certificateRepository.Received(1).InsertWalletSlice(Arg.Is(x } [Fact] - public async void WhenCertificateNotFound_CompleteAndWriteWarning() + public async Task WhenCertificateNotFound_CompleteAndWriteWarning() { // Arrange var certId = Guid.NewGuid(); @@ -188,7 +188,7 @@ public async void WhenCertificateNotFound_CompleteAndWriteWarning() } [Fact] - public async void WhenTransientException_FaultedWithTransient() + public async Task WhenTransientException_FaultedWithTransient() { var innerException = new Exception("Could not connect to registry"); @@ -242,7 +242,7 @@ public async void WhenTransientException_FaultedWithTransient() } [Fact] - public async void WhenFailure_FaultedWithTransient() + public async Task WhenFailure_FaultedWithTransient() { var innerException = new Exception("Could not connect to registry"); @@ -296,7 +296,7 @@ public async void WhenFailure_FaultedWithTransient() } [Fact] - public async void WhenSliceNotFound() + public async Task WhenSliceNotFound() { // Arrange var certId = Guid.NewGuid(); @@ -351,7 +351,7 @@ public async void WhenSliceNotFound() } [Fact] - public async void WhenInvalidKey() + public async Task WhenInvalidKey() { // Arrange var certId = Guid.NewGuid(); diff --git a/src/ProjectOrigin.WalletSystem.IntegrationTests/ProjectOrigin.WalletSystem.IntegrationTests.csproj b/src/ProjectOrigin.WalletSystem.IntegrationTests/ProjectOrigin.WalletSystem.IntegrationTests.csproj index 3e539ebf..c168ae5c 100644 --- a/src/ProjectOrigin.WalletSystem.IntegrationTests/ProjectOrigin.WalletSystem.IntegrationTests.csproj +++ b/src/ProjectOrigin.WalletSystem.IntegrationTests/ProjectOrigin.WalletSystem.IntegrationTests.csproj @@ -9,14 +9,14 @@ - - - - - - - - + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,8 +24,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - - + + diff --git a/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/ClaimsControllerTests.cs b/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/ClaimsControllerTests.cs index 50cca78b..df98f3b4 100644 --- a/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/ClaimsControllerTests.cs +++ b/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/ClaimsControllerTests.cs @@ -204,7 +204,7 @@ public async Task ClaimCertificate_Unauthorized() } [Fact] - public async void ClaimCertificate_PublishesCommand() + public async Task ClaimCertificate_PublishesCommand() { // Arrange var subject = _fixture.Create(); diff --git a/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/RequestStatusControllerTests.cs b/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/RequestStatusControllerTests.cs index 84225e8e..e43fdd77 100644 --- a/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/RequestStatusControllerTests.cs +++ b/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/RequestStatusControllerTests.cs @@ -80,7 +80,7 @@ public async Task GetRequestStatus() var response = (result.Result as OkObjectResult)?.Value as RequestStatusResponse; response.Should().NotBeNull(); - response.Status.Should().Be(RequestStatus.Completed); + response!.Status.Should().Be(RequestStatus.Completed); } private static ControllerContext CreateContextWithUser(string subject) diff --git a/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/TransfersControllerTests.cs b/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/TransfersControllerTests.cs index d7ea4e86..e93412a5 100644 --- a/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/TransfersControllerTests.cs +++ b/src/ProjectOrigin.WalletSystem.IntegrationTests/REST/TransfersControllerTests.cs @@ -241,9 +241,8 @@ public async Task TransferCertificate_Unauthorized() } [Fact] - public async void TransferCertificate_PublishesCommand() + public async Task TransferCertificate_PublishesCommand() { - // Arrange var subject = _fixture.Create(); var request = _fixture.Create(); diff --git a/src/ProjectOrigin.WalletSystem.IntegrationTests/Repositories/CertificateRepositoryTests.cs b/src/ProjectOrigin.WalletSystem.IntegrationTests/Repositories/CertificateRepositoryTests.cs index fa31b54f..911311e3 100644 --- a/src/ProjectOrigin.WalletSystem.IntegrationTests/Repositories/CertificateRepositoryTests.cs +++ b/src/ProjectOrigin.WalletSystem.IntegrationTests/Repositories/CertificateRepositoryTests.cs @@ -96,8 +96,9 @@ public async Task CreateSlice_InsertsSlice() var insertedSlice = await _connection.QueryFirstOrDefaultAsync("SELECT * FROM wallet_slices WHERE id = @id", new { slice.Id }); - insertedSlice!.Should().BeEquivalentTo(slice, options => options.Excluding(x => x.UpdatedAt)); - insertedSlice.UpdatedAt.Hour.Should().Be(DateTimeOffset.UtcNow.Hour); + insertedSlice.Should().NotBeNull(); + insertedSlice.Should().BeEquivalentTo(slice, options => options.Excluding(x => x.UpdatedAt)); + insertedSlice!.UpdatedAt.Hour.Should().Be(DateTimeOffset.UtcNow.Hour); insertedSlice.UpdatedAt.Day.Should().Be(DateTimeOffset.UtcNow.Day); insertedSlice.UpdatedAt.Year.Should().Be(DateTimeOffset.UtcNow.Year); insertedSlice.UpdatedAt.Month.Should().Be(DateTimeOffset.UtcNow.Month); diff --git a/src/ProjectOrigin.WalletSystem.Server/ProjectOrigin.WalletSystem.Server.csproj b/src/ProjectOrigin.WalletSystem.Server/ProjectOrigin.WalletSystem.Server.csproj index 5cd2a5ce..c4f73a85 100644 --- a/src/ProjectOrigin.WalletSystem.Server/ProjectOrigin.WalletSystem.Server.csproj +++ b/src/ProjectOrigin.WalletSystem.Server/ProjectOrigin.WalletSystem.Server.csproj @@ -10,30 +10,30 @@ - - - - - + + + + + - - + + - - - - + + + + - - - + + + - + - - + +