package services import ( "testing" "time" "github.com/inchstep/server/internal/models" "github.com/stretchr/testify/suite" ) type CheckInServiceTestSuite struct { ServiceTestSuite } func TestCheckInServiceSuite(t *testing.T) { suite.Run(t, new(CheckInServiceTestSuite)) } func (s *CheckInServiceTestSuite) setupUser() string { user, err := s.svc.RegisterByPhone("13800138100") s.Require().NoError(err) return user.ID } func (s *CheckInServiceTestSuite) TestCreateItem() { userID := s.setupUser() item := &models.CheckInItem{ Name: "每日阅读", Category: models.CategoryStudy, CycleType: models.CycleDaily, Privacy: models.PrivacyFriendsOnly, DailyGoal: strPtr("读30页"), } err := s.svcCk.CreateItem(userID, item) s.Require().NoError(err) s.NotEmpty(item.ID) s.Equal(models.StatusActive, item.Status) } func (s *CheckInServiceTestSuite) TestGetUserItems() { userID := s.setupUser() item1 := &models.CheckInItem{Name: "跑步", Category: models.CategoryHealth, CycleType: models.CycleDaily, Privacy: models.PrivacyFriendsOnly} item2 := &models.CheckInItem{Name: "冥想", Category: models.CategoryHabit, CycleType: models.CycleDaily, Privacy: models.PrivacyFriendsOnly} s.Require().NoError(s.svcCk.CreateItem(userID, item1)) s.Require().NoError(s.svcCk.CreateItem(userID, item2)) items, err := s.svcCk.GetUserItems(userID) s.Require().NoError(err) s.Len(items, 2) } func (s *CheckInServiceTestSuite) TestGetItemByID() { userID := s.setupUser() item := &models.CheckInItem{Name: "写作", Category: models.CategoryHobby, CycleType: models.CycleDaily, Privacy: models.PrivacyPublic} s.Require().NoError(s.svcCk.CreateItem(userID, item)) found, err := s.svcCk.GetItemByID(item.ID, userID) s.Require().NoError(err) s.Equal("写作", found.Name) } func (s *CheckInServiceTestSuite) TestGetItemByID_WrongUser() { userID1 := s.setupUser() userID2, _ := s.svc.RegisterByPhone("13800138101") s.Require().NotNil(userID2) item := &models.CheckInItem{Name: "日记", Category: models.CategoryHabit, CycleType: models.CycleDaily, Privacy: models.PrivacyPrivate} s.Require().NoError(s.svcCk.CreateItem(userID1, item)) _, err := s.svcCk.GetItemByID(item.ID, userID2.ID) s.Error(err) // should fail - wrong user } func (s *CheckInServiceTestSuite) TestPauseAndResumeItem() { userID := s.setupUser() item := &models.CheckInItem{Name: "瑜伽", Category: models.CategoryHealth, CycleType: models.CycleDaily, Privacy: models.PrivacyPrivate} s.Require().NoError(s.svcCk.CreateItem(userID, item)) err := s.svcCk.PauseItem(item.ID, userID) s.Require().NoError(err) paused, err := s.svcCk.GetItemByID(item.ID, userID) s.Require().NoError(err) s.Equal(models.StatusPaused, paused.Status) err = s.svcCk.ResumeItem(item.ID, userID) s.Require().NoError(err) resumed, err := s.svcCk.GetItemByID(item.ID, userID) s.Require().NoError(err) s.Equal(models.StatusActive, resumed.Status) } func (s *CheckInServiceTestSuite) TestCreateRecord() { userID := s.setupUser() item := &models.CheckInItem{Name: "背单词", Category: models.CategoryStudy, CycleType: models.CycleDaily, Privacy: models.PrivacyPrivate} s.Require().NoError(s.svcCk.CreateItem(userID, item)) record, err := s.svcCk.CreateRecord(userID, item.ID, time.Now(), strPtr("背了50个"), nil) s.Require().NoError(err) s.NotEmpty(record.ID) s.Equal(models.RecordNormal, record.Status) } func (s *CheckInServiceTestSuite) TestCreateRecord_DuplicateDate() { userID := s.setupUser() item := &models.CheckInItem{Name: "喝水", Category: models.CategoryHealth, CycleType: models.CycleDaily, Privacy: models.PrivacyPrivate} s.Require().NoError(s.svcCk.CreateItem(userID, item)) _, err := s.svcCk.CreateRecord(userID, item.ID, time.Now(), nil, nil) s.Require().NoError(err) _, err = s.svcCk.CreateRecord(userID, item.ID, time.Now(), nil, nil) s.Error(err) s.Contains(err.Error(), "已打卡") }