vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
|
ec343013
Keenan Nemetz
15d ago
|
1 | package server_test |
| 2 | ||
| 3 | import ( | |
| 4 | "net/url" | |
| 5 | "strings" | |
| 6 | "testing" | |
| 7 | ) | |
| 8 | ||
| 9 | func TestReleaseCreateAndEditFromTheBrowser(t *testing.T) { | |
| 10 | t.Parallel() | |
| 11 | f := newFixture(t) | |
| 12 | f.publish(f.repo) | |
| 13 | work := workRepo(t, map[string]string{"readme.md": "hello\n"}) | |
| 14 | if _, errs, err := f.git(work, "push", f.sshURL(f.repo), "main:refs/heads/main"); err != nil { | |
| 15 | t.Fatalf("push: %s", errs) | |
| 16 | } | |
| 17 | sess, cookie := f.browserSession(t, f.ownerID) | |
| 18 | ||
|
ed03b3d1
Keenan Nemetz
6h ago
|
19 | resp, body := f.browserGet(t, "/"+f.repo+"/releases/new", cookie) |
|
ec343013
Keenan Nemetz
15d ago
|
20 | if resp.StatusCode != 200 || !strings.Contains(body, "New release") { |
| 21 | t.Fatalf("new release page = %d:\n%s", resp.StatusCode, body) | |
| 22 | } | |
| 23 | form := url.Values{ | |
| 24 | "csrf": {sess.CSRF}, "tag": {"v1.0.0"}, "target": {"main"}, | |
| 25 | "notes": {"## v1.0.0\n\nFirst release.\n"}, | |
| 26 | } | |
|
ed03b3d1
Keenan Nemetz
6h ago
|
27 | resp, _ = f.browserPost(t, "/"+f.repo+"/releases", cookie, form) |
| 28 | if resp.StatusCode != 303 || resp.Header.Get("Location") != "/"+f.repo+"/releases/v1.0.0" { | |
|
ec343013
Keenan Nemetz
15d ago
|
29 | t.Fatalf("create release = %d %q", resp.StatusCode, resp.Header.Get("Location")) |
| 30 | } | |
| 31 | m, err := f.srv.Repos.Open(f.repo) | |
| 32 | if err != nil { | |
| 33 | t.Fatal(err) | |
| 34 | } | |
| 35 | tag, err := m.Git().Tag("v1.0.0") | |
| 36 | if err != nil { | |
| 37 | t.Fatal(err) | |
| 38 | } | |
| 39 | if !tag.Annotated || !strings.Contains(tag.Message, "First release.") || tag.Tagger != "keenan" { | |
| 40 | t.Fatalf("created tag = %+v", tag) | |
| 41 | } | |
|
ed03b3d1
Keenan Nemetz
6h ago
|
42 | resp, body = f.browserGet(t, "/"+f.repo+"/releases/v1.0.0", cookie) |
|
ec343013
Keenan Nemetz
15d ago
|
43 | if resp.StatusCode != 200 || !strings.Contains(body, "First release") || !strings.Contains(body, "Edit notes") { |
| 44 | t.Fatalf("release page = %d:\n%s", resp.StatusCode, body) | |
| 45 | } | |
| 46 | ||
|
ed03b3d1
Keenan Nemetz
6h ago
|
47 | resp, body = f.browserGet(t, "/"+f.repo+"/releases/edit?tag=v1.0.0", cookie) |
|
ec343013
Keenan Nemetz
15d ago
|
48 | if resp.StatusCode != 200 || !strings.Contains(body, "First release") { |
| 49 | t.Fatalf("edit release page = %d:\n%s", resp.StatusCode, body) | |
| 50 | } | |
| 51 | form.Set("notes", "## v1.0.0\n\nRevised notes.\n") | |
|
ed03b3d1
Keenan Nemetz
6h ago
|
52 | resp, _ = f.browserPost(t, "/"+f.repo+"/releases/edit", cookie, form) |
|
ec343013
Keenan Nemetz
15d ago
|
53 | if resp.StatusCode != 303 { |
| 54 | t.Fatalf("edit release = %d", resp.StatusCode) | |
| 55 | } | |
| 56 | tag, err = m.Git().Tag("v1.0.0") | |
| 57 | if err != nil { | |
| 58 | t.Fatal(err) | |
| 59 | } | |
| 60 | if !strings.Contains(tag.Message, "Revised notes.") || strings.Contains(tag.Message, "First release.") { | |
| 61 | t.Fatalf("edited tag message = %q", tag.Message) | |
| 62 | } | |
| 63 | ||
| 64 | form.Set("tag", "v1.0.0") | |
| 65 | form.Set("notes", "duplicate") | |
|
ed03b3d1
Keenan Nemetz
6h ago
|
66 | if resp, body := f.browserPost(t, "/"+f.repo+"/releases", cookie, form); resp.StatusCode != 400 || !strings.Contains(body, "already exists") { |
|
ec343013
Keenan Nemetz
15d ago
|
67 | t.Fatalf("duplicate release = %d:\n%s", resp.StatusCode, body) |
| 68 | } | |
| 69 | form.Set("tag", "bad tag") | |
|
ed03b3d1
Keenan Nemetz
6h ago
|
70 | if resp, _ := f.browserPost(t, "/"+f.repo+"/releases", cookie, form); resp.StatusCode != 400 { |
|
ec343013
Keenan Nemetz
15d ago
|
71 | t.Fatalf("invalid tag = %d, want 400", resp.StatusCode) |
| 72 | } | |
| 73 | form.Set("tag", "v1.1.0") | |
| 74 | form.Set("notes", " ") | |
|
ed03b3d1
Keenan Nemetz
6h ago
|
75 | if resp, body := f.browserPost(t, "/"+f.repo+"/releases", cookie, form); resp.StatusCode != 400 || !strings.Contains(body, "needs notes") { |
|
ec343013
Keenan Nemetz
15d ago
|
76 | t.Fatalf("empty notes = %d:\n%s", resp.StatusCode, body) |
| 77 | } | |
| 78 | ||
| 79 | commit, _ := m.Git().RevParse("main") | |
| 80 | if err := m.Git().UpdateRef("refs/tags/light", commit); err != nil { | |
| 81 | t.Fatal(err) | |
| 82 | } | |
|
ed03b3d1
Keenan Nemetz
6h ago
|
83 | if resp, body := f.browserGet(t, "/"+f.repo+"/releases/edit?tag=light", cookie); resp.StatusCode != 200 || !strings.Contains(body, "Lightweight tags have no notes") { |
|
ec343013
Keenan Nemetz
15d ago
|
84 | t.Fatalf("lightweight edit page = %d:\n%s", resp.StatusCode, body) |
| 85 | } | |
| 86 | form.Set("tag", "light") | |
| 87 | form.Set("notes", "cannot") | |
|
ed03b3d1
Keenan Nemetz
6h ago
|
88 | if resp, _ := f.browserPost(t, "/"+f.repo+"/releases/edit", cookie, form); resp.StatusCode != 400 { |
|
ec343013
Keenan Nemetz
15d ago
|
89 | t.Fatalf("lightweight edit = %d, want 400", resp.StatusCode) |
| 90 | } | |
| 91 | } |