hugo

Fork of github.com/gohugoio/hugo with reverse pagination support

git clone git://git.shimmy1996.com/hugo.git

disableKinds_test.go (13591B)

    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 package hugolib
   14 
   15 import (
   16 	"fmt"
   17 	"testing"
   18 
   19 	qt "github.com/frankban/quicktest"
   20 	"github.com/gohugoio/hugo/resources/page"
   21 )
   22 
   23 func TestDisable(t *testing.T) {
   24 	c := qt.New(t)
   25 
   26 	newSitesBuilder := func(c *qt.C, disableKind string) *sitesBuilder {
   27 		config := fmt.Sprintf(`
   28 baseURL = "http://example.com/blog"
   29 enableRobotsTXT = true
   30 ignoreErrors = ["error-disable-taxonomy"]
   31 disableKinds = [%q]
   32 `, disableKind)
   33 
   34 		b := newTestSitesBuilder(c)
   35 		b.WithTemplatesAdded("_default/single.html", `single`)
   36 		b.WithConfigFile("toml", config).WithContent("sect/page.md", `
   37 ---
   38 title: Page
   39 categories: ["mycat"]
   40 tags: ["mytag"]
   41 ---
   42 
   43 `, "sect/no-list.md", `
   44 ---
   45 title: No List
   46 _build:
   47   list: false
   48 ---
   49 
   50 `, "sect/no-render.md", `
   51 ---
   52 title: No List
   53 _build:
   54   render: false
   55 ---
   56 `,
   57 			"sect/no-render-link.md", `
   58 ---
   59 title: No Render Link
   60 aliases: ["/link-alias"]
   61 _build:
   62   render: link
   63 ---
   64 `,
   65 			"sect/no-publishresources/index.md", `
   66 ---
   67 title: No Publish Resources
   68 _build:
   69   publishResources: false
   70 ---
   71 
   72 `, "sect/headlessbundle/index.md", `
   73 ---
   74 title: Headless
   75 headless: true
   76 ---
   77 
   78 
   79 `, "headless-local/_index.md", `
   80 ---
   81 title: Headless Local Lists
   82 cascade:
   83     _build:
   84         render: false
   85         list: local
   86         publishResources: false
   87 ---
   88 
   89 `, "headless-local/headless-local-page.md", "---\ntitle: Headless Local Page\n---",
   90 			"headless-local/sub/_index.md", `
   91 ---
   92 title: Headless Local Lists Sub
   93 ---
   94 
   95 `, "headless-local/sub/headless-local-sub-page.md", "---\ntitle: Headless Local Sub Page\n---",
   96 		)
   97 
   98 		b.WithSourceFile("content/sect/headlessbundle/data.json", "DATA")
   99 		b.WithSourceFile("content/sect/no-publishresources/data.json", "DATA")
  100 
  101 		return b
  102 	}
  103 
  104 	getPage := func(b *sitesBuilder, ref string) page.Page {
  105 		b.Helper()
  106 		p, err := b.H.Sites[0].getPageNew(nil, ref)
  107 		b.Assert(err, qt.IsNil)
  108 		return p
  109 	}
  110 
  111 	getPageInSitePages := func(b *sitesBuilder, ref string) page.Page {
  112 		b.Helper()
  113 		for _, pages := range []page.Pages{b.H.Sites[0].Pages(), b.H.Sites[0].RegularPages()} {
  114 			for _, p := range pages {
  115 				if ref == p.(*pageState).sourceRef() {
  116 					return p
  117 				}
  118 			}
  119 		}
  120 		return nil
  121 	}
  122 
  123 	getPageInPagePages := func(p page.Page, ref string, pageCollections ...page.Pages) page.Page {
  124 		if len(pageCollections) == 0 {
  125 			pageCollections = []page.Pages{p.Pages(), p.RegularPages(), p.RegularPagesRecursive(), p.Sections()}
  126 		}
  127 		for _, pages := range pageCollections {
  128 			for _, p := range pages {
  129 				if ref == p.(*pageState).sourceRef() {
  130 					return p
  131 				}
  132 			}
  133 		}
  134 		return nil
  135 	}
  136 
  137 	disableKind := page.KindPage
  138 	c.Run("Disable "+disableKind, func(c *qt.C) {
  139 		b := newSitesBuilder(c, disableKind)
  140 		b.Build(BuildCfg{})
  141 		s := b.H.Sites[0]
  142 		b.Assert(getPage(b, "/sect/page.md"), qt.IsNil)
  143 		b.Assert(b.CheckExists("public/sect/page/index.html"), qt.Equals, false)
  144 		b.Assert(getPageInSitePages(b, "/sect/page.md"), qt.IsNil)
  145 		b.Assert(getPageInPagePages(getPage(b, "/"), "/sect/page.md"), qt.IsNil)
  146 
  147 		// Also check the side effects
  148 		b.Assert(b.CheckExists("public/categories/mycat/index.html"), qt.Equals, false)
  149 		b.Assert(len(s.Taxonomies()["categories"]), qt.Equals, 0)
  150 	})
  151 
  152 	disableKind = page.KindTerm
  153 	c.Run("Disable "+disableKind, func(c *qt.C) {
  154 		b := newSitesBuilder(c, disableKind)
  155 		b.Build(BuildCfg{})
  156 		s := b.H.Sites[0]
  157 		b.Assert(b.CheckExists("public/categories/index.html"), qt.Equals, true)
  158 		b.Assert(b.CheckExists("public/categories/mycat/index.html"), qt.Equals, false)
  159 		b.Assert(len(s.Taxonomies()["categories"]), qt.Equals, 0)
  160 		b.Assert(getPage(b, "/categories"), qt.Not(qt.IsNil))
  161 		b.Assert(getPage(b, "/categories/mycat"), qt.IsNil)
  162 	})
  163 
  164 	disableKind = page.KindTaxonomy
  165 	c.Run("Disable "+disableKind, func(c *qt.C) {
  166 		b := newSitesBuilder(c, disableKind)
  167 		b.Build(BuildCfg{})
  168 		s := b.H.Sites[0]
  169 		b.Assert(b.CheckExists("public/categories/mycat/index.html"), qt.Equals, true)
  170 		b.Assert(b.CheckExists("public/categories/index.html"), qt.Equals, false)
  171 		b.Assert(len(s.Taxonomies()["categories"]), qt.Equals, 1)
  172 		b.Assert(getPage(b, "/categories/mycat"), qt.Not(qt.IsNil))
  173 		categories := getPage(b, "/categories")
  174 		b.Assert(categories, qt.Not(qt.IsNil))
  175 		b.Assert(categories.RelPermalink(), qt.Equals, "")
  176 		b.Assert(getPageInSitePages(b, "/categories"), qt.IsNil)
  177 		b.Assert(getPageInPagePages(getPage(b, "/"), "/categories"), qt.IsNil)
  178 	})
  179 
  180 	disableKind = page.KindHome
  181 	c.Run("Disable "+disableKind, func(c *qt.C) {
  182 		b := newSitesBuilder(c, disableKind)
  183 		b.Build(BuildCfg{})
  184 		b.Assert(b.CheckExists("public/index.html"), qt.Equals, false)
  185 		home := getPage(b, "/")
  186 		b.Assert(home, qt.Not(qt.IsNil))
  187 		b.Assert(home.RelPermalink(), qt.Equals, "")
  188 		b.Assert(getPageInSitePages(b, "/"), qt.IsNil)
  189 		b.Assert(getPageInPagePages(home, "/"), qt.IsNil)
  190 		b.Assert(getPage(b, "/sect/page.md"), qt.Not(qt.IsNil))
  191 	})
  192 
  193 	disableKind = page.KindSection
  194 	c.Run("Disable "+disableKind, func(c *qt.C) {
  195 		b := newSitesBuilder(c, disableKind)
  196 		b.Build(BuildCfg{})
  197 		b.Assert(b.CheckExists("public/sect/index.html"), qt.Equals, false)
  198 		sect := getPage(b, "/sect")
  199 		b.Assert(sect, qt.Not(qt.IsNil))
  200 		b.Assert(sect.RelPermalink(), qt.Equals, "")
  201 		b.Assert(getPageInSitePages(b, "/sect"), qt.IsNil)
  202 		home := getPage(b, "/")
  203 		b.Assert(getPageInPagePages(home, "/sect"), qt.IsNil)
  204 		b.Assert(home.OutputFormats(), qt.HasLen, 2)
  205 		page := getPage(b, "/sect/page.md")
  206 		b.Assert(page, qt.Not(qt.IsNil))
  207 		b.Assert(page.CurrentSection(), qt.Equals, sect)
  208 		b.Assert(getPageInPagePages(sect, "/sect/page.md"), qt.Not(qt.IsNil))
  209 		b.AssertFileContent("public/sitemap.xml", "sitemap")
  210 		b.AssertFileContent("public/index.xml", "rss")
  211 	})
  212 
  213 	disableKind = kindRSS
  214 	c.Run("Disable "+disableKind, func(c *qt.C) {
  215 		b := newSitesBuilder(c, disableKind)
  216 		b.Build(BuildCfg{})
  217 		b.Assert(b.CheckExists("public/index.xml"), qt.Equals, false)
  218 		home := getPage(b, "/")
  219 		b.Assert(home.OutputFormats(), qt.HasLen, 1)
  220 	})
  221 
  222 	disableKind = kindSitemap
  223 	c.Run("Disable "+disableKind, func(c *qt.C) {
  224 		b := newSitesBuilder(c, disableKind)
  225 		b.Build(BuildCfg{})
  226 		b.Assert(b.CheckExists("public/sitemap.xml"), qt.Equals, false)
  227 	})
  228 
  229 	disableKind = kind404
  230 	c.Run("Disable "+disableKind, func(c *qt.C) {
  231 		b := newSitesBuilder(c, disableKind)
  232 		b.Build(BuildCfg{})
  233 		b.Assert(b.CheckExists("public/404.html"), qt.Equals, false)
  234 	})
  235 
  236 	disableKind = kindRobotsTXT
  237 	c.Run("Disable "+disableKind, func(c *qt.C) {
  238 		b := newSitesBuilder(c, disableKind)
  239 		b.WithTemplatesAdded("robots.txt", "myrobots")
  240 		b.Build(BuildCfg{})
  241 		b.Assert(b.CheckExists("public/robots.txt"), qt.Equals, false)
  242 	})
  243 
  244 	c.Run("Headless bundle", func(c *qt.C) {
  245 		b := newSitesBuilder(c, disableKind)
  246 		b.Build(BuildCfg{})
  247 		b.Assert(b.CheckExists("public/sect/headlessbundle/index.html"), qt.Equals, false)
  248 		b.Assert(b.CheckExists("public/sect/headlessbundle/data.json"), qt.Equals, true)
  249 		bundle := getPage(b, "/sect/headlessbundle/index.md")
  250 		b.Assert(bundle, qt.Not(qt.IsNil))
  251 		b.Assert(bundle.RelPermalink(), qt.Equals, "")
  252 		resource := bundle.Resources()[0]
  253 		b.Assert(resource.RelPermalink(), qt.Equals, "/blog/sect/headlessbundle/data.json")
  254 		b.Assert(bundle.OutputFormats(), qt.HasLen, 0)
  255 		b.Assert(bundle.AlternativeOutputFormats(), qt.HasLen, 0)
  256 	})
  257 
  258 	c.Run("Build config, no list", func(c *qt.C) {
  259 		b := newSitesBuilder(c, disableKind)
  260 		b.Build(BuildCfg{})
  261 		ref := "/sect/no-list.md"
  262 		b.Assert(b.CheckExists("public/sect/no-list/index.html"), qt.Equals, true)
  263 		p := getPage(b, ref)
  264 		b.Assert(p, qt.Not(qt.IsNil))
  265 		b.Assert(p.RelPermalink(), qt.Equals, "/blog/sect/no-list/")
  266 		b.Assert(getPageInSitePages(b, ref), qt.IsNil)
  267 		sect := getPage(b, "/sect")
  268 		b.Assert(getPageInPagePages(sect, ref), qt.IsNil)
  269 	})
  270 
  271 	c.Run("Build config, local list", func(c *qt.C) {
  272 		b := newSitesBuilder(c, disableKind)
  273 		b.Build(BuildCfg{})
  274 		ref := "/headless-local"
  275 		sect := getPage(b, ref)
  276 		b.Assert(sect, qt.Not(qt.IsNil))
  277 		b.Assert(getPageInSitePages(b, ref), qt.IsNil)
  278 
  279 		b.Assert(getPageInSitePages(b, "/headless-local/_index.md"), qt.IsNil)
  280 		b.Assert(getPageInSitePages(b, "/headless-local/headless-local-page.md"), qt.IsNil)
  281 
  282 		localPageRef := ref + "/headless-local-page.md"
  283 
  284 		b.Assert(getPageInPagePages(sect, localPageRef, sect.RegularPages()), qt.Not(qt.IsNil))
  285 		b.Assert(getPageInPagePages(sect, localPageRef, sect.RegularPagesRecursive()), qt.Not(qt.IsNil))
  286 		b.Assert(getPageInPagePages(sect, localPageRef, sect.Pages()), qt.Not(qt.IsNil))
  287 
  288 		ref = "/headless-local/sub"
  289 
  290 		sect = getPage(b, ref)
  291 		b.Assert(sect, qt.Not(qt.IsNil))
  292 
  293 		localPageRef = ref + "/headless-local-sub-page.md"
  294 		b.Assert(getPageInPagePages(sect, localPageRef), qt.Not(qt.IsNil))
  295 	})
  296 
  297 	c.Run("Build config, no render", func(c *qt.C) {
  298 		b := newSitesBuilder(c, disableKind)
  299 		b.Build(BuildCfg{})
  300 		ref := "/sect/no-render.md"
  301 		b.Assert(b.CheckExists("public/sect/no-render/index.html"), qt.Equals, false)
  302 		p := getPage(b, ref)
  303 		b.Assert(p, qt.Not(qt.IsNil))
  304 		b.Assert(p.RelPermalink(), qt.Equals, "")
  305 		b.Assert(p.OutputFormats(), qt.HasLen, 0)
  306 		b.Assert(getPageInSitePages(b, ref), qt.Not(qt.IsNil))
  307 		sect := getPage(b, "/sect")
  308 		b.Assert(getPageInPagePages(sect, ref), qt.Not(qt.IsNil))
  309 	})
  310 
  311 	c.Run("Build config, no render link", func(c *qt.C) {
  312 		b := newSitesBuilder(c, disableKind)
  313 		b.Build(BuildCfg{})
  314 		ref := "/sect/no-render-link.md"
  315 		b.Assert(b.CheckExists("public/sect/no-render/index.html"), qt.Equals, false)
  316 		p := getPage(b, ref)
  317 		b.Assert(p, qt.Not(qt.IsNil))
  318 		b.Assert(p.RelPermalink(), qt.Equals, "/blog/sect/no-render-link/")
  319 		b.Assert(p.OutputFormats(), qt.HasLen, 1)
  320 		b.Assert(getPageInSitePages(b, ref), qt.Not(qt.IsNil))
  321 		sect := getPage(b, "/sect")
  322 		b.Assert(getPageInPagePages(sect, ref), qt.Not(qt.IsNil))
  323 
  324 		// https://github.com/gohugoio/hugo/issues/7832
  325 		// It should still render any aliases.
  326 		b.AssertFileContent("public/link-alias/index.html", "refresh")
  327 	})
  328 
  329 	c.Run("Build config, no publish resources", func(c *qt.C) {
  330 		b := newSitesBuilder(c, disableKind)
  331 		b.Build(BuildCfg{})
  332 		b.Assert(b.CheckExists("public/sect/no-publishresources/index.html"), qt.Equals, true)
  333 		b.Assert(b.CheckExists("public/sect/no-publishresources/data.json"), qt.Equals, false)
  334 		bundle := getPage(b, "/sect/no-publishresources/index.md")
  335 		b.Assert(bundle, qt.Not(qt.IsNil))
  336 		b.Assert(bundle.RelPermalink(), qt.Equals, "/blog/sect/no-publishresources/")
  337 		b.Assert(bundle.Resources(), qt.HasLen, 1)
  338 		resource := bundle.Resources()[0]
  339 		b.Assert(resource.RelPermalink(), qt.Equals, "/blog/sect/no-publishresources/data.json")
  340 	})
  341 }
  342 
  343 // https://github.com/gohugoio/hugo/issues/6897#issuecomment-587947078
  344 func TestDisableRSSWithRSSInCustomOutputs(t *testing.T) {
  345 	b := newTestSitesBuilder(t).WithConfigFile("toml", `
  346 disableKinds = ["term", "taxonomy", "RSS"]
  347 [outputs]
  348 home = [ "HTML", "RSS" ]
  349 `).Build(BuildCfg{})
  350 
  351 	// The config above is a little conflicting, but it exists in the real world.
  352 	// In Hugo 0.65 we consolidated the code paths and made RSS a pure output format,
  353 	// but we should make sure to not break existing sites.
  354 	b.Assert(b.CheckExists("public/index.xml"), qt.Equals, false)
  355 }
  356 
  357 func TestBundleNoPublishResources(t *testing.T) {
  358 	b := newTestSitesBuilder(t)
  359 	b.WithTemplates("index.html", `
  360 {{ $bundle := site.GetPage "section/bundle-false" }}
  361 {{ $data1 := $bundle.Resources.GetMatch "data1*" }}
  362 Data1: {{ $data1.RelPermalink }}
  363 
  364 `)
  365 
  366 	b.WithContent("section/bundle-false/index.md", `---\ntitle: BundleFalse
  367 _build:
  368   publishResources: false
  369 ---`,
  370 		"section/bundle-false/data1.json", "Some data1",
  371 		"section/bundle-false/data2.json", "Some data2",
  372 	)
  373 
  374 	b.WithContent("section/bundle-true/index.md", `---\ntitle: BundleTrue
  375 ---`,
  376 		"section/bundle-true/data3.json", "Some data 3",
  377 	)
  378 
  379 	b.Build(BuildCfg{})
  380 	b.AssertFileContent("public/index.html", `Data1: /section/bundle-false/data1.json`)
  381 	b.AssertFileContent("public/section/bundle-false/data1.json", `Some data1`)
  382 	b.Assert(b.CheckExists("public/section/bundle-false/data2.json"), qt.Equals, false)
  383 	b.AssertFileContent("public/section/bundle-true/data3.json", `Some data 3`)
  384 }
  385 
  386 func TestNoRenderAndNoPublishResources(t *testing.T) {
  387 	noRenderPage := `
  388 ---
  389 title: %s
  390 _build:
  391     render: false
  392     publishResources: false
  393 ---
  394 `
  395 	b := newTestSitesBuilder(t)
  396 	b.WithTemplatesAdded("index.html", `
  397 {{ $page := site.GetPage "sect/no-render" }}
  398 {{ $sect := site.GetPage "sect-no-render" }}
  399 
  400 Page: {{ $page.Title }}|RelPermalink: {{ $page.RelPermalink }}|Outputs: {{ len $page.OutputFormats }}
  401 Section: {{ $sect.Title }}|RelPermalink: {{ $sect.RelPermalink }}|Outputs: {{ len $sect.OutputFormats }}
  402 
  403 
  404 `)
  405 	b.WithContent("sect-no-render/_index.md", fmt.Sprintf(noRenderPage, "MySection"))
  406 	b.WithContent("sect/no-render.md", fmt.Sprintf(noRenderPage, "MyPage"))
  407 
  408 	b.Build(BuildCfg{})
  409 
  410 	b.AssertFileContent("public/index.html", `
  411 Page: MyPage|RelPermalink: |Outputs: 0
  412 Section: MySection|RelPermalink: |Outputs: 0
  413 `)
  414 
  415 	b.Assert(b.CheckExists("public/sect/no-render/index.html"), qt.Equals, false)
  416 	b.Assert(b.CheckExists("public/sect-no-render/index.html"), qt.Equals, false)
  417 }