better entry ids
This commit is contained in:
parent
304db7ec03
commit
5939bbd09d
|
@ -1,8 +1,11 @@
|
|||
package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"owl-blogs/app/repository"
|
||||
"owl-blogs/domain/model"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type EntryService struct {
|
||||
|
@ -14,6 +17,22 @@ func NewEntryService(entryRepository repository.EntryRepository) *EntryService {
|
|||
}
|
||||
|
||||
func (s *EntryService) Create(entry model.Entry) error {
|
||||
// try to find a good ID
|
||||
m := regexp.MustCompile(`[^a-z0-9-]`)
|
||||
prefix := m.ReplaceAllString(strings.ToLower(entry.Title()), "-")
|
||||
title := prefix
|
||||
counter := 0
|
||||
for {
|
||||
_, err := s.EntryRepository.FindById(title)
|
||||
if err == nil {
|
||||
counter += 1
|
||||
title = prefix + "-" + fmt.Sprintf("%s-%d", prefix, counter)
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
entry.SetID(title)
|
||||
|
||||
return s.EntryRepository.Create(entry)
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
package app_test
|
||||
|
||||
import (
|
||||
"owl-blogs/app"
|
||||
"owl-blogs/infra"
|
||||
"owl-blogs/test"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func setupService() *app.EntryService {
|
||||
db := test.NewMockDb()
|
||||
register := app.NewEntryTypeRegistry()
|
||||
register.Register(&test.MockEntry{})
|
||||
repo := infra.NewEntryRepository(db, register)
|
||||
service := app.NewEntryService(repo)
|
||||
return service
|
||||
}
|
||||
|
||||
func TestNiceEntryId(t *testing.T) {
|
||||
service := setupService()
|
||||
entry := &test.MockEntry{}
|
||||
meta := test.MockEntryMetaData{
|
||||
Title: "Hello World",
|
||||
}
|
||||
entry.SetMetaData(&meta)
|
||||
|
||||
err := service.Create(entry)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "hello-world", entry.ID())
|
||||
}
|
||||
|
||||
func TestNoTitleCreation(t *testing.T) {
|
||||
service := setupService()
|
||||
entry := &test.MockEntry{}
|
||||
meta := test.MockEntryMetaData{
|
||||
Title: "",
|
||||
}
|
||||
entry.SetMetaData(&meta)
|
||||
|
||||
err := service.Create(entry)
|
||||
require.NoError(t, err)
|
||||
require.NotEqual(t, "", entry.ID())
|
||||
}
|
|
@ -97,7 +97,7 @@ func (r *DefaultEntryRepo) FindById(id string) (model.Entry, error) {
|
|||
return nil, err
|
||||
}
|
||||
if data.Id == "" {
|
||||
return nil, nil
|
||||
return nil, errors.New("entry not found")
|
||||
}
|
||||
return r.sqlEntryToEntry(data)
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ type MockEntryMetaData struct {
|
|||
Str string
|
||||
Number int
|
||||
Date time.Time
|
||||
Title string
|
||||
}
|
||||
|
||||
type MockEntry struct {
|
||||
|
@ -29,5 +30,5 @@ func (e *MockEntry) SetMetaData(metaData interface{}) {
|
|||
}
|
||||
|
||||
func (e *MockEntry) Title() string {
|
||||
return ""
|
||||
return e.metaData.Title
|
||||
}
|
||||
|
|
|
@ -66,7 +66,7 @@ func (f *MockFormData) FormValue(key string, defaultValue ...string) string {
|
|||
|
||||
func TestFieldToFormField(t *testing.T) {
|
||||
field := reflect.TypeOf(&MockData{}).Elem().Field(0)
|
||||
formField, err := forms.FieldToFormField(field, "")
|
||||
formField, err := forms.FieldToFormField(field, reflect.Value{})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "Image", formField.Name)
|
||||
require.Equal(t, "file", formField.Params.InputType)
|
||||
|
@ -86,11 +86,8 @@ func TestForm_HtmlForm(t *testing.T) {
|
|||
form := forms.NewForm(&MockData{}, nil)
|
||||
html, err := form.HtmlForm()
|
||||
require.NoError(t, err)
|
||||
require.Contains(t, html, "<form")
|
||||
require.Contains(t, html, "method=\"POST\"")
|
||||
require.Contains(t, html, "<input type=\"file\" name=\"Image\"")
|
||||
require.Contains(t, html, "<input type=\"text\" name=\"Content\"")
|
||||
require.Contains(t, html, "<input type=\"submit\" value=\"Submit\"")
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue