From 161abb094d3ff714f1b31d9b21b1c4a463b53f17 Mon Sep 17 00:00:00 2001 From: Philip O'Toole Date: Wed, 11 Aug 2021 21:19:10 -0400 Subject: [PATCH] Add db-level FK constraints unit test --- db/db_test.go | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/db/db_test.go b/db/db_test.go index 138810e4..ca880dfc 100644 --- a/db/db_test.go +++ b/db/db_test.go @@ -113,6 +113,68 @@ func Test_TableCreationInMemory(t *testing.T) { } } +// Test_TableCreationInMemoryFK ensures foreign key constraints work +func Test_TableCreationInMemoryFK(t *testing.T) { + createTableFoo := "CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT)" + createTableBar := "CREATE TABLE bar (fooid INTEGER NOT NULL PRIMARY KEY, FOREIGN KEY(fooid) REFERENCES foo(id))" + insertIntoBar := "INSERT INTO bar(fooid) VALUES(1)" + + db := mustCreateInMemoryDatabase() + defer db.Close() + + r, err := db.ExecuteStringStmt(createTableFoo) + if err != nil { + t.Fatalf("failed to create table: %s", err.Error()) + } + if exp, got := `[{}]`, asJSON(r); exp != got { + t.Fatalf("unexpected results for query, expected %s, got %s", exp, got) + } + + r, err = db.ExecuteStringStmt(createTableBar) + if err != nil { + t.Fatalf("failed to create table: %s", err.Error()) + } + if exp, got := `[{}]`, asJSON(r); exp != got { + t.Fatalf("unexpected results for query, expected %s, got %s", exp, got) + } + + r, err = db.ExecuteStringStmt(insertIntoBar) + if err != nil { + t.Fatalf("failed to insert record: %s", err.Error()) + } + if exp, got := `[{"last_insert_id":1,"rows_affected":1}]`, asJSON(r); exp != got { + t.Fatalf("unexpected results for query, expected %s, got %s", exp, got) + } + + // Now, do same testing with FK constraints enabled. + dbFK := mustCreateInMemoryDatabaseFK() + defer dbFK.Close() + + r, err = dbFK.ExecuteStringStmt(createTableFoo) + if err != nil { + t.Fatalf("failed to create table: %s", err.Error()) + } + if exp, got := `[{}]`, asJSON(r); exp != got { + t.Fatalf("unexpected results for query, expected %s, got %s", exp, got) + } + + r, err = dbFK.ExecuteStringStmt(createTableBar) + if err != nil { + t.Fatalf("failed to create table: %s", err.Error()) + } + if exp, got := `[{}]`, asJSON(r); exp != got { + t.Fatalf("unexpected results for query, expected %s, got %s", exp, got) + } + + r, err = dbFK.ExecuteStringStmt(insertIntoBar) + if err != nil { + t.Fatalf("failed to insert record: %s", err.Error()) + } + if exp, got := `[{"error":"FOREIGN KEY constraint failed"}]`, asJSON(r); exp != got { + t.Fatalf("unexpected results for query, expected %s, got %s", exp, got) + } +} + func Test_SQLiteMasterTable(t *testing.T) { db, path := mustCreateDatabase() defer db.Close() @@ -1425,6 +1487,14 @@ func mustCreateInMemoryDatabase() *DB { return db } +func mustCreateInMemoryDatabaseFK() *DB { + db, err := OpenInMemory(true) + if err != nil { + panic("failed to open in-memory database with foreign key constraints") + } + return db +} + func mustWriteAndOpenDatabase(b []byte) (*DB, string) { var err error f := mustTempFile()