Files
sub2api/backend/internal/service/json_time_validation_test.go
T

61 lines
1.9 KiB
Go

package service
import (
"context"
"encoding/json"
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestAnnouncementServiceRejectsOutOfRangeDates(t *testing.T) {
for _, year := range []int{-1, 10000} {
date := time.Date(year, 1, 1, 0, 0, 0, 0, time.UTC)
for _, field := range []string{"start", "end"} {
t.Run(date.String()+field, func(t *testing.T) {
repo := &announcementRepoStub{}
svc := NewAnnouncementService(repo, nil, nil, nil)
input := &CreateAnnouncementInput{Title: "test", Content: "test"}
if field == "start" {
input.StartsAt = &date
} else {
input.EndsAt = &date
}
_, err := svc.Create(context.Background(), input)
require.ErrorIs(t, err, ErrAnnouncementInvalidSchedule)
require.Nil(t, repo.item, "invalid dates must never reach persistence")
repo.item = &Announcement{ID: 1, Title: "test", Content: "test"}
update := &UpdateAnnouncementInput{}
ptr := &date
if field == "start" {
update.StartsAt = &ptr
} else {
update.EndsAt = &ptr
}
_, err = svc.Update(context.Background(), 1, update)
require.ErrorIs(t, err, ErrAnnouncementInvalidSchedule)
require.Nil(t, repo.item.StartsAt)
require.Nil(t, repo.item.EndsAt)
})
}
}
}
func TestAnnouncementServiceAcceptsJSONDateBoundariesAndClear(t *testing.T) {
start := time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(9999, 12, 31, 23, 59, 59, 0, time.UTC)
repo := &announcementRepoStub{}
svc := NewAnnouncementService(repo, nil, nil, nil)
a, err := svc.Create(context.Background(), &CreateAnnouncementInput{Title: "test", Content: "test", StartsAt: &start, EndsAt: &end})
require.NoError(t, err)
_, err = json.Marshal(a)
require.NoError(t, err)
var clear *time.Time
a, err = svc.Update(context.Background(), 1, &UpdateAnnouncementInput{StartsAt: &clear, EndsAt: &clear})
require.NoError(t, err)
require.Nil(t, a.StartsAt)
require.Nil(t, a.EndsAt)
}