hugo_sites_rebuild_test.go (8316B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package hugolib 15 16 import ( 17 "testing" 18 19 qt "github.com/frankban/quicktest" 20 ) 21 22 func TestSitesRebuild(t *testing.T) { 23 configFile := ` 24 baseURL = "https://example.com" 25 title = "Rebuild this" 26 contentDir = "content" 27 enableInlineShortcodes = true 28 timeout = "5s" 29 30 31 ` 32 33 var ( 34 contentFilename = "content/blog/page1.md" 35 dataFilename = "data/mydata.toml" 36 ) 37 38 createSiteBuilder := func(t testing.TB) *sitesBuilder { 39 b := newTestSitesBuilder(t).WithConfigFile("toml", configFile).Running() 40 41 b.WithSourceFile(dataFilename, `hugo = "Rocks!"`) 42 43 b.WithContent("content/_index.md", `--- 44 title: Home, Sweet Home! 45 --- 46 47 `) 48 49 b.WithContent(contentFilename, ` 50 --- 51 title: "Page 1" 52 summary: "Initial summary" 53 paginate: 3 54 --- 55 56 Content. 57 58 {{< badge.inline >}} 59 Data Inline: {{ site.Data.mydata.hugo }} 60 {{< /badge.inline >}} 61 `) 62 63 // For .Page.Render tests 64 b.WithContent("prender.md", `--- 65 title: Page 1 66 --- 67 68 Content for Page 1. 69 70 {{< dorender >}} 71 72 `) 73 74 b.WithTemplatesAdded( 75 "layouts/shortcodes/dorender.html", ` 76 {{ $p := .Page }} 77 Render {{ $p.RelPermalink }}: {{ $p.Render "single" }} 78 79 `) 80 81 b.WithTemplatesAdded("index.html", ` 82 {{ range (.Paginate .Site.RegularPages).Pages }} 83 * Page Paginate: {{ .Title }}|Summary: {{ .Summary }}|Content: {{ .Content }} 84 {{ end }} 85 {{ range .Site.RegularPages }} 86 * Page Pages: {{ .Title }}|Summary: {{ .Summary }}|Content: {{ .Content }} 87 {{ end }} 88 Content: {{ .Content }} 89 Data: {{ site.Data.mydata.hugo }} 90 `) 91 92 b.WithTemplatesAdded("layouts/partials/mypartial1.html", `Mypartial1`) 93 b.WithTemplatesAdded("layouts/partials/mypartial2.html", `Mypartial2`) 94 b.WithTemplatesAdded("layouts/partials/mypartial3.html", `Mypartial3`) 95 b.WithTemplatesAdded("_default/single.html", `{{ define "main" }}Single Main: {{ .Title }}|Mypartial1: {{ partial "mypartial1.html" }}{{ end }}`) 96 b.WithTemplatesAdded("_default/list.html", `{{ define "main" }}List Main: {{ .Title }}{{ end }}`) 97 b.WithTemplatesAdded("_default/baseof.html", `Baseof:{{ block "main" . }}Baseof Main{{ end }}|Mypartial3: {{ partial "mypartial3.html" }}:END`) 98 99 return b 100 } 101 102 t.Run("Refresh paginator on edit", func(t *testing.T) { 103 b := createSiteBuilder(t) 104 105 b.Build(BuildCfg{}) 106 107 b.AssertFileContent("public/index.html", "* Page Paginate: Page 1|Summary: Initial summary|Content: <p>Content.</p>") 108 109 b.EditFiles(contentFilename, ` 110 --- 111 title: "Page 1 edit" 112 summary: "Edited summary" 113 --- 114 115 Edited content. 116 117 `) 118 119 b.Build(BuildCfg{}) 120 121 b.AssertFileContent("public/index.html", "* Page Paginate: Page 1 edit|Summary: Edited summary|Content: <p>Edited content.</p>") 122 // https://github.com/gohugoio/hugo/issues/5833 123 b.AssertFileContent("public/index.html", "* Page Pages: Page 1 edit|Summary: Edited summary|Content: <p>Edited content.</p>") 124 }) 125 126 // https://github.com/gohugoio/hugo/issues/6768 127 t.Run("Edit data", func(t *testing.T) { 128 b := createSiteBuilder(t) 129 130 b.Build(BuildCfg{}) 131 132 b.AssertFileContent("public/index.html", ` 133 Data: Rocks! 134 Data Inline: Rocks! 135 `) 136 137 b.EditFiles(dataFilename, `hugo = "Rules!"`) 138 139 b.Build(BuildCfg{}) 140 141 b.AssertFileContent("public/index.html", ` 142 Data: Rules! 143 Data Inline: Rules!`) 144 }) 145 146 // https://github.com/gohugoio/hugo/issues/6968 147 t.Run("Edit single.html with base", func(t *testing.T) { 148 b := newTestSitesBuilder(t).Running() 149 150 b.WithTemplates( 151 "_default/single.html", `{{ define "main" }}Single{{ end }}`, 152 "_default/baseof.html", `Base: {{ block "main" .}}Block{{ end }}`, 153 ) 154 155 b.WithContent("p1.md", "---\ntitle: Page\n---") 156 157 b.Build(BuildCfg{}) 158 159 b.EditFiles("layouts/_default/single.html", `Single Edit: {{ define "main" }}Single{{ end }}`) 160 161 counters := &testCounters{} 162 163 b.Build(BuildCfg{testCounters: counters}) 164 165 b.Assert(int(counters.contentRenderCounter), qt.Equals, 0) 166 }) 167 168 t.Run("Page.Render, edit baseof", func(t *testing.T) { 169 b := createSiteBuilder(t) 170 171 b.WithTemplatesAdded("index.html", ` 172 {{ $p := site.GetPage "prender.md" }} 173 prender: {{ $p.Title }}|{{ $p.Content }} 174 175 `) 176 177 b.Build(BuildCfg{}) 178 179 b.AssertFileContent("public/index.html", ` 180 Render /prender/: Baseof:Single Main: Page 1|Mypartial1: Mypartial1|Mypartial3: Mypartial3:END 181 `) 182 183 b.EditFiles("layouts/_default/baseof.html", `Baseof Edited:{{ block "main" . }}Baseof Main{{ end }}:END`) 184 185 b.Build(BuildCfg{}) 186 187 b.AssertFileContent("public/index.html", ` 188 Render /prender/: Baseof Edited:Single Main: Page 1|Mypartial1: Mypartial1:END 189 `) 190 }) 191 192 t.Run("Page.Render, edit partial in baseof", func(t *testing.T) { 193 b := createSiteBuilder(t) 194 195 b.WithTemplatesAdded("index.html", ` 196 {{ $p := site.GetPage "prender.md" }} 197 prender: {{ $p.Title }}|{{ $p.Content }} 198 199 `) 200 201 b.Build(BuildCfg{}) 202 203 b.AssertFileContent("public/index.html", ` 204 Render /prender/: Baseof:Single Main: Page 1|Mypartial1: Mypartial1|Mypartial3: Mypartial3:END 205 `) 206 207 b.EditFiles("layouts/partials/mypartial3.html", `Mypartial3 Edited`) 208 209 b.Build(BuildCfg{}) 210 211 b.AssertFileContent("public/index.html", ` 212 Render /prender/: Baseof:Single Main: Page 1|Mypartial1: Mypartial1|Mypartial3: Mypartial3 Edited:END 213 `) 214 }) 215 216 t.Run("Edit RSS shortcode", func(t *testing.T) { 217 b := createSiteBuilder(t) 218 219 b.WithContent("output.md", `--- 220 title: Output 221 outputs: ["HTML", "AMP"] 222 layout: output 223 --- 224 225 Content for Output. 226 227 {{< output >}} 228 229 `) 230 231 b.WithTemplates( 232 "layouts/_default/output.html", `Output HTML: {{ .RelPermalink }}|{{ .Content }}`, 233 "layouts/_default/output.amp.html", `Output AMP: {{ .RelPermalink }}|{{ .Content }}`, 234 "layouts/shortcodes/output.html", `Output Shortcode HTML`, 235 "layouts/shortcodes/output.amp.html", `Output Shortcode AMP`) 236 237 b.Build(BuildCfg{}) 238 239 b.AssertFileContent("public/output/index.html", ` 240 Output Shortcode HTML 241 `) 242 b.AssertFileContent("public/amp/output/index.html", ` 243 Output Shortcode AMP 244 `) 245 246 b.EditFiles("layouts/shortcodes/output.amp.html", `Output Shortcode AMP Edited`) 247 248 b.Build(BuildCfg{}) 249 250 b.AssertFileContent("public/amp/output/index.html", ` 251 Output Shortcode AMP Edited 252 `) 253 }) 254 } 255 256 // Issues #7623 #7625 257 func TestSitesRebuildOnFilesIncludedWithGetPage(t *testing.T) { 258 b := newTestSitesBuilder(t).Running() 259 b.WithContent("pages/p1.md", `--- 260 title: p1 261 --- 262 P3: {{< GetPage "pages/p3" >}} 263 `) 264 265 b.WithContent("pages/p2.md", `--- 266 title: p2 267 --- 268 P4: {{< site_GetPage "pages/p4" >}} 269 P5: {{< site_GetPage "p5" >}} 270 P6: {{< dot_site_GetPage "p6" >}} 271 `) 272 273 b.WithContent("pages/p3/index.md", "---\ntitle: p3\nheadless: true\n---\nP3 content") 274 b.WithContent("pages/p4/index.md", "---\ntitle: p4\nheadless: true\n---\nP4 content") 275 b.WithContent("pages/p5.md", "---\ntitle: p5\n---\nP5 content") 276 b.WithContent("pages/p6.md", "---\ntitle: p6\n---\nP6 content") 277 278 b.WithTemplates( 279 "_default/single.html", `{{ .Content }}`, 280 "shortcodes/GetPage.html", ` 281 {{ $arg := .Get 0 }} 282 {{ $p := .Page.GetPage $arg }} 283 {{ $p.Content }} 284 `, 285 "shortcodes/site_GetPage.html", ` 286 {{ $arg := .Get 0 }} 287 {{ $p := site.GetPage $arg }} 288 {{ $p.Content }} 289 `, "shortcodes/dot_site_GetPage.html", ` 290 {{ $arg := .Get 0 }} 291 {{ $p := .Site.GetPage $arg }} 292 {{ $p.Content }} 293 `, 294 ) 295 296 b.Build(BuildCfg{}) 297 298 b.AssertFileContent("public/pages/p1/index.html", "P3 content") 299 b.AssertFileContent("public/pages/p2/index.html", `P4 content 300 P5 content 301 P6 content 302 `) 303 304 b.EditFiles("content/pages/p3/index.md", "---\ntitle: p3\n---\nP3 changed content") 305 b.EditFiles("content/pages/p4/index.md", "---\ntitle: p4\n---\nP4 changed content") 306 b.EditFiles("content/pages/p5.md", "---\ntitle: p5\n---\nP5 changed content") 307 b.EditFiles("content/pages/p6.md", "---\ntitle: p6\n---\nP6 changed content") 308 309 b.Build(BuildCfg{}) 310 311 b.AssertFileContent("public/pages/p1/index.html", "P3 changed content") 312 b.AssertFileContent("public/pages/p2/index.html", `P4 changed content 313 P5 changed content 314 P6 changed content 315 `) 316 }