Add unittests for month
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Jan Bader 2022-04-06 22:16:50 +00:00
parent 35690681cf
commit 8fe91293e1
5 changed files with 111 additions and 69 deletions

View File

@ -88,7 +88,7 @@ func (*Handler) getAvailableBalance(budget postgres.Budget, month Month,
continue continue
} }
if !month.InPast(bal.Date) { if month.InFuture(bal.Date) {
continue continue
} }

View File

@ -245,6 +245,15 @@ func (h Handler) CheckAvailableBalance(ctx context.Context, t *testing.T, testCa
}) })
} }
func AssertEqualBool(t *testing.T, expected, actual bool, message string) {
t.Helper()
if expected == actual {
return
}
t.Errorf("%s: expected %v, got %v", message, expected, actual)
}
func assertEqual(t *testing.T, expected, actual float64, message string) { func assertEqual(t *testing.T, expected, actual float64, message string) {
t.Helper() t.Helper()
if expected == actual { if expected == actual {

55
server/month.go Normal file
View File

@ -0,0 +1,55 @@
package server
import (
"fmt"
"time"
)
type Month struct {
Year int
Month int
}
func NewFromTime(date time.Time) Month {
return Month{date.Year(), int(date.Month())}
}
func (m Month) String() string {
return fmt.Sprintf("%d-%d", m.Year, m.Month)
}
func (m Month) FirstOfMonth() time.Time {
return time.Date(m.Year, time.Month(m.Month), 1, 0, 0, 0, 0, time.Now().Location())
}
func (m Month) InFuture(date time.Time) bool {
if m.Year < date.Year() {
return true
}
if m.Year > date.Year() {
return false
}
return time.Month(m.Month) < date.Month()
}
func (m Month) InPast(date time.Time) bool {
if m.Year > date.Year() {
return true
}
if m.Year < date.Year() {
return false
}
return time.Month(m.Month) > date.Month()
}
func (m Month) InPresent(date time.Time) bool {
if date.Year() != m.Year {
return false
}
return date.Month() == time.Month(m.Month)
}

46
server/month_test.go Normal file
View File

@ -0,0 +1,46 @@
package server_test
import (
"testing"
"time"
"git.javil.eu/jacob1123/budgeteer/server"
)
type TestCaseCompare struct {
Value server.Month
Date time.Time
InPast bool
InPresent bool
InFuture bool
}
func TestComparisons(t *testing.T) {
t.Parallel()
loc := time.Now().Location()
tests := []TestCaseCompare{
{server.Month{2022, 2}, time.Date(2022, 3, 1, 0, 0, 0, 0, loc), false, false, true},
{server.Month{2022, 3}, time.Date(2022, 3, 1, 0, 0, 0, 0, loc), false, true, false},
{server.Month{2022, 4}, time.Date(2022, 3, 1, 0, 0, 0, 0, loc), true, false, false},
{server.Month{2022, 2}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), false, false, true},
{server.Month{2022, 3}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), false, true, false},
{server.Month{2022, 4}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), true, false, false},
{server.Month{2021, 2}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), false, false, true},
{server.Month{2021, 3}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), false, false, true},
{server.Month{2021, 4}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), false, false, true},
{server.Month{2023, 2}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), true, false, false},
{server.Month{2023, 3}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), true, false, false},
{server.Month{2023, 4}, time.Date(2022, 3, 31, 0, 0, 0, 0, loc), true, false, false},
{server.Month{2021, 11}, time.Date(2021, 12, 1, 0, 0, 0, 0, loc), false, false, true},
}
for i := range tests { //nolint:paralleltest
test := tests[i]
t.Run(test.Date.Format("2006-01-02")+" is in of "+test.Value.String(), func(t *testing.T) {
t.Parallel()
server.AssertEqualBool(t, test.InPast, test.Value.InPast(test.Date), "in past")
server.AssertEqualBool(t, test.InPresent, test.Value.InPresent(test.Date), "in present")
server.AssertEqualBool(t, test.InFuture, test.Value.InFuture(test.Date), "in future")
})
}
}

View File

@ -8,74 +8,6 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
type Month struct {
Year int
Month int
}
func NewFromTime(date time.Time) Month {
return Month{date.Year(), int(date.Month())}
}
func (m Month) String() string {
return fmt.Sprintf("%d-%d", m.Year, m.Month)
}
func (m Month) FirstOfMonth() time.Time {
return time.Date(m.Year, time.Month(m.Month), 1, 0, 0, 0, 0, time.Now().Location())
}
func (m Month) nextMonth() Month {
if m.Month == 12 {
return Month{m.Year + 1, 1}
}
return Month{m.Year, m.Month}
}
func (m Month) InFuture(date time.Time) bool {
if m.Year < date.Year() {
return true
}
if m.Year > date.Year() {
return false
}
return time.Month(m.Month) < date.Month()
}
func (m Month) isBeforeOrContains(date time.Time) bool {
if m.Year < date.Year() {
return true
}
if m.Year > date.Year() {
return false
}
return time.Month(m.Month) <= date.Month()
}
func (m Month) InPast(date time.Time) bool {
if m.Year > date.Year() {
return false
}
if m.Year < date.Year() {
return true
}
return time.Month(m.Month) > date.Month()
}
func (m Month) InPresent(date time.Time) bool {
if date.Year() != m.Year {
return false
}
return date.Month() == time.Month(m.Month)
}
func getDate(c *gin.Context) (Month, error) { func getDate(c *gin.Context) (Month, error) {
var year, month int var year, month int
yearString := c.Param("year") yearString := c.Param("year")