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 s.db.AutoMigrate(&model.NotificationSetting{}) 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.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.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) }