From 5a2248667d0f3eb4e8031f2a83642212aa433149 Mon Sep 17 00:00:00 2001 From: Harmon Date: Mon, 11 May 2026 16:12:26 +0800 Subject: [PATCH] Allow extra pair metadata in bundle checks --- main.go | 1 - main_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 84ec196..63548c0 100644 --- a/main.go +++ b/main.go @@ -426,7 +426,6 @@ func loadAndValidateInput(inputRoot string) (pairsDocument, error) { var doc pairsDocument decoder := json.NewDecoder(file) - decoder.DisallowUnknownFields() if err := decoder.Decode(&doc); err != nil { return pairsDocument{}, fmt.Errorf("parse pairs.json: %w", err) } diff --git a/main_test.go b/main_test.go index 179a738..83f76c7 100644 --- a/main_test.go +++ b/main_test.go @@ -194,6 +194,48 @@ func TestRunCheckTreatsMissingOrbitAsWarning(t *testing.T) { } } +func TestRunCheckAllowsExtraPairMetadata(t *testing.T) { + root := t.TempDir() + input := filepath.Join(root, "bundle") + + writeTestFile(t, filepath.Join(input, "data", "scene_master", "m.txt"), "master") + writeTestFile(t, filepath.Join(input, "data", "scene_slave", "s.txt"), "slave") + writeTestFile(t, filepath.Join(input, "orbit", "master.txt"), "master orbit") + writeTestFile(t, filepath.Join(input, "orbit", "slave.txt"), "slave orbit") + writeTestFile(t, filepath.Join(input, pairsFileName), `{ + "schema": "dinsar_source_bundle_pairs.v1", + "exported_at": "2026-05-11T07:20:15Z", + "pairs": [ + { + "pair_id": "pair_0001", + "identity_key": "uid:test", + "task_name": "Task_20250101_20250113", + "task_alias": "Task_20250101_20250113", + "pair_key": "lt1_test", + "scene_pair_uid": "test", + "master_data": "data/scene_master", + "slave_data": "data/scene_slave", + "master_orbit": "orbit/master.txt", + "slave_orbit": "orbit/slave.txt", + "master_source_path": "D:\\source\\master", + "slave_source_path": "D:\\source\\slave", + "scene_center_distance_meters": 123.4 + } + ] +}`) + + result, err := runCheck(config{inputRoot: input, logWriter: io.Discard}) + if err != nil { + t.Fatalf("runCheck failed: %v", err) + } + if result.report.Failed != 0 { + t.Fatalf("failed = %d, want 0; errors=%v", result.report.Failed, result.report.Errors) + } + if result.report.Valid != 1 { + t.Fatalf("valid = %d, want 1", result.report.Valid) + } +} + func TestParseFlagsRejectsSkipExistingWithOverwrite(t *testing.T) { _, err := parseFlags([]string{"--input", "in", "--output", "out", "--skip-existing", "--overwrite"}) if err == nil {