From 5939bbd09dad0e8f4843714bcac92cc601d3a51e Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Tue, 8 Aug 2023 19:41:07 +0200 Subject: [PATCH] better entry ids --- app/entry_service.go | 19 +++++++++++++++++ app/entry_service_test.go | 45 +++++++++++++++++++++++++++++++++++++++ infra/entry_repository.go | 2 +- test/mock_entry.go | 3 ++- web/forms/form_test.go | 5 +---- 5 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 app/entry_service_test.go diff --git a/app/entry_service.go b/app/entry_service.go index 3528c4e..08b6442 100644 --- a/app/entry_service.go +++ b/app/entry_service.go @@ -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) } diff --git a/app/entry_service_test.go b/app/entry_service_test.go new file mode 100644 index 0000000..da6cbcb --- /dev/null +++ b/app/entry_service_test.go @@ -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()) +} diff --git a/infra/entry_repository.go b/infra/entry_repository.go index 3aad5bb..1316757 100644 --- a/infra/entry_repository.go +++ b/infra/entry_repository.go @@ -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) } diff --git a/test/mock_entry.go b/test/mock_entry.go index 6957205..1b0373e 100644 --- a/test/mock_entry.go +++ b/test/mock_entry.go @@ -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 } diff --git a/web/forms/form_test.go b/web/forms/form_test.go index 8e08c54..bd1bb56 100644 --- a/web/forms/form_test.go +++ b/web/forms/form_test.go @@ -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, "