1package domain_test
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7 "github.com/stretchr/testify/require"
8
9 "github.com/bnema/gordon/internal/domain"
10)
11
12func TestValidateReadinessPath(t *testing.T) {
13 valid := []string{"/", "/healthz", "/healthz?probe=1", "/a/b-c_d.e"}
14 for _, path := range valid {
15 require.NoError(t, domain.ValidateReadinessPath(path), "path %q should be accepted", path)
16 }
17
18 invalid := []string{
19 "",
20 " ",
21 "healthz",
22 "@127.0.0.1:9/internal",
23 "//evil.example.com/path",
24 "http://evil.example.com/path",
25 "https://evil.example.com/path",
26 "/healthz\r\nHost: evil",
27 "/healthz\x00",
28 "/healthz\x7f",
29 "/he\talthz",
30 " /healthz",
31 "/healthz ",
32 "\t/healthz",
33 "/healthz\n",
34 }
35 for _, path := range invalid {
36 assert.Error(t, domain.ValidateReadinessPath(path), "path %q should be rejected", path)
37 }
38}
39
40func TestAppSpecValidate_RejectsAuthorityInReadinessPath(t *testing.T) {
41 spec := domain.AppSpec{
42 Name: "blog",
43 Services: []domain.AppService{{
44 Name: "web",
45 Image: "img:1",
46 Readiness: domain.AppReadiness{Type: domain.AppReadinessHTTP, Path: "@127.0.0.1:9/internal", Timeout: 30},
47 }},
48 }
49 assert.ErrorIs(t, spec.Validate(), domain.ErrInvalidAppSpec)
50}