use data_modelling_core::convert::convert_to_odcs;
use data_modelling_core::convert::migrate_dataflow::migrate_dataflow_to_domain;
use data_modelling_core::export::cads::CADSExporter;
use data_modelling_core::export::odps::ODPSExporter;
use data_modelling_core::import::cads::CADSImporter;
use data_modelling_core::import::odps::ODPSImporter;
use data_modelling_core::models::Tag;
use data_modelling_core::models::domain::Domain;
use std::str::FromStr;
#[test]
fn test_cads_wasm_import_functionality() {
let cads_yaml = r#"
apiVersion: v1.0
kind: AIModel
id: 550e8400-e29b-41d4-a716-446655440000
name: test-model
version: 1.0.0
status: draft
description:
purpose: Test model
"#;
let importer = CADSImporter::new();
let asset = importer.import(cads_yaml).unwrap();
let json = serde_json::to_string(&asset).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(parsed["name"], "test-model");
assert_eq!(parsed["kind"], "AIModel");
assert_eq!(parsed["apiVersion"], "v1.0");
}
#[test]
fn test_cads_wasm_export_functionality() {
let cads_yaml = r#"
apiVersion: v1.0
kind: AIModel
id: 550e8400-e29b-41d4-a716-446655440000
name: test-model
version: 1.0.0
status: draft
"#;
let importer = CADSImporter::new();
let asset = importer.import(cads_yaml).unwrap();
let asset_json = serde_json::to_string(&asset).unwrap();
let asset: data_modelling_core::models::cads::CADSAsset =
serde_json::from_str(&asset_json).unwrap();
let exported_yaml = CADSExporter::export_asset(&asset);
assert!(exported_yaml.contains("apiVersion"));
assert!(exported_yaml.contains("kind"));
assert!(exported_yaml.contains("name"));
assert!(exported_yaml.contains("test-model"));
}
#[test]
fn test_cads_wasm_round_trip() {
let original_yaml = r#"
apiVersion: v1.0
kind: MLPipeline
id: 660e8400-e29b-41d4-a716-446655440001
name: test-pipeline
version: 1.0.0
status: draft
tags:
- ml
- test
"#;
let importer = CADSImporter::new();
let asset = importer.import(original_yaml).unwrap();
let asset_json = serde_json::to_string(&asset).unwrap();
let asset: data_modelling_core::models::cads::CADSAsset =
serde_json::from_str(&asset_json).unwrap();
let exported_yaml = CADSExporter::export_asset(&asset);
let asset2 = importer.import(&exported_yaml).unwrap();
assert_eq!(asset.name, asset2.name);
assert_eq!(asset.kind, asset2.kind);
assert_eq!(asset.version, asset2.version);
}
#[test]
fn test_odps_wasm_import_functionality() {
let odps_yaml = r#"
apiVersion: v1.0.0
kind: DataProduct
id: 550e8400-e29b-41d4-a716-446655440000
name: test-product
version: 1.0.0
status: active
inputPorts:
- name: input
version: 1.0.0
contractId: contract-123
outputPorts:
- name: output
version: 1.0.0
contractId: contract-456
"#;
let importer = ODPSImporter::new();
let product = importer.import(odps_yaml).unwrap();
let json = serde_json::to_string(&product).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(parsed["name"], "test-product");
assert_eq!(parsed["kind"], "DataProduct");
assert!(
parsed["apiVersion"] == "v1.0.0" || parsed["api_version"] == "v1.0.0",
"Expected apiVersion or api_version field"
);
}
#[test]
fn test_odps_wasm_export_functionality() {
let odps_yaml = r#"
apiVersion: v1.0.0
kind: DataProduct
id: 550e8400-e29b-41d4-a716-446655440000
name: test-product
version: 1.0.0
status: draft
"#;
let importer = ODPSImporter::new();
let product = importer.import(odps_yaml).unwrap();
let product_json = serde_json::to_string(&product).unwrap();
let product: data_modelling_core::models::odps::ODPSDataProduct =
serde_json::from_str(&product_json).unwrap();
let exported_yaml = ODPSExporter::export_product(&product);
assert!(exported_yaml.contains("apiVersion"));
assert!(exported_yaml.contains("kind"));
assert!(exported_yaml.contains("name"));
assert!(exported_yaml.contains("test-product"));
}
#[test]
fn test_odps_wasm_round_trip() {
let original_yaml = r#"
apiVersion: v1.0.0
kind: DataProduct
id: 660e8400-e29b-41d4-a716-446655440001
name: test-product
version: 1.0.0
status: active
tags:
- product
- test
inputPorts:
- name: input
version: 1.0.0
contractId: contract-123
"#;
let importer = ODPSImporter::new();
let product = importer.import(original_yaml).unwrap();
let product_json = serde_json::to_string(&product).unwrap();
let product: data_modelling_core::models::odps::ODPSDataProduct =
serde_json::from_str(&product_json).unwrap();
let exported_yaml = ODPSExporter::export_product(&product);
let product2 = importer.import(&exported_yaml).unwrap();
assert_eq!(product.name, product2.name);
assert_eq!(product.kind, product2.kind);
assert_eq!(product.version, product2.version);
}
#[test]
fn test_domain_wasm_create_functionality() {
let domain = Domain::new("test-domain".to_string());
let json = serde_json::to_string(&domain).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(parsed["name"], "test-domain");
assert!(parsed["id"].is_string());
}
#[test]
fn test_domain_wasm_import_functionality() {
let domain_yaml = r#"
id: 550e8400-e29b-41d4-a716-446655440000
name: test-domain
description: Test domain description
systems: []
cads_nodes: []
odcs_nodes: []
system_connections: []
node_connections: []
"#;
let domain = Domain::from_yaml(domain_yaml).unwrap();
let json = serde_json::to_string(&domain).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(parsed["name"], "test-domain");
assert_eq!(parsed["description"], "Test domain description");
}
#[test]
fn test_domain_wasm_export_functionality() {
let mut domain = Domain::new("test-domain".to_string());
domain.description = Some("Test description".to_string());
let domain_json = serde_json::to_string(&domain).unwrap();
let domain: Domain = serde_json::from_str(&domain_json).unwrap();
let exported_yaml = domain.to_yaml().unwrap();
assert!(exported_yaml.contains("name"));
assert!(exported_yaml.contains("test-domain"));
assert!(exported_yaml.contains("description"));
}
#[test]
fn test_domain_wasm_round_trip() {
let mut domain = Domain::new("test-domain".to_string());
domain.description = Some("Test description".to_string());
let domain_json = serde_json::to_string(&domain).unwrap();
let domain: Domain = serde_json::from_str(&domain_json).unwrap();
let exported_yaml = domain.to_yaml().unwrap();
let domain2 = Domain::from_yaml(&exported_yaml).unwrap();
assert_eq!(domain.name, domain2.name);
assert_eq!(domain.description, domain2.description);
}
#[test]
fn test_domain_wasm_migrate_dataflow_functionality() {
let dataflow_yaml = r#"
nodes:
- id: 550e8400-e29b-41d4-a716-446655440000
name: kafka-cluster
type: Kafka
metadata:
owner: Data Engineering Team
infrastructure_type: Kafka
- id: 660e8400-e29b-41d4-a716-446655440001
name: postgres-db
type: PostgreSQL
metadata:
owner: Database Team
infrastructure_type: PostgreSQL
relationships:
- id: 770e8400-e29b-41d4-a716-446655440002
source_node_id: 550e8400-e29b-41d4-a716-446655440000
target_node_id: 660e8400-e29b-41d4-a716-446655440001
type: data-flow
"#;
let domain = migrate_dataflow_to_domain(dataflow_yaml, Some("test-domain")).unwrap();
let json_result = serde_json::to_string(&domain);
assert_eq!(domain.name, "test-domain");
assert!(
!domain.systems.is_empty(),
"Migration should create at least one system"
);
assert!(
!domain.system_connections.is_empty(),
"Migration should create at least one connection"
);
if let Ok(json) = json_result {
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(parsed["name"], "test-domain");
assert!(parsed["systems"].is_array());
assert!(parsed["system_connections"].is_array());
}
}
#[test]
fn test_tag_wasm_parse_functionality() {
let tag = Tag::from_str("finance").unwrap();
let json = serde_json::to_string(&tag).unwrap();
assert_eq!(json, "\"finance\"");
let tag = Tag::from_str("Environment:Dev").unwrap();
let json = serde_json::to_string(&tag).unwrap();
assert_eq!(json, "\"Environment:Dev\"");
let tag = Tag::from_str("Domains:[Finance, Sales]").unwrap();
let json = serde_json::to_string(&tag).unwrap();
assert_eq!(json, "\"Domains:[Finance, Sales]\"");
}
#[test]
fn test_tag_wasm_serialize_functionality() {
let tag = Tag::Simple("finance".to_string());
let tag_json = serde_json::to_string(&tag).unwrap();
let tag: Tag = serde_json::from_str(&tag_json).unwrap();
assert_eq!(tag.to_string(), "finance");
let tag = Tag::Pair("Environment".to_string(), "Dev".to_string());
let tag_json = serde_json::to_string(&tag).unwrap();
let tag: Tag = serde_json::from_str(&tag_json).unwrap();
assert_eq!(tag.to_string(), "Environment:Dev");
let tag = Tag::List(
"Domains".to_string(),
vec!["Finance".to_string(), "Sales".to_string()],
);
let tag_json = serde_json::to_string(&tag).unwrap();
let tag: Tag = serde_json::from_str(&tag_json).unwrap();
assert_eq!(tag.to_string(), "Domains:[Finance, Sales]");
}
#[test]
fn test_tag_wasm_round_trip() {
let test_cases = vec![
("finance", Tag::Simple("finance".to_string())),
(
"Environment:Dev",
Tag::Pair("Environment".to_string(), "Dev".to_string()),
),
(
"Domains:[Finance, Sales]",
Tag::List(
"Domains".to_string(),
vec!["Finance".to_string(), "Sales".to_string()],
),
),
];
for (tag_str, expected_tag) in test_cases {
let tag = Tag::from_str(tag_str).unwrap();
let tag_json = serde_json::to_string(&tag).unwrap();
let tag: Tag = serde_json::from_str(&tag_json).unwrap();
let serialized = tag.to_string();
assert_eq!(tag, expected_tag);
assert_eq!(serialized, tag_str);
}
}
#[test]
fn test_tag_wasm_error_handling() {
assert!(Tag::from_str("").is_err());
assert!(Tag::from_str(" ").is_err());
assert!(Tag::from_str("finance").is_ok());
assert!(Tag::from_str("Environment:Dev").is_ok());
assert!(Tag::from_str("Domains:[A, B]").is_ok());
}
#[test]
fn test_convert_to_odcs_wasm_functionality() {
let sql = "CREATE TABLE users (id INT, name VARCHAR(100));";
let result = convert_to_odcs(sql, Some("sql"));
match result {
Ok(_odcs_yaml) => {
}
Err(e) => {
let error_msg = e.to_string();
assert!(!error_msg.is_empty(), "Error message should not be empty");
}
}
let json_schema = r#"{"type": "object", "properties": {"id": {"type": "integer"}}}"#;
let result = convert_to_odcs(json_schema, Some("json_schema"));
match result {
Ok(_odcs_yaml) => {
}
Err(e) => {
let error_msg = e.to_string();
assert!(!error_msg.is_empty(), "Error message should not be empty");
}
}
let result = convert_to_odcs(sql, None);
match result {
Ok(_odcs_yaml) => {
}
Err(e) => {
let error_msg = e.to_string();
assert!(!error_msg.is_empty(), "Error message should not be empty");
}
}
}
#[test]
fn test_convert_to_odcs_wasm_error_handling() {
let cads_yaml = r#"
apiVersion: v1.0
kind: AIModel
id: test-model
name: test-model
version: 1.0.0
status: draft
"#;
let result = convert_to_odcs(cads_yaml, Some("cads"));
assert!(
result.is_err(),
"CADS → ODCS conversion should return an error"
);
let error_msg = result.unwrap_err().to_string();
assert!(
error_msg.contains("CADS")
|| error_msg.contains("UnsupportedFormat")
|| error_msg.contains("unsupported")
|| error_msg.contains("cannot convert")
|| error_msg.contains("requires"),
"Error message should be informative. Got: {}",
error_msg
);
let odps_yaml = r#"
apiVersion: v1.0.0
kind: DataProduct
id: test-product
name: test-product
version: 1.0.0
status: active
"#;
let result = convert_to_odcs(odps_yaml, Some("odps"));
assert!(
result.is_err(),
"ODPS → ODCS conversion should return an error"
);
let error_msg = result.unwrap_err().to_string();
assert!(
error_msg.contains("ODPS")
|| error_msg.contains("UnsupportedFormat")
|| error_msg.contains("unsupported")
|| error_msg.contains("cannot convert")
|| error_msg.contains("requires"),
"Error message should be informative. Got: {}",
error_msg
);
}