mod common;
use common::{copy_fixture, run_ok, workdir};
use std::path::Path;
#[test]
fn cli_service_is_cli_archetype_with_state_subsections() {
let repo = copy_fixture("cli-service");
let dir = workdir(repo.path());
run_ok(&dir, &["index", "--quiet"]);
let atlas = run_ok(&dir, &["atlas"]);
assert!(atlas.contains("ARCHETYPE: cli"), "{atlas}");
assert!(atlas.contains("STATE & DATA AUTHORITY"), "{atlas}");
assert!(atlas.contains("DATA OWNERSHIP"), "{atlas}");
assert!(atlas.contains("RUNTIME STATE"), "{atlas}");
assert!(
atlas.contains("ServerState.cache (mutable)"),
"mutable field under runtime state: {atlas}"
);
assert!(atlas.contains("CONFIGURATION"), "{atlas}");
assert!(atlas.contains("configured_by PORT"), "{atlas}");
assert!(atlas.contains("DERIVED / REGISTRIES"), "{atlas}");
assert!(atlas.contains("root owns conn (EXTRACTED)"), "{atlas}");
assert!(atlas.contains("DATA STORES"), "{atlas}");
}
#[test]
fn python_facts_service_is_web_framework() {
let repo = copy_fixture("python-facts-service");
let dir = workdir(repo.path());
run_ok(&dir, &["index", "--quiet"]);
let atlas = run_ok(&dir, &["atlas"]);
assert!(atlas.contains("ARCHETYPE: web_framework"), "{atlas}");
assert!(atlas.contains("STATE & DATA AUTHORITY"), "{atlas}");
assert!(atlas.contains("RUNTIME STATE"), "{atlas}");
assert!(atlas.contains("Cart.items (mutable)"), "{atlas}");
assert!(atlas.contains("CONFIGURATION"), "{atlas}");
assert!(atlas.contains("configured_by DEBUG"), "{atlas}");
}
#[test]
fn go_facts_service_is_web_framework() {
let repo = copy_fixture("go-facts-service");
let dir = workdir(repo.path());
run_ok(&dir, &["index", "--quiet"]);
let atlas = run_ok(&dir, &["atlas"]);
assert!(atlas.contains("ARCHETYPE: web_framework"), "{atlas}");
assert!(atlas.contains("STATE & DATA AUTHORITY"), "{atlas}");
assert!(atlas.contains("RUNTIME STATE"), "{atlas}");
assert!(atlas.contains("User.ID (mutable)"), "{atlas}");
}
#[test]
fn hierarchy_clusterer_groups_architecture_by_layer() {
let tmp = tempfile::TempDir::new().unwrap();
let dir = tmp.path().join("repo");
write_hierarchy_fixture(&dir);
run_ok(&dir, &["index", "--quiet"]);
let atlas = run_ok(&dir, &["atlas"]);
assert!(atlas.contains("ARCHETYPE:"), "archetype header: {atlas}");
assert!(atlas.contains("API+WEB"), "{atlas}");
assert!(
atlas.contains("Implementation: api, web"),
"merged members: {atlas}"
);
assert!(atlas.contains("ROOT\nImplementation: root"), "{atlas}");
assert!(atlas.contains("Owns: conn (EXTRACTED)"), "{atlas}");
}
fn write_hierarchy_fixture(dir: &Path) {
std::fs::create_dir_all(dir.join("api")).unwrap();
std::fs::create_dir_all(dir.join("web")).unwrap();
std::fs::write(
dir.join("api/db.py"),
r#"# api db helpers.
import sqlite3
def get_conn():
return sqlite3.connect("app.db")
def save_event(kind: str) -> None:
conn = get_conn()
conn.execute("INSERT INTO events (kind) VALUES (?)", (kind,))
conn.commit()
conn.close()
"#,
)
.unwrap();
std::fs::write(
dir.join("api/handlers.py"),
r#"# api handlers.
from api.db import save_event
from web.render import render_page
def handle(kind: str) -> str:
save_event(kind)
return render_page(kind)
"#,
)
.unwrap();
std::fs::write(
dir.join("web/render.py"),
r#"# web rendering.
import sqlite3
def render_page(kind: str) -> str:
conn = sqlite3.connect("app.db")
conn.execute("INSERT INTO pages (kind) VALUES (?)", (kind,))
conn.commit()
conn.close()
return kind
"#,
)
.unwrap();
std::fs::write(dir.join("README.md"), "# demo\n").unwrap();
}