Skip to content

Commit

Permalink
test(maintenance): refacto how we test
Browse files Browse the repository at this point in the history
  • Loading branch information
curzolapierre committed Jul 18, 2023
1 parent d5fb53a commit a95f584
Showing 1 changed file with 44 additions and 48 deletions.
92 changes: 44 additions & 48 deletions db/maintenance/info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,71 +5,67 @@ import (
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/Scalingo/cli/utils"
"github.com/Scalingo/go-scalingo/v6"
)

type test struct {
maintenanceStatuses []scalingo.MaintenanceStatus
expectedRunTime time.Time
maintenanceRunDate time.Time
}

func TestGetNextMaintenanceLocalWindow(t *testing.T) {
now := dateOfTheWeekUTC(time.Wednesday, 8)
now := dateAt(t, "Wednesday, 19-Jul-23 08:00:00 UTC")

tests := map[string]struct {
maintenanceTimeData time.Time
expectedMaintenanceRunTime func(time.Time, scalingo.MaintenanceStatus) time.Time
}{
"it should be executed next week": {
maintenanceTimeData: dateOfTheWeekUTC(time.Sunday, 0),
expectedMaintenanceRunTime: func(maintenanceData time.Time, _ scalingo.MaintenanceStatus) time.Time {
return maintenanceData.AddDate(0, 0, 7)
},
tests := map[string]test{
"when the maintenance is notified, queued or scheduled, the maintenance should be executed a week later when execution date is in the past": {
maintenanceStatuses: []scalingo.MaintenanceStatus{scalingo.MaintenanceStatusNotified, scalingo.MaintenanceStatusQueued, scalingo.MaintenanceStatusScheduled},
maintenanceRunDate: dateAt(t, "Sunday, 16-Jul-23 00:00:00 UTC"),
expectedRunTime: dateAt(t, "Sunday, 23-Jul-23 00:00:00 UTC"),
},
"it should be ongoing": {
maintenanceTimeData: dateOfTheWeekUTC(time.Wednesday, 7),
expectedMaintenanceRunTime: func(maintenanceData time.Time, maintenanceType scalingo.MaintenanceStatus) time.Time {
if maintenanceType == scalingo.MaintenanceStatusScheduled {
return maintenanceData.AddDate(0, 0, 7)
}
return maintenanceData
},
"when the maintenance is notified or queued, the maintenance should be ongoing when execution date is within maintenance boundaries": {
maintenanceStatuses: []scalingo.MaintenanceStatus{scalingo.MaintenanceStatusNotified, scalingo.MaintenanceStatusQueued},
maintenanceRunDate: dateAt(t, "Wednesday, 19-Jul-23 07:00:00 UTC"),
expectedRunTime: dateAt(t, "Wednesday, 19-Jul-23 07:00:00 UTC"),
},
"it should be executed this week": {
maintenanceTimeData: dateOfTheWeekUTC(time.Saturday, 7),
expectedMaintenanceRunTime: func(maintenanceData time.Time, maintenanceType scalingo.MaintenanceStatus) time.Time {
return maintenanceData
},
"when the maintenance is scheduled, the maintenance should be executed when execution date is within maintenance boundaries": {
maintenanceStatuses: []scalingo.MaintenanceStatus{scalingo.MaintenanceStatusScheduled},
maintenanceRunDate: dateAt(t, "Wednesday, 19-Jul-23 07:00:00 UTC"),
expectedRunTime: dateAt(t, "Saturday, 26-Jul-23 07:00:00 UTC"),
},
"when the maintenance is notified, queued or scheduled, the maintenance should be executed this week when execution date in future": {
maintenanceStatuses: []scalingo.MaintenanceStatus{scalingo.MaintenanceStatusNotified, scalingo.MaintenanceStatusQueued, scalingo.MaintenanceStatusScheduled},
maintenanceRunDate: dateAt(t, "Saturday, 22-Jul-23 07:00:00 UTC"),
expectedRunTime: dateAt(t, "Saturday, 22-Jul-23 07:00:00 UTC"),
},
}
for _, maintenanceType := range []scalingo.MaintenanceStatus{
scalingo.MaintenanceStatusNotified,
scalingo.MaintenanceStatusQueued,
scalingo.MaintenanceStatusScheduled,
} {
for testName, test := range tests {
t.Run("when the maintenance is "+string(maintenanceType)+"/"+testName, func(t *testing.T) {
// given
expectedRunTime := test.expectedMaintenanceRunTime(test.maintenanceTimeData, maintenanceType)

maintenanceWindow := scalingo.MaintenanceWindow{
WeekdayUTC: int(test.maintenanceTimeData.Weekday()),
StartingHourUTC: test.maintenanceTimeData.Hour(),
DurationInHour: 8,
}
for testName, test := range tests {
t.Run(testName, func(t *testing.T) {
maintenanceWindow := scalingo.MaintenanceWindow{
WeekdayUTC: int(test.maintenanceRunDate.Weekday()),
StartingHourUTC: test.maintenanceRunDate.Hour(),
DurationInHour: 8,
}

for _, status := range test.maintenanceStatuses {
// when
nextExec, untilExec := getNextLocalMaintenanceWindow(now, maintenanceWindow, maintenanceType)
nextExec, untilExec := getNextLocalMaintenanceWindow(now, maintenanceWindow, status)

// Then
assert.Equal(t, expectedRunTime.Local(), nextExec)
assert.Equal(t, expectedRunTime.Local().Add(time.Duration(maintenanceWindow.DurationInHour)*time.Hour), untilExec)
})
}
assert.Equal(t, test.expectedRunTime.Local(), nextExec)
assert.Equal(t, test.expectedRunTime.Local().Add(time.Duration(maintenanceWindow.DurationInHour)*time.Hour), untilExec)
}
})
}
}

func dateOfTheWeekUTC(weekday time.Weekday, hour int) time.Time {
date := utils.BeginningOfWeek(time.Now().In(time.UTC))
date = date.AddDate(0, 0, int(weekday)-1)
date = date.Add(time.Duration(hour) * time.Hour)
func dateAt(t *testing.T, date string) time.Time {
parsedTime, err := time.Parse(time.RFC850, date)

require.NoError(t, err)

return date
return parsedTime
}

0 comments on commit a95f584

Please sign in to comment.