github.com/Jeffail/benthos/v3@v3.65.0/lib/test/integration/sql_test.go (about) 1 package integration 2 3 import ( 4 "context" 5 "database/sql" 6 "fmt" 7 "testing" 8 "time" 9 10 "github.com/Jeffail/benthos/v3/internal/integration" 11 "github.com/ory/dockertest/v3" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 var _ = registerIntegrationTest("sql", func(t *testing.T) { 17 t.Parallel() 18 19 pool, err := dockertest.NewPool("") 20 require.NoError(t, err) 21 22 pool.MaxWait = time.Second * 30 23 resource, err := pool.RunWithOptions(&dockertest.RunOptions{ 24 Repository: "postgres", 25 ExposedPorts: []string{"5432/tcp"}, 26 Env: []string{ 27 "POSTGRES_USER=testuser", 28 "POSTGRES_PASSWORD=testpass", 29 "POSTGRES_DB=testdb", 30 }, 31 }) 32 require.NoError(t, err) 33 t.Cleanup(func() { 34 assert.NoError(t, pool.Purge(resource)) 35 }) 36 37 var db *sql.DB 38 t.Cleanup(func() { 39 if db != nil { 40 db.Close() 41 } 42 }) 43 44 resource.Expire(900) 45 require.NoError(t, pool.Retry(func() error { 46 var dberr error 47 if db == nil { 48 if db, dberr = sql.Open( 49 "postgres", 50 fmt.Sprintf("postgres://testuser:testpass@localhost:%v/testdb?sslmode=disable", resource.GetPort("5432/tcp")), 51 ); dberr != nil { 52 return dberr 53 } 54 db.SetMaxIdleConns(0) 55 } 56 if dberr = db.Ping(); err != nil { 57 return dberr 58 } 59 if _, dberr = db.Exec(`create table testtable ( 60 id varchar(50) not null, 61 content varchar(50) not null, 62 primary key (id) 63 );`); dberr != nil { 64 return dberr 65 } 66 return nil 67 })) 68 69 template := ` 70 output: 71 sql: 72 driver: postgres 73 data_source_name: postgres://testuser:testpass@localhost:$PORT/testdb?sslmode=disable 74 query: "INSERT INTO testtable (id, content) VALUES ($1, $2);" 75 args_mapping: '[ "$ID-"+this.id.string(), this.content ]' 76 ` 77 queryGetFn := func(ctx context.Context, testID string, id string) (string, []string, error) { 78 key := testID + "-" + id 79 80 row := db.QueryRowContext(ctx, "SELECT content FROM testtable WHERE id = $1;", key) 81 if row.Err() != nil { 82 return "", nil, row.Err() 83 } 84 85 var content string 86 err := row.Scan(&content) 87 return fmt.Sprintf(`{"content":"%v","id":%v}`, content, id), nil, err 88 } 89 suite := integration.StreamTests( 90 integration.StreamTestOutputOnlySendSequential(10, queryGetFn), 91 integration.StreamTestOutputOnlySendBatch(10, queryGetFn), 92 ) 93 suite.Run( 94 t, template, 95 integration.StreamTestOptPort(resource.GetPort("5432/tcp")), 96 ) 97 })