const { test } = require('node:test'); const assert = require('node:assert/strict'); const mb = require('../lib/musicbrainz'); const rec = (title, artist, releases = []) => ({ id: 'rec-' + title, title, length: 200000, 'artist-credit': [{ name: artist, artist: { id: 'a', name: artist } }], releases, }); const albumRel = { id: 'rel-1', title: 'Real Album', date: '2021-05-01', 'release-group': { 'primary-type': 'Album' } }; const singleRel = { id: 'rel-2', title: 'Some Single', date: '2020-01-01', 'release-group': { 'primary-type': 'Single' } }; test('mbPickMatch: artist-verified match prefers a recording with a release', () => { const recs = [rec('Memories', 'NoAki'), rec('Memories', 'NoAki', [albumRel])]; assert.equal(mb.mbPickMatch(recs, 'NoAki', 'Memories'), recs[1]); }); test('mbPickMatch: completely different artist → null (no wrong album)', () => { const recs = [rec('Memories', 'Rab Noakes', [albumRel]), rec('Memories', 'Maroon 5', [albumRel])]; assert.equal(mb.mbPickMatch(recs, '☆NoAki☆', 'Memories'), null); }); test('mbPickMatch: loose artist match (one contained in the other)', () => { const recs = [rec('Flower Dance', 'DJ Okawari', [albumRel])]; assert.equal(mb.mbPickMatch(recs, 'Okawari', 'Flower Dance'), recs[0]); }); test('mapMbRecording: maps album/year/cover/duration and prefers the Album release', () => { const m = mb.mapMbRecording(rec('Memories', 'NoAki', [singleRel, albumRel])); assert.equal(m.album, 'Real Album'); assert.equal(m.albumArtist, 'NoAki'); assert.equal(m.year, 2021); assert.equal(m.trackName, 'Memories'); assert.equal(m.durationMs, 200000); assert.equal(m.artworkUrl, 'https://coverartarchive.org/release/rel-1/front-500'); assert.equal(m._source, 'musicbrainz'); }); test('mapMbRecording: no release → no album, no artwork (clean fallback territory)', () => { const m = mb.mapMbRecording(rec('Orphan Song', 'NoAki', [])); assert.equal(m.album, undefined); assert.equal(m.artworkUrl, ''); assert.equal(m.metaArtistName, 'NoAki'); }); test('mapMbRecording: null in → {} out', () => { assert.deepEqual(mb.mapMbRecording(null), {}); });