109 lines
3.5 KiB
Go
109 lines
3.5 KiB
Go
//go:build integration
|
|
|
|
package repository
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/suite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type SettingRepoSuite struct {
|
|
suite.Suite
|
|
ctx context.Context
|
|
db *gorm.DB
|
|
repo *SettingRepository
|
|
}
|
|
|
|
func (s *SettingRepoSuite) SetupTest() {
|
|
s.ctx = context.Background()
|
|
s.db = testTx(s.T())
|
|
s.repo = NewSettingRepository(s.db)
|
|
}
|
|
|
|
func TestSettingRepoSuite(t *testing.T) {
|
|
suite.Run(t, new(SettingRepoSuite))
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestSetAndGetValue() {
|
|
s.Require().NoError(s.repo.Set(s.ctx, "k1", "v1"), "Set")
|
|
got, err := s.repo.GetValue(s.ctx, "k1")
|
|
s.Require().NoError(err, "GetValue")
|
|
s.Require().Equal("v1", got, "GetValue mismatch")
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestSet_Upsert() {
|
|
s.Require().NoError(s.repo.Set(s.ctx, "k1", "v1"), "Set")
|
|
s.Require().NoError(s.repo.Set(s.ctx, "k1", "v2"), "Set upsert")
|
|
got, err := s.repo.GetValue(s.ctx, "k1")
|
|
s.Require().NoError(err, "GetValue after upsert")
|
|
s.Require().Equal("v2", got, "upsert mismatch")
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestGetValue_Missing() {
|
|
_, err := s.repo.GetValue(s.ctx, "nonexistent")
|
|
s.Require().Error(err, "expected error for missing key")
|
|
s.Require().ErrorIs(err, gorm.ErrRecordNotFound)
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestSetMultiple_AndGetMultiple() {
|
|
s.Require().NoError(s.repo.SetMultiple(s.ctx, map[string]string{"k2": "v2", "k3": "v3"}), "SetMultiple")
|
|
m, err := s.repo.GetMultiple(s.ctx, []string{"k2", "k3"})
|
|
s.Require().NoError(err, "GetMultiple")
|
|
s.Require().Equal("v2", m["k2"])
|
|
s.Require().Equal("v3", m["k3"])
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestGetMultiple_EmptyKeys() {
|
|
m, err := s.repo.GetMultiple(s.ctx, []string{})
|
|
s.Require().NoError(err, "GetMultiple with empty keys")
|
|
s.Require().Empty(m, "expected empty map")
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestGetMultiple_Subset() {
|
|
s.Require().NoError(s.repo.SetMultiple(s.ctx, map[string]string{"a": "1", "b": "2", "c": "3"}))
|
|
m, err := s.repo.GetMultiple(s.ctx, []string{"a", "c", "nonexistent"})
|
|
s.Require().NoError(err, "GetMultiple subset")
|
|
s.Require().Equal("1", m["a"])
|
|
s.Require().Equal("3", m["c"])
|
|
_, exists := m["nonexistent"]
|
|
s.Require().False(exists, "nonexistent key should not be in map")
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestGetAll() {
|
|
s.Require().NoError(s.repo.SetMultiple(s.ctx, map[string]string{"x": "1", "y": "2"}))
|
|
all, err := s.repo.GetAll(s.ctx)
|
|
s.Require().NoError(err, "GetAll")
|
|
s.Require().GreaterOrEqual(len(all), 2, "expected at least 2 settings")
|
|
s.Require().Equal("1", all["x"])
|
|
s.Require().Equal("2", all["y"])
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestDelete() {
|
|
s.Require().NoError(s.repo.Set(s.ctx, "todelete", "val"))
|
|
s.Require().NoError(s.repo.Delete(s.ctx, "todelete"), "Delete")
|
|
_, err := s.repo.GetValue(s.ctx, "todelete")
|
|
s.Require().Error(err, "expected missing key error after Delete")
|
|
s.Require().ErrorIs(err, gorm.ErrRecordNotFound)
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestDelete_Idempotent() {
|
|
// Delete a key that doesn't exist should not error
|
|
s.Require().NoError(s.repo.Delete(s.ctx, "nonexistent_delete"), "Delete nonexistent should be idempotent")
|
|
}
|
|
|
|
func (s *SettingRepoSuite) TestSetMultiple_Upsert() {
|
|
s.Require().NoError(s.repo.Set(s.ctx, "upsert_key", "old_value"))
|
|
s.Require().NoError(s.repo.SetMultiple(s.ctx, map[string]string{"upsert_key": "new_value", "new_key": "new_val"}))
|
|
|
|
got, err := s.repo.GetValue(s.ctx, "upsert_key")
|
|
s.Require().NoError(err)
|
|
s.Require().Equal("new_value", got, "SetMultiple should upsert existing key")
|
|
|
|
got2, err := s.repo.GetValue(s.ctx, "new_key")
|
|
s.Require().NoError(err)
|
|
s.Require().Equal("new_val", got2)
|
|
}
|