Skip to content

Bump the all-dependencies group with 4 updates#231

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/nuget/all-dependencies-56bdddeef2
Closed

Bump the all-dependencies group with 4 updates#231
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/nuget/all-dependencies-56bdddeef2

Bump the all-dependencies group with 4 updates

a878b36
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
GitHub Actions / Test report succeeded Jan 26, 2026 in 0s

276 passed, 0 failed and 18 skipped

Tests passed successfully

Report Passed Failed Skipped Time
tests/Elzik.Breef.Api.Tests.Functional/TestResults/test-results.trx 8✅ 66s
tests/Elzik.Breef.Api.Tests.Integration/TestResults/test-results.trx 11✅ 1s
tests/Elzik.Breef.Infrastructure.Tests.Integration/TestResults/test-results.trx 39✅ 18⚪ 11s
tests/Elzik.Breef.Infrastructure.Tests.Unit/TestResults/test-results.trx 218✅ 2s

✅ tests/Elzik.Breef.Api.Tests.Functional/TestResults/test-results.trx

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

Test suite Passed Failed Skipped Time
Elzik.Breef.Api.Tests.Functional.Breefs.BreefTestsDocker 2✅ 52s
Elzik.Breef.Api.Tests.Functional.Breefs.BreefTestsNative 2✅ 4s
Elzik.Breef.Api.Tests.Functional.ExceptionHandlingTests 2✅ 2s
Elzik.Breef.Api.Tests.Functional.Health.HealthTestsDocker 1✅ 516ms
Elzik.Breef.Api.Tests.Functional.Health.HealthTestsNative 1✅ 2s

✅ Elzik.Breef.Api.Tests.Functional.Breefs.BreefTestsDocker

✅ EndToEndHappyPath
✅ Unauthorised

✅ Elzik.Breef.Api.Tests.Functional.Breefs.BreefTestsNative

✅ EndToEndHappyPath
✅ Unauthorised

✅ Elzik.Breef.Api.Tests.Functional.ExceptionHandlingTests

✅ Breefs_WithCallerFixableError_ReturnsExpectedProblemDetails
✅ Breefs_WithNonCallerFixableError_ReturnsGenericProblemDetails

✅ Elzik.Breef.Api.Tests.Functional.Health.HealthTestsDocker

✅ Health_Called_ReturnsOK

✅ Elzik.Breef.Api.Tests.Functional.Health.HealthTestsNative

✅ Health_Called_ReturnsOK

✅ tests/Elzik.Breef.Api.Tests.Integration/TestResults/test-results.trx

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

Test suite Passed Failed Skipped Time
Elzik.Breef.Api.Tests.Integration.BreefApiOptionsTests 2✅ 158ms
Elzik.Breef.Api.Tests.Integration.FileBasedContentSummarisationInstructionProviderTests 9✅ 118ms

✅ Elzik.Breef.Api.Tests.Integration.BreefApiOptionsTests

✅ WhenValidated_MissingApiKey_ShouldFailValidation
✅ WhenValidated_WithValidApiKey_ShouldPassValidation

✅ Elzik.Breef.Api.Tests.Integration.FileBasedContentSummarisationInstructionProviderTests

✅ GetInstructions_ExtractTypeNameNotFound_Throws
✅ Instantiated_AllRequiredFilesPresent_Succeeds
✅ Instantiated_DirectoryMissing_Throws
✅ Instantiated_EmptyInstructionFile_Throws(instructionContent: "   \n\t  ")
✅ Instantiated_EmptyInstructionFile_Throws(instructionContent: "")
✅ Instantiated_InvalidRequiredExtractTypeNames_Throws(requiredExtractTypeNames: [])
✅ Instantiated_InvalidRequiredExtractTypeNames_Throws(requiredExtractTypeNames: null)
✅ Instantiated_RequiredInstructionMissing_Throws
✅ Instantiated_SomeRequiredFilesMissing_Throws

✅ tests/Elzik.Breef.Infrastructure.Tests.Integration/TestResults/test-results.trx

57 tests were completed in 11s with 39 passed, 0 failed and 18 skipped.

