Skip to content

Commit 86eb468

Browse files
test(semrel): initial
1 parent dc60be1 commit 86eb468

File tree

1 file changed

+218
-0
lines changed

1 file changed

+218
-0
lines changed

semrel_test.go

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
package semrel
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"github.com/Masterminds/semver"
8+
"github.com/google/go-github/github"
9+
"net/http"
10+
"net/http/httptest"
11+
"net/url"
12+
"strings"
13+
"testing"
14+
)
15+
16+
func TestNewRepository(t *testing.T) {
17+
repo, err := NewRepository(context.TODO(), "", "")
18+
if repo != nil || err == nil {
19+
t.Fatal("invalid initialization")
20+
}
21+
repo, err = NewRepository(context.TODO(), "owner/test-repo", "token")
22+
if repo == nil || err != nil {
23+
t.Fatal("invalid initialization")
24+
}
25+
}
26+
27+
func createCommit(sha, message string) *github.RepositoryCommit {
28+
return &github.RepositoryCommit{SHA: &sha, Commit: &github.Commit{Message: &message}}
29+
}
30+
31+
var (
32+
GITHUB_REPO_PRIVATE = true
33+
GITHUB_DEFAULTBRANCH = "master"
34+
GITHUB_REPO = github.Repository{DefaultBranch: &GITHUB_DEFAULTBRANCH, Private: &GITHUB_REPO_PRIVATE}
35+
GITHUB_COMMITS = []*github.RepositoryCommit{
36+
createCommit("abcd", "feat(app): new feature"),
37+
createCommit("dcba", "Fix: bug"),
38+
createCommit("cdba", "Initial commit"),
39+
createCommit("efcd", "chore: break\nBREAKING CHANGE: breaks everything"),
40+
}
41+
GITHUB_TAG_SHA = "be10"
42+
GITHUB_TAG_NAME = "v1.0.0"
43+
GITHUB_TAG = github.RepositoryTag{Commit: &github.Commit{SHA: &GITHUB_TAG_SHA}, Name: &GITHUB_TAG_NAME}
44+
)
45+
46+
func githubHandler(w http.ResponseWriter, r *http.Request) {
47+
if r.Header.Get("Authorization") != "Bearer token" {
48+
http.Error(w, "unauthorized", http.StatusUnauthorized)
49+
return
50+
}
51+
if r.Method == "GET" && r.URL.Path == "/repos/owner/test-repo" {
52+
json.NewEncoder(w).Encode(GITHUB_REPO)
53+
return
54+
}
55+
if r.Method == "GET" && r.URL.Path == "/repos/owner/test-repo/commits" {
56+
json.NewEncoder(w).Encode(GITHUB_COMMITS)
57+
return
58+
}
59+
if r.Method == "GET" && r.URL.Path == "/repos/owner/test-repo/tags" {
60+
json.NewEncoder(w).Encode([]*github.RepositoryTag{&GITHUB_TAG})
61+
return
62+
}
63+
if r.Method == "POST" && r.URL.Path == "/repos/owner/test-repo/releases" {
64+
var data map[string]string
65+
json.NewDecoder(r.Body).Decode(&data)
66+
r.Body.Close()
67+
if data["tag_name"] != "v2.0.0" {
68+
http.Error(w, "invalid tag name", http.StatusBadRequest)
69+
return
70+
}
71+
fmt.Fprint(w, "{}")
72+
return
73+
}
74+
http.Error(w, "invalid route", http.StatusNotImplemented)
75+
}
76+
77+
func getNewTestRepo(t *testing.T) (*Repository, *httptest.Server) {
78+
repo, err := NewRepository(context.TODO(), "owner/test-repo", "token")
79+
if err != nil {
80+
t.Fatal(err)
81+
return nil, nil
82+
}
83+
ts := httptest.NewServer(http.HandlerFunc(githubHandler))
84+
repo.Client.BaseURL, _ = url.Parse(ts.URL)
85+
return repo, ts
86+
}
87+
88+
func TestGetInfo(t *testing.T) {
89+
repo, ts := getNewTestRepo(t)
90+
defer ts.Close()
91+
defaultBranch, isPrivate, err := repo.GetInfo()
92+
if err != nil {
93+
t.Fatal(err)
94+
}
95+
if defaultBranch != GITHUB_DEFAULTBRANCH || !isPrivate {
96+
t.Fatal("invalid response")
97+
}
98+
}
99+
100+
func compareCommit(c *Commit, t, s string, change Change) bool {
101+
if c.Type != t || c.Scope != s {
102+
return false
103+
}
104+
if c.Change.Major != change.Major ||
105+
c.Change.Minor != change.Minor ||
106+
c.Change.Patch != change.Patch {
107+
return false
108+
}
109+
return true
110+
}
111+
112+
func TestGetCommits(t *testing.T) {
113+
repo, ts := getNewTestRepo(t)
114+
defer ts.Close()
115+
commits, err := repo.GetCommits()
116+
if err != nil {
117+
t.Fatal(err)
118+
}
119+
if len(commits) != 4 {
120+
t.Fatal("invalid response")
121+
}
122+
123+
if !compareCommit(commits[0], "feat", "app", Change{false, true, false}) ||
124+
!compareCommit(commits[1], "fix", "", Change{false, false, true}) ||
125+
!compareCommit(commits[2], "", "", Change{false, false, false}) ||
126+
!compareCommit(commits[3], "chore", "", Change{true, false, false}) {
127+
t.Fatal("invalid commits")
128+
}
129+
}
130+
131+
func TestGetLatestRelease(t *testing.T) {
132+
repo, ts := getNewTestRepo(t)
133+
defer ts.Close()
134+
release, err := repo.GetLatestRelease()
135+
if err != nil {
136+
t.Fatal(err)
137+
}
138+
if release.SHA != GITHUB_TAG_SHA || release.Version.String() != "1.0.0" {
139+
t.Fatal("invalid tag")
140+
}
141+
}
142+
143+
func TestCreateRelease(t *testing.T) {
144+
repo, ts := getNewTestRepo(t)
145+
defer ts.Close()
146+
newVersion, _ := semver.NewVersion("2.0.0")
147+
err := repo.CreateRelease([]*Commit{}, &Release{}, newVersion)
148+
if err != nil {
149+
t.Fatal(err)
150+
}
151+
}
152+
153+
func TestCaluclateChange(t *testing.T) {
154+
commits := []*Commit{
155+
&Commit{SHA: "a", Change: Change{true, false, false}},
156+
&Commit{SHA: "b", Change: Change{false, true, false}},
157+
&Commit{SHA: "c", Change: Change{false, false, true}},
158+
}
159+
change := CaluclateChange(commits, &Release{})
160+
if !change.Major || !change.Minor || !change.Patch {
161+
t.Fail()
162+
}
163+
change = CaluclateChange(commits, &Release{SHA: "a"})
164+
if change.Major || change.Minor || change.Patch {
165+
t.Fail()
166+
}
167+
version, _ := semver.NewVersion("1.0.0")
168+
newVersion := GetNewVersion(commits, &Release{SHA: "b", Version: version})
169+
if newVersion.String() != "2.0.0" {
170+
t.Fail()
171+
}
172+
}
173+
174+
func TestApplyChange(t *testing.T) {
175+
version, _ := semver.NewVersion("1.0.0")
176+
newVersion := ApplyChange(version, Change{false, false, false})
177+
if newVersion != nil {
178+
t.Fail()
179+
}
180+
newVersion = ApplyChange(version, Change{false, false, true})
181+
if newVersion.String() != "1.0.1" {
182+
t.Fail()
183+
}
184+
newVersion = ApplyChange(version, Change{false, true, true})
185+
if newVersion.String() != "1.1.0" {
186+
t.Fail()
187+
}
188+
newVersion = ApplyChange(version, Change{true, true, true})
189+
if newVersion.String() != "2.0.0" {
190+
t.Fail()
191+
}
192+
version, _ = semver.NewVersion("0.1.0")
193+
newVersion = ApplyChange(version, Change{})
194+
if newVersion.String() != "1.0.0" {
195+
t.Fail()
196+
}
197+
}
198+
199+
func TestGetChangelog(t *testing.T) {
200+
commits := []*Commit{
201+
&Commit{},
202+
&Commit{SHA: "123456789", Type: "feat", Scope: "app", Message: "commit message"},
203+
&Commit{SHA: "abcd", Type: "fix", Scope: "", Message: "commit message"},
204+
&Commit{SHA: "12345678", Type: "yolo", Scope: "swag", Message: "commit message"},
205+
&Commit{SHA: "12345678", Type: "chore", Scope: "", Message: "commit message", Raw: []string{"", "BREAKING CHANGE: test"}, Change: Change{Major: true}},
206+
&Commit{SHA: "stop", Type: "chore", Scope: "", Message: "not included"},
207+
}
208+
latestRelease := &Release{SHA: "stop"}
209+
newVersion, _ := semver.NewVersion("2.0.0")
210+
changelog := GetChangelog(commits, latestRelease, newVersion)
211+
if !strings.Contains(changelog, "* **app:** commit message (12345678)") ||
212+
!strings.Contains(changelog, "* commit message (abcd)") ||
213+
!strings.Contains(changelog, "#### yolo") ||
214+
!strings.Contains(changelog, "```BREAKING CHANGE: test\n```") ||
215+
strings.Contains(changelog, "not included") {
216+
t.Fail()
217+
}
218+
}

0 commit comments

Comments
 (0)