import { test } from 'node:test' import assert from 'node:assert/strict' import { installAngebot, baueInstallHinweis, starteInstallQuelle, istAusgeblendet, merkeAusgeblendet } from '../public/neu/install-hinweis.js' import { mitDom } from './support/knDaten.js' const a = (o) => installAngebot({ appLayout: true, standalone: false, canPrompt: false, ios: false, dismissed: false, ...o }) test('installAngebot: nur Handy, nicht installiert, mit Prompt oder iOS, nicht ausgeblendet', () => { assert.deepEqual(a({ canPrompt: true }), { zeigen: true, art: 'prompt' }) assert.deepEqual(a({ ios: true }), { zeigen: true, art: 'ios' }) assert.deepEqual(a({ ios: true, canPrompt: true }), { zeigen: true, art: 'prompt' }) for (const o of [{}, { canPrompt: true, standalone: true }, { canPrompt: true, appLayout: false }, { canPrompt: true, dismissed: true }]) assert.equal(a(o).zeigen, false) }) test('Hinweis: Texte, Knöpfe, Sperre bei kaputtem localStorage', () => mitDom((fx) => { let n = 0; const zaehle = () => { n += 1 } const ios = baueInstallHinweis({ art: 'ios', onInstall() {}, onDismiss() {} }) assert.match(ios.textContent, /WEBklar als App/); assert.match(ios.textContent, /Tippe auf „Teilen“ und dann auf „Zum Home-Bildschirm“\./) const prompt = baueInstallHinweis({ art: 'prompt', onInstall: zaehle, onDismiss: zaehle }) assert.match(prompt.textContent, /Mit einem Tipp auf deinem Homescreen – ohne App-Store\./) fx.klick(fx.finde(prompt, (e) => e.textContent === 'Installieren')); fx.klick(fx.finde(prompt, '[aria-label="Hinweis ausblenden"]')); assert.equal(n, 2) globalThis.localStorage = { getItem() { throw new Error('x') }, setItem() { throw new Error('x') } } assert.equal(istAusgeblendet(), false); assert.doesNotThrow(merkeAusgeblendet); delete globalThis.localStorage })) test('Installquelle: beforeinstallprompt merken, installieren, appinstalled räumt', async () => { const handler = {}; const win = { addEventListener: (t, f) => { handler[t] = f }, matchMedia: () => ({ matches: false }), navigator: { userAgent: 'iPhone' } } const q = starteInstallQuelle(win); assert.equal(q.ios, true); assert.equal(starteInstallQuelle(win), q) let prompted = 0; handler.beforeinstallprompt({ preventDefault() {}, prompt: async () => { prompted += 1 } }) assert.equal(q.kannPrompt(), true); await q.installiere(); assert.equal(prompted, 1); assert.equal(q.kannPrompt(), false) }) test('Installquelle: appinstalled räumt, beiAenderung meldet, fehlendes matchMedia ist false', async () => { const handler = {}; const win = { addEventListener: (t, f) => { handler[t] = f }, navigator: { userAgent: 'Android', standalone: false } } const q = starteInstallQuelle(win); const meldungen = []; q.beiAenderung(() => meldungen.push(q.kannPrompt())) assert.equal(q.ios, false); assert.equal(q.standalone(), false) handler.beforeinstallprompt({ preventDefault() {}, prompt: async () => {} }); assert.equal(q.kannPrompt(), true) handler.appinstalled(); assert.equal(q.kannPrompt(), false); assert.deepEqual(meldungen, [true, false]) assert.equal(starteInstallQuelle({ addEventListener() {}, navigator: { userAgent: '', platform: 'MacIntel', maxTouchPoints: 5 } }).ios, true) })