Changeset 78b8e58 in Klonkt


Ignore:
Timestamp:
08/25/2026 08:00:40 PM (2 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
76290bf
Parents:
cb1bd82
Message:

Toetsen: layout-pins eruit, overlap samengevoegd (mixtape, migrate, c2s-titel)

Dezelfde maat als bij de Berichten-toetsen (Robins besluit, 25-8): een
toets pint een beslissing, niet waar iets staat of hoe de code gespeld
is. Drie bestanden, netto drie toetsen minder en vier pins weg:

  • mixtape-ui: de bron-regex-toets op de labelmap weg (die toetste dezelfde regel als de render-toets, maar dan op de spelling van de code); de klasse-pin rond het woord Mixtape los (dat het er staat is het besluit, waar het staat is layout); de spoel-asserts weg -- de cassette-decoratie is layout, de haken van tape.js (.post-tape, data-tape-go) blijven, want dat is het contract met de module.
  • migrate-page: de twee volgorde-toetsen samengevoegd. De volgorde ZELF blijft getoetst, want daar is hij inhoud: wie de stappen verkeerd om doet breekt zijn verhuizing. De positie-assert van het stappenplan (bovenaan) is weg, het bestaan ervan blijft.
  • c2s-title: de twee lege-titel-gevallen (geen name, alleen witruimte) zijn een regel met twee kanten, nu een toets.

Bij het echt lezen bleken twee eerder verdachte toetsen juist
beslissingstoetsen: 'de teksten praten geen jargon' bewaakt Robins eigen
regel en toetst op betekenis-niveau, en 'stap 5' is daar destijds al
bewust op herschreven. Die blijven onaangeroerd, net als de tien
speler-toetsen die broncode lezen -- brosse dekking, maar de enige die
browser-JS hier heeft; schrappen kan pas als er iets voor in de plaats
komt.

Tegenbewijs per snede: het mixtape-label valt tegen de renderer van voor
8e1af9c, de volgorde valt tegen een omgedraaide pagina, en de lege titel
valt tegen een mutatie die er een verzint. Volle suite 1229 groen.

Location:
test
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • test/c2s-title.test.js

    rcb1bd82 r78b8e58  
    5151});
    5252
    53 test('zonder name blijft alles zoals het was: lege titel, geen kopregel', async () => {
    54   const r = await maak({ content: '<p>gewoon een note</p>' });
    55   assert.equal(r.status, 201);
    56   const post = db.prepare('SELECT * FROM posts WHERE id = ?').get(r.id);
     53test('geen echte titel blijft een lege titel: zonder name, en met alleen witruimte', async () => {
     54  // Een regel met twee kanten (samengevoegd 25-8): wat er niet is, wordt niet
     55  // verzonnen -- of het veld nu ontbreekt of alleen witruimte draagt.
     56  const zonder = await maak({ content: '<p>gewoon een note</p>' });
     57  assert.equal(zonder.status, 201);
     58  const post = db.prepare('SELECT * FROM posts WHERE id = ?').get(zonder.id);
    5759  assert.equal(post.title, '', 'geen name is een lege titel, geen undefined of null');
    5860  const note = AP.buildNote('https://test.example', site, post);
    59   assert.ok(!/<strong>/.test(note.content.split('</p>')[0] + '</p>') || !post.title, 'geen verzonnen kopregel');
     61  assert.ok(!note.content.startsWith('<p><strong>'), 'geen verzonnen kopregel');
     62
     63  const wit = await maak({ name: '   ', content: '<p>z</p>' });
     64  const witPost = db.prepare('SELECT title FROM posts WHERE id = ?').get(wit.id);
     65  assert.equal(witPost.title, '', 'witruimte trimt weg tot leeg');
     66  const witNote = AP.buildNote('https://test.example', site, db.prepare('SELECT * FROM posts WHERE id = ?').get(wit.id));
     67  assert.ok(!witNote.content.startsWith('<p><strong>'), 'en er komt geen lege kopregel');
    6068});
    6169
     
    7987});
    8088
    81 test('een titel met alleen witruimte is geen titel', async () => {
    82   const r = await maak({ name: '   ', content: '<p>z</p>' });
    83   const post = db.prepare('SELECT title FROM posts WHERE id = ?').get(r.id);
    84   assert.equal(post.title, '', 'witruimte trimt weg tot leeg');
    85   const note = AP.buildNote('https://test.example', site, post);
    86   assert.ok(!note.content.startsWith('<p><strong>'), 'en er komt geen lege kopregel');
    87 });
  • test/migrate-page.test.js

    rcb1bd82 r78b8e58  
    3939
    4040test('de volgorde op de pagina volgt de verhuizing: claimen eerst, aankondigen laatst', () => {
     41  // Volgorde is hier INHOUD, geen layout (25-8): wie deze stappen in de
     42  // verkeerde volgorde doet, breekt zijn verhuizing -- de pagina IS het
     43  // stappenplan. Daarom mag deze positietoets blijven waar andere sneuvelden.
     44  // De losse toets dat het stappenplan "bovenaan, voor de knoppen" staat is
     45  // hierin opgegaan: dat het er IS hoort erbij, waar het staat niet.
    4146  const ejs = fs.readFileSync('src/views/pages/admin-migrate.ejs', 'utf8');
     47  assert.ok(ejs.indexOf('mig-steps') > -1, 'er hoort een stappenplan te staan');
    4248  const alias = ejs.indexOf('name="ap_aliases"');
    4349  const halen = ejs.indexOf('/admin/migrate/pull');
     
    6773
    6874// ── Het stappenplan ───────────────────────────────────────────────
    69 
    70 test('het stappenplan zet de volgorde vast die niemand raadt', () => {
    71   const ejs = fs.readFileSync('src/views/pages/admin-migrate.ejs', 'utf8');
    72   const plan = ejs.indexOf('mig-steps');
    73   const alias = ejs.indexOf('name="ap_aliases"');
    74   assert.ok(plan > -1, 'er hoort een stappenplan te staan');
    75   assert.ok(plan < alias, 'en bovenaan, voor de knoppen die het beschrijft');
    76 });
    7775
    7876test('"hier" draait om als je vanaf de vertrekkende kant kijkt', async () => {
  • test/mixtape-ui.test.js

    rcb1bd82 r78b8e58  
    8888  // Het teken zat eerst in de tekst; nu staat er een echte cassette getekend en
    8989  // is het woord genoeg. De eis blijft dezelfde: hij noemt zichzelf goed.
    90   assert.match(html, /class="tape-kind">Mixtape</, 'een mixtape hoort zichzelf zo te noemen');
     90  // Zonder de klassenaam erbij (25-8): WAAR het woord staat is layout, DAT het
     91  // er staat is het besluit. De bron-regex-toets op de labelmap is weg om
     92  // dezelfde reden: die toetste deze regel nog een keer, maar dan op de
     93  // spelling van de code.
     94  assert.match(html, />Mixtape</, 'een mixtape hoort zichzelf zo te noemen');
    9195  assert.doesNotMatch(html, /💿 Album/, 'en niet het jasje van een album te dragen');
    92 });
    93 
    94 test('de renderer kiest zijn label niet meer met een tweewegkeuze', () => {
    95   const bron = fs.readFileSync('src/services/AudioEmbedService.js', 'utf8');
    96   assert.doesNotMatch(bron, /kind === 'playlist' \? '📃 Playlist' : '💿 Album'/,
    97     'die vorm gaf een mixtape het jasje van een album');
    98   assert.match(bron, /mixtape: '📼 Mixtape'/);
    9996});
    10097
     
    110107  const html = AudioEmbedService.embedPlaylistShortcodes('<p>[[playlist:tape]]</p>', (id) => (id === 'tape' ? pl : null));
    111108
     109  // Alleen de haken waar tape.js zich aan vastpakt (.post-tape, data-tape-go):
     110  // dat is het contract tussen markup en module. De spoelen zelf zijn decor en
     111  // worden hier sinds 25-8 niet meer geteld -- hoe de cassette eruitziet is
     112  // layout, dat hij bedienbaar is niet.
    112113  assert.match(html, /class="post-tape"/);
    113   assert.match(html, /tape-reel--left/, 'twee spoelen, anders is het geen cassette');
    114   assert.match(html, /tape-reel--right/);
    115114  assert.match(html, /data-tape-go="back"/, 'terugspoelen');
    116115  assert.match(html, /data-tape-go="fwd"/, 'vooruitspoelen');
Note: See TracChangeset for help on using the changeset viewer.