pgxpoolgo

package module
v1.2.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 19, 2022 License: MIT Imports: 10 Imported by: 2

README

pgxpoolgo

go.dev reference GitHub go.mod Go version GitHub tag (latest SemVer) GitHub license

pgxpoolgo is based on pgxpool, but provides Pool interface and ability to mock the pgxpool connection for unit testing.

This package also provides some mock function that based on pgxmock like NewMockRows.

Getting started

Installation

You can use the go get method:

go get github.com/dalikewara/pgxpoolgo
Features
  • Mock support for these instance:
    • pgxpool.Pool
    • pgx.Rows
    • pgx.Row
    • pgconn.CommandTag
    • pgx.Tx
Todo
  • Add mock support for these instance:
    • pgxpool.Conn
    • pgxpool.Config
    • pgxpool.Stat
    • pgx.BatchResults
    • pgx.CopyFromSource
    • pgx.Batch
    • pgx.QueryFuncRow
Usage
Pool.Query
func poolQueryGetUserIDs(ctx context.Context, pool pgxpoolgo.Pool) ([]uint32, error) {
	var ids []uint32

	rows, err := pool.Query(ctx, `SELECT id FROM users`)
	if err != nil {
		return ids, err
	}
	defer rows.Close()

	for rows.Next() {
		var id uint32
		if err = rows.Scan(&id); err != nil {
			return ids, err
		}
		ids = append(ids, id)
	}

	return ids, nil
}

func TestPoolQueryGetUsersIDs_OK(t *testing.T) {
	ctx := context.Background()
	mockPool := pgxpoolgo.NewMockPool(t)
	assert.Implements(t, (*pgxpoolgo.Pool)(nil), mockPool)

	mockRows := pgxpoolgo.NewMockRows([]string{"id"}).AddRow(uint32(1)).AddRow(uint32(2)).AddRow(uint32(3)).Compose()
	mockPool.On("Query", ctx, `SELECT id FROM users`).Return(mockRows, nil).Once()

	ids, err := poolQueryGetUserIDs(ctx, mockPool)
	assert.Equal(t, true, mockPool.AssertCalled(t, "Query", ctx, `SELECT id FROM users`))
	assert.Equal(t, true, mockPool.AssertExpectations(t))
	assert.Nil(t, err)
	assert.Equal(t, []uint32{1, 2, 3}, ids)
}
Pool.QueryRow
func poolQueryRowGetUserID(ctx context.Context, pool pgxpoolgo.Pool) (uint32, error) {
	var id uint32

	err := pool.QueryRow(ctx, `SELECT id FROM users`).Scan(&id)
	if err != nil {
		return id, err
	}

	return id, nil
}

func TestPoolQueryRowGetUsersID_OK(t *testing.T) {
	ctx := context.Background()
	mockPool := pgxpoolgo.NewMockPool(t)
	assert.Implements(t, (*pgxpoolgo.Pool)(nil), mockPool)

	mockRow := pgxpoolgo.NewMockRow([]string{"id"}).AddRow(uint32(1)).Compose()
	mockPool.On("QueryRow", ctx, `SELECT id FROM users`).Return(mockRow, nil).Once()

	id, err := poolQueryRowGetUserID(ctx, mockPool)
	assert.Equal(t, true, mockPool.AssertCalled(t, "QueryRow", ctx, `SELECT id FROM users`))
	assert.Equal(t, true, mockPool.AssertExpectations(t))
	assert.Nil(t, err)
	assert.Equal(t, uint32(1), id)
}
Pool.Exec
func poolExecInsertUser(ctx context.Context, pool pgxpoolgo.Pool, username, email string) error {
	commandTag, err := pool.Exec(ctx, `INSERT INTO users (username, email) VALUES ($1, $2)`, username, email)
	if err != nil {
		return err
	}
	if commandTag.RowsAffected() < 1 {
		return errors.New("no user was inserted")
	}

	return nil
}

