source: Klonkt/test/playlist-uitgave.test.js@ d8f7d9c

main
Last change on this file since d8f7d9c was d8f7d9c, checked in by Robin <roboburr@…>, 3 weeks ago

Playlists: uitgavedatum en MusicBrainz release-id op een album

Stap 1 van shaer-756s. Het album bestaat al als ding -- een playlist met
kind='album', met eigen id, titel, artiest, jaar, hoes en een eigen
AP-collectie. Wat ontbrak om het als Album uit te geven zijn twee velden.

release_date en niet year: die kolom blijft en wordt gewoon getoond,
maar hun AlbumSerializer leest released als een DateField. Een jaartal
als 2024-01-01 versturen is een dag verzinnen, en dat is precies wat we
bij artiesten en albums niet doen. Volledige datum of niets -- ook
2024-02-31 valt af, want Date rolt die stil door naar 2 maart en dan
bewaren we iets anders dan er ingetypt is.

mb_release_id is de tegenhanger van sites.mb_artist_id: dezelfde
verwijzing naar MusicBrainz, een niveau lager.

ALLEEN BIJ kind='album', en dat wordt in PlaylistService afgedwongen en
niet alleen in het scherm. De API ligt open -- de post-editor gebruikt
hem ook -- en een scherm is geen bewaking. Omschakelen naar afspeellijst
maakt de velden ALTIJD leeg, ook als de aanroeper er niets over zei:
anders houdt een album dat je tot mixtape ombouwt zijn uitgavedatum, en
duikt die weer op zodra iemand hem terugzet. Het leespad geeft ze ook
niet door bij een afspeellijst, zodat een oude rij niet alsnog lekt.

In de editor staan de velden onder Type en verdwijnen ze als je naar
playlist schakelt. Daar hoorde een CSS-regel bij: .pl-field is display:
flex en dat wint van het hidden-attribuut -- zonder .pl-field[hidden]
{ display: none } bleven ze gewoon staan.

Co-Authored-By: Claude Opus 5 <noreply@…>

  • Property mode set to 100644
