package store_test import ( "fmt" "gitea.deepak.science/deepak/gogmagog/models" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" "testing" ) func TestSelectUserById(t *testing.T) { // set up test assert := assert.New(t) id := 1 username := "test" displayName := "Tom Est" password := []byte("ABC€") str, mock := getDbMock(t) rows := sqlmock.NewRows([]string{ "user_id", "username", "display_name", "password", }). AddRow(id, username, displayName, password) mock.ExpectQuery(`^SELECT user_id, username, display_name, password FROM users WHERE user_id = \$1`). WithArgs(id). WillReturnRows(rows) // function under test user, err := str.SelectUserByID(1) // test results assert.Nil(err) assert.EqualValues(id, user.UserID) assert.Equal(username, user.Username) assert.Equal(displayName, user.DisplayName) assert.Equal(password, user.Password) if err := mock.ExpectationsWereMet(); err != nil { t.Errorf("unfulfilled expectations: %s", err) } } func TestErrUserByID(t *testing.T) { assert := assert.New(t) idToUse := 1 str, mock := getDbMock(t) mock.ExpectQuery(`^SELECT user_id, username, display_name, password FROM users WHERE user_id = \$1`).WithArgs(idToUse).WillReturnError(fmt.Errorf("example error")) user, err := str.SelectUserByID(idToUse) assert.NotNil(err) assert.Nil(user) if err := mock.ExpectationsWereMet(); err != nil { t.Errorf("unfulfilled expectations: %s", err) } } func TestInsertUser(t *testing.T) { // setup assert := assert.New(t) str, mock := getDbMock(t) username := "test" displayName := "Tom Est" password := []byte("ABC€") usr := &models.User{Username: username, DisplayName: displayName, Password: password} idToUse := 8 rows := sqlmock.NewRows([]string{"user_id"}).AddRow(8) mock.ExpectBegin() mock.ExpectQuery(`^INSERT INTO users \(username, display_name, password\) VALUES \(\$1, \$2, \$3\) RETURNING user_id$`). WithArgs(username, displayName, password). WillReturnRows(rows) mock.ExpectCommit() // function under test insertedId, err := str.InsertUser(usr) // check results assert.Nil(err) assert.EqualValues(idToUse, insertedId) if err := mock.ExpectationsWereMet(); err != nil { t.Errorf("unfulfilled expectations: %s", err) } } func TestInsertUserErr(t *testing.T) { // setup assert := assert.New(t) str, mock := getDbMock(t) username := "test" displayName := "Tom Est" password := []byte("ABC€") usr := &models.User{Username: username, DisplayName: displayName, Password: password} mock.ExpectBegin() mock.ExpectQuery(`^INSERT INTO users \(username, display_name, password\) VALUES \(\$1, \$2, \$3\) RETURNING user_id$`). WithArgs(username, displayName, password). WillReturnError(fmt.Errorf("example error")) mock.ExpectRollback() // function under test _, err := str.InsertUser(usr) // check results assert.NotNil(err) if err := mock.ExpectationsWereMet(); err != nil { t.Errorf("unfulfilled expectations: %s", err) } } func TestInsertUserCommitErr(t *testing.T) { // setup assert := assert.New(t) str, mock := getDbMock(t) username := "test" displayName := "Tom Est" password := []byte("ABC€") usr := &models.User{Username: username, DisplayName: displayName, Password: password} idToUse := 8 rows := sqlmock.NewRows([]string{"user_id"}).AddRow(idToUse) mock.ExpectBegin() mock.ExpectQuery(`^INSERT INTO users \(username, display_name, password\) VALUES \(\$1, \$2, \$3\) RETURNING user_id$`). WithArgs(username, displayName, password). WillReturnRows(rows) mock.ExpectCommit().WillReturnError(fmt.Errorf("another error example")) // function under test _, err := str.InsertUser(usr) // check results assert.NotNil(err) if err := mock.ExpectationsWereMet(); err != nil { t.Errorf("unfulfilled expectations: %s", err) } }