Pengenalan Template Data
Jika Anda sudah mempelajari HTML Template pada artikel sebelumnya, maka kita akan lanjutkam mengenai template data dimana data ini bisa kita tampilkan secara dinamis dengan cara menggunakan data struct ataupun map. Namun perlu diketahui perubahan di dalam text template kita perlu tahu nama field
atau key
yang akan kita gunakan untuk mengisi data dinamis tdi template. Kita bisa menyebutkan nama field
atau key
tersebut seperti contoh {{.NamaField}}
.
Menerapkan pada Handler Project
Kita buat terlebih dahulu template yang pada folder templates
dengan membuat file baru name.html
dengan isi seperti berikut ini.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ .Title }}</title>
</head>
<body>
<h1>Hello {{ .Name }}</h1>
</body>
</html>
Kalau kita lihat kode HTML diatas sederhana sekali, kita akan mengirimkan data Title
dan Name
dari handler ke dalam template HTML. Selanjutnya kita buat fungsi handler seperti dibawah ini.
func TemplateDataStructHandler(w http.ResponseWriter, r *http.Request) {
t := template.Must(template.ParseFiles("./templates/name.html"))
t.ExecuteTemplate(w, "name.html", map[string]interface{}{
"Title": "Template Data Struct",
"Name": "Santekno",
})
}
Jika kamu ingin menggunakan struct
juga sebenarnya sama saja pembedanya yaitu kita mengirimkan kepada template itu berupa struct
yang sudah kita definisikan seperti contoh dibawah ini.
type Page struct {
Title string
Name string
}
func TemplateDataStructHandler(w http.ResponseWriter, r *http.Request) {
t := template.Must(template.ParseFiles("./templates/name.html"))
t.ExecuteTemplate(w, "name.html", Page{
Title: "Template Data Struct",
Name: "Santekno",
})
}
Dan jangan lupa juga tambahkan fungsi handler tersebut pada initiate mux
dengan endpoint yang berbeda seperti ini.
mux.HandleFunc("/template-data-map", TemplateDataMapHandler)
mux.HandleFunc("/template-data-struct", TemplateDataStructHandler)
Maka kita bisa jalankan program kita lalu buka browser dan akses endpoint ini, maka akan muncul halaman dengan judul Template Data Struct
dan tag HTML nama Santekno
.
http://localhost:8080/template-data-struct
http://localhost:8080/template-data-map
Pengujian HTML Template
Cara kita melakukan pengujian pada fungsi handler yang sudah kita buat yaitu dengan menggunakan unit test seperti dibawah ini.
func TestTemplateDataMapHandler(t *testing.T) {
tests := []struct {
name string
want string
}{
{
name: "get from embed",
want: "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>Template Data Map</title>\n </head>\n <body>\n <h1>Hello Santekno</h1>\n </body>\n</html>",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "http://localhost/file", nil)
recorder := httptest.NewRecorder()
TemplateDataMapHandler(recorder, request)
body, _ := io.ReadAll(recorder.Result().Body)
bodyString := string(body)
if !reflect.DeepEqual(bodyString, tt.want) {
t.Errorf("response = %#v, want = %#v\n", bodyString, tt.want)
}
})
}
}
func TestTemplateDataStructHandler(t *testing.T) {
tests := []struct {
name string
want string
}{
{
name: "get from embed",
want: "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>Template Data Struct</title>\n </head>\n <body>\n <h1>Hello Santekno</h1>\n </body>\n</html>",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "http://localhost/file", nil)
recorder := httptest.NewRecorder()
TemplateDataStructHandler(recorder, request)
body, _ := io.ReadAll(recorder.Result().Body)
bodyString := string(body)
if !reflect.DeepEqual(bodyString, tt.want) {
t.Errorf("response = %#v, want = %#v\n", bodyString, tt.want)
}
})
}
}
Pada unit test ini kita memastikan bahwa input yang dikirim dari handler sudah sesuai dengan response HTML Template yang dikirim.