diff --git a/backlog/tasks/ml-192 - Add-high-value-behavioral-test-coverage.md b/backlog/tasks/ml-192 - Add-high-value-behavioral-test-coverage.md new file mode 100644 index 00000000..04031d7c --- /dev/null +++ b/backlog/tasks/ml-192 - Add-high-value-behavioral-test-coverage.md @@ -0,0 +1,53 @@ +--- +id: ML-192 +title: Add high-value behavioral test coverage +status: To Do +assignee: [] +created_date: "2026-05-20 17:19" +updated_date: "2026-05-20 17:20" +labels: + - testing + - coverage +dependencies: [] +documentation: + - docs/architecture.md + - docs/project-conventions.md + - .agents/skills/testing/SKILL.md + - .agents/skills/ui-framework/SKILL.md + - .agents/skills/sqlite-optimization/SKILL.md +priority: high +ordinal: 35000 +--- + +## Description + + + +Increase coverage where current tests would catch meaningful regressions in user-facing workflows and core data transformations. Focus on the high-value gaps identified from the coverage triage: RecordForm genre and cover-search behavior, BarcodeScanner component state and import branches, Notes component create/update/read-edit behavior, ScrobbleRules subset application, and Assets.Image conversion/error handling. Avoid tests that only assert markup exists without exercising behavior. + + + +## Acceptance Criteria + + + +- [ ] #1 Record editing tests cover genre search suggestions, adding a new normalized genre, preventing duplicate/blank genres, and removing an existing genre through the LiveComponent path. +- [ ] #2 Record editing tests cover Brave cover search success, search failure with a friendly message, selecting a search result, and persisting the downloaded cover hash on the record. +- [ ] #3 Barcode scanner tests cover a scan failure toast, removing one scanned result, clearing all scanned results, and the 2+ new-release async import branch including expected enqueued import jobs. +- [ ] #4 Notes component tests cover creating a new record or artist note, rendering an existing note in read mode, updating note content, and persisting the result through the Notes context. +- [ ] #5 Scrobble rules tests prove apply_all_rules/1 only updates the supplied track subset and leaves non-supplied matching tracks unchanged. +- [ ] #6 Assets image tests cover convert/3 same-format passthrough, successful JPEG/WebP conversion as supported by the app, and invalid image data returning an error tuple. + + +## Implementation Plan + + + +1. Read docs/architecture.md, docs/project-conventions.md, .agents/skills/testing/SKILL.md, and relevant UI/SQLite guidance before changing tests. +2. Add focused PhoenixTest/LiveView tests around existing record edit flows for genre events and cover search/download, stubbing BraveSearch.API and asserting persisted record state through MusicLibrary.Records. +3. Add BarcodeScanner tests through the collection scan LiveView or component harness, using Req.Test/Oban assertions to verify scan failure, remove/clear behavior, and async import enqueues. +4. Add Notes component coverage through record or artist show pages, asserting persisted notes through MusicLibrary.Notes rather than UI text alone. +5. Add ScrobbleRules subset tests with explicit scrobbled_at_uts values so only supplied tracks are updated. +6. Add Assets.Image tests for convert/3 and invalid data using existing image fixtures or fallback data. +7. Run targeted test files first, then run the relevant project test command if scope/time permits. + diff --git a/backlog/tasks/ml-193 - Add-secondary-parser-search-and-API-coverage.md b/backlog/tasks/ml-193 - Add-secondary-parser-search-and-API-coverage.md new file mode 100644 index 00000000..7a1d1b0e --- /dev/null +++ b/backlog/tasks/ml-193 - Add-secondary-parser-search-and-API-coverage.md @@ -0,0 +1,55 @@ +--- +id: ML-193 +title: Add secondary parser search and API coverage +status: To Do +assignee: [] +created_date: "2026-05-20 17:19" +updated_date: "2026-05-20 17:20" +labels: + - testing + - coverage +dependencies: [] +documentation: + - docs/architecture.md + - docs/project-conventions.md + - .agents/skills/testing/SKILL.md + - .agents/skills/ui-framework/SKILL.md + - .agents/skills/external-api-integration/SKILL.md +priority: medium +ordinal: 36000 +--- + +## Description + + + +Add focused tests for low-coverage modules where direct tests would be more diagnostic than broad end-to-end coverage. Focus on universal search record-set/navigation behavior, MusicBrainz parser helpers, Last.fm session XML edge cases, HTTP/API error classification, the Wikipedia worker cancel path, and StatsComponents on-this-day rendering branches. + + + +## Acceptance Criteria + + + +- [ ] #1 Universal search tests cover record-set results and counts when record sets match by name, description, contained record title, or artist name. +- [ ] #2 Universal search tests cover navigation events for collection records, wishlist records, artists, record sets, navigation links, and view-all collection/wishlist/record-set actions. +- [ ] #3 MusicBrainz parser tests cover ReleaseGroup artist credits with joinphrases, included release-group filtering, release ID extraction, parse_record_type precedence for live and compilation albums, and ReleaseSearchResult handling of missing release groups or unknown media formats. +- [ ] #4 LastFm.Session tests cover non-subscriber XML, missing subscriber, and missing name/key nodes with explicit expected struct values. +- [ ] #5 HTTP/API error tests cover MusicLibrary.HttpError default status-kind mapping and Discogs.API.ErrorResponse fallback message and retry-delay behavior. +- [ ] #6 ArtistRefreshWikipediaData worker tests cover the {:cancel, :no_english_wikipedia} branch when Wikipedia reports no English article. +- [ ] #7 StatsComponents or page-level tests cover grouped on-this-day records and anniversary labels for Today, normal years, 5-year, and 10-year milestones. + + +## Implementation Plan + + + +1. Read docs/architecture.md, docs/project-conventions.md, .agents/skills/testing/SKILL.md, and the UI/external API skill guidance before editing tests. +2. Extend universal search tests with record set fixtures and navigation assertions; prefer PhoenixTest and unwrap only where direct LiveView event interaction is needed. +3. Add direct parser tests for MusicBrainz.ReleaseGroup and MusicBrainz.ReleaseSearchResult using small explicit maps plus existing fixtures where helpful. +4. Expand LastFm.Session tests beyond doctests with explicit XML examples for non-subscriber and missing-node cases. +5. Add table-style tests for MusicLibrary.HttpError and Discogs.API.ErrorResponse that assert concrete kinds, messages, retryability, and retry delays. +6. Add the ArtistRefreshWikipediaData no-English-Wikipedia worker branch using a Wikipedia stub or context setup that produces {:error, :no_english_wikipedia}. +7. Cover StatsComponents on-this-day grouped and anniversary rendering through the page if practical, otherwise use focused component rendering consistent with local patterns. +8. Run the new/modified targeted tests and any broader affected test files. + diff --git a/backlog/tasks/ml-194 - Add-selective-low-priority-smoke-coverage.md b/backlog/tasks/ml-194 - Add-selective-low-priority-smoke-coverage.md new file mode 100644 index 00000000..460e78db --- /dev/null +++ b/backlog/tasks/ml-194 - Add-selective-low-priority-smoke-coverage.md @@ -0,0 +1,54 @@ +--- +id: ML-194 +title: Add selective low-priority smoke coverage +status: To Do +assignee: [] +created_date: "2026-05-20 17:19" +updated_date: "2026-05-20 17:20" +labels: + - testing + - coverage +dependencies: [] +documentation: + - docs/architecture.md + - docs/project-conventions.md + - docs/production-infrastructure.md + - .agents/skills/testing/SKILL.md + - .agents/skills/oban-worker/SKILL.md + - .agents/skills/ui-framework/SKILL.md +priority: low +ordinal: 37000 +--- + +## Description + + + +Add only low-cost tests for low-coverage wiring where there is a real regression signal. This task should not chase percentages with brittle route enumeration, supervision-shape assertions, or Phoenix framework behavior. Focus on thin bulk worker delegation, timezone/static-asset hook assignment if practical, and browser CSP/header behavior. + + + +## Acceptance Criteria + + + +- [ ] #1 Bulk cron worker smoke tests verify each all-record/all-artist worker delegates to the corresponding batch flow and enqueues the expected downstream jobs for representative records or artist infos. +- [ ] #2 The bulk worker tests avoid duplicating full single-item worker API refresh behavior that is already covered elsewhere. +- [ ] #3 A browser pipeline test asserts the Content-Security-Policy header includes the app-specific image, worker, connect, frame-ancestor, and base-uri directives that matter for current features. +- [ ] #4 GetTimezone hook coverage verifies a provided connect-param timezone is assigned and missing connect params fall back to MusicLibrary.default_timezone/0, if this can be tested without brittle framework setup. +- [ ] #5 StaticAssets hook coverage is added only if it can assert the assigned value through an existing LiveView request without coupling to Phoenix internals. +- [ ] #6 No tests are added for Application child ordering, exhaustive route enumeration, or framework-generated static_changed?/1 behavior unless a concrete project regression is identified. + + +## Implementation Plan + + + +1. Read docs/architecture.md, docs/project-conventions.md, docs/production-infrastructure.md, .agents/skills/testing/SKILL.md, and .agents/skills/oban-worker/SKILL.md before editing tests. +2. Add a small parameterized worker smoke test file for the all-record/all-artist workers, asserting the expected downstream enqueue behavior through existing batch flows. +3. Keep worker tests shallow: do not stub or exercise external API refresh behavior already covered by single-item worker tests. +4. Add a browser pipeline/controller test for the CSP header on a representative HTML route, asserting only directives that are project-specific and important to current features. +5. Investigate GetTimezone/StaticAssets hook coverage; add tests only if they can be expressed through stable public LiveView behavior without coupling to Phoenix internals. +6. Explicitly avoid Application child ordering, exhaustive route list, and framework static_changed?/1 tests. +7. Run the targeted worker/controller/hook tests and any affected web test file. +