2026-05-15 19:26:25 +08:00
|
|
|
package pack
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"archive/zip"
|
2026-05-18 22:22:22 +08:00
|
|
|
"bufio"
|
2026-05-15 19:26:25 +08:00
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
2026-05-18 22:22:22 +08:00
|
|
|
"strings"
|
2026-05-15 19:26:25 +08:00
|
|
|
"testing"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestLoadPathSupportsDirectory(t *testing.T) {
|
|
|
|
|
loaded, err := LoadPath(filepath.Join("..", "..", "packs", "openai-cn-pack"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("LoadPath(dir) error = %v", err)
|
|
|
|
|
}
|
|
|
|
|
if loaded.Manifest.PackID != "openai-cn-pack" {
|
|
|
|
|
t.Fatalf("PackID = %q, want %q", loaded.Manifest.PackID, "openai-cn-pack")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLoadPathSupportsZipArchive(t *testing.T) {
|
|
|
|
|
tempDir := t.TempDir()
|
|
|
|
|
archivePath := filepath.Join(tempDir, "openai-cn-pack.zip")
|
|
|
|
|
writePackArchive(t, archivePath)
|
|
|
|
|
|
|
|
|
|
loaded, err := LoadPath(archivePath)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("LoadPath(zip) error = %v", err)
|
|
|
|
|
}
|
|
|
|
|
if loaded.Manifest.PackID != "openai-cn-pack" {
|
|
|
|
|
t.Fatalf("PackID = %q, want %q", loaded.Manifest.PackID, "openai-cn-pack")
|
|
|
|
|
}
|
|
|
|
|
if len(loaded.Providers) == 0 {
|
|
|
|
|
t.Fatal("Providers = 0, want parsed providers from archive")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func writePackArchive(t *testing.T, archivePath string) {
|
|
|
|
|
t.Helper()
|
|
|
|
|
file, err := os.Create(archivePath)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("os.Create() error = %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer file.Close()
|
|
|
|
|
|
|
|
|
|
writer := zip.NewWriter(file)
|
|
|
|
|
defer writer.Close()
|
|
|
|
|
|
|
|
|
|
sourceRoot := filepath.Join("..", "..", "packs", "openai-cn-pack")
|
2026-05-18 22:22:22 +08:00
|
|
|
files := []string{"pack.json", "checksums.txt"}
|
|
|
|
|
checksumFile, err := os.Open(filepath.Join(sourceRoot, "checksums.txt"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("os.Open(checksums.txt) error = %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer checksumFile.Close()
|
|
|
|
|
scanner := bufio.NewScanner(checksumFile)
|
|
|
|
|
for scanner.Scan() {
|
|
|
|
|
line := strings.TrimSpace(scanner.Text())
|
|
|
|
|
if line == "" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
parts := strings.Fields(line)
|
|
|
|
|
if len(parts) != 2 {
|
|
|
|
|
t.Fatalf("invalid checksum line %q", line)
|
|
|
|
|
}
|
|
|
|
|
files = append(files, filepath.FromSlash(parts[1]))
|
|
|
|
|
}
|
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
|
|
|
t.Fatalf("scan checksums.txt error = %v", err)
|
2026-05-15 19:26:25 +08:00
|
|
|
}
|
|
|
|
|
for _, relativePath := range files {
|
|
|
|
|
body, err := os.ReadFile(filepath.Join(sourceRoot, relativePath))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("os.ReadFile(%q) error = %v", relativePath, err)
|
|
|
|
|
}
|
|
|
|
|
entry, err := writer.Create(filepath.ToSlash(filepath.Join("openai-cn-pack", relativePath)))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Create(%q) error = %v", relativePath, err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := entry.Write(body); err != nil {
|
|
|
|
|
t.Fatalf("Write(%q) error = %v", relativePath, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if err := writer.Close(); err != nil {
|
|
|
|
|
t.Fatalf("Close archive writer: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|