Skip to content

Commit

Permalink
test: add more test cases
Browse files Browse the repository at this point in the history
Signed-off-by: Jian Zeng <[email protected]>
  • Loading branch information
knight42 committed Jan 3, 2024
1 parent 51a4f9b commit e46cbb7
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 12 deletions.
14 changes: 8 additions & 6 deletions pkg/server/repo_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,7 @@ func (s *Server) handlerGetRepo(c echo.Context) error {

var repo model.Repo
res := s.getDB(c).
Where(model.Repo{
Name: name,
}).
Where(model.Repo{Name: name}).
Limit(1).
Find(&repo)
if err != nil {
Expand Down Expand Up @@ -95,7 +93,7 @@ func (s *Server) handlerRemoveRepo(c echo.Context) error {
if err != nil {
l.Error("Fail to delete RepoMeta", slogErrAttr(err), slog.String("repo", name))
}

s.repoSchedules.Remove(name)
return c.NoContent(http.StatusNoContent)
}

Expand Down Expand Up @@ -215,6 +213,9 @@ func (s *Server) handlerReloadAllRepos(c echo.Context) error {
const msg = "Fail to delete RepoMetas"
l.Error(msg, slogErrAttr(err))
}
for name := range toDelete {
s.repoSchedules.Remove(name)
}
return c.NoContent(http.StatusNoContent)
}

Expand Down Expand Up @@ -249,8 +250,9 @@ func (s *Server) handlerSyncRepo(c echo.Context) error {
if errors.Is(err, errNotFound) {
return newHTTPError(http.StatusNotFound, "Repo not found")
}
if errdefs.IsConflict(err) {
return newHTTPError(http.StatusConflict, err.Error())
var dkErr errdefs.ErrConflict
if errors.As(err, &dkErr) {
return newHTTPError(http.StatusConflict, "Repo is syncing")
}
const msg = "Fail to sync Repo"
l.Error(msg, slogErrAttr(err))
Expand Down
83 changes: 77 additions & 6 deletions pkg/server/repo_handlers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,45 @@ func TestHandlerListRepos(t *testing.T) {

func TestHandlerReloadAllRepos(t *testing.T) {
te := NewTestEnv(t)
stateDir, err := os.MkdirTemp("", t.Name())
rootDir, err := os.MkdirTemp("", t.Name())
require.NoError(t, err)
t.Cleanup(func() {
_ = os.RemoveAll(stateDir)
_ = os.RemoveAll(rootDir)
})
cfgDir1 := filepath.Join(rootDir, "cfg1")
cfgDir2 := filepath.Join(rootDir, "cfg2")
require.NoError(t, os.Mkdir(cfgDir1, 0o755))
require.NoError(t, os.Mkdir(cfgDir2, 0o755))
te.server.config = Config{
RepoLogsDir: filepath.Join(stateDir, "logs"),
RepoConfigDir: []string{"/no/such/dir", stateDir},
RepoLogsDir: filepath.Join(rootDir, "logs"),
RepoConfigDir: []string{"/no/such/dir", cfgDir1, cfgDir2},
}
te.server.repoSchedules.Set("should-be-deleted", cron.Schedule(nil))

require.NoError(t, te.server.db.Create([]model.Repo{
{
Name: "should-be-deleted",
},
{
Name: "repo0",
Cron: "1 * * * *",
},
}).Error)

require.NoError(t, te.server.db.Create([]model.RepoMeta{
{
Name: "should-be-deleted",
},
{
Name: "repo0",
Upstream: "http://foo.com",
},
}).Error)

for i := 0; i < 2; i++ {
testutils.WriteFile(
t,
filepath.Join(stateDir, fmt.Sprintf("repo%d.yaml", i)),
filepath.Join(cfgDir1, fmt.Sprintf("repo%d.yaml", i)),
fmt.Sprintf(`
name: repo%d
cron: "* * * * *"
Expand All @@ -62,15 +87,38 @@ storageDir: /tmp
`, i),
)
}
testutils.WriteFile(t, filepath.Join(cfgDir2, "repo0.yaml"), `
image: ubuntu
envs:
UPSTREAM: http://bar.com
`)

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

require.EqualValues(t, 2, te.server.repoSchedules.Count())

var repos []model.Repo
require.NoError(t, te.server.db.Find(&repos).Error)
require.NoError(t, te.server.db.Order("name").Find(&repos).Error)
require.Len(t, repos, 2)

require.EqualValues(t, "repo0", repos[0].Name)
require.EqualValues(t, "ubuntu", repos[0].Image)
require.EqualValues(t, "* * * * *", repos[0].Cron)
require.NotEmpty(t, repos[0].Envs)

require.EqualValues(t, "repo1", repos[1].Name)
require.EqualValues(t, "alpine:latest", repos[1].Image)

var metas []model.RepoMeta
require.NoError(t, te.server.db.Order("name").Find(&metas).Error)
require.Len(t, repos, 2)
require.EqualValues(t, "repo0", metas[0].Name)
require.EqualValues(t, "http://bar.com", metas[0].Upstream)

require.EqualValues(t, "repo1", metas[1].Name)
}

func TestHandlerSyncRepo(t *testing.T) {
Expand Down Expand Up @@ -109,3 +157,26 @@ func TestHandlerSyncRepo(t *testing.T) {
require.NotEmpty(t, meta.LastSuccess)
require.NotEmpty(t, meta.NextRun)
}

func TestHandlerRemoveRepo(t *testing.T) {
te := NewTestEnv(t)
name := te.RandomString()
require.NoError(t, te.server.db.Create(&model.Repo{
Name: name,
Cron: "@every 1h",
Image: "alpine:latest",
StorageDir: "/data",
}).Error)
require.NoError(t, te.server.db.Create(&model.RepoMeta{Name: name}).Error)
schedule, _ := cron.ParseStandard("@every 1h")
te.server.repoSchedules.Set(name, schedule)

cli := te.RESTClient()
resp, err := cli.R().Delete(fmt.Sprintf("/repos/%s", name))
require.NoError(t, err)
require.True(t, resp.IsSuccess(), "Unexpected response: %s", resp.Body())

require.False(t, te.server.repoSchedules.Has(name))
require.ErrorContains(t, te.server.db.First(&model.Repo{Name: name}).Error, "record not found")
require.ErrorContains(t, te.server.db.First(&model.RepoMeta{Name: name}).Error, "record not found")
}

0 comments on commit e46cbb7

Please sign in to comment.