From bc47ccc818b4393f1f1c9d64b81ed9577e951824 Mon Sep 17 00:00:00 2001 From: Dan Sosedoff Date: Tue, 13 Jan 2015 21:03:52 -0600 Subject: [PATCH] Add initial client tests --- client_test.go | 209 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 client_test.go diff --git a/client_test.go b/client_test.go new file mode 100644 index 0000000..973f4dd --- /dev/null +++ b/client_test.go @@ -0,0 +1,209 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + "testing" + + "github.com/stretchr/testify/assert" +) + +var testClient *Client + +func setup() { + out, err := exec.Command("createdb", "-U", "postgres", "-h", "localhost", "booktown").CombinedOutput() + + if err != nil { + fmt.Print("Database creation failed:", string(out)) + os.Exit(1) + } + + out, err = exec.Command("psql", "-U", "postgres", "-h", "localhost", "-f", "./sql/booktown.sql", "booktown").CombinedOutput() + + if err != nil { + fmt.Print("Database import failed:", string(out)) + os.Exit(1) + } +} + +func setupClient() { + testClient, _ = NewClientFromUrl("postgres://postgres@localhost/booktown?sslmode=disable") +} + +func teardownClient() { + if testClient != nil { + testClient.db.Close() + } +} + +func teardown() { + out, err := exec.Command("dropdb", "-U", "postgres", "-h", "localhost", "booktown").CombinedOutput() + + if err != nil { + fmt.Print(string(out)) + } +} + +func test_NewClientFromUrl(t *testing.T) { + url := "postgres://postgres@localhost/booktown?sslmode=disable" + client, err := NewClientFromUrl(url) + + if err != nil { + defer client.db.Close() + } + + assert.Equal(t, nil, err) + assert.Equal(t, url, client.connectionString) +} + +func test_Test(t *testing.T) { + assert.Equal(t, nil, testClient.Test()) +} + +func test_Info(t *testing.T) { + res, err := testClient.Info() + + assert.Equal(t, nil, err) + assert.NotEqual(t, nil, res) +} + +func test_Databases(t *testing.T) { + res, err := testClient.Databases() + + assert.Equal(t, nil, err) + assert.Contains(t, res, "booktown") + assert.Contains(t, res, "postgres") +} + +func test_Tables(t *testing.T) { + res, err := testClient.Tables() + + expected := []string{ + "alternate_stock", + "authors", + "book_backup", + "book_queue", + "books", + "customers", + "daily_inventory", + "distinguished_authors", + "editions", + "employees", + "favorite_authors", + "favorite_books", + "money_example", + "my_list", + "numeric_values", + "publishers", + "recent_shipments", + "schedules", + "shipments", + "states", + "stock", + "stock_backup", + "stock_view", + "subjects", + "text_sorting", + } + + assert.Equal(t, nil, err) + assert.Equal(t, expected, res) +} + +func test_Table(t *testing.T) { + res, err := testClient.Table("books") + + columns := []string{ + "column_name", + "data_type", + "is_nullable", + "character_maximum_length", + "character_set_catalog", + "column_default", + } + + assert.Equal(t, nil, err) + assert.Equal(t, columns, res.Columns) + assert.Equal(t, 4, len(res.Rows)) +} + +func test_TableRows(t *testing.T) { + res, err := testClient.TableRows("books", RowsOptions{}) + + assert.Equal(t, nil, err) + assert.Equal(t, 4, len(res.Columns)) + assert.Equal(t, 15, len(res.Rows)) +} + +func test_TableInfo(t *testing.T) { + res, err := testClient.TableInfo("books") + + assert.Equal(t, nil, err) + assert.Equal(t, 4, len(res.Columns)) + assert.Equal(t, 1, len(res.Rows)) +} + +func test_TableIndexes(t *testing.T) { + res, err := testClient.TableIndexes("books") + + assert.Equal(t, nil, err) + assert.Equal(t, 2, len(res.Columns)) + assert.Equal(t, 2, len(res.Rows)) +} + +func test_Query(t *testing.T) { + res, err := testClient.Query("SELECT * FROM books") + + assert.Equal(t, nil, err) + assert.Equal(t, 4, len(res.Columns)) + assert.Equal(t, 15, len(res.Rows)) +} + +func test_QueryError(t *testing.T) { + res, err := testClient.Query("SELCT * FROM books") + + assert.NotEqual(t, nil, err) + assert.Equal(t, "pq: syntax error at or near \"SELCT\"", err.Error()) + assert.Equal(t, true, res == nil) +} + +func test_QueryInvalidTable(t *testing.T) { + res, err := testClient.Query("SELECT * FROM books2") + + assert.NotEqual(t, nil, err) + assert.Equal(t, "pq: relation \"books2\" does not exist", err.Error()) + assert.Equal(t, true, res == nil) +} + +func test_ResultCsv(t *testing.T) { + res, _ := testClient.Query("SELECT * FROM books ORDER BY id ASC LIMIT 1") + csv := res.CSV() + + expected := "id,title,author_id,subject_id\n156,The Tell-Tale Heart,115,9\n" + + assert.Equal(t, expected, string(csv)) +} + +func TestAll(t *testing.T) { + teardown() + setup() + setupClient() + + test_NewClientFromUrl(t) + test_Test(t) + test_Info(t) + test_Databases(t) + test_Tables(t) + test_Table(t) + test_TableRows(t) + test_TableInfo(t) + test_TableIndexes(t) + test_Query(t) + test_QueryError(t) + test_QueryInvalidTable(t) + test_ResultCsv(t) + + teardownClient() + teardown() +}