github.com/res-am/buffalo@v0.11.1/render/template_test.go (about) 1 package render_test 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "strings" 9 "testing" 10 11 "github.com/gobuffalo/buffalo/render" 12 "github.com/gobuffalo/packr" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func Test_Template(t *testing.T) { 17 r := require.New(t) 18 19 tPath, err := ioutil.TempDir("", "") 20 r.NoError(err) 21 defer os.Remove(tPath) 22 23 tmpFile, err := os.Create(filepath.Join(tPath, "test")) 24 r.NoError(err) 25 defer os.Remove(tmpFile.Name()) 26 27 _, err = tmpFile.Write([]byte("<%= name %>")) 28 r.NoError(err) 29 30 type ji func(string, ...string) render.Renderer 31 32 table := []ji{ 33 render.New(render.Options{ 34 TemplatesBox: packr.NewBox(tPath), 35 }).Template, 36 } 37 38 for _, j := range table { 39 re := j("foo/bar", filepath.Base(tmpFile.Name())) 40 r.Equal("foo/bar", re.ContentType()) 41 bb := &bytes.Buffer{} 42 err = re.Render(bb, render.Data{"name": "Mark"}) 43 r.NoError(err) 44 r.Equal("Mark", strings.TrimSpace(bb.String())) 45 } 46 } 47 48 func Test_Template_Partial(t *testing.T) { 49 r := require.New(t) 50 51 tPath, err := ioutil.TempDir("", "") 52 r.NoError(err) 53 defer os.Remove(tPath) 54 55 partFile, err := os.Create(filepath.Join(tPath, "_foo.html")) 56 r.NoError(err) 57 58 _, err = partFile.Write([]byte("Foo > <%= name %>")) 59 r.NoError(err) 60 61 tmpFile, err := os.Create(filepath.Join(tPath, "index.html")) 62 r.NoError(err) 63 64 _, err = tmpFile.Write([]byte(`<%= partial("foo.html") %>`)) 65 r.NoError(err) 66 67 type ji func(string, ...string) render.Renderer 68 69 j := render.New(render.Options{ 70 TemplatesBox: packr.NewBox(tPath), 71 }).Template 72 73 re := j("foo/bar", "index.html") 74 r.Equal("foo/bar", re.ContentType()) 75 bb := &bytes.Buffer{} 76 err = re.Render(bb, render.Data{"name": "Mark"}) 77 r.NoError(err) 78 r.Equal("Foo > Mark", strings.TrimSpace(bb.String())) 79 } 80 81 func Test_Template_Partial_Recursive_With_Global_And_Local_Context(t *testing.T) { 82 r := require.New(t) 83 84 tPath, err := ioutil.TempDir("", "") 85 r.NoError(err) 86 defer os.Remove(tPath) 87 88 partFile, err := os.Create(filepath.Join(tPath, "_foo.html")) 89 r.NoError(err) 90 91 _, err = partFile.Write([]byte(`<%= other %>|<%= name %>`)) 92 r.NoError(err) 93 94 tmpFile, err := os.Create(filepath.Join(tPath, "index.html")) 95 r.NoError(err) 96 97 _, err = tmpFile.Write([]byte(`<%= partial("foo.html", {other: "Other"}) %>`)) 98 r.NoError(err) 99 100 re := render.New(render.Options{ 101 TemplatesBox: packr.NewBox(tPath), 102 }).Template("", "index.html") 103 104 bb := &bytes.Buffer{} 105 err = re.Render(bb, render.Data{"name": "Mark"}) 106 r.NoError(err) 107 r.Equal("Other|Mark", strings.TrimSpace(bb.String())) 108 } 109 110 func Test_Template_Partial_WithoutExtension(t *testing.T) { 111 r := require.New(t) 112 113 tPath, err := ioutil.TempDir("", "") 114 r.NoError(err) 115 defer os.Remove(tPath) 116 117 partFile, err := os.Create(filepath.Join(tPath, "_foo.html")) 118 r.NoError(err) 119 120 _, err = partFile.Write([]byte("Foo > <%= name %>")) 121 r.NoError(err) 122 123 tmpFile, err := os.Create(filepath.Join(tPath, "index.html")) 124 r.NoError(err) 125 126 _, err = tmpFile.Write([]byte(`<%= partial("foo") %>`)) 127 r.NoError(err) 128 129 type ji func(string, ...string) render.Renderer 130 131 j := render.New(render.Options{ 132 TemplatesBox: packr.NewBox(tPath), 133 }).HTML 134 135 re := j("index.html") 136 bb := &bytes.Buffer{} 137 err = re.Render(bb, render.Data{"name": "Mark"}) 138 r.NoError(err) 139 r.Equal("Foo > Mark", strings.TrimSpace(bb.String())) 140 } 141 142 func Test_AssetPath(t *testing.T) { 143 r := require.New(t) 144 145 cases := map[string]string{ 146 "something.txt": "/assets/something.txt", 147 "images/something.png": "/assets/images/something.png", 148 "/images/something.png": "/assets/images/something.png", 149 "application.css": "/assets/application.aabbc123.css", 150 } 151 152 tDir, err := ioutil.TempDir("", "templates") 153 if err != nil { 154 r.Fail("Could not set the templates dir") 155 } 156 157 aDir, err := ioutil.TempDir("", "assets") 158 if err != nil { 159 r.Fail("Could not set the assets dir") 160 } 161 162 re := render.New(render.Options{ 163 TemplatesBox: packr.NewBox(tDir), 164 AssetsBox: packr.NewBox(aDir), 165 }).Template 166 167 ioutil.WriteFile(filepath.Join(aDir, "manifest.json"), []byte(`{ 168 "application.css": "application.aabbc123.css" 169 }`), 0644) 170 171 for original, expected := range cases { 172 173 tmpFile, err := os.Create(filepath.Join(tDir, "test.html")) 174 r.NoError(err) 175 176 _, err = tmpFile.Write([]byte("<%= assetPath(\"" + original + "\") %>")) 177 r.NoError(err) 178 179 result := re("text/html", filepath.Base(tmpFile.Name())) 180 181 bb := &bytes.Buffer{} 182 err = result.Render(bb, render.Data{}) 183 r.NoError(err) 184 r.Equal(expected, strings.TrimSpace(bb.String())) 185 186 os.Remove(tmpFile.Name()) 187 } 188 } 189 190 func Test_AssetPathNoManifest(t *testing.T) { 191 r := require.New(t) 192 193 cases := map[string]string{ 194 "something.txt": "/assets/something.txt", 195 } 196 197 tDir, err := ioutil.TempDir("", "templates") 198 if err != nil { 199 r.Fail("Could not set the templates dir") 200 } 201 202 aDir, err := ioutil.TempDir("", "assets") 203 if err != nil { 204 r.Fail("Could not set the assets dir") 205 } 206 207 re := render.New(render.Options{ 208 TemplatesBox: packr.NewBox(tDir), 209 AssetsBox: packr.NewBox(aDir), 210 }).Template 211 212 for original, expected := range cases { 213 214 tmpFile, err := os.Create(filepath.Join(tDir, "test.html")) 215 r.NoError(err) 216 217 _, err = tmpFile.Write([]byte("<%= assetPath(\"" + original + "\") %>")) 218 r.NoError(err) 219 220 result := re("text/html", filepath.Base(tmpFile.Name())) 221 222 bb := &bytes.Buffer{} 223 err = result.Render(bb, render.Data{}) 224 r.NoError(err) 225 r.Equal(expected, strings.TrimSpace(bb.String())) 226 227 os.Remove(tmpFile.Name()) 228 } 229 } 230 func Test_AssetPathManifestCorrupt(t *testing.T) { 231 r := require.New(t) 232 233 cases := map[string]string{ 234 "something.txt": "manifest.json is not correct", 235 "other.txt": "manifest.json is not correct", 236 } 237 238 tDir, err := ioutil.TempDir("", "templates") 239 if err != nil { 240 r.Fail("Could not set the templates dir") 241 } 242 243 aDir, err := ioutil.TempDir("", "assets") 244 if err != nil { 245 r.Fail("Could not set the assets dir") 246 } 247 248 ioutil.WriteFile(filepath.Join(aDir, "manifest.json"), []byte(`//shdnn Corrupt!`), 0644) 249 250 re := render.New(render.Options{ 251 TemplatesBox: packr.NewBox(tDir), 252 AssetsBox: packr.NewBox(aDir), 253 }).Template 254 255 for original, expected := range cases { 256 257 tmpFile, err := os.Create(filepath.Join(tDir, "test.html")) 258 r.NoError(err) 259 260 _, err = tmpFile.Write([]byte("<%= assetPath(\"" + original + "\") %>")) 261 r.NoError(err) 262 263 result := re("text/html", filepath.Base(tmpFile.Name())) 264 265 bb := &bytes.Buffer{} 266 err = result.Render(bb, render.Data{}) 267 r.Error(err) 268 r.Contains(err.Error(), expected) 269 270 os.Remove(tmpFile.Name()) 271 } 272 }