Test suite Passed Failed Skipped Time
Elzik.Breef.Infrastructure.Tests.Integration.AiContentSummariserTests 2✅ 10s
Elzik.Breef.Infrastructure.Tests.Integration.AiServiceOptionsTests 6✅ 114ms
Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.HtmlContentExtractorTests 6✅ 384ms
Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.Reddit.Client.RawRedditPostClientTests 2⚪ 2ms
Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.Reddit.Client.RawSubredditClientTests 2⚪ 2ms
Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.Reddit.Client.RedditPostClientTests 1⚪ 1ms
Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.Reddit.RedditPostContentExtractorTests 15✅ 13⚪ 39ms
Elzik.Breef.Infrastructure.Tests.Integration.Wallabag.WallabagAuthClientTests 1✅ 1s
Elzik.Breef.Infrastructure.Tests.Integration.Wallabag.WallabagClientTests 2✅ 3s
Elzik.Breef.Infrastructure.Tests.Integration.Wallabag.WallabagOptionsTests 7✅ 95ms

✅ Elzik.Breef.Infrastructure.Tests.Integration.AiContentSummariserTests

✅ Summarise_WithValidContent_ReturnsSummary(testExtractedContentFile: "BbcNewsPage-ExpectedContent.txt")
✅ Summarise_WithValidContent_ReturnsSummary(testExtractedContentFile: "TestHtmlPage-ExpectedContent.txt")

✅ Elzik.Breef.Infrastructure.Tests.Integration.AiServiceOptionsTests

✅ WhenValidated_AllFieldsValid_ShouldPassValidation
✅ WhenValidated_InvalidEndpointUrl_ShouldFailValidation
✅ WhenValidated_MissingApiKey_ShouldFailValidation
✅ WhenValidated_MissingEndpointUrl_ShouldFailValidation
✅ WhenValidated_MissingModelId_ShouldFailValidation
✅ WhenValidated_MissingProvider_ShouldFailValidation

✅ Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.HtmlContentExtractorTests

✅ CanHandle_AnyString_CanHandle
✅ Extract_WithValidUrl_ExtractsContent(testFileName: "BbcNewsPage.html", expectedFileName: "BbcNewsPage-ExpectedContent.txt", expectedTitle: "Artificial Intelligence: Plan to 'unleash AI' acro"···, expectedPreviewImageUrl: "https://ichef.bbci.co.uk/ace/standard/1280/cpsprod"···)
✅ Extract_WithValidUrl_ExtractsContent(testFileName: "TestHtmlPage.html", expectedFileName: "TestHtmlPage-ExpectedContent.txt", expectedTitle: "Test HTML Page", expectedPreviewImageUrl: "https://test-large-image.jpg")
✅ Extract_WithValidUrl_ExtractsContent(testFileName: "TestHtmlPageNoContent.html", expectedFileName: "TestHtmlPageNoContent-ExpectedContent.txt", expectedTitle: "Test HTML Page", expectedPreviewImageUrl: "https://test-large-image.jpg")
✅ Extract_WithValidUrl_ExtractsContent(testFileName: "TestHtmlPageNoImages.html", expectedFileName: "TestHtmlPage-ExpectedContent.txt", expectedTitle: "Test HTML Page", expectedPreviewImageUrl: null)
✅ Extract_WithValidUrl_ExtractsContent(testFileName: "TestHtmlPageNoTitle.html", expectedFileName: "TestHtmlPage-ExpectedContent.txt", expectedTitle: "https://mock.url", expectedPreviewImageUrl: "https://test-large-image.jpg")

✅ Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.Reddit.Client.RawRedditPostClientTests

⚪ GetPost_PostWithGalleryDataNumericIds_HandlesDeserialization
⚪ GetPost_ValidPostId_ReturnsRedditPost

✅ Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.Reddit.Client.RawSubredditClientTests

⚪ GetAboutSubreddit_ValidSubreddit_ReturnsAboutSubreddit
⚪ GetNewInSubreddit_ValidSubreddit_ReturnsNewInSubreddit

✅ Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.Reddit.Client.RedditPostClientTests

⚪ GetPost_ValidPostId_ReturnsExpectedRedditPost

✅ Elzik.Breef.Infrastructure.Tests.Integration.ContentExtractors.Reddit.RedditPostContentExtractorTests

