Repository Pattern – Testing

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.

Sharing is caring:

Leave a Comment