From e5f12afda2cd33b6695b0a4d2d713d56f515f152 Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki Date: Fri, 16 Oct 2020 10:46:14 +0300 Subject: [PATCH] SQLStore: Run tests as integration tests (#28265) * sqlstore: Run tests as integration tests * Truncate database instead of re-creating it on each test * Fix test description See https://github.com/grafana/grafana/pull/12129 * Fix lint issues * Fix postgres dialect after review suggestion * Rename and document functions after review suggestion * Add periods * Fix auto-increment value for mysql dialect Co-authored-by: Emil Tullstedt (cherry picked from commit 4937f0daabb42304f1ee544da02bcf35d1336fe1) --- .../sqlstore/alert_notification_test.go | 2 + pkg/services/sqlstore/alert_test.go | 4 +- pkg/services/sqlstore/annotation_test.go | 2 + pkg/services/sqlstore/apikey_test.go | 2 + pkg/services/sqlstore/dashboard_acl_test.go | 2 + .../sqlstore/dashboard_folder_test.go | 2 + .../sqlstore/dashboard_provisioning_test.go | 2 + .../dashboard_service_integration_test.go | 2 + .../sqlstore/dashboard_snapshot_test.go | 2 + pkg/services/sqlstore/dashboard_test.go | 2 + .../sqlstore/dashboard_version_test.go | 2 + pkg/services/sqlstore/datasource_test.go | 2 + pkg/services/sqlstore/login_attempt_test.go | 2 + pkg/services/sqlstore/migrator/dialect.go | 5 + .../sqlstore/migrator/mysql_dialect.go | 31 +++++ .../sqlstore/migrator/postgres_dialect.go | 35 ++++++ .../sqlstore/migrator/sqlite_dialect.go | 34 ++++++ pkg/services/sqlstore/org_test.go | 2 + pkg/services/sqlstore/playlist_test.go | 2 + pkg/services/sqlstore/preferences_test.go | 2 + pkg/services/sqlstore/quota_test.go | 2 + .../sqlstore/searchstore/search_test.go | 2 + pkg/services/sqlstore/sqlbuilder_test.go | 2 + pkg/services/sqlstore/sqlstore.go | 112 ++++++++++-------- pkg/services/sqlstore/sqlstore_test.go | 2 + pkg/services/sqlstore/stars_test.go | 2 + pkg/services/sqlstore/stats_test.go | 2 + pkg/services/sqlstore/tags_test.go | 2 + pkg/services/sqlstore/team_test.go | 2 + pkg/services/sqlstore/temp_user_test.go | 2 + pkg/services/sqlstore/transactions_test.go | 2 + pkg/services/sqlstore/user_auth_test.go | 2 + pkg/services/sqlstore/user_test.go | 2 + 33 files changed, 222 insertions(+), 53 deletions(-) diff --git a/pkg/services/sqlstore/alert_notification_test.go b/pkg/services/sqlstore/alert_notification_test.go index 6cc105c5826..55fcb749845 100644 --- a/pkg/services/sqlstore/alert_notification_test.go +++ b/pkg/services/sqlstore/alert_notification_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/alert_test.go b/pkg/services/sqlstore/alert_test.go index dd8ba36b190..a508d9bb2ae 100644 --- a/pkg/services/sqlstore/alert_test.go +++ b/pkg/services/sqlstore/alert_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( @@ -128,7 +130,7 @@ func TestAlertingDataAccess(t *testing.T) { So(alert.DashboardSlug, ShouldEqual, "dashboard-with-alerts") }) - Convey("Viewer cannot read alerts", func() { + Convey("Viewer can read alerts", func() { viewerUser := &models.SignedInUser{OrgRole: models.ROLE_VIEWER, OrgId: 1} alertQuery := models.GetAlertsQuery{DashboardIDs: []int64{testDash.Id}, PanelId: 1, OrgId: 1, User: viewerUser} err2 := HandleAlertsQuery(&alertQuery) diff --git a/pkg/services/sqlstore/annotation_test.go b/pkg/services/sqlstore/annotation_test.go index be48e8ec131..7487e82d732 100644 --- a/pkg/services/sqlstore/annotation_test.go +++ b/pkg/services/sqlstore/annotation_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/apikey_test.go b/pkg/services/sqlstore/apikey_test.go index 7d3f019d60b..dc1ab50aedb 100644 --- a/pkg/services/sqlstore/apikey_test.go +++ b/pkg/services/sqlstore/apikey_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/dashboard_acl_test.go b/pkg/services/sqlstore/dashboard_acl_test.go index 0fc190e92d0..f9472273050 100644 --- a/pkg/services/sqlstore/dashboard_acl_test.go +++ b/pkg/services/sqlstore/dashboard_acl_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/dashboard_folder_test.go b/pkg/services/sqlstore/dashboard_folder_test.go index 9ee801286e3..177613fcb1f 100644 --- a/pkg/services/sqlstore/dashboard_folder_test.go +++ b/pkg/services/sqlstore/dashboard_folder_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/dashboard_provisioning_test.go b/pkg/services/sqlstore/dashboard_provisioning_test.go index 9c8b5ead793..1283f72bec4 100644 --- a/pkg/services/sqlstore/dashboard_provisioning_test.go +++ b/pkg/services/sqlstore/dashboard_provisioning_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/dashboard_service_integration_test.go b/pkg/services/sqlstore/dashboard_service_integration_test.go index 0d5d64f16ab..bc999f48a7b 100644 --- a/pkg/services/sqlstore/dashboard_service_integration_test.go +++ b/pkg/services/sqlstore/dashboard_service_integration_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/dashboard_snapshot_test.go b/pkg/services/sqlstore/dashboard_snapshot_test.go index 5012fb0beb4..2da61dc4aa0 100644 --- a/pkg/services/sqlstore/dashboard_snapshot_test.go +++ b/pkg/services/sqlstore/dashboard_snapshot_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/dashboard_test.go b/pkg/services/sqlstore/dashboard_test.go index 598856e9ace..c448cc8e281 100644 --- a/pkg/services/sqlstore/dashboard_test.go +++ b/pkg/services/sqlstore/dashboard_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/dashboard_version_test.go b/pkg/services/sqlstore/dashboard_version_test.go index 5b15db5ab07..4a8a33af852 100644 --- a/pkg/services/sqlstore/dashboard_version_test.go +++ b/pkg/services/sqlstore/dashboard_version_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/datasource_test.go b/pkg/services/sqlstore/datasource_test.go index 53c8766c012..972b5eb3513 100644 --- a/pkg/services/sqlstore/datasource_test.go +++ b/pkg/services/sqlstore/datasource_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/login_attempt_test.go b/pkg/services/sqlstore/login_attempt_test.go index 21fe47149d4..b79b2bf0f81 100644 --- a/pkg/services/sqlstore/login_attempt_test.go +++ b/pkg/services/sqlstore/login_attempt_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/migrator/dialect.go b/pkg/services/sqlstore/migrator/dialect.go index 2846e0f77cc..984c7db1c0b 100644 --- a/pkg/services/sqlstore/migrator/dialect.go +++ b/pkg/services/sqlstore/migrator/dialect.go @@ -45,6 +45,7 @@ type Dialect interface { PostInsertId(table string, sess *xorm.Session) error CleanDB() error + TruncateDBTables() error NoOpSql() string IsUniqueConstraintViolation(err error) bool @@ -270,3 +271,7 @@ func (db *BaseDialect) CleanDB() error { func (db *BaseDialect) NoOpSql() string { return "SELECT 0;" } + +func (db *BaseDialect) TruncateDBTables() error { + return nil +} diff --git a/pkg/services/sqlstore/migrator/mysql_dialect.go b/pkg/services/sqlstore/migrator/mysql_dialect.go index ec0b67a076b..7132dbaf4b0 100644 --- a/pkg/services/sqlstore/migrator/mysql_dialect.go +++ b/pkg/services/sqlstore/migrator/mysql_dialect.go @@ -1,6 +1,7 @@ package migrator import ( + "fmt" "strconv" "strings" @@ -137,6 +138,36 @@ func (db *Mysql) CleanDB() error { return nil } +// TruncateDBTables truncates all the tables. +// A special case is the dashboard_acl table where we keep the default permissions. +func (db *Mysql) TruncateDBTables() error { + tables, err := db.engine.DBMetas() + if err != nil { + return err + } + sess := db.engine.NewSession() + defer sess.Close() + + for _, table := range tables { + switch table.Name { + case "dashboard_acl": + // keep default dashboard permissions + if _, err := sess.Exec(fmt.Sprintf("DELETE FROM %v WHERE dashboard_id != -1 AND org_id != -1;", db.Quote(table.Name))); err != nil { + return errutil.Wrapf(err, "failed to truncate table %q", table.Name) + } + if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE %v AUTO_INCREMENT = 3;", db.Quote(table.Name))); err != nil { + return errutil.Wrapf(err, "failed to reset table %q", table.Name) + } + default: + if _, err := sess.Exec(fmt.Sprintf("TRUNCATE TABLE %v;", db.Quote(table.Name))); err != nil { + return errutil.Wrapf(err, "failed to truncate table %q", table.Name) + } + } + } + + return nil +} + func (db *Mysql) isThisError(err error, errcode uint16) bool { if driverErr, ok := err.(*mysql.MySQLError); ok { if driverErr.Number == errcode { diff --git a/pkg/services/sqlstore/migrator/postgres_dialect.go b/pkg/services/sqlstore/migrator/postgres_dialect.go index bf063dcf0a7..ef26a879b8b 100644 --- a/pkg/services/sqlstore/migrator/postgres_dialect.go +++ b/pkg/services/sqlstore/migrator/postgres_dialect.go @@ -140,6 +140,37 @@ func (db *Postgres) CleanDB() error { return nil } +// TruncateDBTables truncates all the tables. +// A special case is the dashboard_acl table where we keep the default permissions. +func (db *Postgres) TruncateDBTables() error { + sess := db.engine.NewSession() + defer sess.Close() + + for _, table := range db.engine.Tables { + switch table.Name { + case "": + continue + case "dashboard_acl": + // keep default dashboard permissions + if _, err := sess.Exec(fmt.Sprintf("DELETE FROM %v WHERE dashboard_id != -1 AND org_id != -1;", db.Quote(table.Name))); err != nil { + return errutil.Wrapf(err, "failed to truncate table %q", table.Name) + } + if _, err := sess.Exec(fmt.Sprintf("ALTER SEQUENCE %v RESTART WITH 3;", db.Quote(fmt.Sprintf("%v_id_seq", table.Name)))); err != nil { + return errutil.Wrapf(err, "failed to reset table %q", table.Name) + } + default: + if _, err := sess.Exec(fmt.Sprintf("TRUNCATE TABLE %v RESTART IDENTITY CASCADE;", db.Quote(table.Name))); err != nil { + if db.isUndefinedTable(err) { + continue + } + return errutil.Wrapf(err, "failed to truncate table %q", table.Name) + } + } + } + + return nil +} + func (db *Postgres) isThisError(err error, errcode string) bool { if driverErr, ok := err.(*pq.Error); ok { if string(driverErr.Code) == errcode { @@ -157,6 +188,10 @@ func (db *Postgres) ErrorMessage(err error) string { return "" } +func (db *Postgres) isUndefinedTable(err error) bool { + return db.isThisError(err, "42P01") +} + func (db *Postgres) IsUniqueConstraintViolation(err error) bool { return db.isThisError(err, "23505") } diff --git a/pkg/services/sqlstore/migrator/sqlite_dialect.go b/pkg/services/sqlstore/migrator/sqlite_dialect.go index 95d4ac0d64d..8780159527d 100644 --- a/pkg/services/sqlstore/migrator/sqlite_dialect.go +++ b/pkg/services/sqlstore/migrator/sqlite_dialect.go @@ -3,6 +3,7 @@ package migrator import ( "fmt" + "github.com/grafana/grafana/pkg/util/errutil" "github.com/mattn/go-sqlite3" "xorm.io/xorm" ) @@ -85,6 +86,39 @@ func (db *Sqlite3) CleanDB() error { return nil } +// TruncateDBTables deletes all data from all the tables and resets the sequences. +// A special case is the dashboard_acl table where we keep the default permissions. +func (db *Sqlite3) TruncateDBTables() error { + tables, err := db.engine.DBMetas() + if err != nil { + return err + } + + sess := db.engine.NewSession() + defer sess.Close() + + for _, table := range tables { + switch table.Name { + case "dashboard_acl": + // keep default dashboard permissions + if _, err := sess.Exec(fmt.Sprintf("DELETE FROM %q WHERE dashboard_id != -1 AND org_id != -1;", table.Name)); err != nil { + return errutil.Wrapf(err, "failed to truncate table %q", table.Name) + } + if _, err := sess.Exec("UPDATE sqlite_sequence SET seq = 2 WHERE name = '%s';", table.Name); err != nil { + return errutil.Wrapf(err, "failed to cleanup sqlite_sequence") + } + default: + if _, err := sess.Exec(fmt.Sprintf("DELETE FROM %s;", table.Name)); err != nil { + return errutil.Wrapf(err, "failed to truncate table %q", table.Name) + } + } + } + if _, err := sess.Exec("UPDATE sqlite_sequence SET seq = 0 WHERE name != 'dashboard_acl';"); err != nil { + return errutil.Wrapf(err, "failed to cleanup sqlite_sequence") + } + return nil +} + func (db *Sqlite3) isThisError(err error, errcode int) bool { if driverErr, ok := err.(sqlite3.Error); ok { if int(driverErr.ExtendedCode) == errcode { diff --git a/pkg/services/sqlstore/org_test.go b/pkg/services/sqlstore/org_test.go index 1e6ca237096..4a4314c1458 100644 --- a/pkg/services/sqlstore/org_test.go +++ b/pkg/services/sqlstore/org_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/playlist_test.go b/pkg/services/sqlstore/playlist_test.go index a599c76a5d4..c5373366389 100644 --- a/pkg/services/sqlstore/playlist_test.go +++ b/pkg/services/sqlstore/playlist_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/preferences_test.go b/pkg/services/sqlstore/preferences_test.go index 841a317a9a1..0323093a9e2 100644 --- a/pkg/services/sqlstore/preferences_test.go +++ b/pkg/services/sqlstore/preferences_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/quota_test.go b/pkg/services/sqlstore/quota_test.go index 486bf4047ac..0fefb9ea2d4 100644 --- a/pkg/services/sqlstore/quota_test.go +++ b/pkg/services/sqlstore/quota_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/searchstore/search_test.go b/pkg/services/sqlstore/searchstore/search_test.go index 0a66b84cfa1..26cf0fa3547 100644 --- a/pkg/services/sqlstore/searchstore/search_test.go +++ b/pkg/services/sqlstore/searchstore/search_test.go @@ -1,3 +1,5 @@ +// +build integration + // package search_test contains integration tests for search package searchstore_test diff --git a/pkg/services/sqlstore/sqlbuilder_test.go b/pkg/services/sqlstore/sqlbuilder_test.go index a69511bc6a5..5350eb0c420 100644 --- a/pkg/services/sqlstore/sqlbuilder_test.go +++ b/pkg/services/sqlstore/sqlbuilder_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/sqlstore.go b/pkg/services/sqlstore/sqlstore.go index e3e053feaa7..dde259f4a9b 100644 --- a/pkg/services/sqlstore/sqlstore.go +++ b/pkg/services/sqlstore/sqlstore.go @@ -340,72 +340,80 @@ type ITestDB interface { Logf(format string, args ...interface{}) } +var testSqlStore *SqlStore + // InitTestDB initializes the test DB. func InitTestDB(t ITestDB) *SqlStore { t.Helper() - sqlstore := &SqlStore{} - sqlstore.Bus = bus.New() - sqlstore.CacheService = localcache.New(5*time.Minute, 10*time.Minute) - sqlstore.skipEnsureDefaultOrgAndUser = true + if testSqlStore == nil { + testSqlStore = &SqlStore{} + testSqlStore.Bus = bus.New() + testSqlStore.CacheService = localcache.New(5*time.Minute, 10*time.Minute) + testSqlStore.skipEnsureDefaultOrgAndUser = true - dbType := migrator.SQLITE + dbType := migrator.SQLITE - // environment variable present for test db? - if db, present := os.LookupEnv("GRAFANA_TEST_DB"); present { - t.Logf("Using database type %q", db) - dbType = db - } + // environment variable present for test db? + if db, present := os.LookupEnv("GRAFANA_TEST_DB"); present { + t.Logf("Using database type %q", db) + dbType = db + } - // set test db config - sqlstore.Cfg = setting.NewCfg() - sec, err := sqlstore.Cfg.Raw.NewSection("database") - if err != nil { - t.Fatalf("Failed to create section: %s", err) - } - if _, err := sec.NewKey("type", dbType); err != nil { - t.Fatalf("Failed to create key: %s", err) - } - - switch dbType { - case "mysql": - if _, err := sec.NewKey("connection_string", sqlutil.MySQLTestDB().ConnStr); err != nil { + // set test db config + testSqlStore.Cfg = setting.NewCfg() + sec, err := testSqlStore.Cfg.Raw.NewSection("database") + if err != nil { + t.Fatalf("Failed to create section: %s", err) + } + if _, err := sec.NewKey("type", dbType); err != nil { t.Fatalf("Failed to create key: %s", err) } - case "postgres": - if _, err := sec.NewKey("connection_string", sqlutil.PostgresTestDB().ConnStr); err != nil { - t.Fatalf("Failed to create key: %s", err) + + switch dbType { + case "mysql": + if _, err := sec.NewKey("connection_string", sqlutil.MySQLTestDB().ConnStr); err != nil { + t.Fatalf("Failed to create key: %s", err) + } + case "postgres": + if _, err := sec.NewKey("connection_string", sqlutil.PostgresTestDB().ConnStr); err != nil { + t.Fatalf("Failed to create key: %s", err) + } + default: + if _, err := sec.NewKey("connection_string", sqlutil.Sqlite3TestDB().ConnStr); err != nil { + t.Fatalf("Failed to create key: %s", err) + } } - default: - if _, err := sec.NewKey("connection_string", sqlutil.Sqlite3TestDB().ConnStr); err != nil { - t.Fatalf("Failed to create key: %s", err) + + // need to get engine to clean db before we init + t.Logf("Creating database connection: %q", sec.Key("connection_string")) + engine, err := xorm.NewEngine(dbType, sec.Key("connection_string").String()) + if err != nil { + t.Fatalf("Failed to init test database: %v", err) } + + testSqlStore.Dialect = migrator.NewDialect(engine) + + // temp global var until we get rid of global vars + dialect = testSqlStore.Dialect + + t.Logf("Cleaning DB") + if err := dialect.CleanDB(); err != nil { + t.Fatalf("Failed to clean test db %v", err) + } + + if err := testSqlStore.Init(); err != nil { + t.Fatalf("Failed to init test database: %v", err) + } + + testSqlStore.engine.DatabaseTZ = time.UTC + testSqlStore.engine.TZLocation = time.UTC } - // need to get engine to clean db before we init - t.Logf("Creating database connection: %q", sec.Key("connection_string")) - engine, err := xorm.NewEngine(dbType, sec.Key("connection_string").String()) - if err != nil { - t.Fatalf("Failed to init test database: %v", err) + if err := dialect.TruncateDBTables(); err != nil { + t.Fatalf("Failed to truncate test db %v", err) } - sqlstore.Dialect = migrator.NewDialect(engine) - - // temp global var until we get rid of global vars - dialect = sqlstore.Dialect - - t.Logf("Cleaning DB") - if err := dialect.CleanDB(); err != nil { - t.Fatalf("Failed to clean test db %v", err) - } - - if err := sqlstore.Init(); err != nil { - t.Fatalf("Failed to init test database: %v", err) - } - - sqlstore.engine.DatabaseTZ = time.UTC - sqlstore.engine.TZLocation = time.UTC - - return sqlstore + return testSqlStore } func IsTestDbMySql() bool { diff --git a/pkg/services/sqlstore/sqlstore_test.go b/pkg/services/sqlstore/sqlstore_test.go index 99896ca4e9d..09bc8de4ab8 100644 --- a/pkg/services/sqlstore/sqlstore_test.go +++ b/pkg/services/sqlstore/sqlstore_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/stars_test.go b/pkg/services/sqlstore/stars_test.go index 3a226707e9f..9f6b0516247 100644 --- a/pkg/services/sqlstore/stars_test.go +++ b/pkg/services/sqlstore/stars_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/stats_test.go b/pkg/services/sqlstore/stats_test.go index 1b62c8e349a..d944d4b1318 100644 --- a/pkg/services/sqlstore/stats_test.go +++ b/pkg/services/sqlstore/stats_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/tags_test.go b/pkg/services/sqlstore/tags_test.go index 67ca2479e41..d675ed40e90 100644 --- a/pkg/services/sqlstore/tags_test.go +++ b/pkg/services/sqlstore/tags_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/team_test.go b/pkg/services/sqlstore/team_test.go index acbd314cf48..36a9e6b05a4 100644 --- a/pkg/services/sqlstore/team_test.go +++ b/pkg/services/sqlstore/team_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/temp_user_test.go b/pkg/services/sqlstore/temp_user_test.go index 791a74d4e47..e5ba591f8fb 100644 --- a/pkg/services/sqlstore/temp_user_test.go +++ b/pkg/services/sqlstore/temp_user_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/transactions_test.go b/pkg/services/sqlstore/transactions_test.go index 4178c741eeb..8c25924b983 100644 --- a/pkg/services/sqlstore/transactions_test.go +++ b/pkg/services/sqlstore/transactions_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/user_auth_test.go b/pkg/services/sqlstore/user_auth_test.go index 2b6621a2035..e5bb2379e5c 100644 --- a/pkg/services/sqlstore/user_auth_test.go +++ b/pkg/services/sqlstore/user_auth_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import ( diff --git a/pkg/services/sqlstore/user_test.go b/pkg/services/sqlstore/user_test.go index df539497dc1..e0bddd2ffc5 100644 --- a/pkg/services/sqlstore/user_test.go +++ b/pkg/services/sqlstore/user_test.go @@ -1,3 +1,5 @@ +// +build integration + package sqlstore import (