datasources_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package datasources
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/log"
  5. "github.com/grafana/grafana/pkg/models"
  6. . "github.com/smartystreets/goconvey/convey"
  7. )
  8. var logger log.Logger = log.New("fake.logger")
  9. func TestDatasourceAsConfig(t *testing.T) {
  10. Convey("Testing datasource as configuration", t, func() {
  11. fakeCfg := &fakeConfig{}
  12. fakeRepo := &fakeRepository{}
  13. Convey("One configured datasource", func() {
  14. fakeCfg.cfg = &DatasourcesAsConfig{
  15. PurgeOtherDatasources: false,
  16. Datasources: []models.DataSource{
  17. models.DataSource{Name: "graphite", OrgId: 1},
  18. },
  19. }
  20. Convey("no datasource in database", func() {
  21. dc := newDatasourceConfiguration(logger, fakeCfg, fakeRepo)
  22. err := dc.applyChanges("mock/config.yaml")
  23. if err != nil {
  24. t.Fatalf("applyChanges return an error %v", err)
  25. }
  26. So(len(fakeRepo.deleted), ShouldEqual, 0)
  27. So(len(fakeRepo.inserted), ShouldEqual, 1)
  28. So(len(fakeRepo.updated), ShouldEqual, 0)
  29. })
  30. Convey("One datasource in database with same name", func() {
  31. fakeRepo.loadAll = []*models.DataSource{
  32. &models.DataSource{Name: "graphite", OrgId: 1, Id: 1},
  33. }
  34. Convey("should update one datasource", func() {
  35. dc := newDatasourceConfiguration(logger, fakeCfg, fakeRepo)
  36. err := dc.applyChanges("mock/config.yaml")
  37. if err != nil {
  38. t.Fatalf("applyChanges return an error %v", err)
  39. }
  40. So(len(fakeRepo.deleted), ShouldEqual, 0)
  41. So(len(fakeRepo.inserted), ShouldEqual, 0)
  42. So(len(fakeRepo.updated), ShouldEqual, 1)
  43. })
  44. })
  45. Convey("One datasource in database with new name", func() {
  46. fakeRepo.loadAll = []*models.DataSource{
  47. &models.DataSource{Name: "old-graphite", OrgId: 1, Id: 1},
  48. }
  49. Convey("should update one datasource", func() {
  50. dc := newDatasourceConfiguration(logger, fakeCfg, fakeRepo)
  51. err := dc.applyChanges("mock/config.yaml")
  52. if err != nil {
  53. t.Fatalf("applyChanges return an error %v", err)
  54. }
  55. So(len(fakeRepo.deleted), ShouldEqual, 0)
  56. So(len(fakeRepo.inserted), ShouldEqual, 1)
  57. So(len(fakeRepo.updated), ShouldEqual, 0)
  58. })
  59. })
  60. })
  61. Convey("Two configured datasource and purge others ", func() {
  62. fakeCfg.cfg = &DatasourcesAsConfig{
  63. PurgeOtherDatasources: true,
  64. Datasources: []models.DataSource{
  65. models.DataSource{Name: "graphite", OrgId: 1},
  66. models.DataSource{Name: "prometheus", OrgId: 1},
  67. },
  68. }
  69. Convey("two other datasources in database", func() {
  70. fakeRepo.loadAll = []*models.DataSource{
  71. &models.DataSource{Name: "old-graphite", OrgId: 1, Id: 1},
  72. &models.DataSource{Name: "old-graphite2", OrgId: 1, Id: 2},
  73. }
  74. Convey("should have two new datasources", func() {
  75. dc := newDatasourceConfiguration(logger, fakeCfg, fakeRepo)
  76. err := dc.applyChanges("mock/config.yaml")
  77. if err != nil {
  78. t.Fatalf("applyChanges return an error %v", err)
  79. }
  80. So(len(fakeRepo.deleted), ShouldEqual, 2)
  81. So(len(fakeRepo.inserted), ShouldEqual, 2)
  82. So(len(fakeRepo.updated), ShouldEqual, 0)
  83. })
  84. })
  85. })
  86. Convey("Two configured datasource and purge others = false", func() {
  87. fakeCfg.cfg = &DatasourcesAsConfig{
  88. PurgeOtherDatasources: false,
  89. Datasources: []models.DataSource{
  90. models.DataSource{Name: "graphite", OrgId: 1},
  91. models.DataSource{Name: "prometheus", OrgId: 1},
  92. },
  93. }
  94. Convey("two other datasources in database", func() {
  95. fakeRepo.loadAll = []*models.DataSource{
  96. &models.DataSource{Name: "old-graphite", OrgId: 1, Id: 1},
  97. &models.DataSource{Name: "old-graphite2", OrgId: 1, Id: 2},
  98. }
  99. Convey("should have two new datasources", func() {
  100. dc := newDatasourceConfiguration(logger, fakeCfg, fakeRepo)
  101. err := dc.applyChanges("mock/config.yaml")
  102. if err != nil {
  103. t.Fatalf("applyChanges return an error %v", err)
  104. }
  105. So(len(fakeRepo.deleted), ShouldEqual, 0)
  106. So(len(fakeRepo.inserted), ShouldEqual, 2)
  107. So(len(fakeRepo.updated), ShouldEqual, 0)
  108. })
  109. })
  110. })
  111. })
  112. }
  113. type fakeRepository struct {
  114. inserted []*models.AddDataSourceCommand
  115. deleted []*models.DeleteDataSourceByIdCommand
  116. updated []*models.UpdateDataSourceCommand
  117. loadAll []*models.DataSource
  118. }
  119. type fakeConfig struct {
  120. cfg *DatasourcesAsConfig
  121. }
  122. func (fc *fakeConfig) readConfig(path string) (*DatasourcesAsConfig, error) {
  123. return fc.cfg, nil
  124. }
  125. func (fc *fakeRepository) delete(cmd *models.DeleteDataSourceByIdCommand) error {
  126. fc.deleted = append(fc.deleted, cmd)
  127. return nil
  128. }
  129. func (fc *fakeRepository) update(cmd *models.UpdateDataSourceCommand) error {
  130. fc.updated = append(fc.updated, cmd)
  131. return nil
  132. }
  133. func (fc *fakeRepository) insert(cmd *models.AddDataSourceCommand) error {
  134. fc.inserted = append(fc.inserted, cmd)
  135. return nil
  136. }
  137. func (fc *fakeRepository) loadAllDatasources() ([]*models.DataSource, error) {
  138. return fc.loadAll, nil
  139. }
  140. func (fc *fakeRepository) get(cmd *models.GetDataSourceByNameQuery) error {
  141. for _, v := range fc.loadAll {
  142. if cmd.Name == v.Name && cmd.OrgId == v.OrgId {
  143. cmd.Result = v
  144. return nil
  145. }
  146. }
  147. return models.ErrDataSourceNotFound
  148. }