use std::fs;
use std::path::Path;
use openapi_nexus::generators::typescript::fetch::sigil_emit_api::generate_api_files;
use sigil_stitch::lang::typescript::TypeScript;
fn read_fixture(rel: &str) -> String {
for base in [
"tests/fixtures",
"../tests/fixtures",
"../../tests/fixtures",
"../../../tests/fixtures",
] {
let p = Path::new(base).join(rel);
if p.exists() {
return fs::read_to_string(p).unwrap();
}
}
panic!("fixture not found: {rel}");
}
#[test]
fn petstore_api_scaffold_emits_one_file_per_tag() {
let yaml = read_fixture("valid/petstore.yaml");
let parsed = openapi_nexus::parser::parse_content_yaml(&yaml).unwrap();
let ir = openapi_nexus::ir::lower::lower(parsed).unwrap();
let files = generate_api_files(&ir, false, &TypeScript::new()).expect("scaffold renders");
assert!(
!files.is_empty(),
"expected at least one API file for petstore"
);
let pet_api = files
.iter()
.find(|f| f.filename.ends_with("PetApi.ts"))
.expect("PetApi.ts must exist for petstore");
let required_fragments = [
"@generated by openapi-nexus",
"export interface PetApiInterface",
"export class PetApi",
"super(configuration ?? DefaultConfig)",
"Raw(",
"await this.",
"return await response.value();",
];
for frag in required_fragments {
assert!(
pet_api.content.contains(frag),
"expected `{frag}` in PetApi.ts:\n{}",
pet_api.content
);
}
eprintln!(
"--- PetApi.ts (scaffold) ---\n{}\n--- end ---",
pet_api.content
);
}
#[test]
fn minimal_api_scaffold_has_no_request_interface_when_op_has_no_params() {
let yaml = read_fixture("valid/minimal.yaml");
let parsed = openapi_nexus::parser::parse_content_yaml(&yaml).unwrap();
let ir = openapi_nexus::ir::lower::lower(parsed).unwrap();
let files = generate_api_files(&ir, false, &TypeScript::new()).expect("scaffold renders");
let default_api = files
.iter()
.find(|f| f.filename.ends_with("DefaultApi.ts"))
.expect("DefaultApi.ts must exist for minimal");
assert!(
!default_api.content.contains("ApiGetTestRequest"),
"op without params should skip request interface:\n{}",
default_api.content
);
assert!(
default_api.content.contains("initOverrides?"),
"initOverrides? must be on every method:\n{}",
default_api.content
);
}