func TestPoolExecInsertUser_OK(t *testing.T) {
	username := "johndoe"
	email := "johndoe@email.com"
	ctx := context.Background()
	mockPool := pgxpoolgo.NewMockPool(t)
	assert.Implements(t, (*pgxpoolgo.Pool)(nil), mockPool)

	mockCommandTag := pgxpoolgo.NewMockCommandTag("INSERT", int64(1))
	mockPool.On("Exec", ctx, `INSERT INTO users (username, email) VALUES ($1, $2)`, username, email).Return(mockCommandTag, nil).Once()

	err := poolExecInsertUser(ctx, mockPool, username, email)
	assert.Equal(t, true, mockPool.AssertCalled(t, "Exec", ctx, `INSERT INTO users (username, email) VALUES ($1, $2)`, username, email))
	assert.Equal(t, true, mockPool.AssertExpectations(t))
	assert.Nil(t, err)
}
Pool.Begin
func poolBeginInsertUser(ctx context.Context, pool pgxpoolgo.Pool, username, email string) error {
	tx, err := pool.Begin(ctx)
	if err != nil {
		return nil
	}

	commandTag, err := tx.Exec(ctx, `INSERT INTO users (username, email) VALUES ($1, $2)`, username, email)
	if err != nil {
		return err
	}
	if commandTag.RowsAffected() < 1 {
		return errors.New("no user was inserted")
	}

	commandTag, err = tx.Exec(ctx, `INSERT INTO profiles (username, email) VALUES ($1, $2)`, username, email)
	if err != nil {
		return err
	}
	if commandTag.RowsAffected() < 1 {
		return errors.New("no profile was inserted")
	}

	if err = tx.Commit(ctx); err != nil {
		return nil
	}

	return nil
}

func TestPoolBeginInsertUser_OK(t *testing.T) {
	username := "johndoe"
	email := "johndoe@email.com"
	ctx := context.Background()
	mockPool := pgxpoolgo.NewMockPool(t)
	assert.Implements(t, (*pgxpoolgo.Pool)(nil), mockPool)

	mockTx := pgxpoolgo.NewMockTx(t)
	mockPool.On("Begin", ctx).Return(mockTx, nil).Once()

	mockCommandTag := pgxpoolgo.NewMockCommandTag("INSERT", int64(1))
	mockTx.On("Exec", ctx, `INSERT INTO users (username, email) VALUES ($1, $2)`, username, email).Return(mockCommandTag, nil)

	mockCommandTag = pgxpoolgo.NewMockCommandTag("INSERT", int64(1))
	mockTx.On("Exec", ctx, `INSERT INTO profiles (username, email) VALUES ($1, $2)`, username, email).Return(mockCommandTag, nil)

	mockTx.On("Commit", ctx).Return(nil).Once()

	err := poolBeginInsertUser(ctx, mockPool, username, email)
	assert.Equal(t, true, mockPool.AssertCalled(t, "Begin", ctx))
	assert.Equal(t, true, mockPool.AssertExpectations(t))
	assert.Equal(t, true, mockTx.AssertCalled(t, "Exec", ctx, `INSERT INTO users (username, email) VALUES ($1, $2)`, username, email))
	assert.Equal(t, true, mockTx.AssertCalled(t, "Exec", ctx, `INSERT INTO profiles (username, email) VALUES ($1, $2)`, username, email))
	assert.Equal(t, true, mockTx.AssertExpectations(t))
	assert.Nil(t, err)
}

Release

Changelog

Read at CHANGELOG.md

Credits

The original pgxpool package belongs to https://github.com/jackc/pgx

The original pgxmock package belongs to https://github.com/pashagolub/pgxmock

License

MIT License

Documentation

Index

Constants

View Source
const ErrDBCodeColumnNotExists = "42703"
View Source
const ErrDBCodeDuplicateKey = "23505"
View Source
const ErrDBCodeInvalidInputSyntax = "22P02"

