pemrograman

10 HTML Template Data

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.

comments powered by Disqus