✅ CanHandle_VariousInvalidUrls_ReturnsFalse(invalidUrl: "https://old.reddit.com/r/programming/comments/abc1"···)
✅ CanHandle_VariousInvalidUrls_ReturnsFalse(invalidUrl: "https://reddit.com/r/programming")
✅ CanHandle_VariousInvalidUrls_ReturnsFalse(invalidUrl: "https://reddit.com/r/programming/comments")
✅ CanHandle_VariousInvalidUrls_ReturnsFalse(invalidUrl: "https://reddit.com/r/programming/comments/abc123/t"···)
✅ CanHandle_VariousInvalidUrls_ReturnsFalse(invalidUrl: "https://reddit.com/r/programming/hot")
✅ CanHandle_VariousInvalidUrls_ReturnsFalse(invalidUrl: "https://reddit.com/user/username/comments/abc123/t"···)
✅ CanHandle_VariousInvalidUrls_ReturnsFalse(invalidUrl: "https://youtube.com/r/programming/comments/abc123/"···)
✅ CanHandle_VariousValidUrls_ReturnsTrue(validUrl: "https://REDDIT.COM/r/AskReddit/comments/ghi789")
✅ CanHandle_VariousValidUrls_ReturnsTrue(validUrl: "https://REDDIT.COM/r/AskReddit/comments/ghi789/que"···)
✅ CanHandle_VariousValidUrls_ReturnsTrue(validUrl: "https://reddit.com/r/pics/comments/jkl012/")
✅ CanHandle_VariousValidUrls_ReturnsTrue(validUrl: "https://reddit.com/r/pics/comments/jkl012/image/")
✅ CanHandle_VariousValidUrls_ReturnsTrue(validUrl: "https://reddit.com/r/programming/comments/abc123")
✅ CanHandle_VariousValidUrls_ReturnsTrue(validUrl: "https://reddit.com/r/programming/comments/abc123/t"···)
✅ CanHandle_VariousValidUrls_ReturnsTrue(validUrl: "https://www.reddit.com/r/funny/comments/def456")
✅ CanHandle_VariousValidUrls_ReturnsTrue(validUrl: "https://www.reddit.com/r/funny/comments/def456/jok"···)
⚪ ExtractAsync_InvalidUrls_ThrowsInvalidOperationException(invalidUrl: "https://not-reddit.com/r/programming/comments/abc1"···)
⚪ ExtractAsync_InvalidUrls_ThrowsInvalidOperationException(invalidUrl: "https://reddit.com")
⚪ ExtractAsync_InvalidUrls_ThrowsInvalidOperationException(invalidUrl: "https://reddit.com/r/programming")
⚪ ExtractAsync_InvalidUrls_ThrowsInvalidOperationException(invalidUrl: "https://reddit.com/r/programming/posts/abc123/titl"···)
⚪ ExtractAsync_InvalidUrls_ThrowsInvalidOperationException(invalidUrl: "not-a-url")
⚪ ExtractAsync_NonExistentPost_ThrowsExpectedException
⚪ ExtractAsync_PostAndSubredditWithoutImage_UsesRedditFallback
⚪ ExtractAsync_PostWithImage_UsesPostImage
⚪ ExtractAsync_PostWithoutImage_UsesSubredditFallback
⚪ ExtractAsync_RealRedditPost_ReturnsValidExtract(url: "https://reddit.com/r/learnprogramming/comments/1kq"···)
⚪ ExtractAsync_RealRedditPost_ReturnsValidExtract(url: "https://www.reddit.com/r/learnprogramming/comments"···)
⚪ ExtractAsync_RealRedditPost_ReturnsValidExtract(url: "https://www.reddit.com/r/learnprogramming/comments"···)
⚪ ExtractAsync_ValidPost_ContentContainsCompleteRedditStructure

✅ Elzik.Breef.Infrastructure.Tests.Integration.Wallabag.WallabagAuthClientTests

✅ GetTokenAsync_FromTestWallabagAccount_ReturnsToken

✅ Elzik.Breef.Infrastructure.Tests.Integration.Wallabag.WallabagClientTests

✅ PostEntryAsync_WithValidEntry_PostsEntry(previewImageUrl: "https://wallabag.elzik.co.uk/img/logo-wallabag.svg")
✅ PostEntryAsync_WithValidEntry_PostsEntry(previewImageUrl: null)

✅ Elzik.Breef.Infrastructure.Tests.Integration.Wallabag.WallabagOptionsTests

✅ WhenValidated_InvalidBaseUrl_ShouldFailValidation
✅ WhenValidated_MissingBaseUrl_ShouldFailValidation
✅ WhenValidated_MissingClientId_ShouldFailValidation
✅ WhenValidated_MissingClientSecret_ShouldFailValidation
✅ WhenValidated_MissingPassword_ShouldFailValidation
✅ WhenValidated_MissingUsername_ShouldFailValidation
✅ WhenValidated_WithValidOptions_ShouldPassValidation

✅ tests/Elzik.Breef.Infrastructure.Tests.Unit/TestResults/test-results.trx

