mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2026-10-04 04:21:57 +00:00
fix(crud): skip generated and read-only columns on insert and update
Tests / Integration Tests (push) Skipped
Build , Vet Test, and Lint / Build (push) Successful in 1m34s
Tests / Unit Tests (push) Successful in 1m42s
Build , Vet Test, and Lint / Lint Code (push) Successful in 2m11s
Build , Vet Test, and Lint / Run Vet Tests (1.24.x) (push) Successful in 2m25s
Build , Vet Test, and Lint / Run Vet Tests (1.23.x) (push) Successful in 2m28s
Tests / Race Detector (push) Successful in 4m6s
Tests / Integration Tests (push) Skipped
Build , Vet Test, and Lint / Build (push) Successful in 1m34s
Tests / Unit Tests (push) Successful in 1m42s
Build , Vet Test, and Lint / Lint Code (push) Successful in 2m11s
Build , Vet Test, and Lint / Run Vet Tests (1.24.x) (push) Successful in 2m25s
Build , Vet Test, and Lint / Run Vet Tests (1.23.x) (push) Successful in 2m28s
Tests / Race Detector (push) Successful in 4m6s
Read-merge-update wrote every model column back, so GENERATED ALWAYS columns failed with SQLSTATE 428C9. Add a bun 'generated' tag option, reflection.NonWritableColumns/RemoveNonWritableColumns, and apply them in resolvespec, restheadspec, websocketspec, mqttspec, resolvemcp and the nested CUD processor. Add ExcludeColumn to InsertQuery/UpdateQuery for model-based writes.
This commit is contained in:
@@ -1920,3 +1920,46 @@ func TestMapToStruct_Errors(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRemoveNonWritableColumns_Generated(t *testing.T) {
|
||||
type m struct {
|
||||
ID int `bun:"id,pk"`
|
||||
Email string `bun:"email"`
|
||||
Norm string `bun:"email_normalized,generated"`
|
||||
Scan string `bun:"scan_col,scanonly"`
|
||||
}
|
||||
vals := map[string]interface{}{"id": 1, "email": "A", "email_normalized": "a", "scan_col": "x", "dynamic": 1}
|
||||
RemoveNonWritableColumns(&m{}, vals)
|
||||
if _, ok := vals["email_normalized"]; ok {
|
||||
t.Error("generated column not removed")
|
||||
}
|
||||
if _, ok := vals["scan_col"]; ok {
|
||||
t.Error("scanonly column not removed")
|
||||
}
|
||||
if len(vals) != 3 {
|
||||
t.Errorf("unexpected keys: %v", vals)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNonWritableColumns(t *testing.T) {
|
||||
type base struct {
|
||||
Created string `bun:"created_at,scanonly"`
|
||||
}
|
||||
type m struct {
|
||||
base
|
||||
ID int `bun:"id,pk"`
|
||||
Email string `bun:"email"`
|
||||
Norm string `bun:"email_normalized,generated"`
|
||||
Ro string `gorm:"column:ro;->"`
|
||||
}
|
||||
got := NonWritableColumns(&m{})
|
||||
want := map[string]bool{"created_at": true, "email_normalized": true, "ro": true}
|
||||
if len(got) != len(want) {
|
||||
t.Fatalf("got %v", got)
|
||||
}
|
||||
for _, c := range got {
|
||||
if !want[c] {
|
||||
t.Errorf("unexpected %s", c)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user