use alef::core::config::NewAlefConfig;
use alef::e2e::codegen::E2eCodegen;
use alef::e2e::codegen::java::JavaCodegen;
use alef::e2e::fixture::{Assertion, Fixture, FixtureGroup};
fn make_extract_fixture() -> Fixture {
Fixture {
id: "extract_with_config".to_string(),
category: Some("contract".to_string()),
description: "Tests extraction with config provided".to_string(),
tags: vec!["config".to_string()],
skip: None,
env: None,
call: Some("extract_file_sync".to_string()),
input: serde_json::json!({
"path": "pdf/test.pdf",
"config": {
"keywords": {
"algorithm": "yake",
"max_keywords": 5
}
}
}),
mock_response: None,
visitor: None,
args: Vec::new(),
assertions: vec![Assertion {
assertion_type: "equals".to_string(),
field: Some("mime_type".to_string()),
value: Some(serde_json::Value::String("application/pdf".to_string())),
values: None,
method: None,
check: None,
args: None,
return_type: None,
}],
source: "contract.json".to_string(),
http: None,
}
}
const TOML: &str = r#"
[workspace]
languages = ["java"]
[[crates]]
name = "sample_crate"
sources = ["src/lib.rs"]
[crates.java]
package = "dev.sample_crate"
[crates.e2e]
fixtures = "fixtures"
output = "e2e"
java_group_id = "dev.sample_crate"
[crates.e2e.call]
function = "extract_file_sync"
result_var = "result"
[[crates.e2e.call.args]]
name = "path"
field = "input.path"
type = "file_path"
[[crates.e2e.call.args]]
name = "mime_type"
field = "input.mime_type"
type = "string"
optional = true
[[crates.e2e.call.args]]
name = "config"
field = "input.config"
type = "json_object"
optional = true
[crates.e2e.call.overrides.csharp]
options_type = "ExtractionConfig"
options_via = "from_json"
# No explicit Java override — should inherit ExtractionConfig from C#
"#;
fn render_java_test() -> String {
let cfg: NewAlefConfig = toml::from_str(TOML).expect("config parses");
let resolved = cfg.clone().resolve().expect("config resolves").remove(0);
let e2e = cfg.crates[0].e2e.clone().expect("e2e config present");
let groups = vec![FixtureGroup {
category: "contract".to_string(),
fixtures: vec![make_extract_fixture()],
}];
let files = JavaCodegen
.generate(&groups, &e2e, &resolved, &[], &[])
.expect("generation succeeds");
files
.iter()
.find(|f| {
let p = f.path.to_string_lossy();
p.contains("ContractTest.java")
})
.expect("ContractTest.java is emitted")
.content
.clone()
}
#[test]
fn json_object_arg_with_value_uses_from_json() {
let rendered = render_java_test();
assert!(
rendered.contains("JsonUtil.fromJson(") && rendered.contains("ExtractionConfig.class"),
"must use JsonUtil.fromJson(..., ExtractionConfig.class) to construct config from JSON fixture value. Rendered:\n{rendered}"
);
assert!(
rendered.contains(".extractFileSync(java.nio.file.Path.of(\"pdf/test.pdf\"), null, config)"),
"must pass the constructed config variable to the function. Rendered:\n{rendered}"
);
}
#[test]
fn json_object_arg_with_value_imports_json_util() {
let rendered = render_java_test();
assert!(
rendered.contains("import dev.sample_crate.JsonUtil;"),
"must import JsonUtil when deserializing config from JSON. Rendered:\n{rendered}"
);
}