Skip to content
GitHub Actions / .NET Tests succeeded Sep 2, 2024 in 1s

342 passed, 0 failed and 0 skipped

Tests passed successfully

Report Passed Failed Skipped Time
.test-results/LogOtter.Azure.AppServices.RequestMiddleware.Tests.trx 11✅ 825ms
.test-results/LogOtter.CosmosDb.ContainerMock.IntegrationTests.trx 96✅ 48s
.test-results/LogOtter.CosmosDb.ContainerMock.Tests.trx 106✅ 1s
.test-results/LogOtter.CosmosDb.EventStore.Tests.trx 10✅ 1s
.test-results/LogOtter.HttpPatch.Tests.trx 29✅ 6s
.test-results/LogOtter.JsonHal.Tests.trx 8✅ 1s
.test-results/LogOtter.Obfuscate.Tests.trx 42✅ 912ms
.test-results/LogOtter.ShortGuid.Tests.trx 15✅ 1s
.test-results/LogOtter.SimpleHealthChecks.Tests.trx 25✅ 839ms

✅ .test-results/LogOtter.Azure.AppServices.RequestMiddleware.Tests.trx

11 tests were completed in 825ms with 11 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.Azure.AppServices.RequestMiddleware.Tests.RequestMiddlewareTests 11✅ 55ms

✅ LogOtter.Azure.AppServices.RequestMiddleware.Tests.RequestMiddlewareTests

✅ RequestMiddleware_MismatchPath
✅ RequestMiddleware_MismatchQuery
✅ RequestMiddleware_NoHeader
✅ RequestMiddleware_RewritesPath(pathInUrl: "/", pathInHeader: "/")
✅ RequestMiddleware_RewritesPath(pathInUrl: "/foo/bar", pathInHeader: "/foo/bar")
✅ RequestMiddleware_RewritesPath(pathInUrl: "/foo/bar/,customers,1234", pathInHeader: "/foo/bar/%2ccustomers%2c1234")
✅ RequestMiddleware_RewritesPath(pathInUrl: "/foo/bar/", pathInHeader: "/foo/bar/%2f%2f%2f")
✅ RequestMiddleware_RewritesPath(pathInUrl: "/foo/bar/customers/1234", pathInHeader: "/foo/bar/%2Fcustomers%2F1234")
✅ RequestMiddleware_RewritesPath(pathInUrl: "/foo/bar/customers/1234/body", pathInHeader: "/foo/bar/%2Fcustomers%2F1234/body")
✅ RequestMiddleware_RewritesPathWithQueryString(pathInUrl: "/foo/bar/customers/1234/body", queryString: "?key=value", pathInHeader: "/foo/bar/%2Fcustomers%2F1234/body?key=value", expectedPath: "/foo/bar/%2Fcustomers%2F1234/body")
✅ RequestMiddleware_RewritesPathWithQueryString(pathInUrl: "/foo/bar/customers/1234/body", queryString: "?key=value&key2=value2", pathInHeader: "/foo/bar/%2Fcustomers%2F1234/body?key=value&key2=v"···, expectedPath: "/foo/bar/%2Fcustomers%2F1234/body")

✅ .test-results/LogOtter.CosmosDb.ContainerMock.IntegrationTests.trx

96 tests were completed in 48s with 96 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosCreateContainerWithUniqueKeyIncludingId 1✅ 7s
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosCreateStreamTests 4✅ 639ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosCreateTests 4✅ 159ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosDeleteStreamTests 2✅ 69ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosDeleteTests 2✅ 78ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosEnumTests 9✅ 1s
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosPartitionTests 4✅ 798ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosQueryEquivalencyTests 21✅ 896ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosQueryEquivalencyTestsLegacyQueries 18✅ 599ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosQuerySerializationTests 8✅ 34ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosReadItemStreamTests 2✅ 33ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosReadTests 3✅ 54ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosReplaceTests 3✅ 85ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosUpsertStreamTests 5✅ 141ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosUpsertTests 5✅ 139ms
LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosUpsertTestsOnTripleUniqueKey 5✅ 141ms

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosCreateContainerWithUniqueKeyIncludingId

✅ CreateUniqueKeyViolationIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosCreateStreamTests

✅ CreateStreamExistingIsEquivalent
✅ CreateStreamNonExistingIsEquivalent
✅ CreateStreamUniqueKeyViolationIsEquivalent
✅ CreateStreamWithEmptyIdIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosCreateTests

✅ CreateEmptyIdIsEquivalent
✅ CreateExistingIsEquivalent
✅ CreateNonExistingIsEquivalent
✅ CreateWithMismatchedPartitionIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosDeleteStreamTests

