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.