/* * Pruefungen des LinkedIn-Profilfotos: laeuft mit `npm test` im Verzeichnis * server/. Geprueft wird alles, was ohne Netz geht - die Adresspruefung und das * Herausloesen der Bildadresse aus dem Seitenquelltext. Der Abruf selbst haengt * an LinkedIn und taugt nicht als Test: er kann jederzeit abgewiesen werden. */ const { normalizeProfileUrl, extractImageUrl } = await import('../src/linkedinPhoto.js'); let failures = 0; function check(name, condition, detail = '') { if (condition) { console.log(` ok ${name}${detail ? ` - ${detail}` : ''}`); } else { console.log(` FAIL ${name}${detail ? ` - ${detail}` : ''}`); failures += 1; } } function throws(fn) { try { fn(); return null; } catch (err) { return err; } } console.log('\nAdresse pruefen'); check( 'Vollstaendige Adresse bleibt', normalizeProfileUrl('https://www.linkedin.com/in/max') === 'https://www.linkedin.com/in/max' ); check( 'Ohne Schema wird https ergaenzt', normalizeProfileUrl('linkedin.com/in/max') === 'https://linkedin.com/in/max' ); check( 'Landeskennung ist erlaubt', normalizeProfileUrl('https://de.linkedin.com/in/max') === 'https://de.linkedin.com/in/max' ); check( 'Nachverfolgung faellt weg', normalizeProfileUrl('https://www.linkedin.com/in/max?trk=abc#top') === 'https://www.linkedin.com/in/max' ); check( 'http wird zu https', normalizeProfileUrl('http://www.linkedin.com/in/max') === 'https://www.linkedin.com/in/max' ); const fremd = throws(() => normalizeProfileUrl('https://linkedin.com.example.org/in/max')); check('Aehnlich aussehender Host wird abgewiesen', fremd?.status === 400, fremd?.message); check('Fremder Host wird abgewiesen', throws(() => normalizeProfileUrl('https://xing.com/x'))?.status === 400); check('Leere Eingabe wird abgewiesen', throws(() => normalizeProfileUrl(''))?.status === 400); check('Unsinn wird abgewiesen', throws(() => normalizeProfileUrl('kein ://link'))?.status === 400); console.log('\nBildadresse aus dem Quelltext'); check( 'og:image wird gefunden', extractImageUrl('') === 'https://media.licdn.com/dms/image/v2/abc' ); check( 'Maskierte Und-Zeichen werden zurueckgesetzt', extractImageUrl('') === 'https://media.licdn.com/dms/image/a?x=1&y=2' ); check( 'twitter:image als Ersatz', extractImageUrl('') === 'https://media.licdn.com/dms/image/t' ); check('Seite ohne Vorschau liefert null', extractImageUrl('
nichts') === null); /* * Wichtig: ohne og:image wird NICHT im uebrigen Quelltext gesucht. Eine * Profilseite ist voller fremder Bilder - Firmenlogos, Beitragsbilder, Fotos * der "aehnlichen Profile". Eines davon zu nehmen, haenge dem Kontakt das * Gesicht einer fremden Person an. */ check( 'Fremde Bilder im Quelltext werden nicht genommen', extractImageUrl( '