nip/tests/test_git_adapter.nim

141 lines
4.4 KiB
Nim

import unittest, options
import std/[os, tempfiles, strutils]
import ../src/nimpak/adapters/git
import ../src/nimpak/cas
suite "Git Adapter":
test "Parse GitHub URL":
let result = parseGitUrl("git+https://github.com/nim-lang/Nim.git")
check result.isOk
let source = result.value
check source.kind == GitHub
check source.owner == "nim-lang"
check source.repo == "Nim"
check source.baseUrl == "https://github.com"
test "Parse GitHub Shorthand":
let result = parseGitUrl("github:NixOS/nixpkgs")
check result.isOk
let source = result.value
check source.kind == GitHub
check source.owner == "NixOS"
check source.repo == "nixpkgs"
test "Parse GitLab Shorthand":
let result = parseGitUrl("gitlab:fdroid/fdroiddata")
check result.isOk
let source = result.value
check source.kind == GitLab
check source.owner == "fdroid"
check source.repo == "fdroiddata"
test "Parse URL with Tag Specifier":
let result = parseGitUrl("github:nim-lang/Nim@v2.0.0")
check result.isOk
let source = result.value
check source.owner == "nim-lang"
check source.repo == "Nim"
check source.tagPattern == "v2.0.0"
test "Parse URL with Branch Fragment":
let result = parseGitUrl("github:nim-lang/Nim#branch=devel")
check result.isOk
let source = result.value
check source.branch == "devel"
suite "Semver Matching":
test "Wildcard matches all":
check matchesSemver("v1.0.0", "*")
check matchesSemver("2.5.3", "*")
check matchesSemver("anything", "*")
test "Prefix wildcard":
check matchesSemver("v1.2.3", "v1.*")
check matchesSemver("v1.99.0", "v1.*")
check not matchesSemver("v2.0.0", "v1.*")
test "Greater than or equal":
check matchesSemver("2.0.0", ">=1.0.0")
check matchesSemver("1.0.0", ">=1.0.0")
check not matchesSemver("0.9.0", ">=1.0.0")
test "Exact match":
check matchesSemver("v1.2.3", "v1.2.3")
check matchesSemver("1.2.3", "1.2.3")
check not matchesSemver("1.2.4", "1.2.3")
suite "Tag Filtering":
test "Filter and sort tags":
let tags = @[
GitTag(name: "v1.0.0", commit: "aaa", isRelease: false),
GitTag(name: "v2.0.0", commit: "bbb", isRelease: false),
GitTag(name: "v1.5.0", commit: "ccc", isRelease: false),
GitTag(name: "v3.0.0", commit: "ddd", isRelease: false),
]
let filtered = filterTags(tags, "v1.*")
check filtered.len == 2
# Should be sorted newest first
check filtered[0].name == "v1.5.0"
check filtered[1].name == "v1.0.0"
suite "CAS Ingestion":
test "Ingest local directory to CAS":
# Create temp directories - one for content, one for CAS
let tempDir = createTempDir("nip_test_", "_ingest")
let contentDir = tempDir / "content"
createDir(contentDir)
defer: removeDir(tempDir)
writeFile(contentDir / "file1.txt", "Hello World")
writeFile(contentDir / "file2.txt", "Test content")
createDir(contentDir / "subdir")
writeFile(contentDir / "subdir" / "nested.txt", "Nested file")
# Initialize CAS in a separate location
var cas = initCasManager(tempDir / "cas-root")
# Ingest the content directory (not the temp dir itself)
let result = ingestDirToCas(cas, contentDir, excludeGit = true)
check result.success
check result.files.len == 3
check result.casHash.len > 0
check result.totalSize > 0
test "Asset pattern matching":
let release = GitRelease(
tag: "v1.0.0",
name: "Release 1.0.0",
assets: @[
GitAsset(name: "app-v1.0.0-linux-amd64.tar.gz", url: "http://example.com/a"),
GitAsset(name: "app-v1.0.0-darwin-arm64.tar.gz", url: "http://example.com/b"),
GitAsset(name: "app-v1.0.0-windows.zip", url: "http://example.com/c"),
GitAsset(name: "checksums.txt", url: "http://example.com/d"),
]
)
# Test suffix match
let tarGz = findAssetByPattern(release, "*.tar.gz")
check tarGz.isSome
check tarGz.get().name.endsWith(".tar.gz")
# Test contains match
let linux = findAssetByPattern(release, "*linux*")
check linux.isSome
check "linux" in linux.get().name
# Test exact match
let checksums = findAssetByPattern(release, "checksums.txt")
check checksums.isSome
check checksums.get().name == "checksums.txt"
# Test no match
let noMatch = findAssetByPattern(release, "*.rpm")
check noMatch.isNone