go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/web/views_test.go (about) 1 /* 2 3 Copyright (c) 2023 - Present. Will Charczuk. All rights reserved. 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository. 5 6 */ 7 8 package web 9 10 import ( 11 "embed" 12 "fmt" 13 "net/http" 14 "testing" 15 16 . "go.charczuk.com/sdk/assert" 17 ) 18 19 func Test_Views_AddPaths(t *testing.T) { 20 v := new(Views) 21 ItsEmpty(t, v.ViewPaths) 22 23 v.AddPaths("foo", "bar") 24 ItsEqual(t, []string{"foo", "bar"}, v.ViewPaths) 25 26 v.AddPaths("moo", "loo") 27 ItsEqual(t, []string{"foo", "bar", "moo", "loo"}, v.ViewPaths) 28 } 29 30 func Test_Views_AddLiterals(t *testing.T) { 31 v := new(Views) 32 ItsEmpty(t, v.ViewLiterals) 33 34 v.AddLiterals("foo", "bar") 35 ItsEqual(t, []string{"foo", "bar"}, v.ViewLiterals) 36 37 v.AddLiterals("moo", "loo") 38 ItsEqual(t, []string{"foo", "bar", "moo", "loo"}, v.ViewLiterals) 39 } 40 41 func Test_Views_AddFS(t *testing.T) { 42 v := new(Views) 43 ItsEmpty(t, v.ViewFS) 44 45 v.AddFS(ViewFS{}, ViewFS{}) 46 ItsLen(t, v.ViewFS, 2) 47 48 v.AddFS(ViewFS{}, ViewFS{}) 49 ItsLen(t, v.ViewFS, 4) 50 } 51 52 func Test_Views_InitializeViews_paths(t *testing.T) { 53 v := new(Views) 54 v.AddPaths("testdata/views/header.html", "testdata/views/footer.html", "testdata/views/index.html") 55 err := v.Initialize() 56 ItsNil(t, err) 57 ItsNotNil(t, v.t) 58 ItsNotNil(t, v.bp) 59 60 tmp := v.Lookup("index") 61 ItsNotNil(t, tmp) 62 } 63 64 func Test_Views_InitializeViews_paths_error(t *testing.T) { 65 v := new(Views) 66 v.AddPaths("testdata/views/header.html", "testdata/views/footer.html", "testdata/views/index.html", "testdata/views/broken.html") 67 err := v.Initialize() 68 ItsNotNil(t, err) 69 ItsNil(t, v.t) 70 ItsNil(t, v.bp) 71 72 tmp := v.Lookup("index") 73 ItsNil(t, tmp) 74 } 75 76 func Test_Views_InitializeViews_literals(t *testing.T) { 77 v := new(Views) 78 v.AddLiterals(`{{ define "foo"}}{{end}}`, `{{ define "bar" }}{{ end }}`) 79 err := v.Initialize() 80 ItsNil(t, err) 81 ItsNotNil(t, v.t) 82 ItsNotNil(t, v.bp) 83 84 tmp := v.Lookup("foo") 85 ItsNotNil(t, tmp) 86 } 87 88 func Test_Views_InitializeViews_literals_error(t *testing.T) { 89 v := new(Views) 90 v.AddLiterals(`{{ define "foo"}}{{end}}`, `{{ define "bar" }}`) 91 err := v.Initialize() 92 ItsNotNil(t, err) 93 ItsNil(t, v.t) 94 ItsNil(t, v.bp) 95 96 tmp := v.Lookup("foo") 97 ItsNil(t, tmp) 98 } 99 100 //go:embed testdata/views 101 var testdataViews embed.FS 102 103 func Test_Views_InitializeViews_fs(t *testing.T) { 104 v := new(Views) 105 v.AddFS(ViewFS{ 106 FS: testdataViews, 107 Patterns: []string{"testdata/views/header.html", "testdata/views/footer.html", "testdata/views/index.html"}, 108 }) 109 err := v.Initialize() 110 ItsNil(t, err) 111 ItsNotNil(t, v.t) 112 ItsNotNil(t, v.bp) 113 114 tmp := v.Lookup("index") 115 ItsNotNil(t, tmp) 116 } 117 118 func Test_Views_InitializeViews_fs_error(t *testing.T) { 119 v := new(Views) 120 v.AddFS(ViewFS{ 121 FS: testdataViews, 122 Patterns: []string{"testdata/views/header.html", "testdata/views/footer.html", "testdata/views/index.html", "testdata/views/broken.html"}, 123 }) 124 err := v.Initialize() 125 ItsNotNil(t, err) 126 ItsNil(t, v.t) 127 ItsNil(t, v.bp) 128 129 tmp := v.Lookup("index") 130 ItsNil(t, tmp) 131 } 132 133 func Test_Views_InitializeViews_empty(t *testing.T) { 134 v := new(Views) 135 err := v.Initialize() 136 ItsNil(t, err) 137 ItsNotNil(t, v.t) 138 ItsNotNil(t, v.bp) 139 140 tmp := v.Lookup("foo") 141 ItsNil(t, err) 142 ItsNil(t, tmp) 143 } 144 145 func Test_Views_BadRequest(t *testing.T) { 146 v := new(Views) 147 148 res := v.BadRequest(fmt.Errorf("this is just a test")) 149 ItsNotNil(t, res.(*ViewResult).Template) 150 ItsNotNil(t, res.(*ViewResult).Views) 151 ItsEqual(t, TemplateBadRequest, res.(*ViewResult).ViewName) 152 ItsEqual(t, http.StatusBadRequest, res.(*ViewResult).StatusCode) 153 ItsEqual(t, "this is just a test", res.(*ViewResult).ViewModel.(error).Error()) 154 } 155 156 func Test_Views_BadRequest_custom(t *testing.T) { 157 v := new(Views) 158 v.AddLiterals(`{{ define "bad_request" }}YO ITS NOT GOOD{{end}}`) 159 err := v.Initialize() 160 ItsNil(t, err) 161 162 res := v.BadRequest(fmt.Errorf("this is just a test")) 163 ItsNotNil(t, res.(*ViewResult).Template) 164 ItsNotNil(t, res.(*ViewResult).Views) 165 ItsEqual(t, TemplateBadRequest, res.(*ViewResult).ViewName) 166 ItsEqual(t, http.StatusBadRequest, res.(*ViewResult).StatusCode) 167 ItsEqual(t, "this is just a test", res.(*ViewResult).ViewModel.(error).Error()) 168 } 169 170 func Test_Views_InternalError(t *testing.T) { 171 v := new(Views) 172 173 res := v.InternalError(fmt.Errorf("this is just a test")) 174 ItsNotNil(t, res.(*ViewResult).Template) 175 ItsNotNil(t, res.(*ViewResult).Views) 176 ItsEqual(t, TemplateInternalError, res.(*ViewResult).ViewName) 177 ItsEqual(t, http.StatusInternalServerError, res.(*ViewResult).StatusCode) 178 ItsEqual(t, "this is just a test", res.(*ViewResult).ViewModel.(error).Error()) 179 } 180 181 func Test_Views_InternalError_custom(t *testing.T) { 182 v := new(Views) 183 v.AddLiterals(`{{ define "error" }}YO ITS NOT GOOD{{end}}`) 184 err := v.Initialize() 185 ItsNil(t, err) 186 187 res := v.InternalError(fmt.Errorf("this is just a test")) 188 ItsNotNil(t, res.(*ViewResult).Template) 189 ItsNotNil(t, res.(*ViewResult).Views) 190 ItsEqual(t, TemplateInternalError, res.(*ViewResult).ViewName) 191 ItsEqual(t, http.StatusInternalServerError, res.(*ViewResult).StatusCode) 192 ItsEqual(t, "this is just a test", res.(*ViewResult).ViewModel.(error).Error()) 193 } 194 195 func Test_Views_NotFound(t *testing.T) { 196 v := new(Views) 197 198 res := v.NotFound() 199 ItsNotNil(t, res.(*ViewResult).Template) 200 ItsNotNil(t, res.(*ViewResult).Views) 201 ItsEqual(t, TemplateNotFound, res.(*ViewResult).ViewName) 202 ItsEqual(t, http.StatusNotFound, res.(*ViewResult).StatusCode) 203 ItsNil(t, res.(*ViewResult).ViewModel) 204 } 205 206 func Test_Views_NotFound_custom(t *testing.T) { 207 v := new(Views) 208 v.AddLiterals(`{{ define "not_found" }}YO ITS NOT HERE{{end}}`) 209 err := v.Initialize() 210 ItsNil(t, err) 211 212 res := v.NotFound() 213 ItsNotNil(t, res.(*ViewResult).Template) 214 ItsNotNil(t, res.(*ViewResult).Views) 215 ItsEqual(t, TemplateNotFound, res.(*ViewResult).ViewName) 216 ItsEqual(t, http.StatusNotFound, res.(*ViewResult).StatusCode) 217 ItsNil(t, res.(*ViewResult).ViewModel) 218 } 219 220 func Test_Views_NotAuthorized(t *testing.T) { 221 v := new(Views) 222 223 res := v.NotAuthorized() 224 ItsNotNil(t, res.(*ViewResult).Template) 225 ItsNotNil(t, res.(*ViewResult).Views) 226 ItsEqual(t, TemplateNotAuthorized, res.(*ViewResult).ViewName) 227 ItsEqual(t, http.StatusUnauthorized, res.(*ViewResult).StatusCode) 228 ItsNil(t, res.(*ViewResult).ViewModel) 229 } 230 231 func Test_Views_NotAuthorized_custom(t *testing.T) { 232 v := new(Views) 233 v.AddLiterals(`{{ define "not_authorized" }}YO ITS NOT HERE{{end}}`) 234 err := v.Initialize() 235 ItsNil(t, err) 236 237 res := v.NotAuthorized() 238 ItsNotNil(t, res.(*ViewResult).Template) 239 ItsNotNil(t, res.(*ViewResult).Views) 240 ItsEqual(t, TemplateNotAuthorized, res.(*ViewResult).ViewName) 241 ItsEqual(t, http.StatusUnauthorized, res.(*ViewResult).StatusCode) 242 ItsNil(t, res.(*ViewResult).ViewModel) 243 } 244 245 func Test_Views_ViewStatus(t *testing.T) { 246 v := new(Views) 247 v.AddLiterals(`{{ define "index" }}{{.}}{{end}}`) 248 err := v.Initialize() 249 ItsNil(t, err) 250 251 res := v.ViewStatus(http.StatusNoContent, "index", "hi!") 252 ItsNotNil(t, res.(*ViewResult).Template) 253 ItsNotNil(t, res.(*ViewResult).Views) 254 ItsEqual(t, "index", res.(*ViewResult).ViewName) 255 ItsEqual(t, http.StatusNoContent, res.(*ViewResult).StatusCode) 256 ItsEqual(t, "hi!", res.(*ViewResult).ViewModel) 257 } 258 259 func Test_Views_ViewStatus_error(t *testing.T) { 260 v := new(Views) 261 v.AddLiterals(`{{ define "index" }}{{.}}{{end}}`) 262 err := v.Initialize() 263 ItsNil(t, err) 264 265 res := v.ViewStatus(http.StatusNoContent, "not-index", "hi!") 266 ItsNotNil(t, res.(*ViewResult).Template) 267 ItsNotNil(t, res.(*ViewResult).Views) 268 ItsEqual(t, TemplateInternalError, res.(*ViewResult).ViewName) 269 ItsEqual(t, http.StatusInternalServerError, res.(*ViewResult).StatusCode) 270 ItsEqual(t, "view result template is unset", res.(*ViewResult).ViewModel.(error).Error()) 271 }