Skip to content

Commit 3cf8057

Browse files
author
Ross
committed
Add unit testing and better error catching
1 parent 33098b5 commit 3cf8057

2 files changed

Lines changed: 184 additions & 3 deletions

File tree

main.go

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ var opts struct {
3333
MaxObjects int64 `short:"m" long:"max" description:"maximum number of s3 object to list" default:"1000" env:"TAG_MONGER_MAX"`
3434
Bucket string `short:"b" long:"bucket" description:"name of s3 bucket" required:"true" env:"TAG_MONGER_BUCKET"`
3535
Days int `short:"d" long:"days" description:"Expire tags older than N days" default:"14" env:"TAG_MONGER_DAYS"`
36-
Weeks int `short:"w" long:"weeks" description:"Expire weekly tags older than N weeks" default:"12" env:"TAG_MONGER_WEEKS"`
36+
Weeks int `short:"w" long:"weeks" description:"Expire weekly tags older than N weeks" default:"14" env:"TAG_MONGER_WEEKS"`
3737
Noop bool `short:"n" long:"noop" description:"Do not make any changes" env:"TAG_MONGER_NOOP"`
3838
Group struct {
3939
Help bool `short:"h" long:"help" description:"Show this help message"`
@@ -49,6 +49,31 @@ func bod(t time.Time) time.Time {
4949
func parse_d_tag(tag string) (t time.Time, err error) {
5050
const shortForm = "d_2006_01_02"
5151

52+
parts := strings.Split(tag, "_")
53+
if len(parts) != 4{
54+
return time.Time{}, fmt.Errorf("Got invalid format")
55+
}
56+
if strings.ToLower(parts[0]) != "d" {
57+
return time.Time{}, fmt.Errorf("Got the wrong tag, should be a daily, got %s",parts[0])
58+
}
59+
month, err := strconv.Atoi((parts[2]))
60+
if err != nil{
61+
return time.Time{}, err
62+
}
63+
day, err := strconv.Atoi((parts[3]))
64+
if err != nil{
65+
return time.Time{}, err
66+
}
67+
if len(parts[1]) != 4 {
68+
return time.Time{}, fmt.Errorf("Got the wrong year format, got %s",parts[1])
69+
}
70+
if len(parts[2]) != 2 || month >12 || month<01{
71+
return time.Time{}, fmt.Errorf("Got the wrong month format, got %s",parts[2])
72+
}
73+
if len(parts[3]) != 2 || day >31 || day <01{
74+
return time.Time{}, fmt.Errorf("Got the wrong day format, got %s",parts[2])
75+
}
76+
5277
t, err = time.Parse(shortForm, tag)
5378
return t, err
5479
}
@@ -58,6 +83,15 @@ func parse_w_tag(tag string) (t time.Time, err error) {
5883
if len(parts) != 3{
5984
return time.Time{}, err
6085
}
86+
if strings.ToLower(parts[0]) != "w" {
87+
return time.Time{}, fmt.Errorf("Got the wrong tag, should be a weekly, got %s",parts[0])
88+
}
89+
if len(parts[1]) != 4 {
90+
return time.Time{}, fmt.Errorf("Got the wrong year format, got %s",parts[1])
91+
}
92+
if len(parts[2]) != 2 {
93+
return time.Time{}, fmt.Errorf("Got the wrong week format, got %s",parts[2])
94+
}
6195
year, err := strconv.Atoi((parts[1]))
6296
if err != nil {
6397
return time.Time{}, err
@@ -66,9 +100,12 @@ func parse_w_tag(tag string) (t time.Time, err error) {
66100
if err != nil {
67101
return time.Time{}, err
68102
}
103+
if week >=53 || week <=0 {
104+
return time.Time{}, fmt.Errorf("invalid week")
105+
}
69106
// ISO week date format
70107
// Get time for first day of the given year and week
71-
t = time.Date(year, 0, 0, 0, 0, 0, 0, time.UTC)
108+
t = time.Date(year, 1, 0, 0, 0, 0, 0, time.UTC)
72109
t = t.AddDate(0, 0, (week-1)*7+1)
73110
return t, nil
74111
}
@@ -259,7 +296,7 @@ func run() error {
259296
w_fresh_objs,w_expired_objs,w_retired_objs,err := parse_objects(
260297
weekly_taglike_objs,
261298
"America/Los_Angeles",
262-
opts.Weeks)
299+
opts.Weeks*7)
263300
if err != nil {
264301
return err
265302
}

main_test.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
"time"
6+
)
7+
8+
func TestDailyParser(t *testing.T){
9+
tests := []struct{
10+
name string
11+
tag string
12+
expected time.Time
13+
wantErr bool
14+
}{
15+
{
16+
name: "valid begining of the year tag",
17+
tag: "d_2024_01_01",
18+
expected: time.Date(2024,1,1,0,0,0,0,time.UTC),
19+
wantErr: false,
20+
},
21+
{
22+
name: "valid may 21 2025",
23+
tag: "d_2025_05_21",
24+
expected: time.Date(2025,5,21,0,0,0,0,time.UTC),
25+
wantErr: false,
26+
},
27+
{
28+
name: "invalid daily",
29+
tag: "d_2025_05",
30+
wantErr: true,
31+
},
32+
{
33+
name: "invalid daily, impossible day format",
34+
tag: "d_2025_05_32",
35+
wantErr: true,
36+
},
37+
{
38+
name: "invalid daily, bad date format",
39+
tag: "d_2025_05_3232",
40+
wantErr: true,
41+
},
42+
{
43+
name: "invalid daily, impossible month",
44+
tag: "d_2025_14_30",
45+
wantErr: true,
46+
},
47+
{
48+
name: "invalid daily, bad year format",
49+
tag: "d_225_05_09",
50+
wantErr: true,
51+
},
52+
}
53+
for _, tt := range tests {
54+
t.Run(tt.name, func(t *testing.T){
55+
got, err := parse_d_tag(tt.tag)
56+
if (err != nil) != tt.wantErr{
57+
t.Errorf("parse_d_tag(%s) got %v, want %v. Error: %s",tt.tag, got, tt.expected, err)
58+
}
59+
if !tt.wantErr && !got.Equal(tt.expected){
60+
t.Errorf("parse_d_tag(%s) = %v, want %v",tt.tag, got, tt.expected)
61+
}
62+
})
63+
}
64+
65+
}
66+
67+
func TestWeeklyParser(t *testing.T) {
68+
tests := []struct{
69+
name string
70+
tag string
71+
expected time.Time
72+
wantErr bool
73+
}{
74+
{
75+
name: "valid begining of the year tag",
76+
tag: "W_2024_01",
77+
expected: time.Date(2024,1,1,0,0,0,0,time.UTC),
78+
wantErr: false,
79+
},
80+
{
81+
name: "valid may 21 2025",
82+
tag: "w_2025_21",
83+
expected: time.Date(2025,5,21,0,0,0,0,time.UTC),
84+
wantErr: false,
85+
},
86+
{
87+
name: "valid Jan 29 2025",
88+
tag: "w_2025_05",
89+
expected: time.Date(2025,1,29,0,0,0,0,time.UTC),
90+
wantErr: false,
91+
},
92+
{
93+
name: "valid tag",
94+
tag: "W_2024_12",
95+
expected: time.Date(2024,3,18,0,0,0,0,time.UTC),
96+
wantErr: false,
97+
},
98+
{
99+
name: "valid ending of the year tag",
100+
tag: "W_2024_52",
101+
expected: time.Date(2024,12,23,0,0,0,0,time.UTC),
102+
wantErr: false,
103+
},
104+
{
105+
name: "valid 12/24/2025 tag",
106+
tag: "W_2025_52",
107+
expected: time.Date(2025,12,24,0,0,0,0,time.UTC),
108+
wantErr: false,
109+
},
110+
{
111+
name: "invalid tag",
112+
tag: "W_2025_df",
113+
wantErr: true,
114+
},
115+
{
116+
name: "invalid tag wrong year format",
117+
tag: "W_205_01",
118+
wantErr: true,
119+
},
120+
{
121+
name: "invalid tag wrong week format",
122+
tag: "W_2025_1",
123+
wantErr: true,
124+
},
125+
{
126+
name: "invalid tag impossible week",
127+
tag: "W_2025_54",
128+
wantErr: true,
129+
},
130+
}
131+
132+
for _, tt := range tests {
133+
t.Run(tt.name, func(t *testing.T){
134+
got, err := parse_w_tag(tt.tag)
135+
if (err != nil) != tt.wantErr{
136+
t.Errorf("parse_w_tag(%s) error = %v, want %v. ",tt.tag, got, tt.expected)
137+
}
138+
if !tt.wantErr && !got.Equal(tt.expected){
139+
t.Errorf("parse_w_tag(%s) = %v, want %v",tt.tag, got, tt.expected)
140+
}
141+
})
142+
}
143+
144+
}

0 commit comments

Comments
 (0)