Variables

This section is empty.

Functions

func Connect

func Connect(ctx context.Context, connString string) (*pgxpool.Pool, error)

Connect runs pgxpool.Connect.

func ConnectConfig

func ConnectConfig(ctx context.Context, config *pgxpool.Config) (*pgxpool.Pool, error)

ConnectConfig runs pgxpool.ConnectConfig.

func NewMockCommandTag added in v1.1.0

func NewMockCommandTag(op string, rowsAffected int64) pgconn.CommandTag

NewMockCommandTag mocks pgconn.CommandTag.

func NewMockCommandTagError added in v1.2.0

func NewMockCommandTagError(err error) pgconn.CommandTag

NewMockCommandTagError mocks pgconn.CommandTag error.

func NewMockErrDB added in v1.2.2

func NewMockErrDB(code string) error

func ParseConfig

func ParseConfig(connString string) (*pgxpool.Config, error)

ParseConfig runs pgxpool.ParseConfig.

Types

type ErrDatabase added in v1.2.1

type ErrDatabase struct {
	DBErr     error
	DBCode    string
	DBMessage string
}

func ErrDB added in v1.2.1

func ErrDB(e error) *ErrDatabase

func (*ErrDatabase) Code added in v1.2.1

func (e *ErrDatabase) Code() string

func (*ErrDatabase) Error added in v1.2.1

func (e *ErrDatabase) Error() string

func (*ErrDatabase) IsColumnNotExists added in v1.2.2

func (e *ErrDatabase) IsColumnNotExists() bool

func (*ErrDatabase) IsDuplicateKey added in v1.2.2

func (e *ErrDatabase) IsDuplicateKey() bool

func (*ErrDatabase) IsInvalidInputSyntax added in v1.2.2

func (e *ErrDatabase) IsInvalidInputSyntax() bool

func (*ErrDatabase) IsNoRows added in v1.2.2

func (e *ErrDatabase) IsNoRows() bool

func (*ErrDatabase) Message added in v1.2.1

func (e *ErrDatabase) Message() string

type MockPool

type MockPool struct {
	mock.Mock
}

MockPool is an autogenerated mock type for the Pool type

func NewMockPool

func NewMockPool(t mockConstructorTestingTNewMockPool) *MockPool

NewMockPool creates a new instance of MockPool. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.

func (*MockPool) Acquire

func (_m *MockPool) Acquire(ctx context.Context) (*pgxpool.Conn, error)

Acquire provides a mock function with given fields: ctx

func (*MockPool) AcquireAllIdle

func (_m *MockPool) AcquireAllIdle(ctx context.Context) []*pgxpool.Conn

AcquireAllIdle provides a mock function with given fields: ctx

func (*MockPool) AcquireFunc

func (_m *MockPool) AcquireFunc(ctx context.Context, f func(*pgxpool.Conn) error) error

AcquireFunc provides a mock function with given fields: ctx, f

func (*MockPool) Begin

func (_m *MockPool) Begin(ctx context.Context) (pgx.Tx, error)

Begin provides a mock function with given fields: ctx

func (*MockPool) BeginFunc

func (_m *MockPool) BeginFunc(ctx context.Context, f func(pgx.Tx) error) error

BeginFunc provides a mock function with given fields: ctx, f

func (*MockPool) BeginTx

func (_m *MockPool) BeginTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, error)

BeginTx provides a mock function with given fields: ctx, txOptions

func (*MockPool) BeginTxFunc

func (_m *MockPool) BeginTxFunc(ctx context.Context, txOptions pgx.TxOptions, f func(pgx.Tx) error) error

BeginTxFunc provides a mock function with given fields: ctx, txOptions, f

func (*MockPool) Close

func (_m *MockPool) Close()

Close provides a mock function with given fields:

func (*MockPool) Config

func (_m *MockPool) Config() *pgxpool.Config

