// ------------------------------------------------------------ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. // ------------------------------------------------------------ package postgres import ( "fmt" "os" "testing" "time" "github.com/dapr/components-contrib/bindings" "github.com/dapr/dapr/pkg/logger" "github.com/stretchr/testify/assert" ) const ( testTableDDL = `CREATE TABLE IF NOT EXISTS foo ( id bigint NOT NULL, v1 character varying(50) NOT NULL, ts TIMESTAMP)` testInsert = "INSERT INTO foo (id, v1, ts) VALUES (%d, 'test-%d', '%v')" testDelete = "DELETE FROM foo" testUpdate = "UPDATE foo SET ts = '%v' WHERE id = %d" testSelect = "SELECT * FROM foo WHERE id < 3" ) func TestOperations(t *testing.T) { t.Parallel() t.Run("Get operation list", func(t *testing.T) { b := NewPostgres(nil) assert.NotNil(t, b) l := b.Operations() assert.Equal(t, 3, len(l)) }) } // SETUP TESTS // 1. `createdb daprtest` // 2. `createuser daprtest` // 3. `psql=# grant all privileges on database daprtest to daprtest;`` // 4. `export POSTGRES_TEST_CONN_URL="postgres://daprtest@localhost:5432/daprtest"`` // 5. `go test -v -count=1 ./bindings/postgres -run ^TestPostgresIntegration` func TestPostgresIntegration(t *testing.T) { url := os.Getenv("POSTGRES_TEST_CONN_URL") if url == "" { t.SkipNow() } // live DB test b := NewPostgres(logger.NewLogger("test")) m := bindings.Metadata{Properties: map[string]string{connectionURLKey: url}} if err := b.Init(m); err != nil { t.Fatal(err) } // create table req := &bindings.InvokeRequest{ Operation: execOperation, Metadata: map[string]string{commandSQLKey: testTableDDL}, } t.Run("Invoke create table", func(t *testing.T) { res, err := b.Invoke(req) assertResponse(t, res, err) }) t.Run("Invoke delete", func(t *testing.T) { req.Metadata[commandSQLKey] = testDelete res, err := b.Invoke(req) assertResponse(t, res, err) }) t.Run("Invoke insert", func(t *testing.T) { for i := 0; i < 10; i++ { req.Metadata[commandSQLKey] = fmt.Sprintf(testInsert, i, i, time.Now().Format(time.RFC3339)) res, err := b.Invoke(req) assertResponse(t, res, err) } }) t.Run("Invoke update", func(t *testing.T) { for i := 0; i < 10; i++ { req.Metadata[commandSQLKey] = fmt.Sprintf(testUpdate, time.Now().Format(time.RFC3339), i) res, err := b.Invoke(req) assertResponse(t, res, err) } }) t.Run("Invoke select", func(t *testing.T) { req.Operation = queryOperation req.Metadata[commandSQLKey] = testSelect res, err := b.Invoke(req) assertResponse(t, res, err) }) t.Run("Invoke delete", func(t *testing.T) { req.Operation = execOperation req.Metadata[commandSQLKey] = testDelete req.Data = nil res, err := b.Invoke(req) assertResponse(t, res, err) }) t.Run("Invoke close", func(t *testing.T) { req.Operation = closeOperation req.Metadata = nil req.Data = nil _, err := b.Invoke(req) assert.NoError(t, err) }) } func assertResponse(t *testing.T, res *bindings.InvokeResponse, err error) { assert.NoError(t, err) assert.NotNil(t, res) assert.NotNil(t, res.Metadata) }