Commit Graph

530 Commits

Author SHA1 Message Date
Claudio Ortolina 1bd5707cb4 Fix page title for scrobble anything index and release group route 2026-04-23 21:06:12 +01:00
Claudio Ortolina 8911afad94 Add tests for Top Albums component 2026-04-23 16:41:44 +01:00
Claudio Ortolina c7c7e1fe4e Navigate from scrobble search to release-group page 2026-04-23 14:47:50 +01:00
Claudio Ortolina 0dcd6eab83 Replace /scrobble/:release_id with nested route 2026-04-23 14:39:26 +01:00
Claudio Ortolina d8041dc0dd Add /scrobble/:rg_id release-group page 2026-04-23 14:35:58 +01:00
Claudio Ortolina 4c48bda7b2 Refactor Release component to take release_id 2026-04-23 14:19:11 +01:00
Claudio Ortolina 0d1f580379 Refactor TracklistPdf to take release alone 2026-04-23 07:48:53 +01:00
Claudio Ortolina f7f38d580e Enable unaliased modules ex_slop check 2026-04-22 20:37:09 +01:00
Claudio Ortolina 0776700170 ML-142: Improve scrobble UI in the release component
- Sticky bar for easier track-based scrobbling
- Support setting custom finish time
2026-04-22 17:19:35 +01:00
Claudio Ortolina 9851a5c6bf Use cart with barcode scanner 2026-04-20 15:46:40 +01:00
Claudio Ortolina eaece07193 Count formats in results 2026-04-20 15:15:29 +01:00
Claudio Ortolina c4ebe636ff Fix ML-143 review: security, worker, and test improvements
Closes ML-143 review findings:
- cast_id/1 uses Integer.parse instead of String.to_integer
- add_to_cart validates against server-side release_groups
- JS.push payload trimmed to {id, format} only
- Oban.insert_all result checked for partial failures
- handle_async success resets @importing? to false
- ImportFromMusicbrainzReleaseGroup gets unique constraint
- Record.parse_datetime/1 made public with safe match
- Workers delegate to Record.parse_datetime/1
- Test coverage: change_format, clear_cart, wishlist single import
2026-04-20 15:15:29 +01:00
Claudio Ortolina 3f5ce060b1 Implement ML-143: Cart-style multi record import
Closes ML-143.
2026-04-20 15:15:29 +01:00
Claudio Ortolina 78487b0085 Pin Wikipedia intro_html to fixture value
Map.has_key? verified the key existed but not the content. The
fixture is deterministic — assert the stored value equals
Wikipedia.Fixtures.article_extract_html/0.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina a6319d55df Pin artist_live/show image_data_hash assertions
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 07c99992a3 Pin barcode_scan release assertions
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 162c10e70a Pin fetch_artist_image asset lookup
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina bce8560ce8 Pin fetch_artist_info stored-data assertions
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 1f457f0f11 Pin prune_assets test to %Asset{hash: ^hash} match
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 8a6c688a56 Assert parsed audit JSON structure
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 0eabe4b3ab Assert import count > 0 in options-forwarding test
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 8ce5da65e2 Pin Brave search error body assertion
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina cedb86af5d Pin OpenAI API error assertions to their shapes
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 6adfbea336 Pin Records.populate_genres error to OpenAI prefix
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 0ee0dcb118 Match decoded OpenAI error body, not raw JSON
Switch the 500-response stubs to Req.Test.json so Req decodes the
body, then match the map shape. Avoids coupling the assertion to
the exact JSON serialization.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 1429f7a826 Drop tautological delete.id checks
Repo.delete always returns the struct it was given, so deleted.id
== original.id is trivially true. Thread deleted.id through the
trailing get_*! call instead, so the binding is load-bearing.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina bb260437a1 Pin populate_genres error to OpenAI prefix
Match the string prefix "OpenAI API error:" that propagates from
OpenAI.gpt on non-2xx responses.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina a841ccf8e8 Tighten generate_record_embedding assertions
Assert stored embedding text matches the representation helper.
Pin the OpenAI-500 error path to the raw JSON body string.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina bbe0d5cd9e Pin artist_refresh_discogs_data assertions
Bind the returned ArtistInfo. For the no-discogs branch, assert
discogs_data was not touched.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina f9e3e8c5f8 Pin artist_refresh_wikipedia_data assertions
Bind perform_job results and assert id equality. For the unchanged case,
also assert wikipedia_data is the same as before the job ran.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 914fb4fbee Match specific errors on scrobble_rules duplicate
Pin the duplicate-rule error to the match_value field and "has already been
taken" message, matching the unique_constraint error_key in the changeset.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 9e29de55aa Pin online_store_templates delete assertion
Assert deleted.id == template.id rather than wildcard-matching the
returned struct.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina a90fdcf82f Tighten chats assertions
Pin invalid-attrs error to specific field, assert collection UUID round-trips
through Ecto.UUID.cast unchanged, and assert deleted.id == chat.id on delete.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 66c36f4d09 Tighten record_sets delete and duplicate assertions
Assert deleted.id == set.id on delete, and pin the duplicate error to the
specific field and message from the unique_constraint on record_set_id.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 60e95804ad Tighten similarity test assertions
Bind returned embeddings and assert record_id / text_representation match.
Pin OpenAI error path to the actual raw string body returned by the stub.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina e0fe5051ec Pin asset dedup assertion to same-hash
The duplicate prevention test asserted `{:ok, _}` twice without checking
that both calls returned the same asset. Assert hash equality.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina ae036e79fb Tighten scrobble_activity assertions
Replace 9 `{:ok, _}` sites with specific response-body checks to verify
the context returns the Last.fm API payload and not just the success branch.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina beaf38fcfe Add record_release tests 2026-04-19 16:11:32 +01:00
Claudio Ortolina 0dcfecf741 Increase render_async timeout to cater for slower CI 2026-04-19 09:29:04 +01:00
Claudio Ortolina f4db063298 Test artist edit form and record set picker flows
Closes #180
2026-04-19 09:00:06 +01:00
Claudio Ortolina 45236e4b10 Convert ErrorIgnorer tests to doctests 2026-04-19 07:50:39 +01:00
Claudio Ortolina 06ae5f8271 Share recent tracks fixture between Last.fm tests 2026-04-19 07:50:15 +01:00
Claudio Ortolina 22a47f4ca9 Add tests for previously uncovered modules 2026-04-19 07:47:20 +01:00
Claudio Ortolina 94143010c0 Fix doubly-wrapped safe tuple in artist bio render 2026-04-17 16:00:22 +01:00
Claudio Ortolina fd6eab82c0 Track fixture files as external resources 2026-04-17 14:02:45 +01:00
Claudio Ortolina 079f2a5f0f Add BraveSearch facade tests 2026-04-17 13:57:36 +01:00
Claudio Ortolina d8d5524e41 Replace Process.sleep with sys.get_state in error notifier tests
Deterministic GenServer state polling instead of timing-based waits.
Fixes #169.
2026-04-17 12:58:50 +01:00
Claudio Ortolina 4c5a3393e2 Run query reporter tests with async false
Avoid getting spurious failures due to interference by other tests
2026-04-17 10:29:43 +01:00
Claudio Ortolina 90838d1a3f Add tests for RecordActions and Chat component
Covers all action handlers on LiveHelpers.RecordActions and all
update/event clauses on Components.Chat — including streaming
chunk/done/error transitions and the retry re-send path.

Closes #179
2026-04-17 07:01:07 +01:00
Claudio Ortolina c816f2de4a Add scrobbled tracks search parser
Introduces ListeningStats.SearchParser with NimbleParsec supporting
record:, album_mbid:, artist_mbid:, artist:, album:, track: filters.
Links scrobble count on record page to filtered scrobbled tracks view.
2026-04-15 14:56:38 +01:00