Setelah repository untuk aplikasi dibuat, berikutnya kita buat repository untuk test.
Buat file pkg/repository/dbrepo/users_testdb.go.
package dbrepo
import (
"database/sql"
"errors"
"time"
"webapp/pkg/data"
)
type TestDBRepo struct{}
func (m *TestDBRepo) Connection() *sql.DB {
return nil
}
// AllUsers returns all users as a slice of *data.User
func (m *TestDBRepo) AllUsers() ([]*data.User, error) {
var users []*data.User
return users, nil
}
// GetUser returns one user by id
func (m *TestDBRepo) GetUser(id int) (*data.User, error) {
var user = data.User{
ID: 1,
}
return &user, nil
}
// GetUserByEmail returns one user by email address
func (m *TestDBRepo) GetUserByEmail(email string) (*data.User, error) {
if email == "admin@example.com" {
user := data.User{
ID: 1,
FirstName: "Admin",
LastName: "User",
Email: "admin@example.com",
Password: "$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK",
IsAdmin: 1,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
return &user, nil
}
return nil, errors.New("not found")
}
// UpdateUser updates one user in the database
func (m *TestDBRepo) UpdateUser(u data.User) error {
return nil
}
// DeleteUser deletes one user from the database, by id
func (m *TestDBRepo) DeleteUser(id int) error {
return nil
}
// InsertUser inserts a new user into the database, and returns the ID of the newly inserted row
func (m *TestDBRepo) InsertUser(user data.User) (int, error) {
return 2, nil
}
// ResetPassword is the method we will use to change a user's password.
func (m *TestDBRepo) ResetPassword(id int, password string) error {
return nil
}
// InsertUserImage inserts a user profile image into the database.
func (m *TestDBRepo) InsertUserImage(i data.UserImage) (int, error) {
return 1, nil
}
Kemudian update file cmd/web/setup_test.go untuk menggunakan repository test yang telah dibuat diatas. (bagian baris komentar adalah kode lama yang sudah tidak digunakan).
package main
import (
"os"
"testing"
"webapp/pkg/repository/dbrepo"
)
var app application
func TestMain(m *testing.M) {
templatePath = "./../../templates/"
app.Session = getSession()
//sudah tidak digunakan, diganti menggunakan testdb repository
// app.DSN = "host=localhost port=5432 user=postgres password=postgres dbname=users sslmode=disable timezone=UTC connect_timeout=5"
// conn, err := app.connectToDB()
// if err != nil {
// log.Fatal(err)
// }
// defer conn.Close()
app.DB = &dbrepo.TestDBRepo{}
os.Exit(m.Run())
}
Sesuai ekspektasi, test dapat dijalankan tanpa error connection, walaupun service docker yang berisi database tidak dijalankan.
$ go test .
ok webapp/cmd/web 2.442s
Sampai disini kita sudah mempelajari bagaimana melakukan test tanpa database service berjalan.
Pada modul selanjutnya kita akan mempelajari Database integration testing.