Skip to content

Commit d29f306

Browse files
committed
add serve tests, refactor clone tests
1 parent 8c77dfd commit d29f306

5 files changed

Lines changed: 180 additions & 85 deletions

File tree

git/clone_test.go

Lines changed: 62 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -8,95 +8,72 @@ import (
88
"github.com/joho/godotenv"
99
)
1010

11+
func loadTestEnv(t *testing.T) {
12+
t.Helper()
13+
if err := godotenv.Load("../.env.test"); err != nil {
14+
log.Fatal("Could not load test env!")
15+
}
16+
}
17+
1118
func TestCloneRepo(t *testing.T) {
12-
err := godotenv.Load("../.env.test")
19+
loadTestEnv(t)
20+
21+
repo := "Hack4Impact-UMD/professor"
22+
dest := t.TempDir()
23+
24+
if err := CloneRepo(repo, dest, ""); err != nil {
25+
t.Error("Error when cloning:", err)
26+
return
27+
}
1328

29+
files, err := os.ReadDir(dest)
1430
if err != nil {
15-
log.Fatal("Could not load test env!")
31+
t.Error("Error when reading dest dir:", err)
32+
} else if len(files) <= 0 {
33+
t.Error("Dest dir is empty")
34+
}
35+
}
36+
37+
func TestCloneRepoPrivateWithPAT(t *testing.T) {
38+
loadTestEnv(t)
39+
40+
repo := "rk234/RamyKaddouri-h4i-assessment-Spring25"
41+
dest := t.TempDir()
42+
43+
if err := CloneRepo(repo, dest, os.Getenv("GITHUB_PAT")); err != nil {
44+
t.Error("Error when cloning:", err)
45+
return
46+
}
47+
48+
files, err := os.ReadDir(dest)
49+
if err != nil {
50+
t.Error("Error when reading dest dir:", err)
51+
} else if len(files) <= 0 {
52+
t.Error("Dest dir is empty")
53+
}
54+
}
55+
56+
func TestCloneRepoPrivateWithBadPAT(t *testing.T) {
57+
loadTestEnv(t)
58+
59+
repo := "rk234/RamyKaddouri-h4i-assessment-Spring25"
60+
dest := t.TempDir()
61+
62+
if err := CloneRepo(repo, dest, "abc:abc"); err != nil {
63+
return
64+
}
65+
66+
t.Error("expected error when cloning private repo with bad PAT")
67+
}
68+
69+
func TestCloneRepoBadPath(t *testing.T) {
70+
loadTestEnv(t)
71+
72+
dest := t.TempDir()
73+
74+
if err := CloneRepo("", dest, ""); err != nil {
1675
return
1776
}
1877

19-
t.Run("should clone the repo in the dest directory", func(t *testing.T) {
20-
repo := "Hack4Impact-UMD/professor"
21-
dest := t.TempDir()
22-
23-
t.Cleanup(func() {
24-
os.RemoveAll(dest)
25-
})
26-
27-
if err := CloneRepo(repo, dest, ""); err != nil {
28-
t.Error("Error when cloning:", err)
29-
t.Fail()
30-
return
31-
}
32-
33-
files, err := os.ReadDir(dest)
34-
35-
if err != nil {
36-
t.Error("Error when reading dest dir:", err)
37-
t.Fail()
38-
return
39-
} else if len(files) <= 0 {
40-
t.Error("Dest dir is empty")
41-
t.Fail()
42-
return
43-
}
44-
})
45-
46-
t.Run("should clone private repo with PAT in the dest directory", func(t *testing.T) {
47-
repo := "rk234/RamyKaddouri-h4i-assessment-Spring25"
48-
dest := t.TempDir()
49-
50-
t.Cleanup(func() {
51-
os.RemoveAll(dest)
52-
})
53-
54-
if err := CloneRepo(repo, dest, os.Getenv("GITHUB_PAT")); err != nil {
55-
t.Error("Error when cloning:", err)
56-
t.Fail()
57-
return
58-
}
59-
60-
files, err := os.ReadDir(dest)
61-
62-
if err != nil {
63-
t.Error("Error when reading dest dir:", err)
64-
t.Fail()
65-
return
66-
} else if len(files) <= 0 {
67-
t.Error("Dest dir is empty")
68-
t.Fail()
69-
return
70-
}
71-
})
72-
73-
t.Run("should error when cloning private repo with bad PAT", func(t *testing.T) {
74-
repo := "rk234/RamyKaddouri-h4i-assessment-Spring25"
75-
dest := t.TempDir()
76-
77-
t.Cleanup(func() {
78-
os.RemoveAll(dest)
79-
})
80-
81-
if err := CloneRepo(repo, dest, "abc:abc"); err != nil {
82-
return
83-
}
84-
85-
t.Fail()
86-
})
87-
88-
t.Run("should error when cloning bad repo path", func(t *testing.T) {
89-
repo := ""
90-
dest := t.TempDir()
91-
92-
t.Cleanup(func() {
93-
os.RemoveAll(dest)
94-
})
95-
96-
if err := CloneRepo(repo, dest, ""); err != nil {
97-
return
98-
}
99-
100-
t.Fail()
101-
})
78+
t.Error("expected error when cloning with empty repo path")
10279
}

