Files
gochat/backend/internal/service/notification_setting_service_test.go
Rogeeandrogee 2b182f9956 H-300: wire Captain Skills into Web runtime (#48)
* H-300: wire Captain Skills into Web runtime

* H-300: enforce effective model and conservative skill budget

* H-300: fix CI gosec step

* ci: extend golangci-lint timeout

* fix lint findings across backend

* fix(push): resolve delivery protocol blockers

* test(repository): close SQLite test databases

* test(repository): reuse SQLite schema per package

* H-307: restore backend Go cache in CI

* H-307: prefetch modules before cold lint

* H-307: resolve govulncheck security gate

* H-307: build lint with patched Go toolchain

* H-307: clear remaining security scan findings

---------

Co-authored-by: Rogee <rogee@ipao.vip>
2026-08-19 07:08:14 +08:00

96 lines
3.0 KiB
Go

package service
import (
"context"
"testing"
"github.com/gochat/gochat/internal/model"
"github.com/gochat/gochat/internal/repository"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type NotificationSettingServiceTestSuite struct {
suite.Suite
db *gorm.DB
svc *NotificationSettingService
repo *repository.NotificationSettingRepo
}
func (s *NotificationSettingServiceTestSuite) SetupTest() {
db, err := gorm.Open(sqlite.Open("file:ns_test?mode=memory&_busy_timeout=5000"), &gorm.Config{})
assert.NoError(s.T(), err)
s.db = db
if err := s.db.AutoMigrate(&model.NotificationSetting{}); err != nil {
panic(err)
}
s.repo = repository.NewNotificationSettingRepo(db)
s.svc = NewNotificationSettingService(s.repo)
}
func (s *NotificationSettingServiceTestSuite) TearDownTest() {
if s.db != nil {
sqlDB, _ := s.db.DB()
sqlDB.Close()
}
}
func TestNotificationSettingServiceSuite(t *testing.T) {
suite.Run(t, new(NotificationSettingServiceTestSuite))
}
func (s *NotificationSettingServiceTestSuite) TestGet_Default() {
ns, err := s.svc.Get(context.Background(), 1, 1)
assert.NoError(s.T(), err)
assert.Equal(s.T(), uint(1), ns.AccountID)
assert.Equal(s.T(), uint(1), ns.UserID)
// Default: all flags enabled
assert.Equal(s.T(), model.AllEmailFlags(), ns.EmailFlags)
assert.Equal(s.T(), model.AllPushFlags(), ns.PushFlags)
}
func (s *NotificationSettingServiceTestSuite) TestGet_Existing() {
s.Require().NotNil(s.repo.Create(&model.NotificationSetting{
AccountID: 1,
UserID: 1,
EmailFlags: model.EmailFlagConversationCreation,
PushFlags: 0,
}))
ns, err := s.svc.Get(context.Background(), 1, 1)
assert.NoError(s.T(), err)
assert.Equal(s.T(), model.EmailFlagConversationCreation, ns.EmailFlags)
assert.Equal(s.T(), 0, ns.PushFlags)
}
func (s *NotificationSettingServiceTestSuite) TestUpdate_CreateNew() {
req := UpdateNotificationSettingRequest{
SelectedEmailFlags: []string{"email_conversation_creation", "email_conversation_mention"},
SelectedPushFlags: []string{"push_conversation_assignment"},
}
ns, err := s.svc.Update(context.Background(), 1, 1, req)
assert.NoError(s.T(), err)
expectedEmail := model.EmailFlagConversationCreation | model.EmailFlagConversationMention
expectedPush := model.PushFlagConversationAssignment
assert.Equal(s.T(), expectedEmail, ns.EmailFlags)
assert.Equal(s.T(), expectedPush, ns.PushFlags)
}
func (s *NotificationSettingServiceTestSuite) TestUpdate_ModifyExisting() {
s.Require().NotNil(s.repo.Create(&model.NotificationSetting{
AccountID: 1,
UserID: 1,
EmailFlags: model.AllEmailFlags(),
PushFlags: model.AllPushFlags(),
}))
req := UpdateNotificationSettingRequest{
SelectedEmailFlags: []string{"email_conversation_assignment"},
SelectedPushFlags: []string{},
}
ns, err := s.svc.Update(context.Background(), 1, 1, req)
assert.NoError(s.T(), err)
assert.Equal(s.T(), model.EmailFlagConversationAssignment, ns.EmailFlags)
assert.Equal(s.T(), 0, ns.PushFlags)
}