218 tests were completed in 2s with 218 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.ContentExtractorBaseTests 7✅ 88ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.ContentExtractorStrategyTests 8✅ 201ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.Raw.FlexibleStringConverterTests 11✅ 70ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.RawNewInSubredditTransformerTests 9✅ 27ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.RawRedditPostTransformerTests 26✅ 67ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.RedditDateTimeConverterTests 9✅ 77ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.RedditPostClientTests 9✅ 94ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.SubredditClientTests 1✅ 245ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.RedditOptionsTests 10✅ 156ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.RedditPostContentExtractorTests 59✅ 132ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.SubredditExtractorTests 61✅ 265ms
Elzik.Breef.Infrastructure.Tests.Unit.ContentSummariserTests 3✅ 99ms
Elzik.Breef.Infrastructure.Tests.Unit.Wallabag.WallabagBreefPublisherTests 1✅ 21ms
Elzik.Breef.Infrastructure.Tests.Unit.Wallabag.WallabagDateTimeConverterTests 4✅ 41ms

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.ContentExtractorBaseTests

✅ Constructor_InvalidExtractorNameWithoutSuffix_ThrowsInvalidOperationException
✅ Constructor_ValidExtractorName_DoesNotThrow
✅ ExtractAsync_ExtractorNameEndingWithExtractor_RemovesSuffixCorrectly
✅ ExtractAsync_MultipleExtractorTypes_SetsDifferentExtractTypes
✅ ExtractAsync_WhenCalled_PreservesExtractDataFromCore
✅ ExtractAsync_WhenCalled_SetsExtractTypeCorrectly
✅ ExtractAsync_WhenCreateUntypedExtractAsyncReturnsNull_ThrowsInvalidOperationException

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.ContentExtractorStrategyTests

✅ CanHandle_AnyString_CanHandle
✅ ExtractAsync_Extractor1CanHandle_UsesExtractor1
✅ ExtractAsync_Extractor2CanHandle_UsesExtractor2
✅ ExtractAsync_NoSpecificExtractorCanHandle_UsesDefaultExtractor
✅ ExtractAsync_OnlyDefaultExtractorExists_UsesDefaultExtractor
✅ Instantiated_DefaultExtractorInSpecificExtractors_Throws
✅ Instantiated_NullDefaultExtractor_Throws
✅ Instantiated_NullSpecificExtractors_Throws

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.Raw.FlexibleStringConverterTests

✅ Read_BooleanValue_ThrowsJsonException
✅ Read_DirectNull_CallsConverter
✅ Read_LargeIntegerValue_ReturnsStringRepresentation
✅ Read_NullValue_ReturnsNull
✅ Read_NumericValue_ReturnsStringRepresentation
✅ Read_StringValue_ReturnsString
✅ Read_WithGalleryItemModel_HandlesNumericId
✅ Read_WithRedditPostStructure_HandlesGalleryDataWithNumericIds
✅ Write_DirectNull_CallsConverter
✅ Write_NullValue_WritesNull
✅ Write_StringValue_WritesStringValue

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.RawNewInSubredditTransformerTests

✅ Transform_ChildrenWithNullData_SkipsNullDataChildren
✅ Transform_ChildrenWithNullIds_SkipsNullIdChildren
✅ Transform_ConcurrentPostFetching_CallsClientConcurrently
✅ Transform_EmptyChildren_ReturnsEmptyNewInSubreddit
✅ Transform_NullChildren_ReturnsEmptyNewInSubreddit
✅ Transform_NullData_ReturnsEmptyNewInSubreddit
✅ Transform_NullRawNewInSubreddit_ThrowsArgumentNullException
✅ Transform_SinglePost_ReturnsNewInSubredditWithOnePost
✅ Transform_ValidRawNewInSubreddit_ReturnsExpectedStructure

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.RawRedditPostTransformerTests

✅ Instantiated_NullOptions_ThrowsArgumentNullException
✅ Instantiated_NullOptionsValue_ThrowsInvalidOperationException
✅ Transform_CommentsWithEmptyStringReplies_ReturnsEmptyList
✅ Transform_CommentsWithNonT1Kind_SkipsComment
✅ Transform_CommentsWithNullChildren_ReturnsEmptyList
✅ Transform_CommentsWithNullListingData_ReturnsEmptyList
✅ Transform_EmptyRedditPost_ThrowsArgumentException
✅ Transform_InvalidRedditOptionsBaseAddress_ThrowsInvalidOperationException
✅ Transform_NullRawRedditPost_ThrowsArgumentNullException
✅ Transform_PostListingWithNoChildren_ThrowsArgumentException
✅ Transform_PostWithDefaultThumbnail_IgnoresThumbnail
✅ Transform_PostWithDirectImageUrl_ExtractsImageCorrectly
✅ Transform_PostWithGallery_ExtractsFirstImageCorrectly
✅ Transform_PostWithHtmlEncodedGalleryUrl_DecodesUrlCorrectly
✅ Transform_PostWithHtmlEncodedPreviewUrl_DecodesUrlCorrectly
✅ Transform_PostWithInvalidGalleryMetadata_SkipsInvalidImages
✅ Transform_PostWithInvalidThumbnails_IgnoresInvalidThumbnails
✅ Transform_PostWithMultipleImageSources_PrioritizesCorrectly
✅ Transform_PostWithMultiplePreviewImages_SelectsLargestImage
✅ Transform_PostWithNonImageUrl_ReturnsNullImageUrl
✅ Transform_PostWithNsfwThumbnail_IgnoresThumbnail
✅ Transform_PostWithNullTitle_ThrowsInvalidOperationException
✅ Transform_PostWithPreviewImage_ExtractsImageCorrectly
✅ Transform_PostWithThumbnailOnly_ExtractsThumbnailCorrectly
✅ Transform_PostWithUrlOverriddenByDest_UsesOverriddenUrl
✅ Transform_ValidRedditPost_ReturnsExpectedStructure

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.RedditDateTimeConverterTests