routes/grade/job.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package grade
2+
3+
func RunGradingJob(assessmentRepoURL string, testRepoURL string) {
4+
}

serve/serve_test.go

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package serve
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"net/http"
7+
"os"
8+
"path/filepath"
9+
"testing"
10+
"time"
11+
)
12+
13+
func TestGetFreePort(t *testing.T) {
14+
port, err := GetFreePort()
15+
if err != nil {
16+
t.Fatalf("GetFreePort() error = %v", err)
17+
}
18+
if port <= 0 || port > 65535 {
19+
t.Errorf("GetFreePort() = %d, want valid port (1-65535)", port)
20+
}
21+
}
22+
23+
func TestGetFreePortUnique(t *testing.T) {
24+
port1, err := GetFreePort()
25+
if err != nil {
26+
t.Fatalf("first GetFreePort() error = %v", err)
27+
}
28+
port2, err := GetFreePort()
29+
if err != nil {
30+
t.Fatalf("second GetFreePort() error = %v", err)
31+
}
32+
if port1 <= 0 || port2 <= 0 {
33+
t.Errorf("expected valid ports, got %d and %d", port1, port2)
34+
}
35+
}
36+
37+
func TestServeAssessment(t *testing.T) {
38+
dir := t.TempDir()
39+
40+
content := "<html><body>hello</body></html>"
41+
if err := os.WriteFile(filepath.Join(dir, "index.html"), []byte(content), 0644); err != nil {
42+
t.Fatalf("failed to write test file: %v", err)
43+
}
44+
45+
port, stop, err := ServeAssessment(dir)
46+
if err != nil {
47+
t.Fatalf("ServeAssessment() error = %v", err)
48+
}
49+
defer stop()
50+
51+
if port <= 0 || port > 65535 {
52+
t.Errorf("ServeAssessment() port = %d, want valid port", port)
53+
}
54+
55+
// Give server time to start
56+
time.Sleep(50 * time.Millisecond)
57+
58+
resp, err := http.Get(fmt.Sprintf("http://localhost:%d/index.html", port))
59+
if err != nil {
60+
t.Fatalf("GET request failed: %v", err)
61+
}
62+
defer resp.Body.Close()
63+
64+
if resp.StatusCode != http.StatusOK {
65+
t.Errorf("status = %d, want %d", resp.StatusCode, http.StatusOK)
66+
}
67+
68+
body, err := io.ReadAll(resp.Body)
69+
if err != nil {
70+
t.Fatalf("failed to read response body: %v", err)
71+
}
72+
if string(body) != content {
73+
t.Errorf("body = %q, want %q", string(body), content)
74+
}
75+
}
76+
77+
func TestServeAssessmentStop(t *testing.T) {
78+
dir := t.TempDir()
79+
80+
port, stop, err := ServeAssessment(dir)
81+
if err != nil {
82+
t.Fatalf("ServeAssessment() error = %v", err)
83+
}
84+
85+
time.Sleep(50 * time.Millisecond)
86+
stop()
87+
time.Sleep(50 * time.Millisecond)
88+
89+
_, err = http.Get(fmt.Sprintf("http://localhost:%d/", port))
90+
if err == nil {
91+
t.Error("expected request to fail after stop, but it succeeded")
92+
}
93+
}
94+
95+
func TestServeAssessmentInvalidDir(t *testing.T) {
96+
// FileServer returns 404s for missing files rather than failing to start
97+
port, stop, err := ServeAssessment("/nonexistent/path/that/does/not/exist")
98+
if err != nil {
99+
return // acceptable to fail fast on bad dir
100+
}
101+
defer stop()
102+
103+
time.Sleep(50 * time.Millisecond)
104+
105+
resp, err := http.Get(fmt.Sprintf("http://localhost:%d/", port))
106+
if err != nil {
107+
return
108+
}
109+
defer resp.Body.Close()
110+
111+
if resp.StatusCode != http.StatusNotFound {
112+
t.Errorf("status = %d, want %d for missing dir", resp.StatusCode, http.StatusNotFound)
113+
}
114+
}

0 commit comments

Comments
 (0)