✅ DeleteExistingWithCorrectETagIsEquivalent
✅ DeleteExistingWithWrongETagIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosDeleteTests

✅ DeleteExistingWithCorrectETagIsEquivalent
✅ DeleteExistingWithWrongETagIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosEnumTests

✅ GivenAQueryUsingAValueForNullableEnumWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAValueForNullableEnumWhenExecutingThenTheResultsShouldMatchReversedEquality
✅ GivenAQueryUsingAValueForNullableNonStringEnumWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAValueForNullableOnSubModelEnumWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingNotNullEnumOnSubmodelWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingNullableEnumOnSubmodelWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingNullableEnumWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingNullableEnumWhenExecutingThenTheResultsShouldMatchReversedEquality
✅ GivenAQueryUsingNullableNonStringEnumWhenExecutingThenTheResultsShouldMatch

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosPartitionTests

✅ GivenACrossPartitionCountUsingEqualsWhenExecutingThenTheResultsShouldMatch
✅ GivenACrossPartitionQueryUsingEqualsWhenExecutingThenTheResultsShouldMatch
✅ GivenDataInTwoPartitionsWhenReadingAPartitionDoesNotCountTheOther
✅ GivenDataInTwoPartitionsWhenReadingAPartitionDoesNotRetrieveTheOther

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosQueryEquivalencyTests

✅ GivenACountUsingEqualsWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryForAllItemsInAPartitionUsingEqualsWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAnyInASubQueryWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAValueFromAMethodAgainstModelWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAValueFromAMethodWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAValueFromAMethodWithArgsWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingContainsOnAnEnumWithAToStringWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingEqualsWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingFirstOrDefaultWhenExecutingThenBothShouldWork
✅ GivenAQueryUsingNotEqualsWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingNotXorWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingProjectionWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingSingleOrDefaultWhenExecutingThenBothShouldWork
✅ GivenAQueryUsingToAnyWhenExecutingThenBothShouldWork
✅ GivenAQueryUsingToLowerInvariantWhenExecutingThenBothShouldError
✅ GivenAQueryUsingToLowerWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingToUpperInvariantWhenExecutingThenBothShouldError
✅ GivenAQueryUsingToUpperWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingXorWhenExecutingThenTheResultsShouldMatch
✅ IsDefinedWorksOnNull
✅ IsNullWorks

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosQueryEquivalencyTestsLegacyQueries

✅ GivenAQueryUsingAnyInASubQueryWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAnyWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAValueFromAMethodAgainstModelWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAValueFromAMethodWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingAValueFromAMethodWithArgsWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingContainsOnAnEnumWithAToStringWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingEqualsWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingFirstOrDefaultWhenExecutingThenBothShouldMatch
✅ GivenAQueryUsingNotEqualsWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingNotXorWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingProjectionWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingSingleOrDefaultWhenExecutingThenBothShouldError
✅ GivenAQueryUsingToAnyWhenExecutingThenBothShouldError
✅ GivenAQueryUsingToLowerInvariantWhenExecutingThenBothShouldError
✅ GivenAQueryUsingToLowerWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingToUpperInvariantWhenExecutingThenBothShouldError
✅ GivenAQueryUsingToUpperWhenExecutingThenTheResultsShouldMatch
✅ GivenAQueryUsingXorWhenExecutingThenTheResultsShouldMatch

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosQuerySerializationTests

