Migrates AI services to Agent Framework #94
Merged
GitHub Actions / .NET Tests
succeeded
Feb 15, 2026 in 0s
189 passed, 0 failed and 0 skipped
| Report | Passed | Failed | Skipped | Time |
|---|---|---|---|---|
| ./TestResults/_runnervmjduv7_2026-02-15_02_02_44.trx | 158✅ | 28s | ||
| ./TestResults/_runnervmjduv7_2026-02-15_02_02_46.trx | 31✅ | 5s |
✅ ./TestResults/_runnervmjduv7_2026-02-15_02_02_44.trx
158 tests were completed in 28s with 158 passed, 0 failed and 0 skipped.
✅ NoteBookmark.Api.Tests.Domain.ContainsPlaceholderAttributeTests
✅ Constructor_ShouldSetPlaceholder
✅ ErrorMessage_ShouldContainPlaceholderName
✅ IsValid_ShouldReturnError_WhenValueDoesNotContainPlaceholder
✅ IsValid_ShouldReturnSuccess_WhenValueContainsPlaceholder
✅ IsValid_ShouldReturnSuccess_WhenValueIsEmpty
✅ IsValid_ShouldReturnSuccess_WhenValueIsNull
✅ IsValid_ShouldReturnSuccess_WhenValueIsWhitespace
✅ IsValid_ShouldValidateCorrectly_ForVariousInputs(value: "Multiple {var1} and {var2}", placeholder: "var1", shouldBeValid: True)
✅ IsValid_ShouldValidateCorrectly_ForVariousInputs(value: "Multiple {var1} and {var2}", placeholder: "var2", shouldBeValid: True)
✅ IsValid_ShouldValidateCorrectly_ForVariousInputs(value: "Multiple var1 and var2", placeholder: "var1", shouldBeValid: False)
✅ IsValid_ShouldValidateCorrectly_ForVariousInputs(value: "Summary of {content}", placeholder: "content", shouldBeValid: True)
✅ IsValid_ShouldValidateCorrectly_ForVariousInputs(value: "Summary of content", placeholder: "content", shouldBeValid: False)
✅ IsValid_ShouldValidateCorrectly_ForVariousInputs(value: "Use {topic} for search", placeholder: "topic", shouldBeValid: True)
✅ IsValid_ShouldValidateCorrectly_ForVariousInputs(value: "Use topic for search", placeholder: "topic", shouldBeValid: False)
✅ NoteBookmark.Api.Tests.Domain.DateOnlyJsonConverterTests
✅ DateConverter_ShouldFormatWithYearMonthDay
✅ Read_ShouldHandleArray_ReturnNull
✅ Read_ShouldHandleBoolean_ReturnStringRepresentation
✅ Read_ShouldHandleEmptyString
✅ Read_ShouldHandleFullDateTime
✅ Read_ShouldHandleInvalidDateString_ReturnOriginal
✅ Read_ShouldHandleNull
✅ Read_ShouldHandleNumber_ParseAsTimestamp
✅ Read_ShouldHandleObject_ReturnNull
✅ Read_ShouldParseValidDate
✅ Write_ShouldWriteNull
✅ Write_ShouldWriteValue
✅ NoteBookmark.Api.Tests.Domain.NoteCategoriesTests
✅ GetCategories_ShouldReturnAllCategories
✅ GetCategories_ShouldReturnListType
✅ GetCategory_ShouldBeCaseInsensitive
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "ai", expected: "AI")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "AI", expected: "AI")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "cloud", expected: "Cloud")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "CLOUD", expected: "Cloud")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "data", expected: "Data")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "database", expected: "Databases")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "del", expected: "del")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "dev", expected: "Programming")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "devops", expected: "DevOps")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "lowcode", expected: "LowCode")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "misc", expected: "Miscellaneous")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "oss", expected: "Open Source")
✅ GetCategory_ShouldReturnCorrectCategory_ForValidInput(input: "top", expected: "Suggestion of the week")
✅ GetCategory_ShouldReturnMiscellaneous_ForInvalidCategory(input: "")
✅ GetCategory_ShouldReturnMiscellaneous_ForInvalidCategory(input: "invalid")
✅ GetCategory_ShouldReturnMiscellaneous_ForInvalidCategory(input: "unknown")
✅ GetCategory_ShouldReturnMiscellaneous_ForNullInput
✅ NoteBookmark.Api.Tests.Domain.NoteTests
✅ Note_Constructor_ShouldInitializeDateAdded_WithCurrentUtcTime
✅ Note_Constructor_ShouldInitializePartitionKey_WithCurrentYearMonth
✅ Note_Constructor_ShouldInitializeRowKey_WithValidGuid
✅ Note_WhenCreated_HasCorrectDefaultValues
✅ Note_WhenPropertiesSet_ReturnsCorrectValues
✅ Validate_ShouldReturnFalse_WhenCommentIsEmpty
✅ Validate_ShouldReturnFalse_WhenCommentIsNull
✅ Validate_ShouldReturnFalse_WhenCommentIsWhitespace
✅ Validate_ShouldReturnTrue_WhenCommentIsNotEmpty
✅ NoteBookmark.Api.Tests.Domain.PostLTests
✅ PostL_Note_CanBeEmptyString
✅ PostL_NoteId_CanBeEmptyString
✅ PostL_WhenCreated_HasCorrectDefaultValues
✅ PostL_WhenPropertiesSet_ReturnsCorrectValues
✅ NoteBookmark.Api.Tests.Domain.PostSuggestionTests
✅ PostSuggestion_RoundTrip_ShouldMaintainValues
✅ PostSuggestion_ShouldDeserializeFromJson
✅ PostSuggestion_ShouldHandleNullAuthor
✅ PostSuggestion_ShouldHandleNullPublicationDate
✅ PostSuggestion_ShouldSerializeToJson
✅ NoteBookmark.Api.Tests.Domain.PostTests
✅ Post_is_read_CanBeSetToAnyBooleanValue(readStatus: False)
✅ Post_is_read_CanBeSetToAnyBooleanValue(readStatus: null)
✅ Post_is_read_CanBeSetToAnyBooleanValue(readStatus: True)
✅ Post_WhenCreated_HasCorrectDefaultValues
✅ Post_WhenPropertiesSet_ReturnsCorrectValues
✅ NoteBookmark.Api.Tests.Domain.ReadingNotesTests
✅ ReadingNotes_CanAddNotesToCategories
✅ ReadingNotes_GetAllUniqueTags_ReturnsDistinctTags
✅ ReadingNotes_WhenCreated_HasCorrectDefaultValues
✅ ReadingNotes_WhenPropertiesSet_ReturnsCorrectValues
✅ NoteBookmark.Api.Tests.Domain.ReadingNoteTests
✅ ReadingNote_WhenCreated_HasCorrectDefaultValues
✅ ReadingNote_WhenPropertiesSet_ReturnsCorrectValues
✅ ToMarkDown_ShouldGenerateCorrectMarkdown_WithAllProperties
✅ ToMarkDown_ShouldHandleMissingAuthor
✅ ToMarkDown_ShouldHandleMissingTitle
✅ ToMarkDown_ShouldHandleMissingUrl
✅ ToMarkDown_ShouldStartWithNewLineAndHyphen
✅ NoteBookmark.Api.Tests.Domain.SearchCriteriasTests
✅ Constructor_ShouldSetSearchPrompt
✅ GetSearchPrompt_ShouldHandleEmptySearchTopic
✅ GetSearchPrompt_ShouldHandleNullSearchTopic
✅ GetSearchPrompt_ShouldReplaceTopicPlaceholder
✅ GetSplittedAllowedDomains_ShouldHandleSingleDomain
✅ GetSplittedAllowedDomains_ShouldReturnNull_WhenAllowedDomainsIsNull
✅ GetSplittedAllowedDomains_ShouldSplitAndTrim_WhenAllowedDomainsProvided
✅ GetSplittedBlockedDomains_ShouldReturnNull_WhenBlockedDomainsIsNull
✅ GetSplittedBlockedDomains_ShouldSplitAndTrim_WhenBlockedDomainsProvided
✅ Properties_ShouldBeSettable
✅ NoteBookmark.Api.Tests.Domain.SettingsTests
✅ Settings_LastBookmarkDate_CanStoreVariousDateFormats(dateString: "2023-12-25T00:00:00")
✅ Settings_LastBookmarkDate_CanStoreVariousDateFormats(dateString: "2024-01-01T12:00:00Z")
✅ Settings_LastBookmarkDate_CanStoreVariousDateFormats(dateString: "2025-06-03T15:30:00")
✅ Settings_ReadingNotesCounter_CanStoreVariousCounterValues(counter: "0")
✅ Settings_ReadingNotesCounter_CanStoreVariousCounterValues(counter: "1")
✅ Settings_ReadingNotesCounter_CanStoreVariousCounterValues(counter: "1000")
✅ Settings_ReadingNotesCounter_CanStoreVariousCounterValues(counter: "999")
✅ Settings_WhenCreated_HasCorrectDefaultValues
✅ Settings_WhenPropertiesSet_ReturnsCorrectValues
✅ NoteBookmark.Api.Tests.Domain.SummaryTests
✅ Summary_WhenCreated_HasCorrectDefaultValues
✅ Summary_WhenPropertiesSet_ReturnsCorrectValues
✅ NoteBookmark.Api.Tests.Endpoints.NoteEndpointsTests
✅ CreateNote_WithInvalidNote_ReturnsBadRequest
✅ CreateNote_WithValidNote_MarksRelatedPostAsRead
✅ CreateNote_WithValidNote_ReturnsCreated
✅ DeleteNote_WithInvalidNoteId_ReturnsNotFound
✅ DeleteNote_WithValidNoteId_ReturnsOk
✅ GetNote_WithInvalidNoteId_ReturnsNotFound
✅ GetNote_WithValidNoteId_ReturnsNote
✅ GetNotes_ReturnsAllNotes
✅ GetNotesForSummary_WithInvalidReadingNotesId_ReturnsEmptyList
✅ GetNotesForSummary_WithValidReadingNotesId_ReturnsFilteredNotes
✅ SaveReadingNotes_WithValidReadingNotes_ReturnsOkWithUrl
✅ UpdateNote_WithInvalidNote_ReturnsBadRequest
✅ UpdateNote_WithValidNote_ReturnsOk
✅ UpdatePostReadStatus_UpdatesAllPostsWithNotes
✅ NoteBookmark.Api.Tests.Endpoints.PostEndpointsTests
✅ DeletePost_WhenPostDoesNotExist_ReturnsNotFound
✅ DeletePost_WhenPostExists_ReturnsOk
✅ ExtractPostDetails_WithInvalidUrl_ReturnsBadRequest
✅ ExtractPostDetails_WithValidUrl_ReturnsOkWithPost
✅ GetPost_WhenPostDoesNotExist_ReturnsNotFound
✅ GetPost_WhenPostExists_ReturnsOkWithPost
✅ GetReadPosts_ReturnsOkWithReadPosts
✅ GetUnreadPosts_ReturnsOkWithUnreadPosts
✅ SavePost_WithInvalidPost_ReturnsBadRequest
✅ SavePost_WithValidPost_ReturnsOk
✅ NoteBookmark.Api.Tests.Endpoints.SettingEndpointsTests
✅ GetNextReadingNotesCounter_ReturnsValidCounter
✅ GetNextReadingNotesCounter_WhenNoSettings_ReturnsDefaultCounter
✅ GetSettings_ReturnsOkWithSettings
✅ SaveSettings_ThenGetSettings_ReturnsUpdatedSettings
✅ SaveSettings_WithInvalidSettings_ReturnsBadRequest
✅ SaveSettings_WithValidSettings_ReturnsOk
✅ SettingsEndpoints_IntegrationFlow_WorksCorrectly
✅ NoteBookmark.Api.Tests.Integration.NoteBookmarkWorkflowTests
✅ CompleteWorkflow_CreatePostAddNoteGenerateSummary_WorksCorrectly
✅ MultipleNotesForSameReadingNotes_WorksCorrectly
✅ PostDeletionWorkflow_DeletePost_WorksCorrectly
✅ PostFilteringWorkflow_ReadAndUnreadPosts_WorksCorrectly
✅ ReadingNotesWorkflow_SaveAndRetrieve_WorksCorrectly
✅ SettingsWorkflow_UpdateCounter_WorksCorrectly
✅ UpdatePostReadStatusWorkflow_UpdatesCorrectly
✅ NoteBookmark.Api.Tests.Services.DataStorageServiceTests
✅ CreateNote_WhenExistingNote_UpdatesNoteSuccessfully
✅ CreateNote_WhenNewNote_AddsNoteSuccessfully
✅ DeletePost_WhenPostDoesNotExist_ReturnsFalse
✅ DeletePost_WhenPostExists_DeletesSuccessfully
✅ GetFilteredPosts_WithUnreadFilter_ReturnsOnlyUnreadPosts
✅ GetNotesForSummary_WithValidReadingNotesId_ReturnsReadingNotes
✅ GetPost_WhenPostDoesNotExist_ReturnsNull
✅ GetPost_WhenPostExists_ReturnsPost
✅ GetReadingNotes_WhenExists_ReturnsReadingNotes
✅ GetSettings_WhenNoSettings_ReturnsDefaultSettings
✅ GetSettings_WhenSettingsExist_ReturnsSettings
✅ GetSummaries_ReturnsAllSummaries
✅ SavePost_WhenExistingPost_UpdatesPostSuccessfully
✅ SavePost_WhenNewPost_AddsPostSuccessfully
✅ SaveReadingNotes_ValidReadingNotes_SavesSuccessfully
✅ SaveReadingNotesMarkdown_ValidMarkdown_SavesSuccessfully
✅ SaveSettings_WhenNewSettings_SavesSuccessfully
✅ SaveSummary_NewSummary_SavesSuccessfully
✅ UpdatePostReadStatus_UpdatesAllPostsWithNotes
✅ ./TestResults/_runnervmjduv7_2026-02-15_02_02_46.trx
31 tests were completed in 5s with 31 passed, 0 failed and 0 skipped.
| Test suite | Passed | Failed | Skipped | Time |
|---|---|---|---|---|
| NoteBookmark.AIServices.Tests.ResearchServiceTests | 14✅ | 3s | ||
| NoteBookmark.AIServices.Tests.SummaryServiceTests | 17✅ | 3s |
✅ NoteBookmark.AIServices.Tests.ResearchServiceTests
✅ SearchSuggestionsAsync_ApiKeyPriority_AppSettingsOverridesEnvVar
✅ SearchSuggestionsAsync_OnException_ReturnsEmptyPostSuggestions
✅ SearchSuggestionsAsync_WithApiKeyFromAppSettings_UsesCorrectValue
✅ SearchSuggestionsAsync_WithApiKeyFromRekaEnvVar_UsesCorrectValue
✅ SearchSuggestionsAsync_WithCustomBaseUrl_UsesProvidedUrl
✅ SearchSuggestionsAsync_WithCustomModelName_UsesProvidedModel
✅ SearchSuggestionsAsync_WithDefaultBaseUrl_UsesRekaApi
✅ SearchSuggestionsAsync_WithDefaultModelName_UsesRekaFlashResearch
✅ SearchSuggestionsAsync_WithEmptyApiKey_ThrowsInvalidOperationException(emptyKey: " ")
✅ SearchSuggestionsAsync_WithEmptyApiKey_ThrowsInvalidOperationException(emptyKey: "")
✅ SearchSuggestionsAsync_WithInvalidUrl_ReturnsEmptyPostSuggestions
✅ SearchSuggestionsAsync_WithMissingApiKey_LogsError
✅ SearchSuggestionsAsync_WithMissingApiKey_ThrowsInvalidOperationException
✅ SearchSuggestionsAsync_WithValidSearchCriterias_ProcessesPrompt
✅ NoteBookmark.AIServices.Tests.SummaryServiceTests
✅ GenerateSummaryAsync_ApiKeyPriority_AppSettingsOverridesEnvVar
✅ GenerateSummaryAsync_OnException_ReturnsEmptyString
✅ GenerateSummaryAsync_WithApiKeyFromAppSettings_UsesCorrectValue
✅ GenerateSummaryAsync_WithApiKeyFromRekaEnvVar_UsesCorrectValue
✅ GenerateSummaryAsync_WithCustomBaseUrl_UsesProvidedUrl
✅ GenerateSummaryAsync_WithCustomModelName_UsesProvidedModel
✅ GenerateSummaryAsync_WithDefaultBaseUrl_UsesRekaApi
✅ GenerateSummaryAsync_WithDefaultModelName_UsesRekaFlash31
✅ GenerateSummaryAsync_WithEmptyApiKey_ReturnsEmptyString(emptyKey: " ")
✅ GenerateSummaryAsync_WithEmptyApiKey_ReturnsEmptyString(emptyKey: "")
✅ GenerateSummaryAsync_WithInvalidUrl_ReturnsEmptyString
✅ GenerateSummaryAsync_WithMissingApiKey_LogsError
✅ GenerateSummaryAsync_WithMissingApiKey_ReturnsEmptyString
✅ GenerateSummaryAsync_WithNullPrompt_HandlesGracefully
✅ GenerateSummaryAsync_WithVariousPrompts_HandlesCorrectly(prompt: "Multi\nline\nprompt")
✅ GenerateSummaryAsync_WithVariousPrompts_HandlesCorrectly(prompt: "Short prompt")
✅ GenerateSummaryAsync_WithVariousPrompts_HandlesCorrectly(prompt: "This is a longer prompt that should be processed c"···)
Loading