✅ Read_InvalidToken_ThrowsJsonException
✅ Read_ValidUnixTimestamp_ReturnsExpectedDateTime(timestamp: 1747678685, expectedUtc: "2025-05-19T18:18:05Z")
✅ Read_ValidUnixTimestamp_ReturnsExpectedDateTime(timestamp: 1747678685, expectedUtc: "2025-05-19T18:18:05Z")
✅ Write_AllDateTimeKinds_ProducesValidUnixTimestamp(kind: Local)
✅ Write_AllDateTimeKinds_ProducesValidUnixTimestamp(kind: Unspecified)
✅ Write_AllDateTimeKinds_ProducesValidUnixTimestamp(kind: Utc)
✅ Write_LocalDateTime_ConvertsToUtcAndWritesCorrectUnixTimestamp
✅ Write_UnspecifiedDateTime_TreatsAsUtcAndWritesCorrectUnixTimestamp
✅ Write_UtcDateTime_WritesCorrectUnixTimestamp

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.RedditPostClientTests

✅ GetPost_EmptyRawPost_ThrowsArgumentException
✅ GetPost_PostWithEmptyStringReplies_HandlesGracefully
✅ GetPost_PostWithJsonElementReplies_HandlesGracefully
✅ GetPost_PostWithMixedCommentTypes_OnlyProcessesComments
✅ GetPost_PostWithNoChildren_ThrowsArgumentException
✅ GetPost_PostWithNullFields_HandlesNullsGracefully
✅ GetPost_PostWithNullReplies_HandlesGracefully
✅ GetPost_PostWithoutTitle_ThrowsInvalidOperationException
✅ GetPost_ValidRedditPost_ReturnsTransformedPost

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.Client.SubredditClientTests

✅ GetNewInSubreddit_ValidSubredditName_ReturnsTransformedResult

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.RedditOptionsTests

✅ RedditOptions_AdditionalBaseAddresses_ShouldBeEmptyByDefault
✅ RedditOptions_AllBaseAddresses_ShouldIncludeDefaultAndAdditional
✅ RedditOptions_AllDomains_ShouldExtractDomainsFromValidUrls
✅ RedditOptions_AllDomains_ShouldSkipInvalidUrls
✅ RedditOptions_ConfigurationBinding_ShouldBindAdditionalBaseAddresses
✅ RedditOptions_ConfigurationBinding_ShouldOverrideDefault
✅ RedditOptions_DefaultBaseAddress_ShouldBeRedditCom
✅ RedditOptions_DefaultConfiguration_ShouldIncludeBothWwwAndNonWwwReddit
✅ RedditOptions_EmptyConfiguration_ShouldUseDefault
✅ RedditOptions_FallbackImageUrl_ShouldBeRedditLogo

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.RedditPostContentExtractorTests

