alef 0.106.0

Opinionated polyglot binding generator for Rust libraries
Documentation
use super::*;

const GO_MOD_E2E: &str = "\
module e2e_go

go 1.26

require (
\tgithub.com/sample_crate-dev/sample_crawler/packages/go v0.3.0-rc.27
\tgithub.com/stretchr/testify v1.11.1
)
";

const GO_MOD_E2E_LOCAL_REPLACE: &str = "\
module e2e_go

go 1.26

require (
\tgithub.com/sample_crate-dev/sample_crawler/packages/go v0.3.0-rc.27
\tgithub.com/stretchr/testify v1.11.1
)

replace github.com/sample_crate-dev/sample_crawler/packages/go => ../../packages/go
";

#[test]
fn sync_e2e_go_mod_updates_library_require_line() {
    let fragment = "github.com/sample_crate-dev/sample_crawler/packages/go";
    let result = sync_e2e_go_mod(GO_MOD_E2E, fragment, "0.3.0-rc.28");
    assert!(result.is_some(), "expected Some when version changes");
    let new = result.unwrap();
    assert!(
        new.contains("github.com/sample_crate-dev/sample_crawler/packages/go v0.3.0-rc.28"),
        "library require line must be updated:\n{new}"
    );
    assert!(
        new.contains("github.com/stretchr/testify v1.11.1"),
        "testify version must be unchanged:\n{new}"
    );
    assert!(!new.contains("v0.3.0-rc.27"), "old version must be gone:\n{new}");
}

#[test]
fn sync_e2e_go_mod_is_idempotent() {
    let fragment = "github.com/sample_crate-dev/sample_crawler/packages/go";
    let first = sync_e2e_go_mod(GO_MOD_E2E, fragment, "0.3.0-rc.28").unwrap();
    let second = sync_e2e_go_mod(&first, fragment, "0.3.0-rc.28");
    assert!(second.is_none(), "second call with same version must be a no-op");
}

#[test]
fn sync_e2e_go_mod_skips_local_replace_placeholder_version() {
    let fragment = "github.com/sample_crate-dev/sample_crawler/packages/go";
    let result = sync_e2e_go_mod(GO_MOD_E2E_LOCAL_REPLACE, fragment, "0.3.0-rc.28");
    assert!(
        result.is_none(),
        "local replace entries keep generated placeholder versions"
    );
}

const GO_MOD_E2E_V2_BLOCK: &str = "\
module e2e_go

go 1.26

require (
\tgithub.com/sample_crate-dev/sample_crawler/packages/go/v2 v2.0.3
\tgithub.com/stretchr/testify v1.11.1
)
";

const GO_MOD_E2E_SINGLE_LINE: &str = "\
module e2e_go

go 1.26

require github.com/sample_crate-dev/sample_crawler/packages/go v0.3.0-rc.27
";

#[test]
fn sync_e2e_go_mod_updates_v2_block_require_line() {
    let module_path = "github.com/sample_crate-dev/sample_crawler/packages/go/v2";
    let result = sync_e2e_go_mod(GO_MOD_E2E_V2_BLOCK, module_path, "2.0.4");
    let new = result.expect("a /v2 module in a require block must be recognized");
    assert!(
        new.contains("github.com/sample_crate-dev/sample_crawler/packages/go/v2 v2.0.4"),
        "v2 library require line must be updated:\n{new}"
    );
    assert!(
        new.contains("github.com/stretchr/testify v1.11.1"),
        "unrelated testify dependency must be unchanged:\n{new}"
    );
    assert!(!new.contains("v2.0.3"), "old version must be gone:\n{new}");
}

#[test]
fn sync_e2e_go_mod_updates_single_line_require() {
    let module_path = "github.com/sample_crate-dev/sample_crawler/packages/go";
    let result = sync_e2e_go_mod(GO_MOD_E2E_SINGLE_LINE, module_path, "0.3.0-rc.28");
    let new = result.expect("a single-line require statement must be recognized");
    assert!(
        new.contains("require github.com/sample_crate-dev/sample_crawler/packages/go v0.3.0-rc.28"),
        "single-line require must be updated:\n{new}"
    );
    assert!(!new.contains("v0.3.0-rc.27"), "old version must be gone:\n{new}");
}

#[test]
fn sync_e2e_go_mod_leaves_unrelated_dependency_untouched() {
    let module_path = "github.com/sample_crate-dev/sample_crawler/packages/go";
    let result = sync_e2e_go_mod(GO_MOD_E2E, module_path, "0.3.0-rc.28").unwrap();
    assert!(
        result.contains("github.com/stretchr/testify v1.11.1"),
        "unrelated dependency must not be touched:\n{result}"
    );
}