Files
eagle/internal/repository/user_base_repo_test.go
2021-12-19 22:58:29 +08:00

129 lines
3.2 KiB
Go

package repository
import (
"context"
"database/sql"
"regexp"
"testing"
"time"
sqlmock "github.com/DATA-DOG/go-sqlmock"
"github.com/go-test/deep"
"github.com/jinzhu/gorm"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
"github.com/go-eagle/eagle/internal/model"
)
type Suite struct {
suite.Suite
db *gorm.DB
mock sqlmock.Sqlmock
repository repository
}
func (s *Suite) SetupSuite() {
var (
db *sql.DB
err error
)
db, s.mock, err = sqlmock.New()
require.NoError(s.T(), err)
gdb, err := gorm.Open("mysql", db)
require.NoError(s.T(), err)
s.db = gdb
s.db.LogMode(true)
//s.repository = New(s.db)
}
func (s *Suite) AfterTest(_, _ string) {
require.NoError(s.T(), s.mock.ExpectationsWereMet())
}
//nolint: golint
func TestInit(t *testing.T) {
suite.Run(t, new(Suite))
}
func (s *Suite) Test_repository_Create() {
user := model.UserBaseModel{
Username: "test-name",
Password: "123456",
Phone: 123455678,
Email: "test@test.com",
Avatar: "/statics/avatar/1.jpg",
Sex: 1,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
const sqlInsert = `INSERT INTO "user_base" ("username","password","phone","email","avatar","sex","created_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7,$8) RETURNING "user_base"."id"`
const newID = 1
s.mock.ExpectBegin()
s.mock.ExpectQuery(regexp.QuoteMeta(sqlInsert)).
WithArgs(user.Username, user.Password, user.Phone, user.Email, user.Avatar, user.Sex, user.CreatedAt, user.UpdatedAt).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(newID))
s.mock.ExpectCommit()
_, err := s.repository.CreateUser(context.TODO(), &user)
require.NoError(s.T(), err)
}
func (s *Suite) Test_repository_GetUserByID() {
var (
id uint64 = 2
username = "test-name"
)
s.mock.ExpectQuery(regexp.QuoteMeta(
`SELECT * FROM "user_base" WHERE (id = $1)`)).
WithArgs(id).WillReturnRows(sqlmock.NewRows([]string{"id", "username"}).AddRow(id, username))
res, err := s.repository.GetUser(context.TODO(), id)
require.NoError(s.T(), err)
require.Nil(s.T(), deep.Equal(&model.UserBaseModel{ID: id, Username: username}, res))
}
func (s *Suite) Test_repository_GetUserByPhone() {
var (
id uint64 = 2
username = "test-phone"
phone int64 = 13011112222
)
s.mock.ExpectQuery(regexp.QuoteMeta(
`SELECT * FROM "user_base" WHERE (phone = $1)`)).
WithArgs(phone).WillReturnRows(sqlmock.NewRows([]string{"id", "username", "phone"}).AddRow(id, username, phone))
res, err := s.repository.GetUserByPhone(context.TODO(), phone)
require.NoError(s.T(), err)
require.Nil(s.T(), deep.Equal(&model.UserBaseModel{ID: id, Username: username, Phone: phone}, res))
}
func (s *Suite) Test_repository_GetUserByEmail() {
var (
id uint64 = 2
username = "test-email"
email = "test-email@test.com"
)
s.mock.ExpectQuery(regexp.QuoteMeta(
`SELECT * FROM "user_base" WHERE (email = $1)`)).
WithArgs(email).WillReturnRows(sqlmock.NewRows([]string{"id", "username", "email"}).AddRow(id, username, email))
res, err := s.repository.GetUserByEmail(context.TODO(), email)
require.NoError(s.T(), err)
require.Nil(s.T(), deep.Equal(&model.UserBaseModel{ID: id, Username: username, Email: email}, res))
}