Config provides a mock function with given fields:

func (*MockPool) CopyFrom

func (_m *MockPool) CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error)

CopyFrom provides a mock function with given fields: ctx, tableName, columnNames, rowSrc

func (*MockPool) Exec

func (_m *MockPool) Exec(ctx context.Context, sql string, arguments ...interface{}) (pgconn.CommandTag, error)

Exec provides a mock function with given fields: ctx, sql, arguments

func (*MockPool) Ping

func (_m *MockPool) Ping(ctx context.Context) error

Ping provides a mock function with given fields: ctx

func (*MockPool) Query

func (_m *MockPool) Query(ctx context.Context, sql string, args ...interface{}) (pgx.Rows, error)

Query provides a mock function with given fields: ctx, sql, args

func (*MockPool) QueryFunc

func (_m *MockPool) QueryFunc(ctx context.Context, sql string, args []interface{}, scans []interface{}, f func(pgx.QueryFuncRow) error) (pgconn.CommandTag, error)

QueryFunc provides a mock function with given fields: ctx, sql, args, scans, f

func (*MockPool) QueryRow

func (_m *MockPool) QueryRow(ctx context.Context, sql string, args ...interface{}) pgx.Row

QueryRow provides a mock function with given fields: ctx, sql, args

func (*MockPool) SendBatch

func (_m *MockPool) SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults

SendBatch provides a mock function with given fields: ctx, b

func (*MockPool) Stat

func (_m *MockPool) Stat() *pgxpool.Stat

Stat provides a mock function with given fields:

type MockRow added in v1.1.0

type MockRow struct {
	// contains filtered or unexported fields
}

func NewMockRow added in v1.1.0

func NewMockRow(columns []string) *MockRow

NewMockRow mocks pgx.Row.

func (*MockRow) AddRow added in v1.1.0

func (mr *MockRow) AddRow(values ...interface{}) *MockRow

func (*MockRow) Compose added in v1.1.0

func (mr *MockRow) Compose() pgx.Row

func (*MockRow) ScanError added in v1.2.0

func (mr *MockRow) ScanError(err error) *MockRow

type MockRows

type MockRows struct {
	// contains filtered or unexported fields
}

func NewMockRows

func NewMockRows(columns []string) *MockRows

NewMockRows mocks pgx.Rows.

func (*MockRows) AddCommandTag

func (mr *MockRows) AddCommandTag(tag pgconn.CommandTag) *MockRows

func (*MockRows) AddRow

func (mr *MockRows) AddRow(values ...interface{}) *MockRows

func (*MockRows) Compose

func (mr *MockRows) Compose() pgx.Rows

func (*MockRows) ScanError added in v1.2.0

func (mr *MockRows) ScanError(rowIndex int, err error) *MockRows

type MockTx added in v1.2.0

type MockTx struct {
	mock.Mock
}

MockTx is an autogenerated mock type for the Tx type

func NewMockTx added in v1.2.0

func NewMockTx(t mockConstructorTestingTNewMockTx) *MockTx

NewMockTx creates a new instance of MockTx. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.

func (*MockTx) Begin added in v1.2.0

func (_m *MockTx) Begin(ctx context.Context) (pgx.Tx, error)

Begin provides a mock function with given fields: ctx

func (*MockTx) BeginFunc added in v1.2.0

func (_m *MockTx) BeginFunc(ctx context.Context, f func(pgx.Tx) error) error

BeginFunc provides a mock function with given fields: ctx, f

func (*MockTx) Commit added in v1.2.0

func (_m *MockTx) Commit(ctx context.Context) error

Commit provides a mock function with given fields: ctx

func (*MockTx) Conn added in v1.2.0

func (_m *MockTx) Conn() *pgx.Conn

Conn provides a mock function with given fields:

func (*MockTx) CopyFrom added in v1.2.0

func (_m *MockTx) CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error)

CopyFrom provides a mock function with given fields: ctx, tableName, columnNames, rowSrc

