sublime_standard_tools 0.0.15

A collection of utilities for working with Node.js projects from Rust applications
Documentation
//! # Package Manager Tests
//!
//! ## What
//! This module tests the PackageManager functionality, including lock file
//! detection, command generation, and package manager detection.
//!
//! ## How
//! Tests verify that each PackageManagerKind returns correct lock files,
//! commands, and can be properly detected and instantiated.
//!
//! ## Why
//! Proper testing of PackageManager ensures reliable package manager
//! operations and detection across different Node.js tools.

use super::test_utils::setup_test_dir;
use crate::node::{PackageManager, PackageManagerKind};
use std::path::PathBuf;
use tokio::fs;

#[tokio::test]
async fn test_package_manager_kind_lock_files() {
    assert_eq!(PackageManagerKind::Npm.lock_file(), "package-lock.json");
    assert_eq!(PackageManagerKind::Yarn.lock_file(), "yarn.lock");
    assert_eq!(PackageManagerKind::Pnpm.lock_file(), "pnpm-lock.yaml");
    assert_eq!(PackageManagerKind::Bun.lock_file(), "bun.lockb");
}

#[tokio::test]
async fn test_package_manager_kind_commands() {
    assert_eq!(PackageManagerKind::Npm.command(), "npm");
    assert_eq!(PackageManagerKind::Yarn.command(), "yarn");
    assert_eq!(PackageManagerKind::Pnpm.command(), "pnpm");
    assert_eq!(PackageManagerKind::Bun.command(), "bun");
}

#[tokio::test]
async fn test_package_manager_creation() {
    let root = PathBuf::from("/fake/project");
    let npm_manager = PackageManager::new(PackageManagerKind::Npm, root.clone());

    assert_eq!(npm_manager.kind(), PackageManagerKind::Npm);
    assert_eq!(npm_manager.root(), &root);
    assert_eq!(npm_manager.lock_file_path(), root.join("package-lock.json"));
}

#[allow(clippy::unwrap_used)]
#[tokio::test]
async fn test_package_manager_detect() {
    let temp_dir = setup_test_dir();
    let root = temp_dir.path();

    // Create a yarn.lock file
    let yarn_lock = root.join("yarn.lock");
    fs::write(&yarn_lock, "# This file is generated by running \"yarn install\"").await.unwrap();

    let detected = PackageManager::detect(root);
    assert!(detected.is_ok());

    let manager = detected.unwrap();
    assert_eq!(manager.kind(), PackageManagerKind::Yarn);
    assert_eq!(manager.root(), root);
}

#[tokio::test]
async fn test_package_manager_detect_failure() {
    let temp_dir = setup_test_dir();
    let root = temp_dir.path();

    // Don't create any lock files
    let detected = PackageManager::detect(root);
    assert!(detected.is_err());
}

#[tokio::test]
async fn test_package_manager_lock_file_path() {
    let root = PathBuf::from("/project");

    let npm_manager = PackageManager::new(PackageManagerKind::Npm, root.clone());
    assert_eq!(npm_manager.lock_file_path(), root.join("package-lock.json"));

    let yarn_manager = PackageManager::new(PackageManagerKind::Yarn, root.clone());
    assert_eq!(yarn_manager.lock_file_path(), root.join("yarn.lock"));

    let pnpm_manager = PackageManager::new(PackageManagerKind::Pnpm, root.clone());
    assert_eq!(pnpm_manager.lock_file_path(), root.join("pnpm-lock.yaml"));

    let bun_manager = PackageManager::new(PackageManagerKind::Bun, root.clone());
    assert_eq!(bun_manager.lock_file_path(), root.join("bun.lockb"));
}