File size: 4.7 KB
Line 
1// Uitgavevelden op een album-playlist (shaer-756s, stap 1).
2//
3// Twee kolommen die ALLEEN bij kind='album' horen: een volledige
4// uitgavedatum en een MusicBrainz release-id. Ze bestaan omdat hun
5// AlbumSerializer `released` als DateField leest en wij alleen `year` hadden --
6// en een jaartal als 2024-01-01 versturen is een dag verzinnen.
7//
8// Wat hier vooral getest wordt is wat er NIET binnenkomt. Het scherm verbergt
9// de velden bij een afspeellijst, maar de API ligt open (de post-editor gebruikt
10// hem ook), en een scherm is geen bewaking.
11import { test } from 'node:test';
12import assert from 'node:assert/strict';
13
14process.env.DATABASE_PATH = ':memory:';
15
16const dbMod = await import('../src/config/database.js');
17const db = dbMod.default;
18dbMod.initializeDatabase();
19const { default: PlaylistService } = await import('../src/services/PlaylistService.js');
20
21db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
22 .run('u1', 'u1', 'u1@t', 'x', 'god');
23db.prepare('INSERT INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)')
24 .run('s1', 'band', 'De Band', 'u1');
25
26const rij = (id) => db.prepare('SELECT * FROM playlists WHERE id = ?').get(id);
27
28test('een album bewaart een volledige datum en een release-id', () => {
29 const id = PlaylistService.create('s1', {
30 title: 'De Plaat', kind: 'album',
31 release_date: '2024-03-15', mb_release_id: '5441C29D-3602-4898-B1A1-B77FA23B8E50',
32 });
33 const r = rij(id);
34 assert.equal(r.release_date, '2024-03-15');
35 assert.equal(r.mb_release_id, '5441c29d-3602-4898-b1a1-b77fa23b8e50', 'mbid gaat naar kleine letters');
36});
37
38test('een halve datum wordt NIET aangevuld', () => {
39 // Dit is de hele reden dat het veld bestaat naast `year`. Zou hij hier
40 // 2024-01-01 van maken, dan stond er een dag op de federatie die niemand
41 // heeft ingevoerd.
42 for (const slecht of ['2024', '2024-03', '15-03-2024', 'maart 2024', '']) {
43 const id = PlaylistService.create('s1', { title: `T${slecht || 'leeg'}`, kind: 'album', release_date: slecht });
44 assert.equal(rij(id).release_date, null, `"${slecht}" had geweigerd moeten worden`);
45 }
46});
47
48test('een bestaande maar onmogelijke datum wordt geweigerd', () => {
49 // Date rolt 2024-02-31 stilletjes door naar 2 maart; dan sla je iets anders
50 // op dan er ingetypt is.
51 const id = PlaylistService.create('s1', { title: 'Onmogelijk', kind: 'album', release_date: '2024-02-31' });
52 assert.equal(rij(id).release_date, null);
53});
54
55test('een onzin-release-id wordt geweigerd', () => {
56 const id = PlaylistService.create('s1', { title: 'Onzin', kind: 'album', mb_release_id: 'niet-een-mbid' });
57 assert.equal(rij(id).mb_release_id, null);
58});
59
60test('een AFSPEELLIJST krijgt ze niet, ook niet als je ze meestuurt', () => {
61 const id = PlaylistService.create('s1', {
62 title: 'De Mix', kind: 'playlist',
63 release_date: '2024-03-15', mb_release_id: '5441c29d-3602-4898-b1a1-b77fa23b8e50',
64 });
65 const r = rij(id);
66 assert.equal(r.release_date, null);
67 assert.equal(r.mb_release_id, null);
68});
69
70test('omschakelen naar afspeellijst MAAKT ze leeg', () => {
71 // Anders houdt een album dat je tot mixtape ombouwt zijn uitgavedatum, en
72 // duikt die weer op zodra iemand hem terugzet.
73 const id = PlaylistService.create('s1', {
74 title: 'Wordt Mix', kind: 'album', release_date: '2024-03-15',
75 mb_release_id: '5441c29d-3602-4898-b1a1-b77fa23b8e50',
76 });
77 assert.equal(rij(id).release_date, '2024-03-15');
78 PlaylistService.update('s1', id, { kind: 'playlist' }); // zegt niets over de velden
79 const r = rij(id);
80 assert.equal(r.release_date, null, 'uitgavedatum bleef staan op een afspeellijst');
81 assert.equal(r.mb_release_id, null);
82});
83
84test('bijwerken zonder de velden te noemen laat ze met rust', () => {
85 const id = PlaylistService.create('s1', { title: 'Blijft', kind: 'album', release_date: '2024-03-15' });
86 PlaylistService.update('s1', id, { title: 'Blijft Ook' });
87 assert.equal(rij(id).release_date, '2024-03-15');
88});
89
90test('get en list geven de velden door, en houden ze leeg bij een afspeellijst', () => {
91 const a = PlaylistService.create('s1', { title: 'Uitgave', kind: 'album', release_date: '2024-03-15' });
92 assert.equal(PlaylistService.get('s1', a).release_date, '2024-03-15');
93 const inLijst = PlaylistService.list('s1').find((p) => p.id === a);
94 assert.equal(inLijst.release_date, '2024-03-15');
95
96 // Rechtstreeks in de kolom zetten op een afspeellijst -- zoals een oude rij
97 // eruit zou kunnen zien. Het leespad hoort dat niet door te geven.
98 const m = PlaylistService.create('s1', { title: 'Mix2', kind: 'playlist' });
99 db.prepare("UPDATE playlists SET release_date = '2024-01-01' WHERE id = ?").run(m);
100 assert.equal(PlaylistService.get('s1', m).release_date, '');
101});
Note: See TracBrowser for help on using the repository browser.