Changeset e9ec5e4 in Klonkt for test/following-csv.test.js


Ignore:
Timestamp:
08/13/2026 06:16:49 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
fbda20e
Parents:
096f099
Message:

Volglijst: Featured is auto_boost, plus de knoppen om hem mee te nemen

Twee dingen: een correctie op de vorige commit, en de ingang die er nog niet was.

DE CORRECTIE. Ik had auto_boost in de kolom "Show boosts" gezet omdat in beide het
woord boost zit. Dat is fout. Bij Mastodon betekent die kolom "toon de reblogs van
deze persoon in mijn tijdlijn", en dat kent Klonkt niet; onze vlag gaat over hun
EIGEN posts in JOUW Cirkel. Dat is de vlag die in de UI al "Uitgelicht" heet
(tl.autoboost, in het Engels letterlijk "Featured"), dus hij hoort in de kolom
Featured en "Show boosts" blijft leeg.

Daarmee vervalt ook de kolom highlighted die ik in de vorige commit toevoegde:
die was een nieuw begrip naast een bestaand begrip met dezelfde naam. Eén ding, één
naam. Een bestand uit Mastodon levert nu featured: false, en dat is juist: hun
kolom 2 mag hier niet als uitgelicht binnenkomen.

DE INGANG. De vorige commit had de functies maar geen knop, en volgens de eigen
regel is een feature pas af als een eindgebruiker hem kan gebruiken. Op /following
staat nu een uitklapblok met een downloadknop en een plakveld.

De importroute geeft followActor mee als followFn, zodat er één pad naar een
volgrelatie blijft. Daar zat een val in: followActor meldt een fout als VELD en
niet als exception, dus zonder vertaling telde een onvindbaar account als geslaagd
mee. Die vertaling zit er nu in.

Changed files:
src/config/database.js

  • kolom highlighted teruggedraaid; commentaar bij auto_boost zegt nu dat het "Uitgelicht"/"Featured" heet

src/services/ArchiveExportService.js

  • auto_boost naar kolom Featured, Show boosts/Notify/Languages blijven leeg
  • parseFollowingCsv leest alleen kolom 5, en levert featured in plaats van twee velden

src/services/ArchiveImportService.js

  • de uitgelicht-stand gaat mee IN de Follow (derde argument), geen tweede UPDATE erna

src/routes/posts.js

  • GET /news/following.csv, met private/no-store want dit is jouw volglijst
  • POST /news/following/import, urlencoded, roept importFollowing aan met followActor

src/services/i18n.js

  • vijf teksten in nl, en en de

src/views/pages/following.ejs

  • het uitklapblok met de downloadknop en het plakveld

test/following-csv.test.js

  • bijgewerkt naar de juiste kolomindeling; de Mastodon-test controleert nu expliciet dat hun "Show boosts: true" NIET als uitgelicht landt

