// tests/main/utils/loopback.test.ts // 로컬 엔진 URL 정규화 테스트. // Windows에서 localhost가 ::1로만 해석되어 Ollama/sidecar 연결이 실패했던 회귀를 고정한다. import { describe, it, expect } from 'vitest' import { loopbackUrl, normalizeLoopbackUrl } from '../../../src/main/utils/loopback' describe('normalizeLoopbackUrl', () => { it('rewrites a bare localhost host to the IPv4 loopback', () => { expect(normalizeLoopbackUrl('http://localhost:11434')).toBe('http://127.0.0.1:11434') }) it('keeps the port and path', () => { expect(normalizeLoopbackUrl('http://localhost:8000/v1')).toBe('http://127.0.0.1:8000/v1') }) it('handles https and trailing dot host forms', () => { expect(normalizeLoopbackUrl('https://localhost:5000/health')).toBe( 'https://127.0.0.1:5000/health', ) expect(normalizeLoopbackUrl('http://localhost.:1234')).toBe('http://127.0.0.1:1234') }) it('leaves remote hosts untouched', () => { expect(normalizeLoopbackUrl('https://api.openai.com/v1')).toBe('https://api.openai.com/v1') expect(normalizeLoopbackUrl('http://192.168.0.10:11434')).toBe('http://192.168.0.10:11434') expect(normalizeLoopbackUrl('http://127.0.0.1:11434')).toBe('http://127.0.0.1:11434') }) it('does not treat lookalike hostnames as loopback', () => { expect(normalizeLoopbackUrl('http://localhost.evil.com')).toBe('http://localhost.evil.com') }) it('falls back to a textual rewrite when the URL is not parseable', () => { // 잘못된 포트는 URL 파서가 던진다 → 정규식 폴백 경로를 탄다. expect(normalizeLoopbackUrl('http://localhost:99999999')).toBe( 'http://127.0.0.1:99999999', ) }) it('passes through inputs without a recognizable host', () => { expect(normalizeLoopbackUrl('localhost:11434')).toBe('localhost:11434') }) it('returns empty input unchanged', () => { expect(normalizeLoopbackUrl('')).toBe('') }) }) describe('loopbackUrl', () => { it('builds an IPv4 loopback URL for a port', () => { expect(loopbackUrl(18765)).toBe('http://127.0.0.1:18765') }) })