DATA-DOG / go-sqlmock

Sql mock driver for golang to test database interactions
Other
5.95k stars 404 forks source link

call to Rollback transaction, was not expected, next expectation is: ExpectedQuery => expecting Query, QueryContext or QueryRow #291

Closed skhaz closed 2 years ago

skhaz commented 2 years ago

Question

I am trying to test this code

package main

import (
    "database/sql"
    "database/sql/driver"
    "regexp"
    "time"

    "github.com/DATA-DOG/go-sqlmock"
    "github.com/google/uuid"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type Workspace struct {
    ID        uuid.UUID      `gorm:"type:uuid;default:uuid_generate_v4()" json:"id"`
    Name      string         `gorm:"not null,type:text" json:"name"`
    CreatedAt time.Time      `gorm:"autoCreateTime" json:"create_time"`
    UpdatedAt time.Time      `gorm:"autoUpdateTime" json:"update_time"`
    DeletedAt gorm.DeletedAt `gorm:"index,->" json:"-"`
}

type WorkspaceRepository struct {
    db *gorm.DB
}

func (r *WorkspaceRepository) Configure(db *gorm.DB) {
    r.db = db
}

func (r *WorkspaceRepository) Delete(id any) (bool, error) {
    if err := r.db.Delete(&Workspace{}, "id = ?", id).Error; err != nil {
        return false, err
    }

    return true, nil
}

func setup() (conn *sql.DB, mock sqlmock.Sqlmock, repository WorkspaceRepository, err error) {
    conn, mock, err = sqlmock.New()
    if err != nil {
        return
    }

    dialector := postgres.New(postgres.Config{Conn: conn, PreferSimpleProtocol: true})
    db, err := gorm.Open(dialector, &gorm.Config{})
    if err != nil {
        return
    }

    repository = WorkspaceRepository{}

    repository.Configure(db)

    return
}

type AnyTime struct{}

func (a AnyTime) Match(v driver.Value) bool {
    _, ok := v.(time.Time)
    return ok
}

func main() {
    conn, mock, repository, err := setup()
    if err != nil {
        panic(err)
    }

    defer conn.Close()

    id := "31645053-7f8c-4769-ba94-b8948f478540"

    mock.ExpectBegin()
    mock.ExpectQuery(regexp.QuoteMeta(`UPDATE "workspaces" SET`)).WithArgs(AnyTime{}, id)
    mock.ExpectCommit()

    _, err = repository.Delete(id)
    if err != nil {
        panic(err)
    }

    err = mock.ExpectationsWereMet()
    if err != nil {
        panic(err)
    }
}

However I get this error, I do not know what I am doing wrong, my expectations match

2022/07/04 11:22:02 /home/ubuntu/workspace/personal/main.go:32 call to ExecQuery 'UPDATE "workspaces" SET "deleted_at"=$1 WHERE id = $2 AND "workspaces"."deleted_at" IS NULL' with args [{Name: Ordinal:1 Value:2022-07-04 11:22:02.304708 -0300 -03} {Name: Ordinal:2 Value:31645053-7f8c-4769-ba94-b8948f478540}], was not expected, next expectation is: ExpectedQuery => expecting Query, QueryContext or QueryRow which:
  - matches sql: 'UPDATE "workspaces" SET'
  - is with arguments:
    0 - {}
    1 - 31645053-7f8c-4769-ba94-b8948f478540; call to Rollback transaction, was not expected, next expectation is: ExpectedQuery => expecting Query, QueryContext or QueryRow which:
  - matches sql: 'UPDATE "workspaces" SET'
  - is with arguments:
    0 - {}
    1 - 31645053-7f8c-4769-ba94-b8948f478540
[0.168ms] [rows:0] UPDATE "workspaces" SET "deleted_at"='2022-07-04 11:22:02.304' WHERE id = '31645053-7f8c-4769-ba94-b8948f478540' AND "workspaces"."deleted_at" IS NULL
panic: call to ExecQuery 'UPDATE "workspaces" SET "deleted_at"=$1 WHERE id = $2 AND "workspaces"."deleted_at" IS NULL' with args [{Name: Ordinal:1 Value:2022-07-04 11:22:02.304708 -0300 -03} {Name: Ordinal:2 Value:31645053-7f8c-4769-ba94-b8948f478540}], was not expected, next expectation is: ExpectedQuery => expecting Query, QueryContext or QueryRow which:
  - matches sql: 'UPDATE "workspaces" SET'
  - is with arguments:
    0 - {}
    1 - 31645053-7f8c-4769-ba94-b8948f478540; call to Rollback transaction, was not expected, next expectation is: ExpectedQuery => expecting Query, QueryContext or QueryRow which:
  - matches sql: 'UPDATE "workspaces" SET'
  - is with arguments:
    0 - {}
    1 - 31645053-7f8c-4769-ba94-b8948f478540

goroutine 1 [running]:
main.main()
        /home/ubuntu/workspace/personal/main.go:81 +0x1da
exit status 2