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  })