✅ GivenACustomSerializer_WhenQueryingWithLingSerializationOptions_ShouldRetrieveTheExpectedRecords(matchOnPropertyUsingASpecifiedName: False, useCamelCaseOnBaseSerializer: False, useCamelCaseOnQuery: False, shouldThrow: False)
✅ GivenACustomSerializer_WhenQueryingWithLingSerializationOptions_ShouldRetrieveTheExpectedRecords(matchOnPropertyUsingASpecifiedName: False, useCamelCaseOnBaseSerializer: False, useCamelCaseOnQuery: True, shouldThrow: True)
✅ GivenACustomSerializer_WhenQueryingWithLingSerializationOptions_ShouldRetrieveTheExpectedRecords(matchOnPropertyUsingASpecifiedName: False, useCamelCaseOnBaseSerializer: True, useCamelCaseOnQuery: False, shouldThrow: True)
✅ GivenACustomSerializer_WhenQueryingWithLingSerializationOptions_ShouldRetrieveTheExpectedRecords(matchOnPropertyUsingASpecifiedName: False, useCamelCaseOnBaseSerializer: True, useCamelCaseOnQuery: True, shouldThrow: False)
✅ GivenACustomSerializer_WhenQueryingWithLingSerializationOptions_ShouldRetrieveTheExpectedRecords(matchOnPropertyUsingASpecifiedName: True, useCamelCaseOnBaseSerializer: False, useCamelCaseOnQuery: False, shouldThrow: False)
✅ GivenACustomSerializer_WhenQueryingWithLingSerializationOptions_ShouldRetrieveTheExpectedRecords(matchOnPropertyUsingASpecifiedName: True, useCamelCaseOnBaseSerializer: False, useCamelCaseOnQuery: True, shouldThrow: True)
✅ GivenACustomSerializer_WhenQueryingWithLingSerializationOptions_ShouldRetrieveTheExpectedRecords(matchOnPropertyUsingASpecifiedName: True, useCamelCaseOnBaseSerializer: True, useCamelCaseOnQuery: False, shouldThrow: True)
✅ GivenACustomSerializer_WhenQueryingWithLingSerializationOptions_ShouldRetrieveTheExpectedRecords(matchOnPropertyUsingASpecifiedName: True, useCamelCaseOnBaseSerializer: True, useCamelCaseOnQuery: True, shouldThrow: False)

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosReadItemStreamTests

✅ ReadWithEmptyIdIsEquivalent
✅ ReadWithNullIdIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosReadTests

✅ ReadWithEmptyIdIsEquivalent
✅ ReadWithInvalidIdIsEquivalent
✅ ReadWithNullIdIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosReplaceTests

✅ ReplaceExistingWithCorrectETagIsEquivalent
✅ ReplaceExistingWithWrongETagIsEquivalent
✅ ReplaceNonExistentItemThrowsTheSameException

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosUpsertStreamTests

✅ UpsertStreamExistingIsEquivalent
✅ UpsertStreamExistingWithCorrectETagIsEquivalent
✅ UpsertStreamExistingWithWrongETagIsEquivalent
✅ UpsertStreamNonExistingIsEquivalent
✅ UpsertStreamUniqueKeyViolationIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosUpsertTests

✅ UpsertExistingIsEquivalent
✅ UpsertExistingWithCorrectETagIsEquivalent
✅ UpsertExistingWithWrongETagIsEquivalent
✅ UpsertNonExistingIsEquivalent
✅ UpsertUniqueKeyViolationIsEquivalent

✅ LogOtter.CosmosDb.ContainerMock.IntegrationTests.CosmosUpsertTestsOnTripleUniqueKey

✅ CreateNonExistingIsEquivalent
✅ CreateUniqueKeyViolationIsEquivalent
✅ UpsertExistingIsEquivalent
✅ UpsertNonExistingIsEquivalent
✅ UpsertUniqueKeyViolationIsEquivalent

✅ .test-results/LogOtter.CosmosDb.ContainerMock.Tests.trx

106 tests were completed in 1s with 106 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.CosmosDb.ContainerMock.Tests.ConcurrencyTests 1✅ 7ms
LogOtter.CosmosDb.ContainerMock.Tests.InvalidIdTests 16✅ 198ms
LogOtter.CosmosDb.ContainerMock.Tests.PartitionKeyHelperTests 10✅ 30ms
LogOtter.CosmosDb.ContainerMock.Tests.SnapshotTests 3✅ 332ms
LogOtter.CosmosDb.ContainerMock.Tests.TransactionalBatch.CreateItemTests 3✅ 43ms
LogOtter.CosmosDb.ContainerMock.Tests.TransactionalBatch.CreateReadTests 2✅ 5ms
LogOtter.CosmosDb.ContainerMock.Tests.TransactionalBatch.ReadItemTests 2✅ 6ms
LogOtter.CosmosDb.ContainerMock.Tests.TtlTests 69✅ 328ms

✅ LogOtter.CosmosDb.ContainerMock.Tests.ConcurrencyTests

✅ CanSimulateAConcurrencyException

✅ LogOtter.CosmosDb.ContainerMock.Tests.InvalidIdTests

