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  }