Skip to content

Commit e46cbb7

Browse files
committed
test: add more test cases
Signed-off-by: Jian Zeng <[email protected]>
1 parent 51a4f9b commit e46cbb7

File tree

2 files changed

+85
-12
lines changed

2 files changed

+85
-12
lines changed

Diff for: pkg/server/repo_handlers.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ func (s *Server) handlerGetRepo(c echo.Context) error {
5858

5959
var repo model.Repo
6060
res := s.getDB(c).
61-
Where(model.Repo{
62-
Name: name,
63-
}).
61+
Where(model.Repo{Name: name}).
6462
Limit(1).
6563
Find(&repo)
6664
if err != nil {
@@ -95,7 +93,7 @@ func (s *Server) handlerRemoveRepo(c echo.Context) error {
9593
if err != nil {
9694
l.Error("Fail to delete RepoMeta", slogErrAttr(err), slog.String("repo", name))
9795
}
98-
96+
s.repoSchedules.Remove(name)
9997
return c.NoContent(http.StatusNoContent)
10098
}
10199

@@ -215,6 +213,9 @@ func (s *Server) handlerReloadAllRepos(c echo.Context) error {
215213
const msg = "Fail to delete RepoMetas"
216214
l.Error(msg, slogErrAttr(err))
217215
}
216+
for name := range toDelete {
217+
s.repoSchedules.Remove(name)
218+
}
218219
return c.NoContent(http.StatusNoContent)
219220
}
220221

@@ -249,8 +250,9 @@ func (s *Server) handlerSyncRepo(c echo.Context) error {
249250
if errors.Is(err, errNotFound) {
250251
return newHTTPError(http.StatusNotFound, "Repo not found")
251252
}
252-
if errdefs.IsConflict(err) {
253-
return newHTTPError(http.StatusConflict, err.Error())
253+
var dkErr errdefs.ErrConflict
254+
if errors.As(err, &dkErr) {
255+
return newHTTPError(http.StatusConflict, "Repo is syncing")
254256
}
255257
const msg = "Fail to sync Repo"
256258
l.Error(msg, slogErrAttr(err))

Diff for: pkg/server/repo_handlers_test.go

+77-6
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,45 @@ func TestHandlerListRepos(t *testing.T) {
4040

4141
func TestHandlerReloadAllRepos(t *testing.T) {
4242
te := NewTestEnv(t)
43-
stateDir, err := os.MkdirTemp("", t.Name())
43+
rootDir, err := os.MkdirTemp("", t.Name())
4444
require.NoError(t, err)
4545
t.Cleanup(func() {
46-
_ = os.RemoveAll(stateDir)
46+
_ = os.RemoveAll(rootDir)
4747
})
48+
cfgDir1 := filepath.Join(rootDir, "cfg1")
49+
cfgDir2 := filepath.Join(rootDir, "cfg2")
50+
require.NoError(t, os.Mkdir(cfgDir1, 0o755))
51+
require.NoError(t, os.Mkdir(cfgDir2, 0o755))
4852
te.server.config = Config{
49-
RepoLogsDir: filepath.Join(stateDir, "logs"),
50-
RepoConfigDir: []string{"/no/such/dir", stateDir},
53+
RepoLogsDir: filepath.Join(rootDir, "logs"),
54+
RepoConfigDir: []string{"/no/such/dir", cfgDir1, cfgDir2},
5155
}
56+
te.server.repoSchedules.Set("should-be-deleted", cron.Schedule(nil))
57+
58+
require.NoError(t, te.server.db.Create([]model.Repo{
59+
{
60+
Name: "should-be-deleted",
61+
},
62+
{
63+
Name: "repo0",
64+
Cron: "1 * * * *",
65+
},
66+
}).Error)
67+
68+
require.NoError(t, te.server.db.Create([]model.RepoMeta{
69+
{
70+
Name: "should-be-deleted",
71+
},
72+
{
73+
Name: "repo0",
74+
Upstream: "http://foo.com",
75+
},
76+
}).Error)
5277

5378
for i := 0; i < 2; i++ {
5479
testutils.WriteFile(
5580
t,
56-
filepath.Join(stateDir, fmt.Sprintf("repo%d.yaml", i)),
81+
filepath.Join(cfgDir1, fmt.Sprintf("repo%d.yaml", i)),
5782
fmt.Sprintf(`
5883
name: repo%d
5984
cron: "* * * * *"
@@ -62,15 +87,38 @@ storageDir: /tmp
6287
`, i),
6388
)
6489
}
90+
testutils.WriteFile(t, filepath.Join(cfgDir2, "repo0.yaml"), `
91+
image: ubuntu
92+
envs:
93+
UPSTREAM: http://bar.com
94+
`)
6595

6696
cli := te.RESTClient()
6797
resp, err := cli.R().Post("/repos")
6898
require.NoError(t, err)
6999
require.True(t, resp.IsSuccess(), "Unexpected response: %s", resp.Body())
70100

101+
require.EqualValues(t, 2, te.server.repoSchedules.Count())
102+
71103
var repos []model.Repo
72-
require.NoError(t, te.server.db.Find(&repos).Error)
104+
require.NoError(t, te.server.db.Order("name").Find(&repos).Error)
73105
require.Len(t, repos, 2)
106+
107+
require.EqualValues(t, "repo0", repos[0].Name)
108+
require.EqualValues(t, "ubuntu", repos[0].Image)
109+
require.EqualValues(t, "* * * * *", repos[0].Cron)
110+
require.NotEmpty(t, repos[0].Envs)
111+
112+
require.EqualValues(t, "repo1", repos[1].Name)
113+
require.EqualValues(t, "alpine:latest", repos[1].Image)
114+
115+
var metas []model.RepoMeta
116+
require.NoError(t, te.server.db.Order("name").Find(&metas).Error)
117+
require.Len(t, repos, 2)
118+
require.EqualValues(t, "repo0", metas[0].Name)
119+
require.EqualValues(t, "http://bar.com", metas[0].Upstream)
120+
121+
require.EqualValues(t, "repo1", metas[1].Name)
74122
}
75123

76124
func TestHandlerSyncRepo(t *testing.T) {
@@ -109,3 +157,26 @@ func TestHandlerSyncRepo(t *testing.T) {
109157
require.NotEmpty(t, meta.LastSuccess)
110158
require.NotEmpty(t, meta.NextRun)
111159
}
160+
161+
func TestHandlerRemoveRepo(t *testing.T) {
162+
te := NewTestEnv(t)
163+
name := te.RandomString()
164+
require.NoError(t, te.server.db.Create(&model.Repo{
165+
Name: name,
166+
Cron: "@every 1h",
167+
Image: "alpine:latest",
168+
StorageDir: "/data",
169+
}).Error)
170+
require.NoError(t, te.server.db.Create(&model.RepoMeta{Name: name}).Error)
171+
schedule, _ := cron.ParseStandard("@every 1h")
172+
te.server.repoSchedules.Set(name, schedule)
173+
174+
cli := te.RESTClient()
175+
resp, err := cli.R().Delete(fmt.Sprintf("/repos/%s", name))
176+
require.NoError(t, err)
177+
require.True(t, resp.IsSuccess(), "Unexpected response: %s", resp.Body())
178+
179+
require.False(t, te.server.repoSchedules.Has(name))
180+
require.ErrorContains(t, te.server.db.First(&model.Repo{Name: name}).Error, "record not found")
181+
require.ErrorContains(t, te.server.db.First(&model.RepoMeta{Name: name}).Error, "record not found")
182+
}

0 commit comments

Comments
 (0)