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  }