diff --git a/markup/goldmark/convert_test.go b/markup/goldmark/convert_test.go
index 266f0f9ab..4c5039e74 100644
--- a/markup/goldmark/convert_test.go
+++ b/markup/goldmark/convert_test.go
@@ -615,15 +615,6 @@ unsafe = true
return testconfig.GetTestConfig(nil, cfg)
}
-func safeConf() config.AllProvider {
- cfg := config.FromTOMLConfigString(`
-[markup]
-[markup.goldmark.renderer]
-unsafe = false
-`)
- return testconfig.GetTestConfig(nil, cfg)
-}
-
func TestConvertCJK(t *testing.T) {
c := qt.New(t)
diff --git a/markup/goldmark/toc_integration_test.go b/markup/goldmark/toc_integration_test.go
new file mode 100644
index 000000000..9b87b8fbc
--- /dev/null
+++ b/markup/goldmark/toc_integration_test.go
@@ -0,0 +1,266 @@
+// Copyright 2021 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 goldmark_test
+
+import (
+ "testing"
+
+ "github.com/gohugoio/hugo/hugolib"
+)
+
+func TestTableOfContents(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- config.toml --
+disableKinds = ['home','rss','section','sitemap','taxonomy','term']
+enableEmoji = false
+
+[markup.tableOfContents]
+startLevel = 2
+endLevel = 4
+ordered = false
+
+[markup.goldmark.extensions]
+strikethrough = false
+
+[markup.goldmark.extensions.typographer]
+disable = true
+
+[markup.goldmark.parser]
+autoHeadingID = false
+autoHeadingIDType = 'github'
+
+[markup.goldmark.renderer]
+unsafe = false
+xhtml = false
+-- layouts/_default/single.html --
+{{ .TableOfContents }}
+-- content/p1.md --
+---
+title: p1 (basic)
+---
+# Title
+## Section 1
+### Section 1.1
+### Section 1.2
+#### Section 1.2.1
+##### Section 1.2.1.1
+-- content/p2.md --
+---
+title: p2 (markdown)
+---
+## Some *emphasized* text
+## Some ` + "`" + `inline` + "`" + ` code
+## Something to escape A < B && C > B
+---
+-- content/p3.md --
+---
+title: p3 (image)
+---
+## An image ![kitten](a.jpg)
+-- content/p4.md --
+---
+title: p4 (raw html)
+---
+## Some raw HTML
+-- content/p5.md --
+---
+title: p5 (typographer)
+---
+## Some "typographer" markup
+-- content/p6.md --
+---
+title: p6 (strikethrough)
+---
+## Some ~~deleted~~ text
+-- content/p7.md --
+---
+title: p7 (emoji)
+---
+## A :snake: emoji
+`
+
+ b := hugolib.Test(t, files)
+
+ // basic
+ b.AssertFileContentExact("public/p1/index.html", ``)
+
+ // markdown
+ b.AssertFileContent("public/p2/index.html", `