Skip to main content

alef_e2e/
lib.rs

1//! Fixture-driven e2e test generation for alef.
2//!
3//! This crate generates complete, runnable e2e test projects for all supported
4//! languages from JSON fixture files. Each project is self-contained with
5//! build files, test files, and local package references.
6
7pub mod codegen;
8pub mod config;
9pub mod escape;
10pub mod field_access;
11pub mod fixture;
12pub mod format;
13pub mod scaffold;
14pub mod validate;
15
16use alef_core::backend::GeneratedFile;
17use alef_core::config::AlefConfig;
18use anyhow::{Context, Result};
19use config::E2eConfig;
20use fixture::{group_fixtures, load_fixtures};
21use std::path::Path;
22use tracing::info;
23
24/// Generate e2e test projects from fixtures.
25///
26/// Returns the list of generated files. The caller is responsible for writing
27/// them to disk.
28pub fn generate_e2e(
29    alef_config: &AlefConfig,
30    e2e_config: &E2eConfig,
31    languages: Option<&[String]>,
32) -> Result<Vec<GeneratedFile>> {
33    let fixtures_dir = Path::new(&e2e_config.fixtures);
34    let fixtures = load_fixtures(fixtures_dir)
35        .with_context(|| format!("failed to load fixtures from {}", fixtures_dir.display()))?;
36
37    info!("Loaded {} fixture(s) from {}", fixtures.len(), e2e_config.fixtures);
38
39    let groups = group_fixtures(&fixtures);
40
41    let generators = if let Some(langs) = languages {
42        codegen::generators_for(langs)
43    } else if !e2e_config.languages.is_empty() {
44        codegen::generators_for(&e2e_config.languages)
45    } else {
46        codegen::all_generators()
47    };
48
49    let mut all_files = Vec::new();
50    for generator in &generators {
51        let files = generator.generate(&groups, e2e_config, alef_config)?;
52        info!("  [{}] generated {} file(s)", generator.language_name(), files.len());
53        all_files.extend(files);
54    }
55
56    Ok(all_files)
57}