Skip to content

Operations on go-sqlmock.Driver fail with: expected a connection to be available, but it is not #267

@fho

Description

@fho

Hello,

I'm working on a package that wraps an sql.Driver and adds functionality.
To test it, I'm trying to use go-sqlmock.
I'm running into the issue that if I wrap the go-sqlmock Driver, all operations fail with the error:
expected a connection to be available, but it is not

I'm accessing the driver via:

db, _, _ := sqlmock.New()
db.Driver()

This can be reproduced e.g. via sqlmw:

package dddbmock_test

import (
	"database/sql"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
	"github.com/ngrok/sqlmw"
)

func TestMWWrap(t *testing.T) {
	db, _, err := sqlmock.New()
	if err != nil {
		t.Fatal("sqlmock new failed:", err)
	}

	sql.Register(
		"mwdriver",
		sqlmw.Driver(db.Driver(), &sqlmw.NullInterceptor{}),
	)

	db, err = sql.Open("mydriver", "")
	if err != nil {
		t.Fatal("opening driver failed:", err)
	}

	if err := db.Ping(); err != nil {
		t.Error("ping failed", err)
	}
}

Without using other external packages and mimicking the wrapping behavior instead it can be reproduced like:

package dddbmock_test

import (
	"database/sql"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
)

func TestRegister(t *testing.T) {
	db, _, err := sqlmock.New(sqlmock.MonitorPingsOption(true))
	if err != nil {
		t.Fatal("sqlmock new failed:", err)
	}

	sql.Register("mydriver", db.Driver())

	db, err = sql.Open("mydriver", "")
	if err != nil {
		t.Fatal("opening driver failed:", err)
	}

	if err := db.Ping(); err != nil {
		t.Error("ping failed", err)
	}

	if _, err := db.Exec(""); err != nil {
		t.Error("exec failed", err)
	}
}

The comment #83 (comment) seems to be about the same issue.
I guess it's not intended to be used like that, but it would be awesome to support operations on the go-sqlmock Driver.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions