AtlatestRepositorysigil-git

sigil-git / tree / testtest-git.sgl

1(import (sigil test)
2 (sigil string)
3 (sigil git))
4
5;; ============================================================
6;; forge-base-url
7;; ============================================================
8
9(test-group "forge-base-url"
10 (test "github"
11 (assert-equal "https://github.com/" (forge-base-url 'github)))
13 (test "gitlab"
14 (assert-equal "https://gitlab.com/" (forge-base-url 'gitlab)))
16 (test "codeberg"
17 (assert-equal "https://codeberg.org/" (forge-base-url 'codeberg)))
19 (test "unknown returns #f"
20 (assert-false (forge-base-url 'unknown))))
22;; ============================================================
23;; parse-git-url - forge shorthand
24;; ============================================================
26(test-group "parse-git-url - forge shorthand"
27 (test "github:user/repo"
28 (let ((parsed (parse-git-url "github:user/repo")))
29 (assert-true (pair? parsed))
30 (assert-equal 'github (git-url-forge parsed))
31 (assert-equal "user" (git-url-user parsed))
32 (assert-equal "repo" (git-url-repo parsed))
33 (assert-false (git-url-subpath parsed))
34 (assert-false (git-url-ref parsed))))
36 (test "codeberg:user/repo/sub/path"
37 (let ((parsed (parse-git-url "codeberg:user/repo/sub/path")))
38 (assert-equal 'codeberg (git-url-forge parsed))
39 (assert-equal "user" (git-url-user parsed))
40 (assert-equal "repo" (git-url-repo parsed))
41 (assert-equal "sub/path" (git-url-subpath parsed))))
43 (test "github:user/repo#main"
44 (let ((parsed (parse-git-url "github:user/repo#main")))
45 (assert-equal "main" (git-url-ref parsed))
46 (assert-false (git-url-subpath parsed))))
48 (test "with subpath and ref"
49 (let ((parsed (parse-git-url "gitlab:org/project/src/lib#v2.0")))
50 (assert-equal 'gitlab (git-url-forge parsed))
51 (assert-equal "org" (git-url-user parsed))
52 (assert-equal "project" (git-url-repo parsed))
53 (assert-equal "src/lib" (git-url-subpath parsed))
54 (assert-equal "v2.0" (git-url-ref parsed))))
56 (test "invalid - missing repo"
57 (assert-false (parse-git-url "github:useronly"))))
59;; ============================================================
60;; parse-git-url - full URLs
61;; ============================================================
63(test-group "parse-git-url - full URLs"
64 (test "https URL"
65 (let ((parsed (parse-git-url "https://example.com/repo.git")))
66 (assert-true (pair? parsed))
67 (assert-equal 'url (git-url-forge parsed))
68 (assert-false (git-url-ref parsed))))
70 (test "https URL with ref"
71 (let ((parsed (parse-git-url "https://example.com/repo.git#v1.0")))
72 (assert-equal "v1.0" (git-url-ref parsed))))
74 (test "http URL"
75 (let ((parsed (parse-git-url "http://example.com/repo.git")))
76 (assert-equal 'url (git-url-forge parsed))))
78 (test "git:// URL"
79 (let ((parsed (parse-git-url "git://example.com/repo.git")))
80 (assert-equal 'url (git-url-forge parsed)))))
82;; ============================================================
83;; parse-git-url - invalid
84;; ============================================================
86(test-group "parse-git-url - invalid"
87 (test "random string returns #f"
88 (assert-false (parse-git-url "not-a-url")))
90 (test "empty string returns #f"
91 (assert-false (parse-git-url ""))))
93;; ============================================================
94;; git-url-to-clone-url
95;; ============================================================
97(test-group "git-url-to-clone-url"
98 (test "forge shorthand produces HTTPS URL"
99 (let* ((parsed (parse-git-url "github:user/repo"))
100 (url (git-url-to-clone-url parsed)))
101 (assert-equal "https://github.com/user/repo.git" url)))
103 (test "codeberg shorthand"
104 (let* ((parsed (parse-git-url "codeberg:org/project"))
105 (url (git-url-to-clone-url parsed)))
106 (assert-equal "https://codeberg.org/org/project.git" url)))
108 (test "full URL passes through"
109 (let* ((parsed (parse-git-url "https://example.com/repo.git"))
110 (url (git-url-to-clone-url parsed)))
111 (assert-equal "https://example.com/repo.git" url))))
113;; ============================================================
114;; git-repo-path
115;; ============================================================
117(test-group "git-repo-path"
118 (test "forge shorthand produces structured path"
119 (let* ((parsed (parse-git-url "github:user/repo"))
120 (path (git-repo-path "/cache" parsed)))
121 (assert-true (string-contains? path "github.com"))
122 (assert-true (string-contains? path "user"))
123 (assert-true (string-contains? path "repo.git"))))
125 (test "full URL produces sanitized path"
126 (let* ((parsed (parse-git-url "https://example.com/repo.git"))
127 (path (git-repo-path "/cache" parsed)))
128 (assert-true (string-starts-with? path "/cache/")))))
130;; ============================================================
131;; git-worktree-key
132;; ============================================================
134(test-group "git-worktree-key"
135 (test "forge shorthand key"
136 (let* ((parsed (parse-git-url "github:user/repo"))
137 (key (git-worktree-key parsed "main")))
138 (assert-equal "github-user-repo-main" key)))
140 (test "full URL key"
141 (let* ((parsed (parse-git-url "https://example.com/repo.git"))
142 (key (git-worktree-key parsed "v1")))
143 (assert-true (string-contains? key "v1")))))
145;; ============================================================
146;; git-available?
147;; ============================================================
149(test-group "git-available?"
150 (test "returns boolean"
151 (let ((result (git-available?)))
152 (assert-true (boolean? result)))))
154(run-tests)