feat: characterized the existing use cases as a baseline; every repo fake behaves like the real ones and can be told to fail, every use case is covered; gremlins runs clean on useCases
This commit is contained in:
1 parent
09bd5afa4a
commit
7c57173497
12 files changed
+1245
-92
No files matched your search
+113
-22
@@ -2,58 +2,150 @@ package test
|
||||
|
||||
import (
|
||||
"RenewCMS/internal/domain/article"
|
||||
imageDomain "RenewCMS/internal/domain/image"
|
||||
"RenewCMS/internal/infrastructure/useCases"
|
||||
"errors"
|
||||
"sort"
|
||||
"testing"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type mockArticleRepo struct {
|
||||
articles map[uint32]article.Article
|
||||
images map[uint32]*imageDomain.Image
|
||||
nextID uint32
|
||||
fail failSwitch
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) FindByFilters(f article.Filters) ([]article.Article, error) {
|
||||
var results []article.Article
|
||||
for _, a := range m.articles {
|
||||
if f.IsOnline != nil && a.IsOnline == *f.IsOnline {
|
||||
results = append(results, a)
|
||||
}
|
||||
func newMockArticleRepo() *mockArticleRepo {
|
||||
return &mockArticleRepo{
|
||||
articles: make(map[uint32]article.Article),
|
||||
images: make(map[uint32]*imageDomain.Image),
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) sortedIds() []uint32 {
|
||||
ids := make([]uint32, 0, len(m.articles))
|
||||
for id := range m.articles {
|
||||
ids = append(ids, id)
|
||||
}
|
||||
sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] })
|
||||
return ids
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) FindByFilters(filters article.Filters) ([]article.Article, error) {
|
||||
if err := m.fail.trigger("FindByFilters"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result := make([]article.Article, 0)
|
||||
for _, id := range m.sortedIds() {
|
||||
a := m.articles[id]
|
||||
if filters.IsOnline != nil && a.IsOnline != *filters.IsOnline {
|
||||
continue
|
||||
}
|
||||
result = append(result, a)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) Get(id uint32) (article.Article, error) {
|
||||
if err := m.fail.trigger("Get"); err != nil {
|
||||
return article.Article{}, err
|
||||
}
|
||||
a, ok := m.articles[id]
|
||||
if !ok {
|
||||
return article.Article{}, article.ErrArticleNotFound
|
||||
return article.Article{}, gorm.ErrRecordNotFound
|
||||
}
|
||||
return a, nil
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) GetByName(name string) (article.Article, error) {
|
||||
if err := m.fail.trigger("GetByName"); err != nil {
|
||||
return article.Article{}, err
|
||||
}
|
||||
for _, id := range m.sortedIds() {
|
||||
a := m.articles[id]
|
||||
if a.Title == name {
|
||||
return a, nil
|
||||
}
|
||||
}
|
||||
return article.Article{}, gorm.ErrRecordNotFound
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) GetAll() []article.Article {
|
||||
result := make([]article.Article, 0)
|
||||
for _, id := range m.sortedIds() {
|
||||
result = append(result, m.articles[id])
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) Create(a article.Article) (article.Article, error) {
|
||||
a.ID = uint32(len(m.articles) + 1)
|
||||
if err := m.fail.trigger("Create"); err != nil {
|
||||
return article.Article{}, err
|
||||
}
|
||||
m.nextID++
|
||||
a.ID = m.nextID
|
||||
m.articles[a.ID] = a
|
||||
return a, nil
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) UpdateBody(id uint32, body string) (article.Article, error) {
|
||||
if err := m.fail.trigger("UpdateBody"); err != nil {
|
||||
return article.Article{}, err
|
||||
}
|
||||
a, ok := m.articles[id]
|
||||
if !ok {
|
||||
return article.Article{}, gorm.ErrRecordNotFound
|
||||
}
|
||||
a.Body = body
|
||||
m.articles[id] = a
|
||||
return a, nil
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) UpdateIsOnline(id uint32, isOnline bool) (article.Article, error) {
|
||||
if err := m.fail.trigger("UpdateIsOnline"); err != nil {
|
||||
return article.Article{}, err
|
||||
}
|
||||
a, ok := m.articles[id]
|
||||
if !ok {
|
||||
return article.Article{}, gorm.ErrRecordNotFound
|
||||
}
|
||||
a.IsOnline = isOnline
|
||||
m.articles[id] = a
|
||||
return a, nil
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) Delete(id uint32) error {
|
||||
if err := m.fail.trigger("Delete"); err != nil {
|
||||
return err
|
||||
}
|
||||
delete(m.articles, id)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *mockArticleRepo) GetByName(n string) (article.Article, error) { return article.Article{}, nil }
|
||||
func (m *mockArticleRepo) GetAll() []article.Article { return nil }
|
||||
func (m *mockArticleRepo) UpdateBody(id uint32, b string) (article.Article, error) {
|
||||
return article.Article{}, nil
|
||||
func (m *mockArticleRepo) AddImage(articleId uint32, imageId uint32) error {
|
||||
if err := m.fail.trigger("AddImage"); err != nil {
|
||||
return err
|
||||
}
|
||||
a, ok := m.articles[articleId]
|
||||
if !ok {
|
||||
return gorm.ErrRecordNotFound
|
||||
}
|
||||
img, ok := m.images[imageId]
|
||||
if !ok {
|
||||
return gorm.ErrRecordNotFound
|
||||
}
|
||||
a.Images = append(a.Images, img)
|
||||
m.articles[articleId] = a
|
||||
return nil
|
||||
}
|
||||
func (m *mockArticleRepo) UpdateIsOnline(id uint32, o bool) (article.Article, error) {
|
||||
return article.Article{}, nil
|
||||
}
|
||||
func (m *mockArticleRepo) AddImage(p, i uint32) error { return nil }
|
||||
|
||||
var _ article.Repository = &mockArticleRepo{}
|
||||
|
||||
func TestCreateArticle(t *testing.T) {
|
||||
repo := &mockArticleRepo{articles: make(map[uint32]article.Article)}
|
||||
repo := newMockArticleRepo()
|
||||
uc := useCases.NewCreateArticleUseCase(repo)
|
||||
|
||||
t.Run("Valid Title", func(t *testing.T) {
|
||||
@@ -77,10 +169,9 @@ func TestCreateArticle(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetOnlineArticle(t *testing.T) {
|
||||
repo := &mockArticleRepo{articles: map[uint32]article.Article{
|
||||
1: {ID: 1, IsOnline: true},
|
||||
2: {ID: 2, IsOnline: false},
|
||||
}}
|
||||
repo := newMockArticleRepo()
|
||||
repo.articles[1] = article.Article{ID: 1, IsOnline: true}
|
||||
repo.articles[2] = article.Article{ID: 2, IsOnline: false}
|
||||
uc := useCases.NewGetArticleUseCase(repo)
|
||||
|
||||
t.Run("Article Online", func(t *testing.T) {
|
||||
|
||||
Reference in new issue
Block a user