From eb27b0fe1ef2819393e38374c61526a1d8a2eee8 Mon Sep 17 00:00:00 2001 From: Ken Hibino Date: Sun, 6 Mar 2022 16:51:35 -0800 Subject: [PATCH] Add TaskMessageBuilder type as a test helper --- internal/asynqtest/builder.go | 80 +++++++++++++++++++++++++ internal/asynqtest/builder_test.go | 94 ++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 internal/asynqtest/builder.go create mode 100644 internal/asynqtest/builder_test.go diff --git a/internal/asynqtest/builder.go b/internal/asynqtest/builder.go new file mode 100644 index 0000000..168725c --- /dev/null +++ b/internal/asynqtest/builder.go @@ -0,0 +1,80 @@ +// Copyright 2022 Kentaro Hibino. All rights reserved. +// Use of this source code is governed by a MIT license +// that can be found in the LICENSE file. + +package asynqtest + +import ( + "time" + + "github.com/google/uuid" + "github.com/hibiken/asynq/internal/base" +) + +func makeDefaultTaskMessage() *base.TaskMessage { + return &base.TaskMessage{ + ID: uuid.NewString(), + Type: "default_task", + Queue: "default", + Retry: 25, + Timeout: 1800, // default timeout of 30 mins + Deadline: 0, // no deadline + } +} + +type TaskMessageBuilder struct { + msg *base.TaskMessage +} + +func (b *TaskMessageBuilder) lazyInit() { + if b.msg == nil { + b.msg = makeDefaultTaskMessage() + } +} + +func (b *TaskMessageBuilder) Build() *base.TaskMessage { + b.lazyInit() + return b.msg +} + +func (b *TaskMessageBuilder) SetType(typename string) *TaskMessageBuilder { + b.lazyInit() + b.msg.Type = typename + return b +} + +func (b *TaskMessageBuilder) SetPayload(payload []byte) *TaskMessageBuilder { + b.lazyInit() + b.msg.Payload = payload + return b +} + +func (b *TaskMessageBuilder) SetQueue(qname string) *TaskMessageBuilder { + b.lazyInit() + b.msg.Queue = qname + return b +} + +func (b *TaskMessageBuilder) SetRetry(n int) *TaskMessageBuilder { + b.lazyInit() + b.msg.Retry = n + return b +} + +func (b *TaskMessageBuilder) SetTimeout(timeout time.Duration) *TaskMessageBuilder { + b.lazyInit() + b.msg.Timeout = int64(timeout.Seconds()) + return b +} + +func (b *TaskMessageBuilder) SetDeadline(deadline time.Time) *TaskMessageBuilder { + b.lazyInit() + b.msg.Deadline = deadline.Unix() + return b +} + +func (b *TaskMessageBuilder) SetGroup(gname string) *TaskMessageBuilder { + b.lazyInit() + b.msg.GroupKey = gname + return b +} diff --git a/internal/asynqtest/builder_test.go b/internal/asynqtest/builder_test.go new file mode 100644 index 0000000..93b8f6e --- /dev/null +++ b/internal/asynqtest/builder_test.go @@ -0,0 +1,94 @@ +// Copyright 2022 Kentaro Hibino. All rights reserved. +// Use of this source code is governed by a MIT license +// that can be found in the LICENSE file. + +package asynqtest + +import ( + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/hibiken/asynq/internal/base" +) + +func TestTaskMessageBuilder(t *testing.T) { + tests := []struct { + desc string + ops func(b *TaskMessageBuilder) // operations to perform on the builder + want *base.TaskMessage + }{ + { + desc: "zero value and build", + ops: nil, + want: &base.TaskMessage{ + Type: "default_task", + Queue: "default", + Payload: nil, + Retry: 25, + Timeout: 1800, // 30m + Deadline: 0, + }, + }, + { + desc: "with type, payload, and queue", + ops: func(b *TaskMessageBuilder) { + b.SetType("foo").SetPayload([]byte("hello")).SetQueue("myqueue") + }, + want: &base.TaskMessage{ + Type: "foo", + Queue: "myqueue", + Payload: []byte("hello"), + Retry: 25, + Timeout: 1800, // 30m + Deadline: 0, + }, + }, + { + desc: "with retry, timeout, and deadline", + ops: func(b *TaskMessageBuilder) { + b.SetRetry(1). + SetTimeout(20 * time.Second). + SetDeadline(time.Date(2017, 3, 6, 0, 0, 0, 0, time.UTC)) + }, + want: &base.TaskMessage{ + Type: "default_task", + Queue: "default", + Payload: nil, + Retry: 1, + Timeout: 20, + Deadline: time.Date(2017, 3, 6, 0, 0, 0, 0, time.UTC).Unix(), + }, + }, + { + desc: "with group", + ops: func(b *TaskMessageBuilder) { + b.SetGroup("mygroup") + }, + want: &base.TaskMessage{ + Type: "default_task", + Queue: "default", + Payload: nil, + Retry: 25, + Timeout: 1800, + Deadline: 0, + GroupKey: "mygroup", + }, + }, + } + cmpOpts := []cmp.Option{cmpopts.IgnoreFields(base.TaskMessage{}, "ID")} + + for _, tc := range tests { + var b TaskMessageBuilder + if tc.ops != nil { + tc.ops(&b) + } + + got := b.Build() + if diff := cmp.Diff(tc.want, got, cmpOpts...); diff != "" { + t.Errorf("%s: TaskMessageBuilder.Build() = %+v, want %+v;\n(-want,+got)\n%s", + tc.desc, got, tc.want, diff) + } + } +}