// Copyright 2019 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package hugolib
import (
"reflect"
"strings"
"testing"
"github.com/gohugoio/hugo/config"
)
func TestSitemapBasic(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
baseURL = "https://example.com"
disableKinds = ["term", "taxonomy"]
-- content/sect/doc1.md --
---
title: doc1
---
Doc1
-- content/sect/doc2.md --
---
title: doc2
---
Doc2
`
b := Test(t, files)
b.AssertFileContent("public/sitemap.xml", " https://example.com/sect/doc1/", "doc2")
}
func TestSitemapMultilingual(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
baseURL = "https://example.com"
disableKinds = ["term", "taxonomy"]
defaultContentLanguage = "en"
[languages]
[languages.en]
weight = 1
languageName = "English"
[languages.nn]
weight = 2
languageName = "Nynorsk"
-- content/sect/doc1.md --
---
title: doc1
---
Doc1
-- content/sect/doc2.md --
---
title: doc2
---
Doc2
-- content/sect/doc2.nn.md --
---
title: doc2
---
Doc2
`
b := Test(t, files)
b.AssertFileContent("public/sitemap.xml", "https://example.com/en/sitemap.xml", "https://example.com/nn/sitemap.xml")
b.AssertFileContent("public/en/sitemap.xml", " https://example.com/sect/doc1/", "doc2")
b.AssertFileContent("public/nn/sitemap.xml", " https://example.com/nn/sect/doc2/")
}
// https://github.com/gohugoio/hugo/issues/5910
func TestSitemapOutputFormats(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
baseURL = "https://example.com"
disableKinds = ["term", "taxonomy"]
-- content/blog/html-amp.md --
---
Title: AMP and HTML
outputs: [ "html", "amp" ]
---
`
b := Test(t, files)
// Should link to the HTML version.
b.AssertFileContent("public/sitemap.xml", " https://example.com/blog/html-amp/")
}
func TestParseSitemap(t *testing.T) {
t.Parallel()
expected := config.SitemapConfig{Priority: 3.0, Filename: "doo.xml", ChangeFreq: "3"}
input := map[string]any{
"changefreq": "3",
"priority": 3.0,
"filename": "doo.xml",
"unknown": "ignore",
}
result, err := config.DecodeSitemap(config.SitemapConfig{}, input)
if err != nil {
t.Fatalf("Failed to parse sitemap: %s", err)
}
if !reflect.DeepEqual(expected, result) {
t.Errorf("Got \n%v expected \n%v", result, expected)
}
}
func TestSitemapShouldNotUseListXML(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
baseURL = "https://example.com"
disableKinds = ["term", "taxonomy"]
[languages]
[languages.en]
weight = 1
languageName = "English"
[languages.nn]
weight = 2
-- layouts/_default/list.xml --
Site: {{ .Site.Title }}|
-- layouts/home --
Home.
`
b := Test(t, files)
b.AssertFileContent("public/sitemap.xml", "https://example.com/en/sitemap.xml")
}
func TestSitemapAndContentBundleNamedSitemap(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
disableKinds = ['home','rss','section','taxonomy','term']
-- layouts/_default/single.html --
layouts/_default/single.html
-- layouts/sitemap/single.html --
layouts/sitemap/single.html
-- content/sitemap/index.md --
---
title: My sitemap
type: sitemap
---
`
b := Test(t, files)
b.AssertFileExists("public/sitemap.xml", true)
}
// Issue 12266
func TestSitemapIssue12266(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
baseURL = 'https://example.org/'
disableKinds = ['rss','taxonomy','term']
defaultContentLanguage = 'en'
defaultContentLanguageInSubdir = true
[languages.de]
[languages.en]
`
// Test A: multilingual with defaultContentLanguageInSubdir = true
b := Test(t, files)
b.AssertFileContent("public/sitemap.xml",
"https://example.org/de/sitemap.xml",
"https://example.org/en/sitemap.xml",
)
b.AssertFileContent("public/de/sitemap.xml", "https://example.org/de/")
b.AssertFileContent("public/en/sitemap.xml", "https://example.org/en/")
// Test B: multilingual with defaultContentLanguageInSubdir = false
files = strings.ReplaceAll(files, "defaultContentLanguageInSubdir = true", "defaultContentLanguageInSubdir = false")
b = Test(t, files)
b.AssertFileContent("public/sitemap.xml",
"https://example.org/de/sitemap.xml",
"https://example.org/en/sitemap.xml",
)
b.AssertFileContent("public/de/sitemap.xml", "https://example.org/de/")
b.AssertFileContent("public/en/sitemap.xml", "https://example.org/")
// Test C: monolingual with defaultContentLanguageInSubdir = false
files = strings.ReplaceAll(files, "[languages.de]", "")
files = strings.ReplaceAll(files, "[languages.en]", "")
b = Test(t, files)
b.AssertFileExists("public/en/sitemap.xml", false)
b.AssertFileContent("public/sitemap.xml", "https://example.org/")
// Test D: monolingual with defaultContentLanguageInSubdir = true
files = strings.ReplaceAll(files, "defaultContentLanguageInSubdir = false", "defaultContentLanguageInSubdir = true")
b = Test(t, files)
b.AssertFileContent("public/sitemap.xml", "https://example.org/en/sitemap.xml")
b.AssertFileContent("public/en/sitemap.xml", "https://example.org/en/")
}