status_test.go

  1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
  2//
  3// SPDX-License-Identifier: AGPL-3.0-or-later
  4
  5package lunatask_test
  6
  7import (
  8	"encoding/json"
  9	"testing"
 10
 11	lunatask "git.secluded.site/go-lunatask"
 12)
 13
 14func TestAllTaskStatuses(t *testing.T) {
 15	t.Parallel()
 16
 17	statuses := lunatask.AllTaskStatuses()
 18
 19	// Check count
 20	if got := len(statuses); got != 5 {
 21		t.Fatalf("AllTaskStatuses() returned %d values, want 5", got)
 22	}
 23
 24	// Check order
 25	expected := []lunatask.TaskStatus{
 26		lunatask.StatusLater,
 27		lunatask.StatusNext,
 28		lunatask.StatusInProgress,
 29		lunatask.StatusWaiting,
 30		lunatask.StatusCompleted,
 31	}
 32	for i, want := range expected {
 33		if statuses[i] != want {
 34			t.Errorf("AllTaskStatuses()[%d] = %q, want %q", i, statuses[i], want)
 35		}
 36	}
 37
 38	// Check roundtrip: each value should be parseable
 39	for _, status := range statuses {
 40		parsed, err := lunatask.ParseTaskStatus(status.String())
 41		if err != nil {
 42			t.Errorf("ParseTaskStatus(%q) failed: %v", status.String(), err)
 43		}
 44
 45		if parsed != status {
 46			t.Errorf("ParseTaskStatus(%q) = %q, want %q", status.String(), parsed, status)
 47		}
 48	}
 49}
 50
 51func TestParseTaskStatus(t *testing.T) {
 52	t.Parallel()
 53
 54	tests := []struct {
 55		name    string
 56		input   string
 57		want    lunatask.TaskStatus
 58		wantErr bool
 59	}{
 60		{"later_lower", "later", lunatask.StatusLater, false},
 61		{"later_upper", "LATER", lunatask.StatusLater, false},
 62		{"later_mixed", "LaTeR", lunatask.StatusLater, false},
 63		{"next_lower", "next", lunatask.StatusNext, false},
 64		{"next_upper", "NEXT", lunatask.StatusNext, false},
 65		{"in_progress_lower", "in-progress", lunatask.StatusInProgress, false},
 66		{"in_progress_upper", "IN-PROGRESS", lunatask.StatusInProgress, false},
 67		{"in_progress_mixed", "In-Progress", lunatask.StatusInProgress, false},
 68		{"waiting_lower", "waiting", lunatask.StatusWaiting, false},
 69		{"waiting_upper", "WAITING", lunatask.StatusWaiting, false},
 70		{"completed_lower", "completed", lunatask.StatusCompleted, false},
 71		{"completed_upper", "COMPLETED", lunatask.StatusCompleted, false},
 72		{"completed_mixed", "CoMpLeTeD", lunatask.StatusCompleted, false},
 73		{"invalid", "invalid", "", true},
 74		{"empty", "", "", true},
 75		{"numeric", "1", "", true},
 76		{"typo", "completd", "", true},
 77	}
 78
 79	for _, testCase := range tests {
 80		t.Run(testCase.name, func(t *testing.T) {
 81			t.Parallel()
 82
 83			got, err := lunatask.ParseTaskStatus(testCase.input)
 84			if (err != nil) != testCase.wantErr {
 85				t.Errorf("ParseTaskStatus(%q) error = %v, wantErr %v", testCase.input, err, testCase.wantErr)
 86
 87				return
 88			}
 89
 90			if !testCase.wantErr && got != testCase.want {
 91				t.Errorf("ParseTaskStatus(%q) = %q, want %q", testCase.input, got, testCase.want)
 92			}
 93		})
 94	}
 95}
 96
 97func TestTaskStatus_MarshalJSON(t *testing.T) {
 98	t.Parallel()
 99
100	tests := []struct {
101		name  string
102		value lunatask.TaskStatus
103		want  string
104	}{
105		{"later", lunatask.StatusLater, `"later"`},
106		{"next", lunatask.StatusNext, `"next"`},
107		{"in_progress_to_started", lunatask.StatusInProgress, `"started"`},
108		{"waiting", lunatask.StatusWaiting, `"waiting"`},
109		{"completed", lunatask.StatusCompleted, `"completed"`},
110	}
111
112	for _, testCase := range tests {
113		t.Run(testCase.name, func(t *testing.T) {
114			t.Parallel()
115
116			got, err := json.Marshal(testCase.value)
117			if err != nil {
118				t.Fatalf("Marshal error: %v", err)
119			}
120
121			if string(got) != testCase.want {
122				t.Errorf("json.Marshal(%q) = %s, want %s", testCase.value, got, testCase.want)
123			}
124		})
125	}
126}
127
128func TestTaskStatus_UnmarshalJSON(t *testing.T) {
129	t.Parallel()
130
131	tests := []struct {
132		name    string
133		input   string
134		want    lunatask.TaskStatus
135		wantErr bool
136	}{
137		{"later", `"later"`, lunatask.StatusLater, false},
138		{"next", `"next"`, lunatask.StatusNext, false},
139		{"started_to_in_progress", `"started"`, lunatask.StatusInProgress, false},
140		{"in_progress", `"in-progress"`, lunatask.StatusInProgress, false},
141		{"waiting", `"waiting"`, lunatask.StatusWaiting, false},
142		{"completed", `"completed"`, lunatask.StatusCompleted, false},
143		{"invalid_type", `123`, "", true},
144	}
145
146	for _, testCase := range tests {
147		t.Run(testCase.name, func(t *testing.T) {
148			t.Parallel()
149
150			var got lunatask.TaskStatus
151
152			err := json.Unmarshal([]byte(testCase.input), &got)
153
154			if (err != nil) != testCase.wantErr {
155				t.Errorf("Unmarshal error = %v, wantErr %v", err, testCase.wantErr)
156
157				return
158			}
159
160			if !testCase.wantErr && got != testCase.want {
161				t.Errorf("Unmarshal(%s) = %q, want %q", testCase.input, got, testCase.want)
162			}
163		})
164	}
165}