Skip to content

Commit

Permalink
refactor: Moving releases fetch into its own files
Browse files Browse the repository at this point in the history
Signed-off-by: Vincent Boutour <[email protected]>
  • Loading branch information
ViBiOh committed May 2, 2021
1 parent f82cae9 commit 200f0ac
Show file tree
Hide file tree
Showing 4 changed files with 145 additions and 123 deletions.
25 changes: 0 additions & 25 deletions pkg/notifier/notifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,31 +104,6 @@ func (a app) Notify(ctx context.Context) error {
return nil
}

func (a app) getNewReleases(ctx context.Context) ([]model.Release, uint64, error) {
var newReleases []model.Release
count := uint64(0)
page := uint(1)

for {
repositories, totalCount, err := a.repositoryService.List(ctx, page, pageSize)
if err != nil {
return nil, count, fmt.Errorf("unable to fetch page %d of repositories: %s", page, err)
}

for _, repo := range repositories {
count++
newReleases = append(newReleases, a.getNewRepositoryReleases(repo)...)
}

if uint64(page*pageSize) < totalCount {
page++
} else {
logger.Info("%d repositories checked, %d new releases", count, len(newReleases))
return newReleases, count, nil
}
}
}

func (a app) getNewRepositoryReleases(repo model.Repository) []model.Release {
versions, err := a.repositoryService.LatestVersions(repo)
if err != nil {
Expand Down
98 changes: 0 additions & 98 deletions pkg/notifier/notifier_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,104 +61,6 @@ func TestFlags(t *testing.T) {
}
}

func TestGetNewReleases(t *testing.T) {
type args struct {
ctx context.Context
}

var cases = []struct {
intention string
instance app
args args
want []model.Release
wantErr error
}{
{
"list error",
app{
repositoryService: repositorytest.New().SetList(nil, 0, errors.New("failed")),
},
args{
ctx: context.Background(),
},
nil,
errors.New("failed"),
},
{
"github error",
app{
repositoryService: repositorytest.New().SetList([]model.Repository{
model.NewRepository(1, model.Github, repositoryName).AddVersion(model.DefaultPattern, repositoryVersion)}, 0, nil).SetLatestVersions(nil, errors.New("failed")),
},
args{
ctx: context.Background(),
},
nil,
nil,
},
{
"same version",
app{
repositoryService: repositorytest.New().SetList([]model.Repository{
model.NewRepository(1, model.Github, repositoryName).AddVersion(model.DefaultPattern, repositoryVersion),
}, 0, nil).SetLatestVersions(map[string]semver.Version{
model.DefaultPattern: {
Name: "1.1.0",
},
}, nil).SetUpdate(errors.New("failed")),
},
args{
ctx: context.Background(),
},
nil,
nil,
},
{
"success",
app{
repositoryService: repositorytest.New().SetList([]model.Repository{
model.NewRepository(1, model.Github, repositoryName).AddVersion(model.DefaultPattern, repositoryVersion),
}, 0, nil).SetLatestVersions(map[string]semver.Version{
model.DefaultPattern: safeParse("1.1.0"),
}, nil).SetUpdate(nil),
},
args{
ctx: context.Background(),
},
[]model.Release{model.NewRelease(
model.NewRepository(1, model.Github, repositoryName).AddVersion(model.DefaultPattern, repositoryVersion),
model.DefaultPattern,
safeParse("1.1.0"),
)},
nil,
},
}

for _, tc := range cases {
t.Run(tc.intention, func(t *testing.T) {
pageSize = 1
got, _, gotErr := tc.instance.getNewReleases(tc.args.ctx)
pageSize = 20

failed := false

if tc.wantErr == nil && gotErr != nil {
failed = true
} else if tc.wantErr != nil && gotErr == nil {
failed = true
} else if tc.wantErr != nil && !strings.Contains(gotErr.Error(), tc.wantErr.Error()) {
failed = true
} else if !reflect.DeepEqual(got, tc.want) {
failed = true
}

if failed {
t.Errorf("getNewReleases() = (%+v, `%s`), want (%+v, `%s`)", got, gotErr, tc.want, tc.wantErr)
}
})
}
}

func TestGetNewRepositoryReleases(t *testing.T) {
type args struct {
repo model.Repository
Expand Down
34 changes: 34 additions & 0 deletions pkg/notifier/releases.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package notifier

import (
"context"
"fmt"

"github.com/ViBiOh/httputils/v4/pkg/logger"
"github.com/ViBiOh/ketchup/pkg/model"
)

func (a app) getNewReleases(ctx context.Context) ([]model.Release, uint64, error) {
var newReleases []model.Release
count := uint64(0)
page := uint(1)

for {
repositories, totalCount, err := a.repositoryService.List(ctx, page, pageSize)
if err != nil {
return nil, count, fmt.Errorf("unable to fetch page %d of repositories: %s", page, err)
}

for _, repo := range repositories {
count++
newReleases = append(newReleases, a.getNewRepositoryReleases(repo)...)
}

if uint64(page*pageSize) < totalCount {
page++
} else {
logger.Info("%d repositories checked, %d new releases", count, len(newReleases))
return newReleases, count, nil
}
}
}
111 changes: 111 additions & 0 deletions pkg/notifier/releases_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package notifier

import (
"context"
"errors"
"reflect"
"strings"
"testing"

"github.com/ViBiOh/ketchup/pkg/model"
"github.com/ViBiOh/ketchup/pkg/semver"
"github.com/ViBiOh/ketchup/pkg/service/repository/repositorytest"
)

func TestGetNewReleases(t *testing.T) {
type args struct {
ctx context.Context
}

var cases = []struct {
intention string
instance app
args args
want []model.Release
wantErr error
}{
{
"list error",
app{
repositoryService: repositorytest.New().SetList(nil, 0, errors.New("failed")),
},
args{
ctx: context.Background(),
},
nil,
errors.New("failed"),
},
{
"github error",
app{
repositoryService: repositorytest.New().SetList([]model.Repository{
model.NewRepository(1, model.Github, repositoryName).AddVersion(model.DefaultPattern, repositoryVersion)}, 0, nil).SetLatestVersions(nil, errors.New("failed")),
},
args{
ctx: context.Background(),
},
nil,
nil,
},
{
"same version",
app{
repositoryService: repositorytest.New().SetList([]model.Repository{
model.NewRepository(1, model.Github, repositoryName).AddVersion(model.DefaultPattern, repositoryVersion),
}, 0, nil).SetLatestVersions(map[string]semver.Version{
model.DefaultPattern: {
Name: "1.1.0",
},
}, nil).SetUpdate(errors.New("failed")),
},
args{
ctx: context.Background(),
},
nil,
nil,
},
{
"success",
app{
repositoryService: repositorytest.New().SetList([]model.Repository{
model.NewRepository(1, model.Github, repositoryName).AddVersion(model.DefaultPattern, repositoryVersion),
}, 0, nil).SetLatestVersions(map[string]semver.Version{
model.DefaultPattern: safeParse("1.1.0"),
}, nil).SetUpdate(nil),
},
args{
ctx: context.Background(),
},
[]model.Release{model.NewRelease(
model.NewRepository(1, model.Github, repositoryName).AddVersion(model.DefaultPattern, repositoryVersion),
model.DefaultPattern,
safeParse("1.1.0"),
)},
nil,
},
}

for _, tc := range cases {
t.Run(tc.intention, func(t *testing.T) {
pageSize = 1
got, _, gotErr := tc.instance.getNewReleases(tc.args.ctx)
pageSize = 20

failed := false

if tc.wantErr == nil && gotErr != nil {
failed = true
} else if tc.wantErr != nil && gotErr == nil {
failed = true
} else if tc.wantErr != nil && !strings.Contains(gotErr.Error(), tc.wantErr.Error()) {
failed = true
} else if !reflect.DeepEqual(got, tc.want) {
failed = true
}

if failed {
t.Errorf("getNewReleases() = (%+v, `%s`), want (%+v, `%s`)", got, gotErr, tc.want, tc.wantErr)
}
})
}
}

0 comments on commit 200f0ac

Please sign in to comment.