feat(14-01): record vendor calls with summer parity:upstream and replay them offline

- WriteUpstream masks vars, hashes long base64 JSON strings and refuses unmasked Authorization/X-Api-Key
- multipart requests recorded as ordered parts; the fake compares parts and hashed payloads
- loopback CONNECT recording proxy with a local ECDSA parity CA, script and forward modes
- parity:upstream command, README and parity docs
This commit is contained in:
Jakub Zych
2026-10-03 19:55:42 +02:00
parent e6a67134d1
commit ee0004fb65
11 changed files with 1647 additions and 15 deletions

View File

@@ -15,7 +15,7 @@ import (
func TestParityCommandContract(t *testing.T) {
names := commandNames()
for _, want := range []string{"parity:record", "parity:proxy", "parity:replay"} {
for _, want := range []string{"parity:record", "parity:proxy", "parity:replay", "parity:upstream"} {
if !containsName(names, want) {
t.Fatalf("missing %s in %v", want, names)
}
@@ -82,6 +82,29 @@ func TestParityCommandContract(t *testing.T) {
}
assertNoSecrets(t, out+"\n"+errString(err), jwt, inv)
upDir := t.TempDir()
upScript := filepath.Join(upDir, "script.yaml")
if err := os.WriteFile(upScript, []byte("responses: []\n"), 0o644); err != nil {
t.Fatal(err)
}
upOut := filepath.Join(outDir, "routes", "POST_x__ok.upstream.yaml")
out, err = runParityCapture("parity:upstream", "--listen", "0.0.0.0:8425", "--ca-dir", filepath.Join(upDir, "ca"), "--out", upOut, "--script", upScript, "--vars", filepath.Join(upDir, "vars.yaml"))
if err == nil || !strings.Contains(err.Error(), "loopback") {
t.Fatalf("upstream non-loopback: %v %s", err, out)
}
out, err = runParityCapture("parity:upstream", "--ca-dir", filepath.Join(upDir, "ca"), "--out", upOut, "--script", upScript, "--vars", filepath.Join(outDir, "routes", "vars.yaml"))
if err == nil || !strings.Contains(err.Error(), "vars file") {
t.Fatalf("upstream vars inside output dir: %v %s", err, out)
}
out, err = runParityCapture("parity:upstream", "--ca-dir", filepath.Join(outDir, "routes", "ca"), "--out", upOut, "--script", upScript, "--vars", filepath.Join(upDir, "vars.yaml"))
if err == nil || !strings.Contains(err.Error(), "ca dir") {
t.Fatalf("upstream CA inside output dir: %v %s", err, out)
}
out, err = runParityCapture("parity:upstream", "--out", upOut, "--vars", filepath.Join(upDir, "vars.yaml"))
if err == nil || !strings.Contains(err.Error(), "--ca-dir") {
t.Fatalf("upstream missing --ca-dir: %v %s", err, out)
}
missing := filepath.Join(outDir, "missing-var.yaml")
if err := os.WriteFile(missing, []byte("version: 1\nname: miss\nsteps:\n - id: a\n request:\n method: GET\n path: /x/{{missing}}\n response:\n status: 200\n"), 0o644); err != nil {
t.Fatal(err)