From 9766bb2ed2d157478006c8e1b721bc54bbe745c0 Mon Sep 17 00:00:00 2001 From: Dan Sosedoff Date: Fri, 15 Jan 2016 12:33:30 -0600 Subject: [PATCH] Add ability to run tests on postgresql 9.1-9.5 --- .travis.yml | 13 ++++--- data/booktown.sql | 2 ++ pkg/client/client_test.go | 74 ++++++++++++++++++++++++++++++++++----- script/test_all.sh | 20 +++++++++++ 4 files changed, 96 insertions(+), 13 deletions(-) create mode 100755 script/test_all.sh diff --git a/.travis.yml b/.travis.yml index b0be546..ef49be7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,21 @@ +sudo: required + language: go -sudo: false + +services: + - docker addons: postgresql: "9.4" go: -- 1.4.2 -- 1.5.2 + - 1.4.2 + - 1.5.2 install: - make setup script: - make build - - make test \ No newline at end of file + - make test + - PGHOST=127.0.0.1 ./scripts/test_all.sh \ No newline at end of file diff --git a/data/booktown.sql b/data/booktown.sql index 5c8a09e..04439a8 100644 --- a/data/booktown.sql +++ b/data/booktown.sql @@ -907,6 +907,8 @@ CREATE FUNCTION "check_book_addition" () RETURNS opaque AS ' CREATE VIEW "stock_view" as SELECT stock.isbn, stock.retail, stock.stock FROM stock; +CREATE MATERIALIZED VIEW "m_stock_view" as SELECT stock.isbn, stock.retail, stock.stock FROM stock; + -- -- TOC Entry ID 30 (OID 3628247) -- diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index 820087b..44960b8 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -11,8 +11,13 @@ import ( ) var ( - testClient *Client - testCommands map[string]string + testClient *Client + testCommands map[string]string + serverHost string + serverPort string + serverUser string + serverPassword string + serverDatabase string ) func mapKeys(data map[string]*Objects) []string { @@ -23,6 +28,28 @@ func mapKeys(data map[string]*Objects) []string { return result } +func pgVersion() (int, int) { + var major, minor int + fmt.Sscanf(os.Getenv("PGVERSION"), "%d.%d", &major, &minor) + return major, minor +} + +func getVar(name, def string) string { + val := os.Getenv(name) + if val == "" { + return def + } + return val +} + +func initVars() { + serverHost = getVar("PGHOST", "localhost") + serverPort = getVar("PGPORT", "5432") + serverUser = getVar("PGUSER", "postgres") + serverPassword = getVar("PGPASSWORD", "postgres") + serverDatabase = getVar("PGDATABASE", "booktown") +} + func setupCommands() { testCommands = map[string]string{ "createdb": "createdb", @@ -42,7 +69,13 @@ func onWindows() bool { } func setup() { - out, err := exec.Command(testCommands["createdb"], "-U", "postgres", "-h", "localhost", "booktown").CombinedOutput() + out, err := exec.Command( + testCommands["createdb"], + "-U", serverUser, + "-h", serverHost, + "-p", serverPort, + serverDatabase, + ).CombinedOutput() if err != nil { fmt.Println("Database creation failed:", string(out)) @@ -50,7 +83,14 @@ func setup() { os.Exit(1) } - out, err = exec.Command(testCommands["psql"], "-U", "postgres", "-h", "localhost", "-f", "../../data/booktown.sql", "booktown").CombinedOutput() + out, err = exec.Command( + testCommands["psql"], + "-U", serverUser, + "-h", serverHost, + "-p", serverPort, + "-f", "../../data/booktown.sql", + serverDatabase, + ).CombinedOutput() if err != nil { fmt.Println("Database import failed:", string(out)) @@ -60,7 +100,8 @@ func setup() { } func setupClient() { - testClient, _ = NewFromUrl("postgres://postgres@localhost/booktown?sslmode=disable") + url := fmt.Sprintf("postgres://%s@%s:%s/%s?sslmode=disable", serverUser, serverHost, serverPort, serverDatabase) + testClient, _ = NewFromUrl(url) } func teardownClient() { @@ -70,7 +111,13 @@ func teardownClient() { } func teardown() { - _, err := exec.Command(testCommands["dropdb"], "-U", "postgres", "-h", "localhost", "booktown").CombinedOutput() + _, err := exec.Command( + testCommands["dropdb"], + "-U", serverUser, + "-h", serverHost, + "-p", serverPort, + serverDatabase, + ).CombinedOutput() if err != nil { fmt.Println("Teardown error:", err) @@ -78,7 +125,7 @@ func teardown() { } func test_NewClientFromUrl(t *testing.T) { - url := "postgres://postgres@localhost/booktown?sslmode=disable" + url := fmt.Sprintf("postgres://%s@%s:%s/%s?sslmode=disable", serverUser, serverHost, serverPort, serverDatabase) client, err := NewFromUrl(url) if err != nil { @@ -90,7 +137,7 @@ func test_NewClientFromUrl(t *testing.T) { } func test_NewClientFromUrl2(t *testing.T) { - url := "postgresql://postgres@localhost/booktown?sslmode=disable" + url := fmt.Sprintf("postgresql://%s@%s:%s/%s?sslmode=disable", serverUser, serverHost, serverPort, serverDatabase) client, err := NewFromUrl(url) if err != nil { @@ -156,6 +203,13 @@ func test_Objects(t *testing.T) { assert.Equal(t, tables, objects["public"].Tables) assert.Equal(t, []string{"recent_shipments", "stock_view"}, objects["public"].Views) assert.Equal(t, []string{"author_ids", "book_ids", "shipments_ship_id_seq", "subject_ids"}, objects["public"].Sequences) + + major, minor := pgVersion() + if minor == 0 || minor >= 3 { + assert.Equal(t, []string{"m_stock_view"}, objects["public"].MaterializedViews) + } else { + t.Logf("Skipping materialized view on %d.%d\n", major, minor) + } } func test_Table(t *testing.T) { @@ -257,7 +311,8 @@ func test_HistoryError(t *testing.T) { } func test_HistoryUniqueness(t *testing.T) { - client, _ := NewFromUrl("postgres://postgres@localhost/booktown?sslmode=disable") + url := fmt.Sprintf("postgres://%s@%s:%s/%s?sslmode=disable", serverUser, serverHost, serverPort, serverDatabase) + client, _ := NewFromUrl(url) client.Query("SELECT * FROM books WHERE id = 1") client.Query("SELECT * FROM books WHERE id = 1") @@ -272,6 +327,7 @@ func TestAll(t *testing.T) { return } + initVars() setupCommands() teardown() setup() diff --git a/script/test_all.sh b/script/test_all.sh new file mode 100755 index 0000000..a2aa5db --- /dev/null +++ b/script/test_all.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -e + +export PGHOST=${PGHOST:-192.168.99.100} +export PGUSER="postgres" +export PGPASSWORD="" +export PGDATABASE="booktown" +export PGPORT="5432" + +for i in {1..5} +do + export PGVERSION="9.$i" + echo "Running tests against PostgreSQL v$PGVERSION" + docker rm -f postgres || true + docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=$PGPASSWORD -d postgres:$PGVERSION + sleep 5 + make test + echo "----------" +done \ No newline at end of file