From cedfc46bd97a78551ccfe6d9bd70f47239db14fe Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Thu, 22 Dec 2022 15:40:26 -0500 Subject: [PATCH] Add more tests, add mocks. --- api4/license.go | 7 ++- store/opentracinglayer/opentracinglayer.go | 2 +- store/retrylayer/retrylayer.go | 2 +- store/retrylayer/retrylayer_test.go | 1 + store/sqlstore/true_up_review_store.go | 8 ++-- store/store.go | 2 +- store/storetest/mocks/TrueUpReviewStore.go | 8 ++-- store/timerlayer/timerlayer.go | 2 +- utils/license.go | 5 +- utils/license_test.go | 56 ++++++++++++++++++++++ 10 files changed, 78 insertions(+), 15 deletions(-) diff --git a/api4/license.go b/api4/license.go index 4e1a402ad4..2409a05071 100644 --- a/api4/license.go +++ b/api4/license.go @@ -10,6 +10,7 @@ import ( "io" "net/http" "os" + "time" "github.com/mattermost/mattermost-server/v6/services/telemetry" "github.com/mattermost/mattermost-server/v6/shared/mlog" @@ -403,7 +404,8 @@ func requestTrueUpReview(c *Context, w http.ResponseWriter, r *http.Request) { return } - dueDate := utils.GetNextTrueUpReviewDueDate() + now := time.Now().UTC() + dueDate := utils.GetNextTrueUpReviewDueDate(now) status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(dueDate) if err != nil { c.Err = model.NewAppError("trueUpReviewStatus", "api.license.true_up_review.get.fail.app_error", nil, "", http.StatusInternalServerError) @@ -445,7 +447,8 @@ func trueUpReviewStatus(c *Context, w http.ResponseWriter, r *http.Request) { return } - nextDueDate := utils.GetNextTrueUpReviewDueDate() + now := time.Now().UTC() + nextDueDate := utils.GetNextTrueUpReviewDueDate(now) status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(nextDueDate) if err != nil { c.Err = model.NewAppError("trueUpReviewStatus", "api.license.true_up_review.get.fail.app_error", nil, "", http.StatusInternalServerError) diff --git a/store/opentracinglayer/opentracinglayer.go b/store/opentracinglayer/opentracinglayer.go index 1ded368891..7537ab276f 100644 --- a/store/opentracinglayer/opentracinglayer.go +++ b/store/opentracinglayer/opentracinglayer.go @@ -10640,7 +10640,7 @@ func (s *OpenTracingLayerTrueUpReviewStore) CreateTrueUpReviewStatusRecord(revie return result, err } -func (s *OpenTracingLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate string) (*model.TrueUpReviewStatus, error) { +func (s *OpenTracingLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "TrueUpReviewStore.GetTrueUpReviewStatus") s.Root.Store.SetContext(newCtx) diff --git a/store/retrylayer/retrylayer.go b/store/retrylayer/retrylayer.go index b9f1c9f8aa..44777919e2 100644 --- a/store/retrylayer/retrylayer.go +++ b/store/retrylayer/retrylayer.go @@ -12157,7 +12157,7 @@ func (s *RetryLayerTrueUpReviewStore) CreateTrueUpReviewStatusRecord(reviewStatu } -func (s *RetryLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate string) (*model.TrueUpReviewStatus, error) { +func (s *RetryLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { tries := 0 for { diff --git a/store/retrylayer/retrylayer_test.go b/store/retrylayer/retrylayer_test.go index 701cf962f4..1bb8a677e6 100644 --- a/store/retrylayer/retrylayer_test.go +++ b/store/retrylayer/retrylayer_test.go @@ -57,6 +57,7 @@ func genStore() *mocks.Store { mock.On("Draft").Return(&mocks.DraftStore{}) mock.On("PostPriority").Return(&mocks.PostPriorityStore{}) mock.On("PostAcknowledgement").Return(&mocks.PostAcknowledgementStore{}) + mock.On("TrueUpReview").Return(&mocks.TrueUpReviewStore{}) return mock } diff --git a/store/sqlstore/true_up_review_store.go b/store/sqlstore/true_up_review_store.go index 87fd29d93f..bfb07d8b97 100644 --- a/store/sqlstore/true_up_review_store.go +++ b/store/sqlstore/true_up_review_store.go @@ -4,6 +4,8 @@ package sqlstore import ( + "time" + "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/store" sq "github.com/mattermost/squirrel" @@ -27,11 +29,11 @@ func trueUpReviewStatusColumns() []string { } } -func (s *SqlTrueUpReviewStore) GetTrueUpReviewStatus(dueDate string) (*model.TrueUpReviewStatus, error) { +func (s *SqlTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { query := s.getQueryBuilder(). Select("*"). From("TrueUpReviewHistory"). - Where(sq.Eq{"DueDate": dueDate}) + Where(sq.Eq{"DueDate": dueDate.Format("2006-01-02")}) queryString, args, err := query.ToSql() if err != nil { @@ -40,7 +42,7 @@ func (s *SqlTrueUpReviewStore) GetTrueUpReviewStatus(dueDate string) (*model.Tru var trueUpReviewStatus model.TrueUpReviewStatus if err := s.GetReplicaX().Get(&trueUpReviewStatus, queryString, args...); err != nil { trueUpReviewStatus.Completed = false - trueUpReviewStatus.DueDate = dueDate + trueUpReviewStatus.DueDate = dueDate.Format("2006-01-02") // If no record is available, create one so there is a record trail. return s.CreateTrueUpReviewStatusRecord(&trueUpReviewStatus) diff --git a/store/store.go b/store/store.go index 346bfee7ca..fbc28e6d7d 100644 --- a/store/store.go +++ b/store/store.go @@ -1000,7 +1000,7 @@ type PostAcknowledgementStore interface { } type TrueUpReviewStore interface { - GetTrueUpReviewStatus(dueDate string) (*model.TrueUpReviewStatus, error) + GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) CreateTrueUpReviewStatusRecord(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) } diff --git a/store/storetest/mocks/TrueUpReviewStore.go b/store/storetest/mocks/TrueUpReviewStore.go index fcffe843f3..6eb602ea75 100644 --- a/store/storetest/mocks/TrueUpReviewStore.go +++ b/store/storetest/mocks/TrueUpReviewStore.go @@ -7,6 +7,8 @@ package mocks import ( model "github.com/mattermost/mattermost-server/v6/model" mock "github.com/stretchr/testify/mock" + + time "time" ) // TrueUpReviewStore is an autogenerated mock type for the TrueUpReviewStore type @@ -38,11 +40,11 @@ func (_m *TrueUpReviewStore) CreateTrueUpReviewStatusRecord(reviewStatus *model. } // GetTrueUpReviewStatus provides a mock function with given fields: dueDate -func (_m *TrueUpReviewStore) GetTrueUpReviewStatus(dueDate string) (*model.TrueUpReviewStatus, error) { +func (_m *TrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { ret := _m.Called(dueDate) var r0 *model.TrueUpReviewStatus - if rf, ok := ret.Get(0).(func(string) *model.TrueUpReviewStatus); ok { + if rf, ok := ret.Get(0).(func(time.Time) *model.TrueUpReviewStatus); ok { r0 = rf(dueDate) } else { if ret.Get(0) != nil { @@ -51,7 +53,7 @@ func (_m *TrueUpReviewStore) GetTrueUpReviewStatus(dueDate string) (*model.TrueU } var r1 error - if rf, ok := ret.Get(1).(func(string) error); ok { + if rf, ok := ret.Get(1).(func(time.Time) error); ok { r1 = rf(dueDate) } else { r1 = ret.Error(1) diff --git a/store/timerlayer/timerlayer.go b/store/timerlayer/timerlayer.go index e08402764f..eee6613062 100644 --- a/store/timerlayer/timerlayer.go +++ b/store/timerlayer/timerlayer.go @@ -9575,7 +9575,7 @@ func (s *TimerLayerTrueUpReviewStore) CreateTrueUpReviewStatusRecord(reviewStatu return result, err } -func (s *TimerLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate string) (*model.TrueUpReviewStatus, error) { +func (s *TimerLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { start := time.Now() result, err := s.TrueUpReviewStore.GetTrueUpReviewStatus(dueDate) diff --git a/utils/license.go b/utils/license.go index 3d2c242d81..69435f7a43 100644 --- a/utils/license.go +++ b/utils/license.go @@ -229,8 +229,7 @@ func GetSanitizedClientLicense(l map[string]string) map[string]string { return sanitizedLicense } -func GetNextTrueUpReviewDueDate() string { - now := time.Now().UTC() +func GetNextTrueUpReviewDueDate(now time.Time) time.Time { quaterEndMonths := []time.Month{time.March, time.June, time.September, time.December} var nextQuaterEndMonth time.Month = time.March @@ -244,5 +243,5 @@ func GetNextTrueUpReviewDueDate() string { } } - return time.Date(now.Year(), nextQuaterEndMonth, TrueUpReviewDueDay, 0, 0, 0, 0, now.Location()).Format("2006-01-02") + return time.Date(now.Year(), nextQuaterEndMonth, TrueUpReviewDueDay, 0, 0, 0, 0, now.Location()) } diff --git a/utils/license_test.go b/utils/license_test.go index 8c57685444..541fda3227 100644 --- a/utils/license_test.go +++ b/utils/license_test.go @@ -8,6 +8,7 @@ import ( "encoding/base64" "os" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -91,3 +92,58 @@ func TestGetLicenseFileFromDisk(t *testing.T) { assert.False(t, success, "should have been an invalid file") }) } + +func TestGetNextTrueUpReviewDueDate(t *testing.T) { + t.Run("Due date always falls on the 15th", func(t *testing.T) { + // Before the 15th + now := time.Date(2022, 12, 14, 0, 0, 0, 0, time.Local) + due := GetNextTrueUpReviewDueDate(now) + assert.Equal(t, due.Day(), TrueUpReviewDueDay) + + // On the 15th + now = time.Date(2022, 12, 15, 0, 0, 0, 0, time.Local) + due = GetNextTrueUpReviewDueDate(now) + assert.Equal(t, due.Day(), TrueUpReviewDueDay) + + // After the 15th + now = time.Date(2022, 12, 16, 0, 0, 0, 0, time.Local) + due = GetNextTrueUpReviewDueDate(now) + assert.Equal(t, due.Day(), TrueUpReviewDueDay) + }) + + t.Run("Due date will always be in next quater if the current date is past the 15th", func(t *testing.T) { + now := time.Date(2022, time.March, 16, 0, 0, 0, 0, time.Local) + due := GetNextTrueUpReviewDueDate(now) + assert.Equal(t, time.June, due.Month()) + + now = time.Date(2022, time.June, 16, 0, 0, 0, 0, time.Local) + due = GetNextTrueUpReviewDueDate(now) + assert.Equal(t, time.September, due.Month()) + + now = time.Date(2022, time.September, 16, 0, 0, 0, 0, time.Local) + due = GetNextTrueUpReviewDueDate(now) + assert.Equal(t, time.December, due.Month()) + + now = time.Date(2022, time.December, 16, 0, 0, 0, 0, time.Local) + due = GetNextTrueUpReviewDueDate(now) + assert.Equal(t, time.March, due.Month()) + }) + + t.Run("Due date will always be in the current quater if the current date is before or on the 15th", func(t *testing.T) { + now := time.Date(2022, time.March, 15, 0, 0, 0, 0, time.Local) + due := GetNextTrueUpReviewDueDate(now) + assert.Equal(t, time.March, due.Month()) + + now = time.Date(2022, time.June, 15, 0, 0, 0, 0, time.Local) + due = GetNextTrueUpReviewDueDate(now) + assert.Equal(t, time.June, due.Month()) + + now = time.Date(2022, time.September, 14, 0, 0, 0, 0, time.Local) + due = GetNextTrueUpReviewDueDate(now) + assert.Equal(t, time.September, due.Month()) + + now = time.Date(2022, time.December, 14, 0, 0, 0, 0, time.Local) + due = GetNextTrueUpReviewDueDate(now) + assert.Equal(t, time.December, due.Month()) + }) +}