Files
Webklar-Kundenbereich/test/knAnsichtInstall.test.js
T
2026-10-16 16:51:44 +00:00

37 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
})