99 lines
2.6 KiB
Go
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
|
|
}
|