189 lines
4.8 KiB
Go
189 lines
4.8 KiB
Go
package installer
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"zsvo/pkg/deps"
|
|
"zsvo/pkg/types"
|
|
)
|
|
|
|
func TestInstaller_BuildPackageIndex(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// Create temporary directory structure
|
|
tempDir, err := os.MkdirTemp("", "zsvo-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create package directory
|
|
pkgDir := filepath.Join(tempDir, "packages")
|
|
if err := os.MkdirAll(pkgDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create package dir: %v", err)
|
|
}
|
|
|
|
// Create root directory
|
|
rootDir := filepath.Join(tempDir, "root")
|
|
if err := os.MkdirAll(rootDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create root dir: %v", err)
|
|
}
|
|
|
|
installer := NewInstaller(rootDir)
|
|
|
|
// Test with empty directory
|
|
index, err := installer.buildPackageIndex([]string{pkgDir})
|
|
if err != nil {
|
|
t.Fatalf("Failed to build package index: %v", err)
|
|
}
|
|
|
|
if len(index) != 0 {
|
|
t.Errorf("Expected 0 packages in index, got %d", len(index))
|
|
}
|
|
|
|
// Test with non-existent directory
|
|
index, err = installer.buildPackageIndex([]string{"/non/existent/path"})
|
|
if err != nil {
|
|
t.Fatalf("Failed to build package index with non-existent path: %v", err)
|
|
}
|
|
|
|
if len(index) != 0 {
|
|
t.Errorf("Expected 0 packages in index for non-existent path, got %d", len(index))
|
|
}
|
|
}
|
|
|
|
func TestInstaller_FindMissingDependencies(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// Create temporary directory structure
|
|
tempDir, err := os.MkdirTemp("", "zsvo-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create root directory
|
|
rootDir := filepath.Join(tempDir, "root")
|
|
if err := os.MkdirAll(rootDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create root dir: %v", err)
|
|
}
|
|
|
|
installer := NewInstaller(rootDir)
|
|
|
|
// Test with package that has no dependencies
|
|
pkgInfo := &types.PkgInfo{
|
|
Name: "testpkg",
|
|
Version: "1.0",
|
|
Dependencies: []string{},
|
|
}
|
|
|
|
installed := make(map[string]*deps.PackageInfo)
|
|
candidates := make(map[string]installCandidate)
|
|
|
|
missing, err := installer.findMissingDependencies(pkgInfo, installed, candidates)
|
|
if err != nil {
|
|
t.Fatalf("Failed to find missing dependencies: %v", err)
|
|
}
|
|
|
|
if len(missing) != 0 {
|
|
t.Errorf("Expected 0 missing dependencies, got %d", len(missing))
|
|
}
|
|
|
|
// Test with package that has missing dependency
|
|
pkgInfoWithDeps := &types.PkgInfo{
|
|
Name: "testpkg",
|
|
Version: "1.0",
|
|
Dependencies: []string{"missingdep"},
|
|
}
|
|
|
|
missing, err = installer.findMissingDependencies(pkgInfoWithDeps, installed, candidates)
|
|
if err != nil {
|
|
t.Fatalf("Failed to find missing dependencies: %v", err)
|
|
}
|
|
|
|
if len(missing) != 1 {
|
|
t.Errorf("Expected 1 missing dependency, got %d", len(missing))
|
|
}
|
|
|
|
if missing[0] != "missingdep" {
|
|
t.Errorf("Expected missing dependency 'missingdep', got %s", missing[0])
|
|
}
|
|
}
|
|
|
|
func TestInstaller_ResolveDependenciesFromSearch(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// Create temporary directory structure
|
|
tempDir, err := os.MkdirTemp("", "zsvo-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create root directory
|
|
rootDir := filepath.Join(tempDir, "root")
|
|
if err := os.MkdirAll(rootDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create root dir: %v", err)
|
|
}
|
|
|
|
installer := NewInstaller(rootDir)
|
|
|
|
// Test with no available packages
|
|
pkgInfo := &types.PkgInfo{
|
|
Name: "testpkg",
|
|
Version: "1.0",
|
|
Dependencies: []string{},
|
|
}
|
|
|
|
candidate := installCandidate{
|
|
path: "/fake/path/testpkg.pkg.tar.zst",
|
|
info: pkgInfo,
|
|
}
|
|
|
|
candidates := []installCandidate{candidate}
|
|
searchPaths := []string{"/non/existent/path"}
|
|
|
|
resolved, err := installer.resolveDependenciesFromSearch(candidates, searchPaths)
|
|
if err != nil {
|
|
t.Fatalf("Failed to resolve dependencies: %v", err)
|
|
}
|
|
|
|
// Should resolve just the single package since it has no deps
|
|
if len(resolved) != 1 {
|
|
t.Errorf("Expected 1 package resolved, got %d", len(resolved))
|
|
}
|
|
|
|
if resolved[0].info.Name != "testpkg" {
|
|
t.Errorf("Expected resolved package 'testpkg', got %s", resolved[0].info.Name)
|
|
}
|
|
}
|
|
|
|
func TestInstaller_InstallWithAutoResolve_MissingDeps(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// Create temporary directory structure
|
|
tempDir, err := os.MkdirTemp("", "zsvo-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp dir: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create root directory
|
|
rootDir := filepath.Join(tempDir, "root")
|
|
if err := os.MkdirAll(rootDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create root dir: %v", err)
|
|
}
|
|
|
|
installer := NewInstaller(rootDir)
|
|
|
|
// Test with non-existent package file
|
|
nonExistentFile := filepath.Join(tempDir, "nonexistent.pkg.tar.zst")
|
|
|
|
err = installer.InstallWithAutoResolve([]string{nonExistentFile}, []string{})
|
|
|
|
if err == nil {
|
|
t.Errorf("Expected error for non-existent package file")
|
|
}
|
|
}
|