source: Klonkt/test/music-type.test.js@ cae7bfc

main
Last change on this file since cae7bfc was cae7bfc, checked in by Robin <robin@…>, 4 weeks ago

De afleiding: welk soort uitgave is een post? (shaer-cyg)

Robins regel gaat over identiteit en niet over tellen -- een post neemt het
type van zijn muziek over als hij precies EEN muzikale eenheid bevat. Zijn het
er meer, dan is de post een post die naar muziek verwijst en houden de
collecties hun eigen identiteit; daarmee vervalt de reden om de posttitel en
-cover te lenen vanzelf.

postMusicType() leest de shortcodes uit de post en geeft type, collectie,
bonus-tracks en leentMetadata terug. Een losse track naast een collectie is
geen rommelrestje maar een bonus-track, en dat maakt het geheel een album.

Een keuze die Robins formulering niet maakte: [[album:naam]] telt als
collectie, net als een playlist. Hem als losse tracks tellen zou een albumpost
stilletjes tot playlist maken.

Alleen de afleiding, nog niet aangesloten op de editor of op wat er federeert.

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

  • Property mode set to 100644
File size: 3.5 KB
Line 
1// Welk soort uitgave is een post? (shaer-cyg)
2//
3// De regel gaat over IDENTITEIT en niet over tellen: een post neemt het type
4// van zijn muziek over als hij precies EEN muzikale eenheid bevat. Zijn het er
5// meer, dan is de post een post die naar muziek verwijst en houden de
6// collecties hun eigen identiteit -- en vervalt de reden om de posttitel en
7// -cover te lenen.
8import { test } from 'node:test';
9import assert from 'node:assert/strict';
10
11process.env.DATABASE_PATH = ':memory:';
12process.env.PUBLIC_BASE_URL = 'https://test.example';
13
14const dbMod = await import('../src/config/database.js');
15dbMod.initializeDatabase();
16const { postMusicType } = await import('../src/services/music/index.js');
17
18test('geen muziek: geen type', () => {
19 assert.equal(postMusicType('<p>gewoon een bericht</p>'), null);
20 assert.equal(postMusicType(''), null);
21 assert.equal(postMusicType(null), null);
22});
23
24test('losse tracks worden een playlist, en lenen de metadata van de post', () => {
25 const r = postMusicType('Twee nieuwe: [[track:a]] en [[track:b]]');
26 assert.equal(r.type, 'playlist');
27 assert.deepEqual(r.tracks, ['a', 'b']);
28 assert.equal(r.leentMetadata, true);
29});
30
31test('ook EEN losse track wordt een playlist', () => {
32 // Naar buiten toe is er dan altijd een collectie om naar te wijzen. Dat
33 // "Playlist" boven een enkel nummer gek leest is een weergavekwestie.
34 assert.equal(postMusicType('[[track:a]]').type, 'playlist');
35});
36
37test('een playlist blijft een playlist', () => {
38 const r = postMusicType('Nieuw: [[playlist:nachtlicht]]');
39 assert.equal(r.type, 'playlist');
40 assert.deepEqual(r.collectie, { soort: 'playlist', id: 'nachtlicht' });
41 assert.equal(r.leentMetadata, true);
42});
43
44test('een album-insluiting is ook een collectie, en telt als album', () => {
45 // Robins regel noemde alleen playlists; [[album:naam]] groepeert net zo goed
46 // tracks. Hem als losse tracks tellen zou een albumpost tot playlist maken.
47 const r = postMusicType('Luister [[album:De Plaat]]');
48 assert.equal(r.type, 'album');
49 assert.deepEqual(r.collectie, { soort: 'album', naam: 'De Plaat' });
50});
51
52test('een collectie MET losse tracks is een album, en die losse zijn bonus', () => {
53 const r = postMusicType('[[playlist:nachtlicht]] plus [[track:x]] en [[track:y]]');
54 assert.equal(r.type, 'album');
55 assert.equal(r.collectie.id, 'nachtlicht');
56 assert.deepEqual(r.bonus, ['x', 'y'], 'geen rommelrestje maar bonus-tracks');
57 assert.deepEqual(r.tracks, [], 'de losse zitten in bonus, niet twee keer');
58 assert.equal(r.leentMetadata, true);
59});
60
61test('TWEE collecties: de post blijft een post en leent niets', () => {
62 const r = postMusicType('[[playlist:een]] en ook [[playlist:twee]]');
63 assert.equal(r.type, 'post');
64 assert.equal(r.collecties.length, 2);
65 assert.equal(r.leentMetadata, false,
66 'bij twee is de post niet meer de drager van EEN identiteit');
67});
68
69test('twee collecties van verschillende soort tellen ook als twee', () => {
70 const r = postMusicType('[[playlist:een]] naast [[album:De Plaat]]');
71 assert.equal(r.type, 'post');
72 assert.equal(r.collecties.length, 2);
73});
74
75test('dezelfde insluiting twee keer is EEN collectie', () => {
76 // Anders maakt een herhaalde shortcode van een albumpost stilletjes een
77 // gewone post.
78 const r = postMusicType('[[playlist:een]] ... en nog eens [[playlist:een]]');
79 assert.equal(r.type, 'playlist');
80 assert.equal(r.collectie.id, 'een');
81});
82
83test('dezelfde track twee keer telt ook maar een keer', () => {
84 assert.deepEqual(postMusicType('[[track:a]] [[track:a]] [[track:b]]').tracks, ['a', 'b']);
85});
Note: See TracBrowser for help on using the repository browser.