Govern wire schemas from TypeSpec
This commit is contained in:
parent
fa81cb7f21
commit
2020dd4ed3
2 changed files with 10189 additions and 1571 deletions
63
crates/remora-contracts/tests/generated_wire.rs
Normal file
63
crates/remora-contracts/tests/generated_wire.rs
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
use remora_contracts::generated_wire::{EventFrame, JobFailure, JobSubmission};
|
||||
use serde::de::DeserializeOwned;
|
||||
use serde_json::{Value, json};
|
||||
|
||||
#[test]
|
||||
fn generated_roots_accept_the_shared_valid_corpus() {
|
||||
let corpus: Value =
|
||||
serde_json::from_str(include_str!("../../../contracts/golden/domain.json")).unwrap();
|
||||
assert_all::<JobSubmission>(&corpus["job_submissions"]);
|
||||
assert_all::<JobFailure>(&corpus["job_failures"]);
|
||||
assert_all::<EventFrame>(&corpus["event_frames"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn generated_roots_reject_governance_regressions() {
|
||||
assert_invalid::<JobSubmission>(json!({
|
||||
"source": {
|
||||
"kind": "http",
|
||||
"url": "not a URL",
|
||||
"result_path": "file.bin"
|
||||
}
|
||||
}));
|
||||
assert_invalid::<JobSubmission>(json!({
|
||||
"source": {
|
||||
"kind": "hugging_face",
|
||||
"repository_type": "model",
|
||||
"repository_id": "missing-owner",
|
||||
"revision": "main"
|
||||
}
|
||||
}));
|
||||
assert_invalid::<JobFailure>(json!({
|
||||
"class": "source_not_found",
|
||||
"message": "missing",
|
||||
"retryable": true
|
||||
}));
|
||||
assert_invalid::<EventFrame>(json!({
|
||||
"schema_version": 2,
|
||||
"kind": "heartbeat",
|
||||
"event_id": "event_0001",
|
||||
"sequence": 1,
|
||||
"cursor": "cursor-value-0001",
|
||||
"occurred_at": "2026-07-15T00:00:00Z"
|
||||
}));
|
||||
assert_invalid::<EventFrame>(json!({
|
||||
"schema_version": 1,
|
||||
"kind": "heartbeat",
|
||||
"event_id": "event_0001",
|
||||
"sequence": 1,
|
||||
"cursor": "cursor-value-0001",
|
||||
"occurred_at": "2026-07-15T00:00:00Z",
|
||||
"unexpected": true
|
||||
}));
|
||||
}
|
||||
|
||||
fn assert_all<T: DeserializeOwned>(values: &Value) {
|
||||
for value in values.as_array().unwrap() {
|
||||
serde_json::from_value::<T>(value.clone()).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
fn assert_invalid<T: DeserializeOwned>(value: Value) {
|
||||
assert!(serde_json::from_value::<T>(value).is_err());
|
||||
}
|
||||
|
|
@ -340,7 +340,24 @@ where
|
|||
T: DeserializeOwned + Serialize,
|
||||
{
|
||||
let dto: T = serde_json::from_value(value.clone()).unwrap();
|
||||
assert_eq!(serde_json::to_value(dto).unwrap(), value);
|
||||
let serialized = serde_json::to_value(&dto).unwrap();
|
||||
assert_eq!(serialized, value);
|
||||
if matches!(
|
||||
definition,
|
||||
"ClaimRequest"
|
||||
| "AttemptRenewRequest"
|
||||
| "AttemptActivateRequest"
|
||||
| "AttemptStopRequest"
|
||||
| "AttemptStagingObjectRequest"
|
||||
| "AttemptStagingWriteIntentRequest"
|
||||
| "AttemptStagingMultipartRequest"
|
||||
| "AttemptResolvedSourceRequest"
|
||||
| "AttemptCheckpointRequest"
|
||||
| "AttemptProgressRequest"
|
||||
| "AttemptOutcomeRequest"
|
||||
) {
|
||||
assert!(remora_contracts::request_is_valid(definition, &dto));
|
||||
}
|
||||
validate_openapi_value(component_schema, definition, &value);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue