icydb-model 0.299.0

IcyDB application-model authoring, validation, and code generation
Documentation
use quote::quote;

use super::SchemaSurfaceTokens;

fn compact_tokens(tokens: proc_macro2::TokenStream) -> String {
    tokens
        .to_string()
        .chars()
        .filter(|character| !character.is_whitespace())
        .collect()
}

#[test]
fn generated_schema_capability_resolves_current_entity_names_privately() {
    let mut surface_tokens = SchemaSurfaceTokens::empty(quote!(::icydb));
    surface_tokens.push_entity("Character");

    let surface = compact_tokens(quote!(#surface_tokens));

    assert!(surface.contains("fn__icydb_endpoint_handler_schema("));
    assert!(surface.contains("try_describe_entity_by_source_key(\"Character\")"));
    assert!(surface.contains("__macro::into_deliverable_schema_reply("));
    assert!(!surface.contains("crate::Character"));
    assert!(!surface.contains("icydb_schema"));
    assert!(!surface.contains("ic_cdk::query"));
}

#[test]
fn generated_schema_private_handler_cannot_export_a_method() {
    let mut surface_tokens = SchemaSurfaceTokens::empty(quote!(::icydb));
    surface_tokens.push_entity("Character");
    let file = syn::parse2::<syn::File>(quote!(#surface_tokens))
        .expect("generated schema surface should remain valid Rust syntax");
    let handler = file
        .items
        .into_iter()
        .find_map(|item| match item {
            syn::Item::Fn(function) if function.sig.ident == "__icydb_endpoint_handler_schema" => {
                Some(function)
            }
            _ => None,
        })
        .expect("generated schema surface should contain its private handler");

    assert!(matches!(handler.vis, syn::Visibility::Restricted(_)));

    assert!(
        handler
            .attrs
            .iter()
            .all(|attribute| attribute.path().is_ident("allow"))
    );
}