remarks: 921 groen in UTC en Europe/Amsterdam. Server gestart en de drie routes
nagelopen: alle drie bestaan en sturen naar de login, geen serverfouten. De template
apart gerenderd in nl/en/de, geen onvertaalde sleutels. De pagina zelf achter de
login niet visueel gezien; daar is een account voor nodig. Onderweg per ongeluk
.claude/launch.json overschreven (die zette PUBLIC_BASE_URL) en weer hersteld.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/following-csv.test.js

    r096f099 re9ec5e4  
    2424const { importFollowing } = await import('../src/services/ArchiveImportService.js');
    2525
    26 const volg = db.prepare(`INSERT INTO ap_following (slug, actor_uri, handle, status, auto_boost, highlighted)
    27                          VALUES (?,?,?,?,?,?)`);
     26const volg = db.prepare(`INSERT INTO ap_following (slug, actor_uri, handle, status, auto_boost)
     27                         VALUES (?,?,?,?,?)`);
    2828
    2929beforeEach(() => {
     
    3232
    3333test('de CSV heeft de Mastodon-koppen, met Featured erachter', () => {
    34   volg.run('me', 'https://a.example/ap/users/jason', '@jason@a.example', 'accepted', 1, 1);
     34  volg.run('me', 'https://a.example/ap/users/jason', '@jason@a.example', 'accepted', 1);
    3535  const csv = followingCsv('me');
    3636  const [kop, eerste] = csv.trim().split('\n');
    3737  assert.equal(kop, 'Account address,Show boosts,Notify on new posts,Languages,Featured');
    3838  // Zonder de leidende @, want zo schrijft Mastodon het adres.
    39   assert.equal(eerste, 'jason@a.example,true,false,,true');
     39  assert.equal(eerste, 'jason@a.example,,,,true');
    4040});
    4141
    4242test('een openstaand verzoek gaat NIET mee', () => {
    43   volg.run('me', 'https://a.example/ap/users/wacht', '@wacht@a.example', 'pending', 0, 0);
    44   volg.run('me', 'https://a.example/ap/users/ja', '@ja@a.example', 'accepted', 0, 0);
     43  volg.run('me', 'https://a.example/ap/users/wacht', '@wacht@a.example', 'pending', 0);
     44  volg.run('me', 'https://a.example/ap/users/ja', '@ja@a.example', 'accepted', 0);
    4545  const regels = followingCsv('me').trim().split('\n').slice(1);
    4646  assert.equal(regels.length, 1, 'een verzoek dat iemand bewust liet liggen mag niet opnieuw verstuurd worden');
     
    4949
    5050test('zonder handle valt hij terug op de actor-URI', () => {
    51   volg.run('me', 'https://a.example/ap/users/naamloos', null, 'accepted', 0, 0);
     51  volg.run('me', 'https://a.example/ap/users/naamloos', null, 'accepted', 0);
    5252  assert.match(followingCsv('me'), /https:\/\/a\.example\/ap\/users\/naamloos/);
    5353});
     
    5858
    5959test('een export leest zichzelf terug', () => {
    60   volg.run('me', 'https://a.example/ap/users/a', '@a@a.example', 'accepted', 1, 0);
    61   volg.run('me', 'https://b.example/ap/users/b', '@b@b.example', 'accepted', 0, 1);
     60  volg.run('me', 'https://a.example/ap/users/a', '@a@a.example', 'accepted', 1);
     61  volg.run('me', 'https://b.example/ap/users/b', '@b@b.example', 'accepted', 0);
    6262  const terug = parseFollowingCsv(followingCsv('me'));
    6363  assert.deepEqual(terug, [
    64     { address: 'a@a.example', autoBoost: true, highlighted: false },
    65     { address: 'b@b.example', autoBoost: false, highlighted: true },
     64    { address: 'a@a.example', featured: true },
     65    { address: 'b@b.example', featured: false },
    6666  ]);
    6767});
     
    7272    + 'iemand@mastodon.social,true,false,\n',
    7373  );
    74   assert.deepEqual(uit, [{ address: 'iemand@mastodon.social', autoBoost: true, highlighted: false }]);
     74  // Hun "Show boosts" staat op true, en dat mag hier NIET als uitgelicht landen.
     75  assert.deepEqual(uit, [{ address: 'iemand@mastodon.social', featured: false }]);
    7576});
    7677
     
    8384  const uit = parseFollowingCsv('Account address,Show boosts\n"raar,naam@a.example",true\n');
    8485  assert.equal(uit[0].address, 'raar,naam@a.example');
    85   assert.equal(uit[0].autoBoost, true);
    8686});
    8787
     
    9090  const r = await importFollowing({ slug: 'me' },
    9191    'Account address,Show boosts,Notify on new posts,Languages,Featured\n'
    92     + 'a@a.example,true,false,,false\n'
    93     + 'b@b.example,false,false,,true\n',
     92    + 'a@a.example,,,,true\n'
     93    + 'b@b.example,,,,false\n',
    9494    { followFn: async (site, adres, boost) => { gezien.push([adres, boost]); return true; } });
    9595
    96   assert.deepEqual(gezien, [['a@a.example', true], ['b@b.example', false]]);
     96  assert.deepEqual(gezien, [['a@a.example', true], ['b@b.example', false]],
     97    'de uitgelicht-stand moet als derde argument mee de Follow in');
    9798  assert.equal(r.gevolgd, 2);
    9899  assert.equal(r.mislukt.length, 0);
     
    130131  db.prepare('INSERT OR IGNORE INTO sites (id, slug, title, owner_id) VALUES (?,?,?,?)')
    131132    .run('s1', 'me', 'Mijn site', 'u1');
    132   volg.run('me', 'https://a.example/ap/users/jason', '@jason@a.example', 'accepted', 1, 1);
     133  volg.run('me', 'https://a.example/ap/users/jason', '@jason@a.example', 'accepted', 1);
    133134
    134135  const { buildArchive } = await import('../src/services/ArchiveExportService.js');
     
    138139  assert.equal(r.counts.following, 1);
    139140  assert.ok(r.manifest.files['following.csv'], 'en hij hoort in het manifest, anders telt hij niet mee bij de controle');
    140   assert.match(String(r.files.get('following.csv')), /jason@a\.example,true,false,,true/);
     141  assert.match(String(r.files.get('following.csv')), /jason@a\.example,,,,true/);
    141142});
Note: See TracChangeset for help on using the changeset viewer.