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 validate;
14
15use alef_core::backend::GeneratedFile;
16use alef_core::config::AlefConfig;
17use anyhow::{Context, Result};
18use config::E2eConfig;
19use fixture::{group_fixtures, load_fixtures};
20use std::path::Path;
21use tracing::info;
22
23/// Generate e2e test projects from fixtures.
24///
25/// Returns the list of generated files. The caller is responsible for writing
26/// them to disk.
27pub fn generate_e2e(
28    alef_config: &AlefConfig,
29    e2e_config: &E2eConfig,
30    languages: Option<&[String]>,
31) -> Result<Vec<GeneratedFile>> {
32    let fixtures_dir = Path::new(&e2e_config.fixtures);
33    let fixtures = load_fixtures(fixtures_dir)
34        .with_context(|| format!("failed to load fixtures from {}", fixtures_dir.display()))?;
35
36    info!("Loaded {} fixture(s) from {}", fixtures.len(), e2e_config.fixtures);
37
38    let groups = group_fixtures(&fixtures);
39
40    let generators = if let Some(langs) = languages {
41        codegen::generators_for(langs)
42    } else if !e2e_config.languages.is_empty() {
43        codegen::generators_for(&e2e_config.languages)
44    } else {
45        codegen::all_generators()
46    };
47
48    let mut all_files = Vec::new();
49    for generator in &generators {
50        let files = generator.generate(&groups, e2e_config, alef_config)?;
51        info!("  [{}] generated {} file(s)", generator.language_name(), files.len());
52        all_files.extend(files);
53    }
54
55    Ok(all_files)
56}