✅ CanHandle_CustomRedditInstance_ReturnsTrue(url: "https://alt.reddit.instance.com/r/programming/comm"···)
✅ CanHandle_CustomRedditInstance_ReturnsTrue(url: "https://custom.reddit.com/r/programming/comments/a"···)
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://not-reddit.com/r/programming/comments/abc1"···)
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://reddit.com")
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://reddit.com/r")
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://reddit.com/r/programming")
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://reddit.com/r/programming/comments")
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://reddit.com/r/programming/comments/abc123/t"···)
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://reddit.com/r/programming/comments/abc123/t"···)
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://reddit.com/r/programming/posts/abc123/titl"···)
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://reddit.com/user/username/comments/abc123/t"···)
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "https://www2.reddit.com/r/programming/comments/abc"···)
✅ CanHandle_InvalidRedditPostUrl_ReturnsFalse(url: "not-a-url")
✅ CanHandle_UnknownRedditInstance_ReturnsFalse(url: "https://unknown.reddit.com/r/programming/comments/"···)
✅ CanHandle_UnknownRedditInstance_ReturnsFalse(url: "https://www.unknown.reddit.com/r/programming/comme"···)
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "https://reddit.com/r/programming/comments/abc123")
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "hTTpS://rEDDiT.cOm/R/pRoGrAmMiNg/CoMmEnTs/AbC123")
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "https://reddit.com/r/programming/comments/abc123/")
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "https://reddit.com/r/programming/comments/abc123/t"···)
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "https://reddit.com/r/programming/comments/abc123/t"···)
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "hTTpS://rEDDiT.cOm/R/pRoGrAmMiNg/CoMmEnTs/AbC123/T"···)
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "https://www.reddit.com/r/programming/comments/abc1"···)
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "https://www.reddit.com/r/programming/comments/abc1"···)
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "https://www.reddit.com/r/programming/comments/abc1"···)
✅ CanHandle_ValidRedditPostUrl_ReturnsTrue(url: "https://www.reddit.com/r/programming/comments/abc1"···)
✅ ExtractAsync_DifferentSubreddits_CallsSubredditImageExtractorWithCorrectName(url: "https://www.reddit.com/r/AskReddit/comments/jkl012", expectedSubreddit: "AskReddit")
✅ ExtractAsync_DifferentSubreddits_CallsSubredditImageExtractorWithCorrectName(url: "https://www.reddit.com/r/AskReddit/comments/jkl012"···, expectedSubreddit: "AskReddit")
✅ ExtractAsync_DifferentSubreddits_CallsSubredditImageExtractorWithCorrectName(url: "https://www.reddit.com/r/funny/comments/def456", expectedSubreddit: "funny")
✅ ExtractAsync_DifferentSubreddits_CallsSubredditImageExtractorWithCorrectName(url: "https://www.reddit.com/r/funny/comments/def456/jok"···, expectedSubreddit: "funny")
✅ ExtractAsync_DifferentSubreddits_CallsSubredditImageExtractorWithCorrectName(url: "https://www.reddit.com/r/programming/comments/abc1"···, expectedSubreddit: "programming")
✅ ExtractAsync_DifferentSubreddits_CallsSubredditImageExtractorWithCorrectName(url: "https://www.reddit.com/r/programming/comments/abc1"···, expectedSubreddit: "programming")
✅ ExtractAsync_DifferentSubreddits_CallsSubredditImageExtractorWithCorrectName(url: "https://www.reddit.com/r/todayilearned/comments/gh"···, expectedSubreddit: "todayilearned")
✅ ExtractAsync_DifferentSubreddits_CallsSubredditImageExtractorWithCorrectName(url: "https://www.reddit.com/r/todayilearned/comments/gh"···, expectedSubreddit: "todayilearned")
✅ ExtractAsync_InvalidUrl_ThrowsInvalidOperationException(invalidUrl: "   ")
✅ ExtractAsync_InvalidUrl_ThrowsInvalidOperationException(invalidUrl: "")
✅ ExtractAsync_InvalidUrl_ThrowsInvalidOperationException(invalidUrl: "not-a-url")
✅ ExtractAsync_InvalidUrl_ThrowsWithMeaningfulErrorMessage
✅ ExtractAsync_PostWithEmptyImage_UsesSubredditFallbackImage
✅ ExtractAsync_PostWithImage_ReturnsExtractWithPostImage
✅ ExtractAsync_PostWithoutImage_UsesSubredditFallbackImage
✅ ExtractAsync_PostWithVariousImageUrls_DoesNotUseFallback(imageUrl: "https://external-preview.redd.it/external-image.gi"···)
✅ ExtractAsync_PostWithVariousImageUrls_DoesNotUseFallback(imageUrl: "https://i.redd.it/gallery-image.jpg")
✅ ExtractAsync_PostWithVariousImageUrls_DoesNotUseFallback(imageUrl: "https://imgur.com/direct-link.webp")
✅ ExtractAsync_PostWithVariousImageUrls_DoesNotUseFallback(imageUrl: "https://preview.redd.it/preview-image.png")
✅ ExtractAsync_PostWithVariousImageUrls_DoesNotUseFallback(imageUrl: "https://reddit.com/thumbnail.bmp")
✅ ExtractAsync_PostWithWhitespaceImage_UsesSubredditFallbackImage
✅ ExtractAsync_SubredditImageExtractorThrows_PropagatesException
✅ ExtractAsync_UnsupportedHost_ThrowsWithMeaningfulErrorMessage
✅ ExtractAsync_UnsupportedUrl_ThrowsInvalidOperationException(unsupportedUrl: "https://reddit.com")
✅ ExtractAsync_UnsupportedUrl_ThrowsInvalidOperationException(unsupportedUrl: "https://reddit.com/r/programming")
✅ ExtractAsync_UnsupportedUrl_ThrowsInvalidOperationException(unsupportedUrl: "https://reddit.com/r/programming/comments")
✅ ExtractAsync_UnsupportedUrl_ThrowsInvalidOperationException(unsupportedUrl: "https://reddit.com/r/programming/comments/abc123/t"···)
✅ ExtractAsync_UnsupportedUrl_ThrowsInvalidOperationException(unsupportedUrl: "https://reddit.com/r/programming/posts/abc123/titl"···)
✅ ExtractAsync_UnsupportedUrl_ThrowsWithMeaningfulErrorMessage
✅ ExtractAsync_ValidUrl_CallsRedditPostClientWithCorrectPostId(url: "https://www.reddit.com/r/programming/comments/abc1"···)
✅ ExtractAsync_ValidUrl_CallsRedditPostClientWithCorrectPostId(url: "https://www.reddit.com/r/programming/comments/abc1"···)
✅ ExtractAsync_ValidUrl_ReturnsCorrectOriginalUrl
✅ ExtractAsync_ValidUrl_ReturnsCorrectTitle
✅ ExtractAsync_ValidUrl_ReturnsSerializedPostAsContent

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentExtractors.Reddit.SubredditExtractorTests

