callback_system_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package gorm
  2. import (
  3. "reflect"
  4. "runtime"
  5. "strings"
  6. "testing"
  7. )
  8. func equalFuncs(funcs []*func(s *Scope), fnames []string) bool {
  9. var names []string
  10. for _, f := range funcs {
  11. fnames := strings.Split(runtime.FuncForPC(reflect.ValueOf(*f).Pointer()).Name(), ".")
  12. names = append(names, fnames[len(fnames)-1])
  13. }
  14. return reflect.DeepEqual(names, fnames)
  15. }
  16. func create(s *Scope) {}
  17. func beforeCreate1(s *Scope) {}
  18. func beforeCreate2(s *Scope) {}
  19. func afterCreate1(s *Scope) {}
  20. func afterCreate2(s *Scope) {}
  21. func TestRegisterCallback(t *testing.T) {
  22. var callback = &Callback{}
  23. callback.Create().Register("before_create1", beforeCreate1)
  24. callback.Create().Register("before_create2", beforeCreate2)
  25. callback.Create().Register("create", create)
  26. callback.Create().Register("after_create1", afterCreate1)
  27. callback.Create().Register("after_create2", afterCreate2)
  28. if !equalFuncs(callback.creates, []string{"beforeCreate1", "beforeCreate2", "create", "afterCreate1", "afterCreate2"}) {
  29. t.Errorf("register callback")
  30. }
  31. }
  32. func TestRegisterCallbackWithOrder(t *testing.T) {
  33. var callback1 = &Callback{}
  34. callback1.Create().Register("before_create1", beforeCreate1)
  35. callback1.Create().Register("create", create)
  36. callback1.Create().Register("after_create1", afterCreate1)
  37. callback1.Create().Before("after_create1").Register("after_create2", afterCreate2)
  38. if !equalFuncs(callback1.creates, []string{"beforeCreate1", "create", "afterCreate2", "afterCreate1"}) {
  39. t.Errorf("register callback with order")
  40. }
  41. var callback2 = &Callback{}
  42. callback2.Update().Register("create", create)
  43. callback2.Update().Before("create").Register("before_create1", beforeCreate1)
  44. callback2.Update().After("after_create2").Register("after_create1", afterCreate1)
  45. callback2.Update().Before("before_create1").Register("before_create2", beforeCreate2)
  46. callback2.Update().Register("after_create2", afterCreate2)
  47. if !equalFuncs(callback2.updates, []string{"beforeCreate2", "beforeCreate1", "create", "afterCreate2", "afterCreate1"}) {
  48. t.Errorf("register callback with order")
  49. }
  50. }
  51. func TestRegisterCallbackWithComplexOrder(t *testing.T) {
  52. var callback1 = &Callback{}
  53. callback1.Query().Before("after_create1").After("before_create1").Register("create", create)
  54. callback1.Query().Register("before_create1", beforeCreate1)
  55. callback1.Query().Register("after_create1", afterCreate1)
  56. if !equalFuncs(callback1.queries, []string{"beforeCreate1", "create", "afterCreate1"}) {
  57. t.Errorf("register callback with order")
  58. }
  59. var callback2 = &Callback{}
  60. callback2.Delete().Before("after_create1").After("before_create1").Register("create", create)
  61. callback2.Delete().Before("create").Register("before_create1", beforeCreate1)
  62. callback2.Delete().After("before_create1").Register("before_create2", beforeCreate2)
  63. callback2.Delete().Register("after_create1", afterCreate1)
  64. callback2.Delete().After("after_create1").Register("after_create2", afterCreate2)
  65. if !equalFuncs(callback2.deletes, []string{"beforeCreate1", "beforeCreate2", "create", "afterCreate1", "afterCreate2"}) {
  66. t.Errorf("register callback with order")
  67. }
  68. }
  69. func replaceCreate(s *Scope) {}
  70. func TestReplaceCallback(t *testing.T) {
  71. var callback = &Callback{}
  72. callback.Create().Before("after_create1").After("before_create1").Register("create", create)
  73. callback.Create().Register("before_create1", beforeCreate1)
  74. callback.Create().Register("after_create1", afterCreate1)
  75. callback.Create().Replace("create", replaceCreate)
  76. if !equalFuncs(callback.creates, []string{"beforeCreate1", "replaceCreate", "afterCreate1"}) {
  77. t.Errorf("replace callback")
  78. }
  79. }
  80. func TestRemoveCallback(t *testing.T) {
  81. var callback = &Callback{}
  82. callback.Create().Before("after_create1").After("before_create1").Register("create", create)
  83. callback.Create().Register("before_create1", beforeCreate1)
  84. callback.Create().Register("after_create1", afterCreate1)
  85. callback.Create().Remove("create")
  86. if !equalFuncs(callback.creates, []string{"beforeCreate1", "afterCreate1"}) {
  87. t.Errorf("remove callback")
  88. }
  89. }