akar-postgres 0.1.13

PostgreSQL extension for the Akar embedded graph database
Documentation
use std::sync::{Arc, Mutex};

use akar_catalog::Catalog;
use akar_common::file_system::VirtualFileSystemRegistry;
use akar_extension::{Extension, ExtensionContext};
use akar_function::registry::FunctionRegistry;
use akar_postgres::PostgresExtension;

fn make_context() -> ExtensionContext {
    ExtensionContext::new(
        Arc::new(Mutex::new(FunctionRegistry::new())),
        Arc::new(Mutex::new(Catalog::new())),
        Arc::new(VirtualFileSystemRegistry::new()),
    )
}

#[test]
fn test_postgres_extension_name() {
    let ext = PostgresExtension::new();
    assert_eq!(ext.name(), "POSTGRES");
}

#[test]
fn test_postgres_extension_default() {
    let ext = PostgresExtension;
    assert_eq!(ext.name(), "POSTGRES");
}

#[test]
fn test_postgres_load_registers_function() {
    let ext = PostgresExtension::new();
    let ctx = make_context();
    let result = ext.load(&ctx);
    assert!(result.is_ok());

    let reg = ctx.function_registry().lock().unwrap();
    assert!(reg.get_scalar("sql_query").is_some());
}

#[test]
fn test_postgres_placeholder_returns_error() {
    let ext = PostgresExtension::new();
    let ctx = make_context();
    ext.load(&ctx).unwrap();

    let reg = ctx.function_registry().lock().unwrap();
    let func = reg.get_scalar("sql_query").unwrap();
    if let akar_function::registry::ScalarFunction::CustomScalar { execute, .. } = func {
        let result = execute(&[]);
        assert!(result.is_err());
        let err = result.unwrap_err();
        assert!(err.contains("not available"));
    } else {
        panic!("Expected CustomScalar variant");
    }
}

#[test]
fn test_postgres_placeholder_wrong_args() {
    let ext = PostgresExtension::new();
    let ctx = make_context();
    ext.load(&ctx).unwrap();

    let reg = ctx.function_registry().lock().unwrap();
    let func = reg.get_scalar("sql_query").unwrap();
    if let akar_function::registry::ScalarFunction::CustomScalar { execute, .. } = func {
        let result = execute(&[akar_common::types::Value::String("host=localhost".into())]);
        assert!(result.is_err());
    } else {
        panic!("Expected CustomScalar variant");
    }
}

#[test]
fn test_postgres_load_idempotent() {
    let ext = PostgresExtension::new();
    let ctx = make_context();
    ext.load(&ctx).unwrap();
    ext.load(&ctx).unwrap();

    let reg = ctx.function_registry().lock().unwrap();
    assert!(reg.get_scalar("sql_query").is_some());
}