✅ CanHandle_CustomRedditInstance_ReturnsTrue(url: "https://alt.reddit.instance.com/r/testsubreddit/")
✅ CanHandle_CustomRedditInstance_ReturnsTrue(url: "https://custom.reddit.com/r/testsubreddit/")
✅ CanHandle_InvalidSubredditUrl_ReturnsFalse(url: "https://not-reddit.com/r/testsubreddit/")
✅ CanHandle_InvalidSubredditUrl_ReturnsFalse(url: "https://reddit.com")
✅ CanHandle_InvalidSubredditUrl_ReturnsFalse(url: "https://reddit.com/r")
✅ CanHandle_InvalidSubredditUrl_ReturnsFalse(url: "https://reddit.com/r/testsubreddit/more")
✅ CanHandle_InvalidSubredditUrl_ReturnsFalse(url: "https://www2.reddit.com/r/testsubreddit/")
✅ CanHandle_InvalidSubredditUrl_ReturnsFalse(url: "not-a-url")
✅ CanHandle_UnknownRedditInstance_ReturnsFalse(url: "https://unknown.reddit.com/r/testsubreddit/")
✅ CanHandle_UnknownRedditInstance_ReturnsFalse(url: "https://www.unknown.reddit.com/r/testsubreddit/")
✅ CanHandle_ValidSubredditUrl_ReturnsTrue(url: "https://reddit.com/r/testsubreddit")
✅ CanHandle_ValidSubredditUrl_ReturnsTrue(url: "https://reddit.com/r/testsubreddit/")
✅ CanHandle_ValidSubredditUrl_ReturnsTrue(url: "hTTpS://rEDdiT.cOm/R/tEsTsUbReDdIt/")
✅ CanHandle_ValidSubredditUrl_ReturnsTrue(url: "https://www.reddit.com/r/testsubreddit/")
✅ ExtractAsync_AvailableContent_ReturnsExpectedContent
✅ ExtractAsync_AvailableContent_ReturnsExpectedTitle
✅ ExtractAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "banner_background_image")
✅ ExtractAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "banner_img")
✅ ExtractAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "community_icon")
✅ ExtractAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "icon_img")
✅ ExtractAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "mobile_banner_image")
✅ ExtractAsync_ImageUrlIsInvalid_UsesFallbackImageUrl(invalidType: "empty")
✅ ExtractAsync_ImageUrlIsInvalid_UsesFallbackImageUrl(invalidType: "invalid-uri")
✅ ExtractAsync_ImageUrlIsInvalid_UsesFallbackImageUrl(invalidType: "non-http")
✅ ExtractAsync_ImageUrlIsInvalid_UsesFallbackImageUrl(invalidType: "null")
✅ ExtractAsync_ImageUrlIsInvalid_UsesFallbackImageUrl(invalidType: "whitespace")
✅ ExtractAsync_NoImageKeysExist_UsesFallbackImageUrl
✅ ExtractAsync_TryGetReturnsFalse_UsesFallbackImageUrl(imageKey: "banner_background_image")
✅ ExtractAsync_TryGetReturnsFalse_UsesFallbackImageUrl(imageKey: "banner_img")
✅ ExtractAsync_TryGetReturnsFalse_UsesFallbackImageUrl(imageKey: "community_icon")
✅ ExtractAsync_TryGetReturnsFalse_UsesFallbackImageUrl(imageKey: "icon_img")
✅ ExtractAsync_TryGetReturnsFalse_UsesFallbackImageUrl(imageKey: "mobile_banner_image")
✅ ExtractAsync_UrlWithQueryString_ExtractsCorrectSubredditName
✅ ExtractAsync_ValidUrl_CallsSubredditClientWithCorrectName(subredditUrl: "https://www.reddit.com/r/testsubreddit")
✅ ExtractAsync_ValidUrl_CallsSubredditClientWithCorrectName(subredditUrl: "https://www.reddit.com/r/testsubreddit/")
✅ ExtractAsync_ValidUrl_GeneratesInstanceSpecificOriginalUrl
✅ GetSubredditImageUrlAsync_FirstImageNotAccessible_ReturnsSecondImage
✅ GetSubredditImageUrlAsync_HttpDownloaderThrows_PropagatesException
✅ GetSubredditImageUrlAsync_ImageExistsButNotAccessible_ReturnsFallbackImageUrl
✅ GetSubredditImageUrlAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "banner_background_image")
✅ GetSubredditImageUrlAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "banner_img")
✅ GetSubredditImageUrlAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "community_icon")
✅ GetSubredditImageUrlAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "icon_img")
✅ GetSubredditImageUrlAsync_ImageKeyExistsAndIsAccessible_ReturnsImageUrl(imageKey: "mobile_banner_image")
✅ GetSubredditImageUrlAsync_ImageUrlIsInvalidUri_UsesFallbackImageUrl(imageKey: "banner_background_image", imageUrl: "http://")
✅ GetSubredditImageUrlAsync_ImageUrlIsInvalidUri_UsesFallbackImageUrl(imageKey: "banner_img", imageUrl: "https://")
✅ GetSubredditImageUrlAsync_ImageUrlIsInvalidUri_UsesFallbackImageUrl(imageKey: "community_icon", imageUrl: "://invalid-url")
✅ GetSubredditImageUrlAsync_ImageUrlIsInvalidUri_UsesFallbackImageUrl(imageKey: "icon_img", imageUrl: "not-a-valid-url")
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "banner_background_image", imageUrl: "   ")
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "banner_background_image", imageUrl: "file:///c:/images/banner.png")
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "banner_img", imageUrl: "\t")
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "banner_img", imageUrl: "javascript:alert('xss')")
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "community_icon", imageUrl: "")
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "community_icon", imageUrl: "ftp://example.com/image.png")
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "icon_img", imageUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEA"···)
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "icon_img", imageUrl: null)
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "mobile_banner_image", imageUrl: "\n")
✅ GetSubredditImageUrlAsync_ImageUrlIsUnsuitable_UsesFallbackImageUrl(imageKey: "mobile_banner_image", imageUrl: "mailto:test@example.com")
✅ GetSubredditImageUrlAsync_MixedValidAndInvalidUrls_UsesFirstValidHttpUrl
✅ GetSubredditImageUrlAsync_MultipleImageKeys_ReturnsFirstAccessibleImage
✅ GetSubredditImageUrlAsync_NoImageKeysExist_ReturnsFallbackImageUrl

✅ Elzik.Breef.Infrastructure.Tests.Unit.ContentSummariserTests

✅ SummariseAsync_ValidContent_Logs
✅ SummariseAsync_ValidContent_ProvidesModelInstructions
✅ SummariseAsync_ValidContent_ReturnsSummary

✅ Elzik.Breef.Infrastructure.Tests.Unit.Wallabag.WallabagBreefPublisherTests

✅ Publish_WhenCalled_ShouldReturnPublishedBreef

✅ Elzik.Breef.Infrastructure.Tests.Unit.Wallabag.WallabagDateTimeConverterTests

✅ Read_InvalidInput_Throws(testJson: "\"invalid-date\"", expectedMessage: "Unable to convert \"invalid-date\" to a Wallabag D"···)
✅ Read_InvalidInput_Throws(testJson: "12345", expectedMessage: "Expected string token.")
✅ Read_ValidDate_ReturnsExpectedDate
✅ Write_ShouldConvertDateTimeToString