47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package service
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"errors"
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/assert"
|
||
|
|
|
||
|
|
"apskel-pos-be/internal/logger"
|
||
|
|
)
|
||
|
|
|
||
|
|
type missingEarnerFake struct {
|
||
|
|
since time.Time
|
||
|
|
max int
|
||
|
|
earned int
|
||
|
|
err error
|
||
|
|
calls int
|
||
|
|
}
|
||
|
|
|
||
|
|
func (f *missingEarnerFake) EarnMissing(_ context.Context, since time.Time, maxOrders int) (int, int, error) {
|
||
|
|
f.calls++
|
||
|
|
f.since, f.max = since, maxOrders
|
||
|
|
return f.earned * 2, f.earned, f.err
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestEarningBackfillJob(t *testing.T) {
|
||
|
|
logger.Setup("fatal", "json")
|
||
|
|
now := time.Date(2026, 9, 30, 12, 0, 0, 0, time.UTC)
|
||
|
|
earner := &missingEarnerFake{earned: 3}
|
||
|
|
job := NewEarningBackfillJob(earner)
|
||
|
|
job.now = func() time.Time { return now }
|
||
|
|
|
||
|
|
assert.Equal(t, 3, job.RunOnce(context.Background()))
|
||
|
|
assert.Equal(t, now.Add(-72*time.Hour), earner.since, "looks back three days")
|
||
|
|
assert.Equal(t, earningBackfillMaxOrders, earner.max)
|
||
|
|
|
||
|
|
// A failing run is logged, not fatal.
|
||
|
|
earner.earned, earner.err = 0, errors.New("db down")
|
||
|
|
assert.Equal(t, 0, job.RunOnce(context.Background()))
|
||
|
|
|
||
|
|
job.Start(time.Hour)
|
||
|
|
job.Stop()
|
||
|
|
job.Stop()
|
||
|
|
}
|