✅ When_inserting_an_item_by_stream_with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "?")
✅ When_inserting_an_item_by_stream_with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "/")
✅ When_inserting_an_item_by_stream_with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "\\")
✅ When_inserting_an_item_by_stream_with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "#")
✅ When_inserting_an_item_with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "?")
✅ When_inserting_an_item_with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "/")
✅ When_inserting_an_item_with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "\\")
✅ When_inserting_an_item_with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "#")
✅ When_upserting_an_item__with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "?")
✅ When_upserting_an_item__with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "/")
✅ When_upserting_an_item__with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "\\")
✅ When_upserting_an_item__with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "#")
✅ When_upserting_an_item_by_stream__with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "?")
✅ When_upserting_an_item_by_stream__with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "/")
✅ When_upserting_an_item_by_stream__with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "\\")
✅ When_upserting_an_item_by_stream__with_a_forward_slash_in_the_id__Then_an_error_occurs(invalidChars: "#")

✅ LogOtter.CosmosDb.ContainerMock.Tests.PartitionKeyHelperTests

✅ CorrectlyDeserializes(input: [-1.7976931348623157E+308])
✅ CorrectlyDeserializes(input: [""])
✅ CorrectlyDeserializes(input: ["Foo"])
✅ CorrectlyDeserializes(input: [0.0])
✅ CorrectlyDeserializes(input: [1.0])
✅ CorrectlyDeserializes(input: [1.7976931348623157E+308])
✅ CorrectlyDeserializes(input: [false])
✅ CorrectlyDeserializes(input: [null])
✅ CorrectlyDeserializes(input: [null])
✅ CorrectlyDeserializes(input: [true])

✅ LogOtter.CosmosDb.ContainerMock.Tests.SnapshotTests

✅ RestoringAnEmptySnapshotResetsData
✅ RestoringASnapshotDeletesData
✅ RestoringASnapshotResetsData

✅ LogOtter.CosmosDb.ContainerMock.Tests.TransactionalBatch.CreateItemTests

✅ CreateItem
✅ CreateItem_ExecuteFails_Rollback
✅ CreateItem_NoExecute_NoChanges

✅ LogOtter.CosmosDb.ContainerMock.Tests.TransactionalBatch.CreateReadTests

✅ CreateItem_ExecuteFails_Rollback
✅ CreateItem_ExecuteFails_Rollback_Empty

✅ LogOtter.CosmosDb.ContainerMock.Tests.TransactionalBatch.ReadItemTests

✅ ReadItem
✅ ReadItem_Fails

✅ LogOtter.CosmosDb.ContainerMock.Tests.TtlTests

