import { describe, expect, it } from
"vitest" ;
import { resolveCanvasHostUrl } from
"./canvas-host-url.js" ;
describe(
"resolveCanvasHostUrl" , () => {
it.each([
{
name:
"returns undefined when no canvas port is available" ,
params: {},
expected: undefined,
},
{
name:
"returns undefined when only a loopback host override is available" ,
params: { canvasPort:
3000 , hostOverride:
"127.0.0.1" },
expected: undefined,
},
{
name:
"prefers non-loopback host overrides and preserves explicit ports" ,
params: {
canvasPort:
3000 ,
hostOverride:
" canvas.openclaw.ai " ,
requestHost:
"gateway.local:9000" ,
localAddress:
"192.168.1.10" ,
},
expected:
"http://canvas.openclaw.ai:3000 ",
},
{
name:
"falls back from rejected loopback overrides to request hosts" ,
params: {
canvasPort:
3000 ,
hostOverride:
"127.0.0.1" ,
requestHost:
"example.com:8443" ,
},
expected:
"http://example.com:3000 ",
},
{
name:
"maps proxied default gateway ports to request-host ports" ,
params: {
canvasPort:
18789 ,
requestHost:
"gateway.example.com:9443" ,
forwardedProto:
"https" ,
},
expected:
"https://gateway.example.com:9443 ",
},
{
name:
"maps proxied default gateway ports to scheme defaults" ,
params: {
canvasPort:
18789 ,
requestHost:
"gateway.example.com" ,
forwardedProto: [
"https" ,
"http" ],
},
expected:
"https://gateway.example.com:443 ",
},
{
name:
"uses http scheme defaults without forwarded proto" ,
params: {
canvasPort:
18789 ,
requestHost:
"gateway.example.com" ,
},
expected:
"http://gateway.example.com:80 ",
},
{
name:
"brackets ipv6 hosts and can fall back to local addresses" ,
params: {
canvasPort:
3000 ,
requestHost:
"not a host" ,
localAddress:
"2001:db8::1" ,
scheme:
"https" ,
},
expected:
"https://[2001:db8::1]:3000 ",
},
])(
"$name" , ({ params, expected }) => {
expect(resolveCanvasHostUrl(params as Parameters<
typeof resolveCanvasHostUrl>[
0 ])).to
Be(
expected,
);
});
});
Messung V0.5 in Prozent C=93 H=100 G=96
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-06-09)
¤
*© Formatika GbR, Deutschland