Files
sxchnge/backend/shared/database/internal/builder/patch_test.go
T

99 lines
2.6 KiB
Go

package builderimp
import (
"testing"
"time"
"git.sendico.io/tech/sxchnge/shared/database/record"
"git.sendico.io/tech/sxchnge/shared/database/repository/builder"
"go.mongodb.org/mongo-driver/v2/bson"
)
func TestPatchBuilderBuildMergesSetOperations(t *testing.T) {
patch := NewPatchImp().
Set(NewFieldImp("name"), "alice").
Inc(NewFieldImp("version"), 1).
Set(NewFieldImp("status"), "active")
built := patch.Build()
if got := countPatchOperator(built, string(builder.Set)); got != 1 {
t.Fatalf("$set operator count = %d, want 1: %#v", got, built)
}
if got := countPatchOperator(built, string(builder.Inc)); got != 1 {
t.Fatalf("$inc operator count = %d, want 1: %#v", got, built)
}
setFields := patchOperatorFields(t, built, string(builder.Set))
for _, key := range []string{"name", "status", storable.UpdatedAtField} {
if countPatchField(setFields, key) != 1 {
t.Fatalf("$set field %s must be present once: %#v", key, setFields)
}
}
}
func TestPatchBuilderBuildOwnsUpdatedAt(t *testing.T) {
manualUpdatedAt := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
patch := NewPatchImp().
Set(NewFieldImp(storable.UpdatedAtField), manualUpdatedAt).
Set(NewFieldImp("status"), "active")
built := patch.Build()
setFields := patchOperatorFields(t, built, string(builder.Set))
if got := countPatchField(setFields, storable.UpdatedAtField); got != 1 {
t.Fatalf("updatedAt field count = %d, want 1: %#v", got, setFields)
}
value, ok := patchFieldValue(setFields, storable.UpdatedAtField).(time.Time)
if !ok {
t.Fatalf("updatedAt value type = %T, want time.Time", patchFieldValue(setFields, storable.UpdatedAtField))
}
if value.Equal(manualUpdatedAt) {
t.Fatalf("updatedAt must be repository-owned, got manual value %s", value.Format(time.RFC3339Nano))
}
}
func patchOperatorFields(t *testing.T, built bson.D, operator string) bson.D {
t.Helper()
for _, entry := range built {
if entry.Key != operator {
continue
}
fields, ok := entry.Value.(bson.D)
if !ok {
t.Fatalf("%s value type = %T, want bson.D", operator, entry.Value)
}
return fields
}
t.Fatalf("%s operator missing: %#v", operator, built)
return nil
}
func countPatchOperator(built bson.D, operator string) int {
count := 0
for _, entry := range built {
if entry.Key == operator {
count++
}
}
return count
}
func countPatchField(fields bson.D, key string) int {
count := 0
for _, field := range fields {
if field.Key == key {
count++
}
}
return count
}
func patchFieldValue(fields bson.D, key string) any {
for _, field := range fields {
if field.Key == key {
return field.Value
}
}
return nil
}