// 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)
		}
	}
}
