package contracts import ( "encoding/json" "testing" ) func TestTaskControlReceiptFields(t *testing.T) { schema, err := CompileCurrent("mq-task-control-receipt.schema.json") if err != nil { t.Fatal(err) } envelope := func(payload map[string]any) map[string]any { return map[string]any{"event_id": "control-fields", "event_type": "task.control", "dispatcher_id": "c046b893-8628-4589-ae50-619d049248a6", "tenant_id": 1001, "payload": payload} } applied := map[string]any{"task_id": "task-a", "action": "pause", "status": "applied", "reason_code": "applied", "task_state": "paused"} if err := schema.Validate(envelope(applied)); err != nil { t.Fatalf("requested success structure rejected: %v", err) } for key := range applied { raw, _ := json.Marshal(applied) var missing map[string]any _ = json.Unmarshal(raw, &missing) delete(missing, key) if err := schema.Validate(envelope(missing)); err == nil { t.Errorf("success accepted without %s", key) } } for _, payload := range []map[string]any{ {"status": "rejected", "reason_code": "invalid_data", "reason_message": "issued_at missing"}, {"task_id": "task-a", "action": "pause", "status": "rejected", "reason_code": "control_rejected", "task_state": "stopped", "reason_message": "task stopped"}, {"task_id": "task-a", "status": "rejected", "reason_code": "invalid_data", "task_state": "running", "reason_message": "invalid action"}, } { if err := schema.Validate(envelope(payload)); err != nil { t.Errorf("rejection with independently known fields rejected: %v", err) } } for _, payload := range []map[string]any{ {"status": "applied"}, {"task_id": "task-a", "action": "pause", "status": "applied", "reason_code": "invalid_data", "task_state": "paused"}, {"status": "rejected", "reason_code": "invalid_data", "reason_message": ""}, {"status": "rejected", "reason_message": "invalid data"}, {"task_id": nil, "status": "rejected", "reason_code": "invalid_data", "reason_message": "invalid data"}, {"task_id": "bad task", "status": "rejected", "reason_code": "invalid_data", "reason_message": "invalid data"}, {"action": "unknown", "status": "rejected", "reason_code": "invalid_data", "reason_message": "invalid data"}, {"task_state": "invented", "status": "rejected", "reason_code": "invalid_data", "reason_message": "invalid data"}, } { if err := schema.Validate(envelope(payload)); err == nil { t.Errorf("invalid payload accepted: %+v", payload) } } }