package configkit import ( "strings" "testing" "gitea.maximumdirect.net/eric/ConfigKit/internal/document" "gitea.maximumdirect.net/eric/ConfigKit/internal/yaml" ) func TestParseSourceOwnsDocumentAndSafeDiagnostics(t *testing.T) { t.Parallel() limits := defaultParseLimits() parsed, diagnostics := parseSource(Bytes("memory.yml", []byte("name: config\n")), "source-1", limits) if len(diagnostics) != 0 || parsed.source == nil || parsed.source.Label != "memory.yml" || parsed.document.Kind != document.Mapping { t.Fatalf("parse result = %#v, diagnostics = %#v", parsed, diagnostics) } const canary = "CANARY_PRIVATE_INPUT" failed, diagnostics := parseSource(Bytes("unsafe\nlabel", []byte("name: ["+canary+"\n")), "source-1", limits) if failed.document != nil || failed.source == nil || len(diagnostics) != 1 || diagnostics[0].Code != CodeYAMLInvalid { t.Fatalf("failed parse = %#v, diagnostics = %#v", failed, diagnostics) } var output strings.Builder if err := WriteDiagnostics(&output, diagnostics); err != nil { t.Fatal(err) } if strings.Contains(output.String(), canary) || strings.Count(output.String(), "\n") != 1 { t.Fatalf("unsafe rendered diagnostic = %q", output.String()) } limits.document = yaml.Limits{Depth: 1, Nodes: 20, ParserDepth: 20} _, diagnostics = parseSource(Bytes("deep", []byte("a:\n b: value\n")), "source-1", limits) if len(diagnostics) != 1 || diagnostics[0].Code != CodeYAMLDepthLimit || diagnostics[0].Primary.Line == 0 { t.Fatalf("depth diagnostics = %#v", diagnostics) } }