aboutsummaryrefslogtreecommitdiff
path: root/error_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'error_test.go')
-rw-r--r--error_test.go164
1 files changed, 162 insertions, 2 deletions
diff --git a/error_test.go b/error_test.go
index a47025a..e21f215 100644
--- a/error_test.go
+++ b/error_test.go
@@ -57,15 +57,175 @@ func TestSqlLogicErrors(t *testing.T) {
if err != nil {
t.Error(err)
}
+ defer db.Close()
- _, err = db.Exec("CREATE TABLE Foo (id INT PRIMARY KEY)")
+ _, err = db.Exec("CREATE TABLE Foo (id INTEGER PRIMARY KEY)")
if err != nil {
t.Error(err)
}
const expectedErr = "table Foo already exists"
- _, err = db.Exec("CREATE TABLE Foo (id INT PRIMARY KEY)")
+ _, err = db.Exec("CREATE TABLE Foo (id INTEGER PRIMARY KEY)")
if err.Error() != expectedErr {
t.Errorf("Unexpected error: %s, expected %s", err.Error(), expectedErr)
}
+
+}
+
+func TestExtendedErrorCodes_ForeignKey(t *testing.T) {
+ dirName, err := ioutil.TempDir("", "sqlite3-err")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dirName)
+
+ dbFileName := path.Join(dirName, "test.db")
+ db, err := sql.Open("sqlite3", dbFileName)
+ if err != nil {
+ t.Error(err)
+ }
+ defer db.Close()
+
+ _, err = db.Exec("PRAGMA foreign_keys=ON;")
+ if err != nil {
+ t.Errorf("PRAGMA foreign_keys=ON: %v", err)
+ }
+
+ _, err = db.Exec(`CREATE TABLE Foo (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ value INTEGER NOT NULL,
+ ref INTEGER NULL REFERENCES Foo (id),
+ UNIQUE(value)
+ );`)
+ if err != nil {
+ t.Error(err)
+ }
+
+ _, err = db.Exec("INSERT INTO Foo (ref, value) VALUES (100, 100);")
+ if err == nil {
+ t.Error("No error!")
+ } else {
+ sqliteErr := err.(Error)
+ if sqliteErr.Code != ErrConstraint {
+ t.Errorf("Wrong basic error code: %d != %d",
+ sqliteErr.Code, ErrConstraint)
+ }
+ if sqliteErr.ExtendedCode != ErrConstraintForeignKey {
+ t.Errorf("Wrong extended error code: %d != %d",
+ sqliteErr.ExtendedCode, ErrConstraintForeignKey)
+ }
+ }
+
+}
+
+func TestExtendedErrorCodes_NotNull(t *testing.T) {
+ dirName, err := ioutil.TempDir("", "sqlite3-err")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dirName)
+
+ dbFileName := path.Join(dirName, "test.db")
+ db, err := sql.Open("sqlite3", dbFileName)
+ if err != nil {
+ t.Error(err)
+ }
+ defer db.Close()
+
+ _, err = db.Exec("PRAGMA foreign_keys=ON;")
+ if err != nil {
+ t.Errorf("PRAGMA foreign_keys=ON: %v", err)
+ }
+
+ _, err = db.Exec(`CREATE TABLE Foo (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ value INTEGER NOT NULL,
+ ref INTEGER NULL REFERENCES Foo (id),
+ UNIQUE(value)
+ );`)
+ if err != nil {
+ t.Error(err)
+ }
+
+ res, err := db.Exec("INSERT INTO Foo (value) VALUES (100);")
+ if err != nil {
+ t.Fatalf("Creating first row: %v", err)
+ }
+
+ id, err := res.LastInsertId()
+ if err != nil {
+ t.Fatalf("Retrieving last insert id: %v", err)
+ }
+
+ _, err = db.Exec("INSERT INTO Foo (ref) VALUES (?);", id)
+ if err == nil {
+ t.Error("No error!")
+ } else {
+ sqliteErr := err.(Error)
+ if sqliteErr.Code != ErrConstraint {
+ t.Errorf("Wrong basic error code: %d != %d",
+ sqliteErr.Code, ErrConstraint)
+ }
+ if sqliteErr.ExtendedCode != ErrConstraintNotNull {
+ t.Errorf("Wrong extended error code: %d != %d",
+ sqliteErr.ExtendedCode, ErrConstraintNotNull)
+ }
+ }
+
+}
+
+func TestExtendedErrorCodes_Unique(t *testing.T) {
+ dirName, err := ioutil.TempDir("", "sqlite3-err")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dirName)
+
+ dbFileName := path.Join(dirName, "test.db")
+ db, err := sql.Open("sqlite3", dbFileName)
+ if err != nil {
+ t.Error(err)
+ }
+ defer db.Close()
+
+ _, err = db.Exec("PRAGMA foreign_keys=ON;")
+ if err != nil {
+ t.Errorf("PRAGMA foreign_keys=ON: %v", err)
+ }
+
+ _, err = db.Exec(`CREATE TABLE Foo (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ value INTEGER NOT NULL,
+ ref INTEGER NULL REFERENCES Foo (id),
+ UNIQUE(value)
+ );`)
+ if err != nil {
+ t.Error(err)
+ }
+
+ res, err := db.Exec("INSERT INTO Foo (value) VALUES (100);")
+ if err != nil {
+ t.Fatalf("Creating first row: %v", err)
+ }
+
+ id, err := res.LastInsertId()
+ if err != nil {
+ t.Fatalf("Retrieving last insert id: %v", err)
+ }
+
+ _, err = db.Exec("INSERT INTO Foo (ref, value) VALUES (?, 100);", id)
+ if err == nil {
+ t.Error("No error!")
+ } else {
+ sqliteErr := err.(Error)
+ if sqliteErr.Code != ErrConstraint {
+ t.Errorf("Wrong basic error code: %d != %d",
+ sqliteErr.Code, ErrConstraint)
+ }
+ if sqliteErr.ExtendedCode != ErrConstraintUnique {
+ t.Errorf("Wrong extended error code: %d != %d",
+ sqliteErr.ExtendedCode, ErrConstraintUnique)
+ }
+ }
+
}