func (*MockTx) Exec added in v1.2.0

func (_m *MockTx) Exec(ctx context.Context, sql string, arguments ...interface{}) (pgconn.CommandTag, error)

Exec provides a mock function with given fields: ctx, sql, arguments

func (*MockTx) LargeObjects added in v1.2.0

func (_m *MockTx) LargeObjects() pgx.LargeObjects

LargeObjects provides a mock function with given fields:

func (*MockTx) Prepare added in v1.2.0

func (_m *MockTx) Prepare(ctx context.Context, name string, sql string) (*pgconn.StatementDescription, error)

Prepare provides a mock function with given fields: ctx, name, sql

func (*MockTx) Query added in v1.2.0

func (_m *MockTx) Query(ctx context.Context, sql string, args ...interface{}) (pgx.Rows, error)

Query provides a mock function with given fields: ctx, sql, args

func (*MockTx) QueryFunc added in v1.2.0

func (_m *MockTx) QueryFunc(ctx context.Context, sql string, args []interface{}, scans []interface{}, f func(pgx.QueryFuncRow) error) (pgconn.CommandTag, error)

QueryFunc provides a mock function with given fields: ctx, sql, args, scans, f

func (*MockTx) QueryRow added in v1.2.0

func (_m *MockTx) QueryRow(ctx context.Context, sql string, args ...interface{}) pgx.Row

QueryRow provides a mock function with given fields: ctx, sql, args

func (*MockTx) Rollback added in v1.2.0

func (_m *MockTx) Rollback(ctx context.Context) error

Rollback provides a mock function with given fields: ctx

func (*MockTx) SendBatch added in v1.2.0

func (_m *MockTx) SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults

SendBatch provides a mock function with given fields: ctx, b

type Pool

type Pool interface {
	Close()
	Acquire(ctx context.Context) (*pgxpool.Conn, error)
	AcquireFunc(ctx context.Context, f func(*pgxpool.Conn) error) error
	AcquireAllIdle(ctx context.Context) []*pgxpool.Conn
	Config() *pgxpool.Config
	Stat() *pgxpool.Stat
	Exec(ctx context.Context, sql string, arguments ...interface{}) (pgconn.CommandTag, error)
	Query(ctx context.Context, sql string, args ...interface{}) (pgx.Rows, error)
	QueryRow(ctx context.Context, sql string, args ...interface{}) pgx.Row
	QueryFunc(ctx context.Context, sql string, args []interface{}, scans []interface{}, f func(pgx.QueryFuncRow) error) (pgconn.CommandTag, error)
	SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults
	Begin(ctx context.Context) (pgx.Tx, error)
	BeginTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, error)
	BeginFunc(ctx context.Context, f func(pgx.Tx) error) error
	BeginTxFunc(ctx context.Context, txOptions pgx.TxOptions, f func(pgx.Tx) error) error
	CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error)
	Ping(ctx context.Context) error
}

type Tx added in v1.2.0

type Tx interface {
	Begin(ctx context.Context) (pgx.Tx, error)
	BeginFunc(ctx context.Context, f func(pgx.Tx) error) (err error)
	Commit(ctx context.Context) error
	Rollback(ctx context.Context) error
	CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error)
	SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults
	LargeObjects() pgx.LargeObjects
	Prepare(ctx context.Context, name string, sql string) (*pgconn.StatementDescription, error)
	Exec(ctx context.Context, sql string, arguments ...interface{}) (commandTag pgconn.CommandTag, err error)
	Query(ctx context.Context, sql string, args ...interface{}) (pgx.Rows, error)
	QueryRow(ctx context.Context, sql string, args ...interface{}) pgx.Row
	QueryFunc(ctx context.Context, sql string, args []interface{}, scans []interface{}, f func(pgx.QueryFuncRow) error) (pgconn.CommandTag, error)
	Conn() *pgx.Conn
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL