修改页面
CI / Server (Go) (push) Has been cancelled
CI / Web (Next.js) (push) Has been cancelled
CI / Mobile (React Native) (push) Has been cancelled
CI / Admin (React) (push) Has been cancelled
CI / Docker Build (push) Has been cancelled

This commit is contained in:
zeronline
2026-06-25 16:33:32 +08:00
parent c5cccd346b
commit 545329ac40
63 changed files with 2560 additions and 161 deletions
@@ -0,0 +1,122 @@
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(), "已打卡")
}