add new test of enum
diff --git a/dockertests/docker_test.go b/dockertests/docker_test.go index 0851a41..93192dc 100644 --- a/dockertests/docker_test.go +++ b/dockertests/docker_test.go
@@ -106,11 +106,12 @@ }) It("should succesfully download new table from pg", func(done Done) { - tableName := "docker_test_a" + tableName := "docker_test_download" targetTablename := "edgex_" + tableName handler := &newTableHandler{ targetTablename: targetTablename, done: done, + verifyFunc: verifyTestTableExist, } apid.Events().Listen(ApigeeSyncEventSelector, handler) @@ -119,17 +120,32 @@ }, 1) It("should get data according to data scope", func(done Done) { - tableName := "docker_test_b" + tableName := "docker_test_scope" targetTablename := "edgex_" + tableName - handler := &newTableScopeHandler{ + handler := &newTableHandler{ targetTablename: targetTablename, done: done, + verifyFunc: verifyTestTableData, } apid.Events().Listen(ApigeeSyncEventSelector, handler) createTestTableWithData(tableName) }, 1) + + It("should replicate ENUM type of pg correctly", func(done Done) { + tableName := "docker_test_enum" + targetTablename := "edgex_" + tableName + handler := &newTableHandler{ + targetTablename: targetTablename, + done: done, + verifyFunc: verifyTestTableEnum, + } + + apid.Events().Listen(ApigeeSyncEventSelector, handler) + createTestTableWithEnum(tableName) + + }, 1) }) }) @@ -163,6 +179,25 @@ tx.Commit() } +func createTestTableWithEnum(tableName string) { + tx, err := pgManager.BeginTransaction() + Expect(err).Should(Succeed()) + defer tx.Rollback() + _, err = tx.Exec("CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');") + Expect(err).Should(Succeed()) + _, err = tx.Exec("CREATE TABLE edgex." + tableName + " (id varchar primary key, val mood, _change_selector varchar);") + Expect(err).Should(Succeed()) + _, err = tx.Exec("ALTER TABLE edgex." + tableName + " replica identity full;") + Expect(err).Should(Succeed()) + _, err = tx.Exec("INSERT INTO edgex." + tableName + " values ('one', 'sad', 'foo');") + Expect(err).Should(Succeed()) + _, err = tx.Exec("INSERT INTO edgex." + tableName + " values ('two', 'ok', 'bar');") + Expect(err).Should(Succeed()) + _, err = tx.Exec("INSERT INTO edgex." + tableName + " values ('three', 'happy', '" + clusterIdFromConfig + "');") + Expect(err).Should(Succeed()) + tx.Commit() +} + func dropTestTable(targetTableName string, sqliteDb apid.DB) { tx, err := pgManager.BeginTransaction() Expect(err).Should(Succeed()) @@ -300,6 +335,7 @@ type newTableHandler struct { targetTablename string done Done + verifyFunc func (string, apid.DB) } func (n *newTableHandler) Handle(event apid.Event) { @@ -307,13 +343,13 @@ defer GinkgoRecover() sqliteDb, err := dataService.DBVersion(s.SnapshotInfo) Expect(err).Should(Succeed()) - Expect(verifyTestTableExist(n.targetTablename, sqliteDb)).To(BeTrue()) + n.verifyFunc(n.targetTablename, sqliteDb) apid.Events().StopListening(ApigeeSyncEventSelector, n) close(n.done) } } -func verifyTestTableExist(targetTableName string, sqliteDb apid.DB) bool { +func verifyTestTableExist(targetTableName string, sqliteDb apid.DB) { rows, err := sqliteDb.Query("SELECT DISTINCT tableName FROM _transicator_tables;") Expect(err).Should(Succeed()) defer rows.Close() @@ -323,26 +359,10 @@ Expect(err).Should(Succeed()) if tableName == targetTableName { - return true + return } } - return false -} - -type newTableScopeHandler struct { - targetTablename string - done Done -} - -func (n *newTableScopeHandler) Handle(event apid.Event) { - if s, ok := event.(*common.Snapshot); ok { - defer GinkgoRecover() - sqliteDb, err := dataService.DBVersion(s.SnapshotInfo) - Expect(err).Should(Succeed()) - verifyTestTableData(n.targetTablename, sqliteDb) - apid.Events().StopListening(ApigeeSyncEventSelector, n) - close(n.done) - } + Fail("Table " + targetTableName + " doesn'r exist!") } func verifyTestTableData(targetTableName string, sqliteDb apid.DB) { @@ -360,6 +380,21 @@ Expect(count).To(Equal(1)) } +func verifyTestTableEnum(targetTableName string, sqliteDb apid.DB) { + rows, err := sqliteDb.Query("SELECT val FROM " + targetTableName + ";") + Expect(err).Should(Succeed()) + defer rows.Close() + count := 0 + for rows.Next() { + var val string + err = rows.Scan(&val) + Expect(err).Should(Succeed()) + Expect(val).To(Equal("happy")) + count += 1 + } + Expect(count).To(Equal(1)) +} + func TestDockerApigeeSync(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "ApigeeSync Docker Suite")
diff --git a/dockertests/management_pg.go b/dockertests/management_pg.go index 6c7dfd4..bbe28e9 100644 --- a/dockertests/management_pg.go +++ b/dockertests/management_pg.go
@@ -195,6 +195,8 @@ * Only test data for the whole suite will remain in the pg. */ func (m *ManagementPg) CleanupTest() error { + + // clean tables tablesToDelete := make([]string, 0) rows, err := m.pg.Query("SELECT table_name FROM information_schema.tables WHERE table_schema='edgex';") if err != nil { @@ -222,7 +224,34 @@ } cleanupSql := "DELETE FROM edgex.apid_cluster WHERE created_by!='" + testInitUser + "';" _, err = m.pg.Exec(cleanupSql) - return err + if err != nil { + return err + } + + // clean enum types + typesToDelete := make([]string, 0) + typeRows, err := m.pg.Query("SELECT DISTINCT pg_type.typname AS enumtype FROM pg_type JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;") + if err != nil { + return err + } + defer typeRows.Close() + for typeRows.Next() { + var typeName string + err = typeRows.Scan(&typeName) + if err != nil { + return err + } + typesToDelete = append(typesToDelete, typeName) + } + + for _, typeName := range typesToDelete { + cleanupSql := "DROP TYPE edgex." + typeName + ";" + _, err := m.pg.Exec(cleanupSql) + if err != nil { + return err + } + } + return nil } func (m *ManagementPg) CleanupAll() error {