github.com/ngicks/gokugen@v0.0.5/middleware_applicator_test.go (about) 1 package gokugen_test 2 3 import ( 4 "context" 5 "sync" 6 "testing" 7 "time" 8 9 "github.com/ngicks/gokugen" 10 mock_gokugen "github.com/ngicks/gokugen/__mock" 11 "github.com/ngicks/gokugen/middleware/observe" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestScheduler(t *testing.T) { 16 t.Run("Use order is mw application order", func(t *testing.T) { 17 _, mockSched, getTrappedTask := mock_gokugen.BuildMockScheduler(t) 18 19 schduler := gokugen.NewMiddlewareApplicator(mockSched) 20 21 orderMu := sync.Mutex{} 22 order := make([]string, 0) 23 hook := func(label1, label2 string) (ctxObserver func(ctx gokugen.SchedulerContext), workFnObserver func(ret any, err error)) { 24 ctxObserver = func(ctx gokugen.SchedulerContext) { 25 orderMu.Lock() 26 defer orderMu.Unlock() 27 order = append(order, label1) 28 } 29 workFnObserver = func(ret any, err error) { 30 orderMu.Lock() 31 defer orderMu.Unlock() 32 order = append(order, label2) 33 } 34 return 35 } 36 mw1 := observe.New(hook("ctx1", "work1")) 37 mw2 := observe.New(hook("ctx2", "work2")) 38 mw3 := observe.New(hook("ctx3", "work3")) 39 mw4 := observe.New(hook("ctx4", "work4")) 40 41 schduler.Use(mw1.Middleware) 42 schduler.Use(mw2.Middleware) 43 schduler.Use([]gokugen.MiddlewareFunc{mw3.Middleware, mw4.Middleware}...) 44 45 schduler.Schedule(gokugen.NewPlainContext( 46 time.Now(), 47 func(taskCtx context.Context, scheduled time.Time) (any, error) { return nil, nil }, 48 nil, 49 )) 50 51 orderMu.Lock() 52 require.Equal(t, []string{"ctx1", "ctx2", "ctx3", "ctx4"}, order) 53 orderMu.Unlock() 54 55 getTrappedTask().Do(context.TODO()) 56 57 orderMu.Lock() 58 // observe action takes place *after* inner work is called. 59 // Then call order is mw-applicaton order. 60 require.Equal(t, []string{"ctx1", "ctx2", "ctx3", "ctx4", "work1", "work2", "work3", "work4"}, order) 61 orderMu.Unlock() 62 }) 63 }