test: add browser-based unit tests for helpers, i18n, router

This commit is contained in:
2026-02-05 15:30:58 +01:00
parent bd7a259d72
commit 0b0185deb1
7 changed files with 658 additions and 1 deletions

115
tests/router.test.js Normal file
View File

@@ -0,0 +1,115 @@
/**
* Tests for js/router.js
*/
import { test, describe, assertEquals, assertDeepEquals, assertTrue } from './test-runner.js'
import { router } from '../js/router.js'
describe('router.parseHash', () => {
test('parses simple path', () => {
// Save original hash
const original = window.location.hash
window.location.hash = '/home'
const result = router.parseHash()
assertEquals(result.path, '/home')
assertDeepEquals(result.params, {})
// Restore
window.location.hash = original
})
test('parses path with query params', () => {
const original = window.location.hash
window.location.hash = '/search?q=test&page=2'
const result = router.parseHash()
assertEquals(result.path, '/search')
assertEquals(result.params.q, 'test')
assertEquals(result.params.page, '2')
window.location.hash = original
})
test('returns / for empty hash', () => {
const original = window.location.hash
window.location.hash = ''
const result = router.parseHash()
assertEquals(result.path, '/')
window.location.hash = original
})
})
describe('router.matchRoute', () => {
// Register test routes
router.register('/test', 'test-page')
router.register('/user/:id', 'user-page')
router.register('/post/:id/comment/:commentId', 'comment-page')
test('matches exact route', () => {
const match = router.matchRoute('/test')
assertEquals(match.componentTag, 'test-page')
assertDeepEquals(match.params, {})
})
test('matches route with single param', () => {
const match = router.matchRoute('/user/123')
assertEquals(match.componentTag, 'user-page')
assertEquals(match.params.id, '123')
})
test('matches route with multiple params', () => {
const match = router.matchRoute('/post/456/comment/789')
assertEquals(match.componentTag, 'comment-page')
assertEquals(match.params.id, '456')
assertEquals(match.params.commentId, '789')
})
test('returns null for unmatched route', () => {
const match = router.matchRoute('/unknown/path')
assertEquals(match, null)
})
test('does not match wrong segment count', () => {
const match = router.matchRoute('/user/123/extra')
assertEquals(match, null)
})
})
describe('router.register', () => {
test('returns router for chaining', () => {
const result = router.register('/chain-test', 'chain-page')
assertEquals(result, router)
})
})
describe('router.getCurrentRoute', () => {
test('returns null before navigation', () => {
// Note: May have a value if other tests triggered navigation
const route = router.getCurrentRoute()
assertTrue(route === null || typeof route === 'object')
})
})
describe('router.navigate', () => {
test('sets hash', () => {
const original = window.location.hash
router.navigate('/nav-test')
assertTrue(window.location.hash.includes('nav-test'))
window.location.hash = original
})
test('includes query params', () => {
const original = window.location.hash
router.navigate('/nav-test', { foo: 'bar', num: '42' })
assertTrue(window.location.hash.includes('foo=bar'))
assertTrue(window.location.hash.includes('num=42'))
window.location.hash = original
})
})