json_time_validation_test.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "testing"
  6. "time"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func TestAnnouncementServiceRejectsOutOfRangeDates(t *testing.T) {
  10. for _, year := range []int{-1, 10000} {
  11. date := time.Date(year, 1, 1, 0, 0, 0, 0, time.UTC)
  12. for _, field := range []string{"start", "end"} {
  13. t.Run(date.String()+field, func(t *testing.T) {
  14. repo := &announcementRepoStub{}
  15. svc := NewAnnouncementService(repo, nil, nil, nil)
  16. input := &CreateAnnouncementInput{Title: "test", Content: "test"}
  17. if field == "start" {
  18. input.StartsAt = &date
  19. } else {
  20. input.EndsAt = &date
  21. }
  22. _, err := svc.Create(context.Background(), input)
  23. require.ErrorIs(t, err, ErrAnnouncementInvalidSchedule)
  24. require.Nil(t, repo.item, "invalid dates must never reach persistence")
  25. repo.item = &Announcement{ID: 1, Title: "test", Content: "test"}
  26. update := &UpdateAnnouncementInput{}
  27. ptr := &date
  28. if field == "start" {
  29. update.StartsAt = &ptr
  30. } else {
  31. update.EndsAt = &ptr
  32. }
  33. _, err = svc.Update(context.Background(), 1, update)
  34. require.ErrorIs(t, err, ErrAnnouncementInvalidSchedule)
  35. require.Nil(t, repo.item.StartsAt)
  36. require.Nil(t, repo.item.EndsAt)
  37. })
  38. }
  39. }
  40. }
  41. func TestAnnouncementServiceAcceptsJSONDateBoundariesAndClear(t *testing.T) {
  42. start := time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC)
  43. end := time.Date(9999, 12, 31, 23, 59, 59, 0, time.UTC)
  44. repo := &announcementRepoStub{}
  45. svc := NewAnnouncementService(repo, nil, nil, nil)
  46. a, err := svc.Create(context.Background(), &CreateAnnouncementInput{Title: "test", Content: "test", StartsAt: &start, EndsAt: &end})
  47. require.NoError(t, err)
  48. _, err = json.Marshal(a)
  49. require.NoError(t, err)
  50. var clear *time.Time
  51. a, err = svc.Update(context.Background(), 1, &UpdateAnnouncementInput{StartsAt: &clear, EndsAt: &clear})
  52. require.NoError(t, err)
  53. require.Nil(t, a.StartsAt)
  54. require.Nil(t, a.EndsAt)
  55. }