toes/src/shared/urls.test.ts

45 lines
1.4 KiB
TypeScript

import { describe, expect, test } from 'bun:test'
import { buildAppUrl, toSubdomain } from './urls'
describe('toSubdomain', () => {
test('passes through clean names', () => {
expect(toSubdomain('clock')).toBe('clock')
expect(toSubdomain('my-app')).toBe('my-app')
})
test('replaces dots with hyphens', () => {
expect(toSubdomain('mcp.txt')).toBe('mcp-txt')
expect(toSubdomain('my.cool.app')).toBe('my-cool-app')
})
test('replaces underscores with hyphens', () => {
expect(toSubdomain('my_app')).toBe('my-app')
})
test('collapses multiple hyphens', () => {
expect(toSubdomain('my--app')).toBe('my-app')
expect(toSubdomain('a..b')).toBe('a-b')
})
test('strips leading and trailing hyphens', () => {
expect(toSubdomain('.hidden')).toBe('hidden')
expect(toSubdomain('trailing.')).toBe('trailing')
expect(toSubdomain('-dashed-')).toBe('dashed')
})
test('lowercases', () => {
expect(toSubdomain('MyApp')).toBe('myapp')
})
})
describe('buildAppUrl', () => {
test('prepends sanitized name as subdomain', () => {
expect(buildAppUrl('clock', 'http://toes.local')).toBe('http://clock.toes.local')
expect(buildAppUrl('mcp.txt', 'http://toes.local')).toBe('http://mcp-txt.toes.local')
})
test('works with localhost and port', () => {
expect(buildAppUrl('my-app', 'http://localhost:3000')).toBe('http://my-app.localhost:3000')
})
})