| 
									
										
										
										
											2017-10-07 16:31:39 +08:00
										 |  |  | package sqlstore | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	. "github.com/smartystreets/goconvey/convey" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/models" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/annotations" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestSavingTags(t *testing.T) { | 
					
						
							|  |  |  | 	Convey("Testing annotation saving/loading", t, func() { | 
					
						
							|  |  |  | 		InitTestDB(t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		repo := SqlAnnotationRepo{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Convey("Can save tags", func() { | 
					
						
							|  |  |  | 			tagPairs := []*models.Tag{ | 
					
						
							|  |  |  | 				{Key: "outage"}, | 
					
						
							|  |  |  | 				{Key: "type", Value: "outage"}, | 
					
						
							|  |  |  | 				{Key: "server", Value: "server-1"}, | 
					
						
							|  |  |  | 				{Key: "error"}, | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			tags, err := repo.ensureTagsExist(newSession(), tagPairs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			So(err, ShouldBeNil) | 
					
						
							|  |  |  | 			So(len(tags), ShouldEqual, 4) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestAnnotations(t *testing.T) { | 
					
						
							|  |  |  | 	Convey("Testing annotation saving/loading", t, func() { | 
					
						
							|  |  |  | 		InitTestDB(t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		repo := SqlAnnotationRepo{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Convey("Can save annotation", func() { | 
					
						
							| 
									
										
										
										
											2017-11-16 21:24:56 +08:00
										 |  |  | 			annotation := &annotations.Item{ | 
					
						
							| 
									
										
										
										
											2017-10-07 16:31:39 +08:00
										 |  |  | 				OrgId:       1, | 
					
						
							|  |  |  | 				UserId:      1, | 
					
						
							|  |  |  | 				DashboardId: 1, | 
					
						
							|  |  |  | 				Text:        "hello", | 
					
						
							| 
									
										
										
										
											2017-11-21 18:27:53 +08:00
										 |  |  | 				Type:        "alert", | 
					
						
							| 
									
										
										
										
											2017-10-07 16:31:39 +08:00
										 |  |  | 				Epoch:       10, | 
					
						
							|  |  |  | 				Tags:        []string{"outage", "error", "type:outage", "server:server-1"}, | 
					
						
							| 
									
										
										
										
											2017-11-16 21:24:56 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			err := repo.Save(annotation) | 
					
						
							| 
									
										
										
										
											2017-10-07 16:31:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			So(err, ShouldBeNil) | 
					
						
							| 
									
										
										
										
											2017-11-16 21:24:56 +08:00
										 |  |  | 			So(annotation.Id, ShouldBeGreaterThan, 0) | 
					
						
							| 
									
										
										
										
											2017-10-07 16:31:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-21 07:52:21 +08:00
										 |  |  | 			annotation2 := &annotations.Item{ | 
					
						
							|  |  |  | 				OrgId:       1, | 
					
						
							|  |  |  | 				UserId:      1, | 
					
						
							|  |  |  | 				DashboardId: 2, | 
					
						
							|  |  |  | 				Text:        "hello", | 
					
						
							|  |  |  | 				Type:        "alert", | 
					
						
							|  |  |  | 				Epoch:       20, | 
					
						
							|  |  |  | 				Tags:        []string{"outage", "error", "type:outage", "server:server-1"}, | 
					
						
							|  |  |  | 				RegionId:    1, | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			err = repo.Save(annotation2) | 
					
						
							|  |  |  | 			So(err, ShouldBeNil) | 
					
						
							|  |  |  | 			So(annotation2.Id, ShouldBeGreaterThan, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-07 16:31:39 +08:00
										 |  |  | 			Convey("Can query for annotation", func() { | 
					
						
							|  |  |  | 				items, err := repo.Find(&annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        0, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 				So(items, ShouldHaveLength, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Convey("Can read tags", func() { | 
					
						
							|  |  |  | 					So(items[0].Tags, ShouldResemble, []string{"outage", "error", "type:outage", "server:server-1"}) | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-21 07:52:21 +08:00
										 |  |  | 			Convey("Can query for annotation by id", func() { | 
					
						
							|  |  |  | 				items, err := repo.Find(&annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:        1, | 
					
						
							|  |  |  | 					AnnotationId: annotation2.Id, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 				So(items, ShouldHaveLength, 1) | 
					
						
							|  |  |  | 				So(items[0].Id, ShouldEqual, annotation2.Id) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Can query for annotation by region id", func() { | 
					
						
							|  |  |  | 				items, err := repo.Find(&annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:    1, | 
					
						
							|  |  |  | 					RegionId: annotation2.RegionId, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 				So(items, ShouldHaveLength, 1) | 
					
						
							|  |  |  | 				So(items[0].Id, ShouldEqual, annotation2.Id) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-07 16:31:39 +08:00
										 |  |  | 			Convey("Should not find any when item is outside time range", func() { | 
					
						
							|  |  |  | 				items, err := repo.Find(&annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        12, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 				So(items, ShouldHaveLength, 0) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Should not find one when tag filter does not match", func() { | 
					
						
							|  |  |  | 				items, err := repo.Find(&annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        1, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 					Tags:        []string{"asd"}, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 				So(items, ShouldHaveLength, 0) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-21 18:27:53 +08:00
										 |  |  | 			Convey("Should not find one when type filter does not match", func() { | 
					
						
							|  |  |  | 				items, err := repo.Find(&annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        1, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 					Type:        "alert", | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 				So(items, ShouldHaveLength, 0) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-07 16:31:39 +08:00
										 |  |  | 			Convey("Should find one when all tag filters does match", func() { | 
					
						
							|  |  |  | 				items, err := repo.Find(&annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        1, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 					Tags:        []string{"outage", "error"}, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 				So(items, ShouldHaveLength, 1) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Should find one when all key value tag filters does match", func() { | 
					
						
							|  |  |  | 				items, err := repo.Find(&annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        1, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 					Tags:        []string{"type:outage", "server:server-1"}, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 				So(items, ShouldHaveLength, 1) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Can update annotation and remove all tags", func() { | 
					
						
							|  |  |  | 				query := &annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        0, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				items, err := repo.Find(query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				annotationId := items[0].Id | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				err = repo.Update(&annotations.Item{ | 
					
						
							|  |  |  | 					Id:    annotationId, | 
					
						
							|  |  |  | 					OrgId: 1, | 
					
						
							|  |  |  | 					Text:  "something new", | 
					
						
							|  |  |  | 					Tags:  []string{}, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				items, err = repo.Find(query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Convey("Can read tags", func() { | 
					
						
							|  |  |  | 					So(items[0].Id, ShouldEqual, annotationId) | 
					
						
							|  |  |  | 					So(len(items[0].Tags), ShouldEqual, 0) | 
					
						
							|  |  |  | 					So(items[0].Text, ShouldEqual, "something new") | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Can update annotation with new tags", func() { | 
					
						
							|  |  |  | 				query := &annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        0, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				items, err := repo.Find(query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				annotationId := items[0].Id | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				err = repo.Update(&annotations.Item{ | 
					
						
							|  |  |  | 					Id:    annotationId, | 
					
						
							|  |  |  | 					OrgId: 1, | 
					
						
							|  |  |  | 					Text:  "something new", | 
					
						
							|  |  |  | 					Tags:  []string{"newtag1", "newtag2"}, | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				items, err = repo.Find(query) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Convey("Can read tags", func() { | 
					
						
							|  |  |  | 					So(items[0].Id, ShouldEqual, annotationId) | 
					
						
							|  |  |  | 					So(items[0].Tags, ShouldResemble, []string{"newtag1", "newtag2"}) | 
					
						
							|  |  |  | 					So(items[0].Text, ShouldEqual, "something new") | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Can delete annotation", func() { | 
					
						
							|  |  |  | 				query := &annotations.ItemQuery{ | 
					
						
							|  |  |  | 					OrgId:       1, | 
					
						
							|  |  |  | 					DashboardId: 1, | 
					
						
							|  |  |  | 					From:        0, | 
					
						
							|  |  |  | 					To:          15, | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				items, err := repo.Find(query) | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				annotationId := items[0].Id | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				err = repo.Delete(&annotations.DeleteParams{Id: annotationId}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				items, err = repo.Find(query) | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Convey("Should be deleted", func() { | 
					
						
							|  |  |  | 					So(len(items), ShouldEqual, 0) | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } |