Web API Testing – Routes Testing

Setelah middleware kita buat pada modul sebelumnya, selanjutnya adalah mengimplementasikan pada routes.

Buka file cmd/api/routes.go, lalu modifikasi dengan menambahkan middleware.

package main

import (
	"net/http"

	"github.com/go-chi/chi/v5"
	"github.com/go-chi/chi/v5/middleware"
)

func (app *application) routes() http.Handler {
	mux := chi.NewRouter()

	// register middleware
	mux.Use(middleware.Recoverer)
	mux.Use(app.enableCORS)

	// authentication routes - auth handler, refresh
	mux.Post("/auth", app.authenticate)
	mux.Post("/refresh-token", app.refresh)

	// protected routes
	mux.Route("/users", func(mux chi.Router) {
		mux.Use(app.authRequired)

		mux.Get("/", app.allUsers)
		mux.Get("/{userID}", app.getUser)
		mux.Delete("/{userID}", app.deleteUser)
		mux.Put("/", app.insertUser)
		mux.Patch("/", app.updateUser)
	})

	return mux
}

Selanjutnya kita buat file cmd/api/routes_test.go untuk fungsi test route diatas. Gunakan code berikut untuk melakukan testing.

package main

import (
	"net/http"
	"strings"
	"testing"

	"github.com/go-chi/chi/v5"
)

func Test_app_routes(t *testing.T) {
	var registered = []struct {
		route  string
		method string
	}{
		{"/auth", "POST"},
		{"/refresh-token", "POST"},
		{"/users/", "GET"},
		{"/users/{userID}", "GET"},
		{"/users/{userID}", "DELETE"},
		{"/users/", "PATCH"},
		{"/users/", "PUT"},
	}

	mux := app.routes()

	chiRoutes := mux.(chi.Routes)

	for _, route := range registered {
		// check to see if the route exists
		if !routeExists(route.route, route.method, chiRoutes) {
			t.Errorf("route %s is not registered", route.route)
		}
	}
}

func routeExists(testRoute, testMethod string, chiRoutes chi.Routes) bool {
	found := false

	_ = chi.Walk(chiRoutes, func(method string, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error {
		if strings.EqualFold(method, testMethod) && strings.EqualFold(route, testRoute) {
			found = true
		}
		return nil
	})

	return found
}

Jika kita jalankan test, sesuai ekspektasi test berhasil.

 go test -v -run Test_app_routes
=== RUN   Test_app_routes
--- PASS: Test_app_routes (0.00s)
PASS
ok      webapp/cmd/api  0.286s

Masih ada fungsi-fungsi yang belum tercover, silakan Anda mencoba praktek dan bereksperimen.

Untuk solusi dapat dilihat pada modul selanjutnya.

Sharing is caring:

Leave a Comment