From 69cc24ea3f76aafb7346333b30074107b86ad9c2 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Fri, 28 Sep 2018 11:17:03 +0200 Subject: [PATCH] wip: test get alert notification state --- pkg/services/sqlstore/alert_notification.go | 66 +++++++++---------- .../sqlstore/alert_notification_test.go | 30 ++++++--- 2 files changed, 51 insertions(+), 45 deletions(-) diff --git a/pkg/services/sqlstore/alert_notification.go b/pkg/services/sqlstore/alert_notification.go index 7af22016d73..213b715c941 100644 --- a/pkg/services/sqlstore/alert_notification.go +++ b/pkg/services/sqlstore/alert_notification.go @@ -3,6 +3,7 @@ package sqlstore import ( "bytes" "context" + "errors" "fmt" "strings" "time" @@ -255,11 +256,12 @@ func InsertAlertNotificationState(ctx context.Context, cmd *m.InsertAlertNotific func SetAlertNotificationStateToCompleteCommand(ctx context.Context, cmd *m.SetAlertNotificationStateToCompleteCommand) error { return withDbSession(ctx, func(sess *DBSession) error { sql := `UPDATE alert_notification_state SET - state= ? + state = ?, + version = ? WHERE id = ?` - res, err := sess.Exec(sql, m.AlertNotificationStateCompleted, cmd.Id) + res, err := sess.Exec(sql, m.AlertNotificationStateCompleted, cmd.Id, cmd.Version+1) if err != nil { return err } @@ -277,7 +279,7 @@ func SetAlertNotificationStateToCompleteCommand(ctx context.Context, cmd *m.SetA func SetAlertNotificationStateToPendingCommand(ctx context.Context, cmd *m.SetAlertNotificationStateToPendingCommand) error { return withDbSession(ctx, func(sess *DBSession) error { sql := `UPDATE alert_notification_state SET - state= ?, + state = ?, version = ? WHERE id = ? AND @@ -314,41 +316,33 @@ func GetAlertNotificationState(ctx context.Context, cmd *m.GetNotificationStateQ return nil } - // normally flow ends here - - if !exist { - notificationState := &m.AlertNotificationState{ - OrgId: cmd.OrgId, - AlertId: cmd.AlertId, - NotifierId: cmd.NotifierId, - State: "unknown", - } - - _, err := sess.Insert(notificationState) - - uniqenessIndexFailureCodes := []string{ - "UNIQUE constraint failed", - "pq: duplicate key value violates unique constraint", - "Error 1062: Duplicate entry ", - } - - for _, code := range uniqenessIndexFailureCodes { - if strings.HasPrefix(err.Error(), code) { - exist, err = getAlertNotificationState(sess, cmd, nj) - - if exist && err == nil { - cmd.Result = nj - return nil - } - } - } - - if err != nil { - return err - } + notificationState := &m.AlertNotificationState{ + OrgId: cmd.OrgId, + AlertId: cmd.AlertId, + NotifierId: cmd.NotifierId, + State: "unknown", } - cmd.Result = nj + if _, err := sess.Insert(notificationState); err != nil { + if dialect.IsUniqueConstraintViolation(err) { + exist, err = getAlertNotificationState(sess, cmd, nj) + + if err != nil { + return err + } + + if !exist { + return errors.New("Should not happen") + } + + cmd.Result = nj + return nil + } + + return err + } + + cmd.Result = notificationState return nil }) } diff --git a/pkg/services/sqlstore/alert_notification_test.go b/pkg/services/sqlstore/alert_notification_test.go index 52682e7788f..849902359cc 100644 --- a/pkg/services/sqlstore/alert_notification_test.go +++ b/pkg/services/sqlstore/alert_notification_test.go @@ -1,6 +1,7 @@ package sqlstore import ( + "context" "testing" "time" @@ -13,16 +14,27 @@ func TestAlertNotificationSQLAccess(t *testing.T) { Convey("Testing Alert notification sql access", t, func() { InitTestDB(t) - //Convey("Alert notification state", func() { - //var alertId int64 = 7 - //var orgId int64 = 5 - //var notifierId int64 = 10 + Convey("Alert notification state", func() { + var alertID int64 = 7 + var orgID int64 = 5 + var notifierID int64 = 10 - //Convey("Getting no existant state returns error", func() { - // query := &models.GetNotificationStateQuery{AlertId: alertId, OrgId: orgId, NotifierId: notifierId} - // err := GetAlertNotificationState(context.Background(), query) - // So(err, ShouldEqual, models.ErrAlertNotificationStateNotFound) - //}) + Convey("Get no existing state should create a new state", func() { + query := &models.GetNotificationStateQuery{AlertId: alertID, OrgId: orgID, NotifierId: notifierID} + err := GetAlertNotificationState(context.Background(), query) + So(err, ShouldBeNil) + So(query.Result, ShouldNotBeNil) + So(query.Result.State, ShouldEqual, "unknown") + + Convey("Get existing state should not create a new state", func() { + query2 := &models.GetNotificationStateQuery{AlertId: alertID, OrgId: orgID, NotifierId: notifierID} + err := GetAlertNotificationState(context.Background(), query2) + So(err, ShouldBeNil) + So(query2.Result, ShouldNotBeNil) + So(query2.Result.Id, ShouldEqual, query.Result.Id) + }) + }) + }) //Convey("Can insert new state for alert notifier", func() { // createCmd := &models.InsertAlertNotificationCommand{