use archlens_d2::D2Renderer; use archlens_domain::{ CodeElement, CodeElementKind, CodeGraph, DiagramLevel, FilePath, ModuleName, Relationship, RelationshipKind, ports::DiagramRenderer, }; fn make_el(name: &str, module: Option<&str>) -> CodeElement { let mut el = CodeElement::new( name, CodeElementKind::Class, FilePath::new(&format!("src/{name}.rs")).unwrap(), 1, ) .unwrap(); if let Some(m) = module { el = el.with_module(ModuleName::new(m).unwrap()); } el } #[test] fn type_level_emits_class_shapes() { let mut graph = CodeGraph::new(); graph.add_element(make_el("OrderService", Some("App"))); graph.add_element(make_el("Order", Some("Domain"))); graph.add_relationship( Relationship::new("OrderService", "Order", RelationshipKind::Composition).unwrap(), ); let graph = graph.qualify(); let renderer = D2Renderer::new(); let output = renderer.render(&graph).unwrap(); let content = output.files()[0].content(); assert!( content.contains("shape: class"), "expected class shape: {content}" ); assert!( content.contains("OrderService"), "expected OrderService: {content}" ); assert!(content.contains("Order"), "expected Order: {content}"); } #[test] fn module_level_emits_module_nodes_and_edges() { let mut graph = CodeGraph::new(); graph.add_element(make_el("Service", Some("App"))); graph.add_element(make_el("Order", Some("Domain"))); graph.add_relationship( Relationship::new("Service", "Order", RelationshipKind::Composition).unwrap(), ); let graph = graph.qualify(); let renderer = D2Renderer::with_level(DiagramLevel::Module); let output = renderer.render(&graph).unwrap(); let content = output.files()[0].content(); assert!(content.contains("App"), "expected App module: {content}"); assert!( content.contains("Domain"), "expected Domain module: {content}" ); assert!( content.contains("->"), "expected dependency arrow: {content}" ); } #[test] fn project_level_groups_by_module() { let mut graph = CodeGraph::new(); graph.add_element( CodeElement::new( "my-api", CodeElementKind::Project, FilePath::new("api/pyproject.toml").unwrap(), 1, ) .unwrap() .with_module(ModuleName::new("Backend").unwrap()), ); graph.add_element( CodeElement::new( "my-commons", CodeElementKind::Project, FilePath::new("commons/pyproject.toml").unwrap(), 1, ) .unwrap(), ); graph.add_relationship( Relationship::new("my-api", "my-commons", RelationshipKind::Composition).unwrap(), ); let renderer = D2Renderer::with_level(DiagramLevel::Project); let output = renderer.render(&graph).unwrap(); let content = output.files()[0].content(); assert!( content.contains("Backend"), "expected Backend group: {content}" ); assert!( content.contains("my-api") || content.contains("my_api"), "expected my-api: {content}" ); assert!(content.contains("->"), "expected dep arrow: {content}"); }