github.com/graemephi/kahugo@v0.62.3-0.20211121071557-d78c0423784d/hugolib/disableKinds_test.go (about)

     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  }