122 lines
3.8 KiB
Go
122 lines
3.8 KiB
Go
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(), "已打卡")
|
|
} |