use std::fs;
use std::path::PathBuf;
use tempfile::TempDir;
fn create_test_file(dir: &TempDir, filename: &str, content: &str) -> PathBuf {
let file_path = dir.path().join(filename);
fs::write(&file_path, content).expect("Failed to write test file");
file_path
}
#[test]
fn test_unknown_attribute_detection_integration() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<button on_clik="handle_click" label="Click Me" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_err());
let err = result.unwrap_err();
let err_msg = format!("{}", err);
assert!(err_msg.contains("on_clik"));
assert!(err_msg.contains("on_click") || err_msg.contains("Did you mean"));
}
#[test]
fn test_valid_attributes_pass_validation() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let content = r#"
<ui>
<Button on_click="handle_click" label="Click Me" width="100" />
</ui>"#;
create_test_file(&temp_dir, "test.dampen", content);
assert!(temp_dir.path().join("test.dampen").exists());
}
#[test]
fn test_strict_mode_placeholder() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let content = r#"
<ui>
<Button on_clik="handle_click" />
</ui>"#;
create_test_file(&temp_dir, "test.dampen", content);
assert!(temp_dir.path().join("test.dampen").exists());
}
#[test]
fn test_handler_validation_with_registry() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let registry_path = temp_dir.path().join("handlers.json");
let registry_content = r#"[
{
"name": "handle_click",
"param_type": null,
"returns_command": false
}
]"#;
fs::write(®istry_path, registry_content).expect("Failed to write registry");
let content = r#"
<column>
<button on_click="handle_click" label="Click Me" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: Some(registry_path.to_string_lossy().to_string()),
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_handler_validation_with_unknown_handler() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let registry_path = temp_dir.path().join("handlers.json");
let registry_content = r#"[
{
"name": "handle_click",
"param_type": null,
"returns_command": false
}
]"#;
fs::write(®istry_path, registry_content).expect("Failed to write registry");
let content = r#"
<column>
<button on_click="unknown_handler" label="Click Me" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: Some(registry_path.to_string_lossy().to_string()),
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_err());
}
#[test]
fn test_handler_validation_without_registry() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<button on_click="any_handler" label="Click Me" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None, model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_binding_validation_with_model() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let model_path = temp_dir.path().join("model.json");
let model_content = r#"[
{
"name": "count",
"type_name": "i32",
"is_nested": false,
"children": []
},
{
"name": "user",
"type_name": "User",
"is_nested": true,
"children": [
{"name": "name", "type_name": "String", "is_nested": false, "children": []}
]
}
]"#;
fs::write(&model_path, model_content).expect("Failed to write model");
let content = r#"
<column>
<text value="{count}" />
<text value="{user.name}" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: Some(model_path.to_string_lossy().to_string()),
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_binding_validation_with_invalid_field() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let model_path = temp_dir.path().join("model.json");
let model_content = r#"[
{
"name": "count",
"type_name": "i32",
"is_nested": false,
"children": []
}
]"#;
fs::write(&model_path, model_content).expect("Failed to write model");
let content = r#"
<column>
<text value="{unknown_field}" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: Some(model_path.to_string_lossy().to_string()),
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_err());
}
#[test]
fn test_binding_validation_without_model() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<text value="{any_field}" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None, custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_valid_radio_group_integration() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<radio id="size_group" value="small" label="Small" on_select="handle_size" />
<radio id="size_group" value="medium" label="Medium" on_select="handle_size" />
<radio id="size_group" value="large" label="Large" on_select="handle_size" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_valid_theme_integration() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<text value="Hello Theme" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_strict_mode_with_errors() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<button on_clik="handle_click" label="Click Me" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args_normal = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result_normal = execute(&args_normal);
assert!(result_normal.is_err());
let args_strict = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: true,
show_widget_versions: false,
};
let result_strict = execute(&args_strict);
assert!(result_strict.is_err());
}
#[test]
fn test_strict_mode_with_no_warnings() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<button on_click="handle_click" label="Click Me" />
<text value="Hello World" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: true,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_required_attribute_validation_text_missing_value() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<text size="16" color="blue" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_err());
let err = result.unwrap_err();
let err_msg = format!("{}", err);
assert!(err_msg.contains("value") || err_msg.contains("required"));
}
#[test]
fn test_required_attribute_validation_image_missing_src() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<image width="200" height="100" fit="contain" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_err());
let err = result.unwrap_err();
let err_msg = format!("{}", err);
assert!(err_msg.contains("src") || err_msg.contains("required"));
}
#[test]
fn test_required_attribute_validation_radio_missing_label() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<radio value="option1" on_select="handle_select" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_err());
let err = result.unwrap_err();
let err_msg = format!("{}", err);
assert!(err_msg.contains("label") || err_msg.contains("required"));
}
#[test]
fn test_required_attribute_validation_all_present() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let content = r#"
<column>
<text value="Hello World" size="16" />
<image src="logo.png" width="100" />
<radio label="Option 1" value="opt1" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: None,
model: None,
custom_widgets: None,
strict: false,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_complete_validation_pipeline_all_flags() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let registry_path = temp_dir.path().join("handlers.json");
let registry_content = r#"[
{
"name": "handle_click",
"param_type": null,
"returns_command": false
},
{
"name": "handle_input",
"param_type": "String",
"returns_command": false
},
{
"name": "handle_select",
"param_type": "String",
"returns_command": false
}
]"#;
fs::write(®istry_path, registry_content).expect("Failed to write registry");
let model_path = temp_dir.path().join("model.json");
let model_content = r#"[
{
"name": "title",
"type_name": "String",
"is_nested": false,
"children": []
},
{
"name": "count",
"type_name": "i32",
"is_nested": false,
"children": []
},
{
"name": "user",
"type_name": "User",
"is_nested": true,
"children": [
{"name": "name", "type_name": "String", "is_nested": false, "children": []},
{"name": "email", "type_name": "String", "is_nested": false, "children": []}
]
}
]"#;
fs::write(&model_path, model_content).expect("Failed to write model");
let content = r#"
<column>
<text value="{title}" size="24" />
<text value="Count: {count}" />
<button on_click="handle_click" label="Click Me" />
<text_input placeholder="Enter name" value="{user.name}" on_input="handle_input" />
<image src="logo.png" width="100" height="100" />
<radio label="Option 1" value="opt1" on_select="handle_select" />
<radio label="Option 2" value="opt2" on_select="handle_select" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: true,
handlers: Some(registry_path.to_string_lossy().to_string()),
model: Some(model_path.to_string_lossy().to_string()),
custom_widgets: None,
strict: true,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_ok());
}
#[test]
fn test_complete_validation_pipeline_with_errors() {
use dampen_cli::commands::check::{CheckArgs, execute};
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let ui_dir = temp_dir.path().join("ui");
fs::create_dir(&ui_dir).expect("Failed to create ui dir");
let registry_path = temp_dir.path().join("handlers.json");
let registry_content = r#"[
{
"name": "handle_click",
"param_type": null,
"returns_command": false
}
]"#;
fs::write(®istry_path, registry_content).expect("Failed to write registry");
let model_path = temp_dir.path().join("model.json");
let model_content = r#"[
{
"name": "count",
"type_name": "i32",
"is_nested": false,
"children": []
}
]"#;
fs::write(&model_path, model_content).expect("Failed to write model");
let content = r#"
<column>
<text size="24" />
<button on_clik="handle_click" label="Click Me" />
<text_input value="{missing_field}" on_input="unknown_handler" />
<image width="100" />
<radio value="opt1" />
</column>"#;
fs::write(ui_dir.join("test.dampen"), content).expect("Failed to write test file");
let args = CheckArgs {
input: Some(ui_dir.to_string_lossy().to_string()),
verbose: false,
handlers: Some(registry_path.to_string_lossy().to_string()),
model: Some(model_path.to_string_lossy().to_string()),
custom_widgets: None,
strict: true,
show_widget_versions: false,
};
let result = execute(&args);
assert!(result.is_err());
let err = result.unwrap_err();
let err_msg = format!("{}", err);
assert!(
err_msg.contains("value")
|| err_msg.contains("on_clik")
|| err_msg.contains("missing_field")
|| err_msg.contains("unknown_handler")
|| err_msg.contains("src")
|| err_msg.contains("label")
);
}