objets_metier_rs 1.0.2

Bibliothèque Rust moderne et sûre pour l'API COM Objets Métier Sage 100c - Production Ready
//! Integration tests for objets_metier_rs
//!
//! These tests verify all 34 CIAL factories are accessible and functional.
//! Tests are marked #[ignore] and require a Sage 100c installation.
//!
//! Run with: cargo test --test integration_tests -- --ignored
//!
//! Environment variables (optional):
//! - SAGE_USERNAME: Sage username (default: "<Administrateur>")
//! - SAGE_PASSWORD: Sage password (default: "")
//! - SAGE_DATABASE: Database path (default: "D:\\TMP\\BIJOU.MAE")

use objets_metier_rs::errors::SageResult;
use objets_metier_rs::wrappers::cial::factories::*;
use objets_metier_rs::wrappers::cial::*;

const CIAL_CLSID: &str = "Objets100c.CIAL";

/// Get test credentials from environment or use defaults
fn get_test_config() -> (String, String, String) {
    let username =
        std::env::var("SAGE_USERNAME").unwrap_or_else(|_| "<Administrateur>".to_string());
    let password = std::env::var("SAGE_PASSWORD").unwrap_or_else(|_| "".to_string());
    let database =
        std::env::var("SAGE_DATABASE").unwrap_or_else(|_| "D:\\TMP\\BIJOU.MAE".to_string());
    (username, password, database)
}

/// Connect to CIAL application for tests
fn connect_cial() -> SageResult<CialApplication> {
    let (username, password, database) = get_test_config();

    let cial = CialApplication::new(CIAL_CLSID)?;
    cial.set_name(&database)?;

    let loggable = cial.loggable()?;
    loggable.set_user_name(&username)?;
    loggable.set_user_pwd(&password)?;

    cial.open()?;

    Ok(cial)
}

// ============================================================================
// SMOKE TESTS - Verify all factories are accessible
// ============================================================================

#[test]
#[ignore]
fn test_all_34_factories_accessible() -> SageResult<()> {
    let app = connect_cial()?;

    println!("Testing all 34 CIAL factories...\n");

    // Phase 1 - Core (8)
    app.factory_article()?;
    app.factory_famille()?;
    app.factory_depot()?;
    app.factory_document_vente()?;
    app.factory_document_achat()?;
    app.factory_document_stock()?;
    app.factory_document_interne()?;
    app.factory_document()?;
    println!("✓ Phase 1: 8/8 factories");

    // Phase 2 - Configuration (5)
    app.factory_gamme()?;
    app.factory_produit()?;
    app.factory_unite()?;
    app.factory_conditionnement()?;
    app.factory_glossaire()?;
    println!("✓ Phase 2: 5/5 factories");

    // Phase 3 - Parameters (16)
    app.factory_categorie_compta_vente()?;
    app.factory_categorie_compta_achat()?;
    app.factory_categorie_compta_stock()?;
    app.factory_categorie_tarif()?;
    app.factory_param_doc_vente()?;
    app.factory_param_doc_achat()?;
    app.factory_param_doc_stock()?;
    app.factory_param_doc_interne()?;
    app.factory_souche_vente()?;
    app.factory_souche_achat()?;
    app.factory_souche_stock()?;
    app.factory_souche_interne()?;
    app.factory_modele()?;
    app.factory_condition_livraison()?;
    app.factory_expedition()?;
    app.factory_periodicite()?;
    println!("✓ Phase 3: 16/16 factories");

    // Phase 4 - Advanced (5)
    app.factory_bareme_commission()?;
    app.factory_bareme_solde()?;
    app.factory_bareme_rabais()?;
    app.factory_article_stat()?;
    app.factory_arrondi()?;
    println!("✓ Phase 4: 5/5 factories");

    println!("\n✅ All 34 factories accessible!");

    Ok(())
}

#[test]
#[ignore]
fn test_factory_article_list() -> SageResult<()> {
    let app = connect_cial()?;
    let factory = app.factory_article()?;

    let _articles = factory.list()?;
    println!("✓ FactoryArticle.list() works");

    Ok(())
}

#[test]
#[ignore]
fn test_factory_arrondi_list() -> SageResult<()> {
    let app = connect_cial()?;
    let factory = app.factory_arrondi()?;

    let _arrondis = factory.list()?;
    println!("✓ FactoryArrondi.list() works (no ExistIntitule)");

    Ok(())
}

#[test]
fn test_cial_types_compile() {
    // This test ensures all types compile correctly (no Sage connection needed)
    fn _test_factory_types() {
        let _: Option<FactoryArticle> = None;
        let _: Option<FactoryFamille> = None;
        let _: Option<FactoryDepot> = None;
        let _: Option<FactoryDocumentVente> = None;
        let _: Option<FactoryGamme> = None;
        let _: Option<FactoryBaremeCommission> = None;
        let _: Option<FactoryArrondi> = None;
    }

    println!("✓ All CIAL types compile");
}