Skip to content

Commit d868cf6

Browse files
committed
add tests
1 parent 3d7d7f3 commit d868cf6

File tree

5 files changed

+124
-7
lines changed

5 files changed

+124
-7
lines changed

internal/types/duration.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ var (
1212
errBeginTimeIsInvalid = errors.New("begin time is invalid")
1313
errEndTimeIsInvalid = errors.New("end time is invalid")
1414
errEndTimeBeforeBeginTime = errors.New("end time is before begin time")
15-
errDurationNotLongEnough = errors.New("end time needs to be atleast a minute after begin time")
15+
errDurationNotLongEnough = errors.New("end time needs to be at least a minute after begin time")
1616
)
1717

18-
func GetTaskLogTimes(beginStr, endStr string) (time.Time, time.Time, error) {
18+
func ParseTaskLogTimes(beginStr, endStr string) (time.Time, time.Time, error) {
1919
var zero time.Time
2020
if strings.TrimSpace(beginStr) == "" {
2121
return zero, zero, errBeginTimeIsEmpty
@@ -48,7 +48,7 @@ func IsTaskLogDurationValid(begin, end time.Time) error {
4848
return errEndTimeBeforeBeginTime
4949
}
5050

51-
if end.Sub(begin).Seconds() < 60 {
51+
if end.Sub(begin) < time.Minute {
5252
return errDurationNotLongEnough
5353
}
5454
return nil

internal/types/duration_test.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package types
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestParseTaskLogTimes(t *testing.T) {
11+
testCases := []struct {
12+
name string
13+
beginStr string
14+
endStr string
15+
err error
16+
}{
17+
// Successes
18+
{
19+
name: "valid times - less than an hour",
20+
beginStr: "2025/08/08 00:40",
21+
endStr: "2025/08/08 00:48",
22+
},
23+
{
24+
name: "valid times - exact hour",
25+
beginStr: "2025/08/08 00:00",
26+
endStr: "2025/08/08 01:00",
27+
},
28+
{
29+
name: "valid times - hours and minutes",
30+
beginStr: "2025/08/08 00:00",
31+
endStr: "2025/08/08 02:30",
32+
},
33+
{
34+
name: "valid times - across day boundary",
35+
beginStr: "2025/08/08 23:30",
36+
endStr: "2025/08/09 00:15",
37+
},
38+
{
39+
name: "valid times - exactly at 8h",
40+
beginStr: "2025/08/08 00:00",
41+
endStr: "2025/08/08 08:00",
42+
},
43+
{
44+
name: "valid times - very long duration",
45+
beginStr: "2025/08/08 00:00",
46+
endStr: "2025/08/09 02:00",
47+
},
48+
{
49+
name: "valid times - exactly one minute",
50+
beginStr: "2025/08/08 00:00",
51+
endStr: "2025/08/08 00:01",
52+
},
53+
// Failures
54+
{
55+
name: "empty begin time",
56+
beginStr: "",
57+
endStr: "2025/08/08 00:10",
58+
err: errBeginTimeIsEmpty,
59+
},
60+
{
61+
name: "empty end time",
62+
beginStr: "2025/08/08 00:10",
63+
endStr: "",
64+
err: errEndTimeIsEmpty,
65+
},
66+
{
67+
name: "begin time as whitespace only",
68+
beginStr: " ",
69+
endStr: "2025/08/08 00:10",
70+
err: errBeginTimeIsEmpty,
71+
},
72+
{
73+
name: "end time as whitespace only",
74+
beginStr: "2025/08/08 00:10",
75+
endStr: " ",
76+
err: errEndTimeIsEmpty,
77+
},
78+
{
79+
name: "invalid begin time format",
80+
beginStr: "2025-08-08 00:10",
81+
endStr: "2025/08/08 00:20",
82+
err: errBeginTimeIsInvalid,
83+
},
84+
{
85+
name: "invalid end time format",
86+
beginStr: "2025/08/08 00:10",
87+
endStr: "08-08-2025 00:20",
88+
err: errEndTimeIsInvalid,
89+
},
90+
{
91+
name: "end time before begin time",
92+
beginStr: "2025/08/08 01:00",
93+
endStr: "2025/08/08 00:59",
94+
err: errEndTimeBeforeBeginTime,
95+
},
96+
{
97+
name: "zero duration",
98+
beginStr: "2025/08/08 00:00",
99+
endStr: "2025/08/08 00:00",
100+
err: errDurationNotLongEnough,
101+
},
102+
}
103+
104+
for _, tt := range testCases {
105+
t.Run(tt.name, func(t *testing.T) {
106+
beginTS, endTS, err := ParseTaskLogTimes(tt.beginStr, tt.endStr)
107+
108+
if tt.err != nil {
109+
require.ErrorIs(t, err, tt.err)
110+
} else {
111+
require.NoError(t, err)
112+
assert.False(t, beginTS.IsZero())
113+
assert.False(t, endTS.IsZero())
114+
}
115+
})
116+
}
117+
}

internal/ui/__snapshots__/TestFinishActiveTLViewWhereNoTimeTracked_1.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
2727
2828

29-
Error: end time needs to be atleast a minute after begin time
29+
Error: end time needs to be at least a minute after begin time
3030

3131

3232

internal/ui/handle.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (m *Model) getCmdToUpdateActiveTL() tea.Cmd {
6868
}
6969

7070
func (m *Model) getCmdToFinishTrackingActiveTL() tea.Cmd {
71-
beginTS, endTS, err := types.GetTaskLogTimes(m.tLInputs[entryBeginTS].Value(), m.tLInputs[entryEndTS].Value())
71+
beginTS, endTS, err := types.ParseTaskLogTimes(m.tLInputs[entryBeginTS].Value(), m.tLInputs[entryEndTS].Value())
7272
if err != nil {
7373
return nil
7474
}
@@ -105,7 +105,7 @@ func (m *Model) getCmdToFinishActiveTLWithoutComment() tea.Cmd {
105105
}
106106

107107
func (m *Model) getCmdToCreateOrEditTL() tea.Cmd {
108-
beginTS, endTS, err := types.GetTaskLogTimes(m.tLInputs[entryBeginTS].Value(), m.tLInputs[entryEndTS].Value())
108+
beginTS, endTS, err := types.ParseTaskLogTimes(m.tLInputs[entryBeginTS].Value(), m.tLInputs[entryEndTS].Value())
109109
if err != nil {
110110
return nil
111111
}

internal/ui/view.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ func (m recordsModel) View() string {
369369
}
370370

371371
func getDurationValidityContext(beginStr, endStr string) (string, tlFormValidity) {
372-
beginTS, endTS, err := types.GetTaskLogTimes(beginStr, endStr)
372+
beginTS, endTS, err := types.ParseTaskLogTimes(beginStr, endStr)
373373
if err != nil {
374374
return fmt.Sprintf("Error: %s", err.Error()), tlSubmitErr
375375
}

0 commit comments

Comments
 (0)