✅ ItemExistsAfterItemUpdated_ReplaceItemAsync(containerTtl: -1, itemTtl: 30, expectedItemExists: True)
✅ ItemExistsAfterItemUpdated_ReplaceItemAsync(containerTtl: 30, itemTtl: 30, expectedItemExists: True)
✅ ItemExistsAfterItemUpdated_ReplaceItemAsync(containerTtl: 30, itemTtl: null, expectedItemExists: True)
✅ ItemExistsAfterItemUpdated_UpsertItemAsync(containerTtl: -1, itemTtl: 19, expectedItemExists: False)
✅ ItemExistsAfterItemUpdated_UpsertItemAsync(containerTtl: -1, itemTtl: 30, expectedItemExists: True)
✅ ItemExistsAfterItemUpdated_UpsertItemAsync(containerTtl: 19, itemTtl: null, expectedItemExists: False)
✅ ItemExistsAfterItemUpdated_UpsertItemAsync(containerTtl: 30, itemTtl: 30, expectedItemExists: True)
✅ ItemExistsAfterItemUpdated_UpsertItemAsync(containerTtl: 30, itemTtl: null, expectedItemExists: True)
✅ ItemExistsAfterItemUpdated_UpsertItemStreamAsync(containerTtl: -1, itemTtl: 19, expectedItemExists: False)
✅ ItemExistsAfterItemUpdated_UpsertItemStreamAsync(containerTtl: -1, itemTtl: 30, expectedItemExists: True)
✅ ItemExistsAfterItemUpdated_UpsertItemStreamAsync(containerTtl: 19, itemTtl: null, expectedItemExists: False)
✅ ItemExistsAfterItemUpdated_UpsertItemStreamAsync(containerTtl: 30, itemTtl: 30, expectedItemExists: True)
✅ ItemExistsAfterItemUpdated_UpsertItemStreamAsync(containerTtl: 30, itemTtl: null, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_CountAsync(containerTtl: -1, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_CountAsync(containerTtl: -1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_CountAsync(containerTtl: 1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_CountAsync(containerTtl: 30, itemTtl: -1, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_CountAsync(containerTtl: 30, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_CountAsync(containerTtl: 30, itemTtl: null, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_CountAsync(containerTtl: 31, itemTtl: 1, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_CountAsync(containerTtl: 31, itemTtl: null, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_CreateItemStreamAsync_GetAllItems(containerTtl: -1, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_CreateItemStreamAsync_GetAllItems(containerTtl: -1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_CreateItemStreamAsync_GetAllItems(containerTtl: 1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_CreateItemStreamAsync_GetAllItems(containerTtl: 30, itemTtl: -1, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_CreateItemStreamAsync_GetAllItems(containerTtl: 30, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_CreateItemStreamAsync_GetAllItems(containerTtl: 30, itemTtl: null, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_CreateItemStreamAsync_GetAllItems(containerTtl: 31, itemTtl: 1, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_CreateItemStreamAsync_GetAllItems(containerTtl: 31, itemTtl: null, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_GetAllItems(containerTtl: -1, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_GetAllItems(containerTtl: -1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_GetAllItems(containerTtl: 1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_GetAllItems(containerTtl: 30, itemTtl: -1, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_GetAllItems(containerTtl: 30, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_GetAllItems(containerTtl: 30, itemTtl: null, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_GetAllItems(containerTtl: 31, itemTtl: 1, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_GetAllItems(containerTtl: 31, itemTtl: null, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_GetItemLinqQueryable(containerTtl: -1, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_GetItemLinqQueryable(containerTtl: -1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_GetItemLinqQueryable(containerTtl: 1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_GetItemLinqQueryable(containerTtl: 30, itemTtl: -1, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_GetItemLinqQueryable(containerTtl: 30, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_GetItemLinqQueryable(containerTtl: 30, itemTtl: null, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_GetItemLinqQueryable(containerTtl: 31, itemTtl: 1, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_GetItemLinqQueryable(containerTtl: 31, itemTtl: null, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_QueryAsync(containerTtl: -1, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_QueryAsync(containerTtl: -1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_QueryAsync(containerTtl: 1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_QueryAsync(containerTtl: 30, itemTtl: -1, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_QueryAsync(containerTtl: 30, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_QueryAsync(containerTtl: 30, itemTtl: null, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_QueryAsync(containerTtl: 31, itemTtl: 1, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_QueryAsync(containerTtl: 31, itemTtl: null, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_ReadItemAsync(containerTtl: -1, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_ReadItemAsync(containerTtl: -1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_ReadItemAsync(containerTtl: 1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_ReadItemAsync(containerTtl: 30, itemTtl: -1, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_ReadItemAsync(containerTtl: 30, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_ReadItemAsync(containerTtl: 30, itemTtl: null, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_ReadItemAsync(containerTtl: 31, itemTtl: 1, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_ReadItemAsync(containerTtl: 31, itemTtl: null, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_ReadItemStreamAsync(containerTtl: -1, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_ReadItemStreamAsync(containerTtl: -1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_ReadItemStreamAsync(containerTtl: 1, itemTtl: 31, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_ReadItemStreamAsync(containerTtl: 30, itemTtl: -1, expectedItemExists: True)
✅ ItemRemovedAfterTtlExpires_ReadItemStreamAsync(containerTtl: 30, itemTtl: 30, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_ReadItemStreamAsync(containerTtl: 30, itemTtl: null, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_ReadItemStreamAsync(containerTtl: 31, itemTtl: 1, expectedItemExists: False)
✅ ItemRemovedAfterTtlExpires_ReadItemStreamAsync(containerTtl: 31, itemTtl: null, expectedItemExists: True)

✅ .test-results/LogOtter.CosmosDb.EventStore.Tests.trx

10 tests were completed in 1s with 10 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.CosmosDb.EventStore.Tests.EventRepositoryTests 5✅ 134ms
LogOtter.CosmosDb.EventStore.Tests.EventStoreTests 5✅ 135ms

✅ LogOtter.CosmosDb.EventStore.Tests.EventRepositoryTests

✅ GetSnapshotWithMultipleEvents
✅ GetSnapshotWithSingleEvents
✅ GetSnapshotWithZeroEvents
✅ MultipleEventsAreStoredCorrectly
✅ SingleEventIsStoredCorrectly

✅ LogOtter.CosmosDb.EventStore.Tests.EventStoreTests

✅ MultipleEventsArePagedCorrectly
✅ MultipleEventsAreStoredCorrectly
✅ SingleEventIsStoredCorrectly
✅ ThrowsExceptionForNumberEventsZero
✅ ThrowsExceptionForStartPositionZero

✅ .test-results/LogOtter.HttpPatch.Tests.trx

29 tests were completed in 6s with 29 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.HttpPatch.Tests.PatchTests 22✅ 4s
LogOtter.HttpPatch.Tests.SerializationTests 7✅ 161ms

✅ LogOtter.HttpPatch.Tests.PatchTests

✅ CanPatchAddress(serializationEngine: Newtonsoft)
✅ CanPatchAddress(serializationEngine: SystemText)
✅ CanPatchCount(serializationEngine: Newtonsoft)
✅ CanPatchCount(serializationEngine: SystemText)
✅ CanPatchDescription(serializationEngine: Newtonsoft)
✅ CanPatchDescription(serializationEngine: SystemText)
✅ CanPatchDescriptionToNull(serializationEngine: Newtonsoft)
✅ CanPatchDescriptionToNull(serializationEngine: SystemText)
✅ CanPatchEnumUsingString(serializationEngine: Newtonsoft)
✅ CanPatchEnumUsingString(serializationEngine: SystemText)
✅ CanPatchName(serializationEngine: Newtonsoft)
✅ CanPatchName(serializationEngine: SystemText)
✅ CanPatchPeople(serializationEngine: Newtonsoft)
✅ CanPatchPeople(serializationEngine: SystemText)
✅ CantPatchNameToNull(serializationEngine: Newtonsoft)
✅ CantPatchNameToNull(serializationEngine: SystemText)
✅ CantPatchNameToShort(serializationEngine: Newtonsoft)
✅ CantPatchNameToShort(serializationEngine: SystemText)
✅ CantPatchPrimitiveToNull(serializationEngine: Newtonsoft)
✅ CantPatchPrimitiveToNull(serializationEngine: SystemText)
✅ CantPatchWhenViolatingAttributesOnSubObject(serializationEngine: Newtonsoft)
✅ CantPatchWhenViolatingAttributesOnSubObject(serializationEngine: SystemText)

✅ LogOtter.HttpPatch.Tests.SerializationTests

✅ DeserializesWithValue(engine: Newtonsoft)
✅ DeserializesWithValue(engine: SystemText)
✅ MissingValueIsShownAsNotInPatch(engine: Newtonsoft)
✅ MissingValueIsShownAsNotInPatch(engine: SystemText)
✅ RoundTripSerializeWhenIncludedInPatch(engine: Newtonsoft)
✅ RoundTripSerializeWhenNotIncludedInPatch(engine: Newtonsoft)
✅ UndefinedIsShownAsNotInPatch(engine: Newtonsoft)

✅ .test-results/LogOtter.JsonHal.Tests.trx

8 tests were completed in 1s with 8 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.JsonHal.Tests.DeserializeTests 4✅ 37ms
LogOtter.JsonHal.Tests.SerializeTests 4✅ 37ms

✅ LogOtter.JsonHal.Tests.DeserializeTests

✅ Deserialize_MultiLinkType
✅ Deserialize_NextOnly
✅ Deserialize_SelfAndNext
✅ Deserialize_SelfOnly

✅ LogOtter.JsonHal.Tests.SerializeTests

✅ Serialize_MultiLinkType
✅ Serialize_NextOnly
✅ Serialize_SelfAndNext
✅ Serialize_SelfOnly

✅ .test-results/LogOtter.Obfuscate.Tests.trx

42 tests were completed in 912ms with 42 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.Obfuscate.Tests.ObfuscationTests 42✅ 25ms

✅ LogOtter.Obfuscate.Tests.ObfuscationTests

✅ ObfuscateEmail(email: "", expectedOutput: "")
✅ ObfuscateEmail(email: "b@bobertson.co.uk", expectedOutput: "b****@bobertson.co.uk")
✅ ObfuscateEmail(email: "bo@bobertson.co.uk", expectedOutput: "b****@bobertson.co.uk")
✅ ObfuscateEmail(email: "bob.b@bobertson.co.uk", expectedOutput: "b****@bobertson.co.uk")
✅ ObfuscateEmail(email: "bob.bo@bobertson.co.uk", expectedOutput: "bo****o@bobertson.co.uk")
✅ ObfuscateEmail(email: "bob.bo+bobertson.co.uk", expectedOutput: "****")
✅ ObfuscateEmail(email: "bob.bobertson@10.0.0.1", expectedOutput: "****")
✅ ObfuscateEmail(email: "bob.bobertson@bobertson.co.uk", expectedOutput: "bo****n@bobertson.co.uk")
✅ ObfuscateEmail(email: "bob.bobertson@bobertson", expectedOutput: "****")
✅ ObfuscateEmail(email: "bob.bobertson@gmail.com", expectedOutput: "bo****n@gmail.com")
✅ ObfuscateEmail(email: "bob.bobertson+test1@bobertson.co.uk", expectedOutput: "bo****1@bobertson.co.uk")
✅ ObfuscateEmail(email: "bob@bobertson.co.uk", expectedOutput: "b****@bobertson.co.uk")
✅ ObfuscateEmail(email: "bobb@bobertson.co.uk", expectedOutput: "b****@bobertson.co.uk")
✅ ObfuscateEmail(email: "hello world", expectedOutput: "****")
✅ ObfuscateEmail(email: null, expectedOutput: null)
✅ ObfuscateName(firstName: "", lastName: "", expectedOutput: "")
✅ ObfuscateName(firstName: "", lastName: "Bobertson", expectedOutput: "Bo****")
✅ ObfuscateName(firstName: "", lastName: "May", expectedOutput: "M****")
✅ ObfuscateName(firstName: "", lastName: null, expectedOutput: "")
✅ ObfuscateName(firstName: "Bob", lastName: "", expectedOutput: "B****")
✅ ObfuscateName(firstName: "Bob", lastName: "Bobertson", expectedOutput: "B**** Bo****")
✅ ObfuscateName(firstName: "Bob", lastName: "May", expectedOutput: "B**** M****")
✅ ObfuscateName(firstName: "Bob", lastName: null, expectedOutput: "B****")
✅ ObfuscateName(firstName: "Bobby", lastName: "", expectedOutput: "Bo****")
✅ ObfuscateName(firstName: "Bobby", lastName: "Bobertson", expectedOutput: "Bo**** Bo****")
✅ ObfuscateName(firstName: "Bobby", lastName: "May", expectedOutput: "Bo**** M****")
✅ ObfuscateName(firstName: "Bobby", lastName: null, expectedOutput: "Bo****")
✅ ObfuscateName(firstName: null, lastName: "", expectedOutput: "")
✅ ObfuscateName(firstName: null, lastName: "Bobertson", expectedOutput: "Bo****")
✅ ObfuscateName(firstName: null, lastName: "May", expectedOutput: "M****")
✅ ObfuscateName(firstName: null, lastName: null, expectedOutput: null)
✅ ObfuscatePhone(phoneNumber: "  ", expectedOutput: "")
✅ ObfuscatePhone(phoneNumber: " ", expectedOutput: "")
✅ ObfuscatePhone(phoneNumber: "", expectedOutput: "")
✅ ObfuscatePhone(phoneNumber: "\r\n", expectedOutput: "")
✅ ObfuscatePhone(phoneNumber: "+4478901", expectedOutput: "****")
✅ ObfuscatePhone(phoneNumber: "+447890123456", expectedOutput: "+447****56")
✅ ObfuscatePhone(phoneNumber: "01234", expectedOutput: "****")
✅ ObfuscatePhone(phoneNumber: "0123456789", expectedOutput: "****")
✅ ObfuscatePhone(phoneNumber: "07890123456", expectedOutput: "07****56")
✅ ObfuscatePhone(phoneNumber: "foo", expectedOutput: "****")
✅ ObfuscatePhone(phoneNumber: null, expectedOutput: null)

✅ .test-results/LogOtter.ShortGuid.Tests.trx

15 tests were completed in 1s with 15 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.ShortGuid.Tests.GuidExtensionsTests 15✅ 27ms

✅ LogOtter.ShortGuid.Tests.GuidExtensionsTests

✅ DoesNotDropCharactersWhenSecondHalfLeadsInWithZero
✅ DoesNotDropCharactersWhenThereIsARemainderThatIsLessThanDoubleTheAlphabetSize
✅ GuidsWithSwappedParts_ShouldGenerateDifferentShortGuids
✅ KnownShortGuid_CorrectlyConverts
✅ RandomShortGuid_ShouldHaveCorrectLength
✅ ShortStringsCanBeValidated(shortString: "", isValid: False, reason: "too short")
✅ ShortStringsCanBeValidated(shortString: "AZCkPjP1rt2B8QVN4GhvctDB", isValid: False, reason: "invalid character")
✅ ShortStringsCanBeValidated(shortString: "sZCkPjP1rt2B8QVN4GhvctDB", isValid: True, reason: "is valid")
✅ ShortStringsCanBeValidated(shortString: "sZCkPjP1rt2B8QVN4GhvctDBB", isValid: False, reason: "too long")
✅ TheAlgorithmShouldBeReversibleWithNoLossOfInformation(guidString: "00000035-0000-0000-0000-00000d0e0f10")
✅ TheAlgorithmShouldBeReversibleWithNoLossOfInformation(guidString: "04030201-0605-0007-0000-000c0d0e0f10")
✅ TheAlgorithmShouldBeReversibleWithNoLossOfInformation(guidString: "0a3d2017-7581-4831-ba3c-a46556c87304")
✅ TheAlgorithmShouldBeReversibleWithNoLossOfInformation(guidString: "CA084F5E-AD86-4A71-B722-C857A50F4B47")
✅ TheAlgorithmShouldBeReversibleWithNoLossOfInformation(guidString: "F15E25C2-AD26-4CE9-83CE-E41B2B9557E4")
✅ TheAlgorithmShouldBeReversibleWithNoLossOfInformation(guidString: "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF")

✅ .test-results/LogOtter.SimpleHealthChecks.Tests.trx

25 tests were completed in 839ms with 25 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
LogOtter.SimpleHealthChecks.Tests.CacheTests 2✅ 7ms
LogOtter.SimpleHealthChecks.Tests.DefaultSetupTests 7✅ 15ms
LogOtter.SimpleHealthChecks.Tests.IncorrectUriTests 2✅ 70ms
LogOtter.SimpleHealthChecks.Tests.OverrideResponseTests 3✅ 52ms
LogOtter.SimpleHealthChecks.Tests.OverrideStatusTests 3✅ 15ms
LogOtter.SimpleHealthChecks.Tests.PingTests 1✅ 5ms
LogOtter.SimpleHealthChecks.Tests.QueryStringTests 2✅ 69ms
LogOtter.SimpleHealthChecks.Tests.SimpleHealthCheckHostOptionsTests 3✅ 15ms
LogOtter.SimpleHealthChecks.Tests.SimpleHealthCheckOptionsTests 2✅ 51ms

✅ LogOtter.SimpleHealthChecks.Tests.CacheTests

✅ ReturnsCacheHeaders
✅ ReturnsNoCacheHeaders

✅ LogOtter.SimpleHealthChecks.Tests.DefaultSetupTests

✅ DefaultReturnsCorrectBody(status: Degraded, expectedResponseBody: "Degraded")
✅ DefaultReturnsCorrectBody(status: Healthy, expectedResponseBody: "Healthy")
✅ DefaultReturnsCorrectBody(status: Unhealthy, expectedResponseBody: "Unhealthy")
✅ DefaultReturnsCorrectStatusCode(status: Degraded, expectedStatusCode: 200)
✅ DefaultReturnsCorrectStatusCode(status: Healthy, expectedStatusCode: 200)
✅ DefaultReturnsCorrectStatusCode(status: Unhealthy, expectedStatusCode: 503)
✅ DefaultReturnsTextPlain

✅ LogOtter.SimpleHealthChecks.Tests.IncorrectUriTests

✅ ReturnsNotFoundWhenMappedIncorrectly
✅ ReturnsNotFoundWhenNotMapped

✅ LogOtter.SimpleHealthChecks.Tests.OverrideResponseTests

✅ ReturnsCorrectResponse(status: Degraded, expectedBody: "{\"Status\":\"Degraded\"}")
✅ ReturnsCorrectResponse(status: Healthy, expectedBody: "{\"Status\":\"Healthy\"}")
✅ ReturnsCorrectResponse(status: Unhealthy, expectedBody: "{\"Status\":\"Unhealthy\"}")

✅ LogOtter.SimpleHealthChecks.Tests.OverrideStatusTests

✅ ReturnsCorrectStatusCode(status: Degraded, expectedStatusCode: 231)
✅ ReturnsCorrectStatusCode(status: Healthy, expectedStatusCode: 230)
✅ ReturnsCorrectStatusCode(status: Unhealthy, expectedStatusCode: 520)

✅ LogOtter.SimpleHealthChecks.Tests.PingTests

✅ PingResponse

✅ LogOtter.SimpleHealthChecks.Tests.QueryStringTests

✅ ReturnsNotFoundWhenQueryStringUsedButNotMapped
✅ ReturnsOkQueryStringUsed

✅ LogOtter.SimpleHealthChecks.Tests.SimpleHealthCheckHostOptionsTests

✅ DefaultHost
✅ DefaultPort
✅ DefaultScheme

✅ LogOtter.SimpleHealthChecks.Tests.SimpleHealthCheckOptionsTests

✅ DefaultOptions
✅ ThrowsExceptionWhenIncompleteDictionarySpecified