mirror of
https://github.com/grafana/grafana.git
synced 2025-02-11 08:05:43 -06:00
SQLStore: Align SQLite IsUniqueConstraintViolation() with other backend implementations (#69224)
* Add integration test for primary key and unique constrain violation * Align SQLite IsUniqueConstraintViolation implementation with other backends
This commit is contained in:
parent
32a67a4ad5
commit
74e87ccbbd
@ -148,7 +148,7 @@ func (db *SQLite3) ErrorMessage(err error) string {
|
||||
}
|
||||
|
||||
func (db *SQLite3) IsUniqueConstraintViolation(err error) bool {
|
||||
return db.isThisError(err, int(sqlite3.ErrConstraintUnique))
|
||||
return db.isThisError(err, int(sqlite3.ErrConstraintUnique)) || db.isThisError(err, int(sqlite3.ErrConstraintPrimaryKey))
|
||||
}
|
||||
|
||||
func (db *SQLite3) IsDeadlock(err error) bool {
|
||||
|
@ -1,12 +1,16 @@
|
||||
package sqlstore
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net/url"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/grafana/grafana/pkg/services/org"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
)
|
||||
|
||||
@ -99,6 +103,54 @@ func TestIntegrationSQLConnectionString(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestIntegrationIsUniqueConstraintViolation(t *testing.T) {
|
||||
store := InitTestDB(t)
|
||||
|
||||
testCases := []struct {
|
||||
desc string
|
||||
f func(*testing.T, *DBSession) error
|
||||
}{
|
||||
{
|
||||
desc: "successfully detect primary key violations",
|
||||
f: func(t *testing.T, sess *DBSession) error {
|
||||
// Attempt to insert org with provided ID (primary key) twice
|
||||
now := time.Now()
|
||||
org := org.Org{Name: "test org primary key violation", Created: now, Updated: now, ID: 42}
|
||||
err := sess.InsertId(&org, store.Dialect)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Provide a different name to avoid unique constraint violation
|
||||
org.Name = "test org 2"
|
||||
return sess.InsertId(&org, store.Dialect)
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "successfully detect unique constrain violations",
|
||||
f: func(t *testing.T, sess *DBSession) error {
|
||||
// Attempt to insert org with reserved name
|
||||
now := time.Now()
|
||||
org := org.Org{Name: "test org unique constrain violation", Created: now, Updated: now, ID: 43}
|
||||
err := sess.InsertId(&org, store.Dialect)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Provide a different ID to avoid primary key violation
|
||||
org.ID = 44
|
||||
return sess.InsertId(&org, store.Dialect)
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := store.WithDbSession(context.Background(), func(sess *DBSession) error {
|
||||
return tc.f(t, sess)
|
||||
})
|
||||
require.Error(t, err)
|
||||
assert.True(t, store.Dialect.IsUniqueConstraintViolation(err))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func makeSQLStoreTestConfig(t *testing.T, dbType, host, dbURL string) *setting.Cfg {
|
||||
t.Helper()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user