Repository: gohugoio/hugo (language: go)

Issue:
templates.Exists cannot find layout
hugo v0.93.0-DEV-92627190+extended linux/amd64

```text
layouts/
├── _default/
│   ├── baseof.html
│   ├── home.html
│   ├── list.html
│   └── single.html
└── post/
    └── single.html
```

```
{{ templates.Exists "post/single.html" }} --> false
{{ templates.Exists "/post/single.html" }} --> false
{{ templates.Exists "layouts/post/single.html" }} --> false
{{ templates.Exists "/layouts/post/single.html" }} --> false
```

According to the [documentation](https://gohugo.io/functions/templates.exists) I expected the first one to work. 

It also returns `false` for templates in mounts.

```bash
git clone --single-branch -b hugo-github-issue-9477 https://github.com/jmooring/hugo-testing hugo-github-issue-9477
cd hugo-github-issue-9477
hugo server
```

Then visit `http://localhost:1313/tests/test-1/`


Discussion / hints:
It's probably the base template that confuses things ... I guess I have only used this for partials.

Fix patch:
diff --git a/tpl/templates/templates.go b/tpl/templates/templates.go
index e005373305b..8e40f3443a2 100644
--- a/tpl/templates/templates.go
+++ b/tpl/templates/templates.go
@@ -34,6 +34,5 @@ type Namespace struct {
 // Note that this is the Unix-styled relative path including filename suffix,
 // e.g. partials/header.html
 func (ns *Namespace) Exists(name string) bool {
-	_, found := ns.deps.Tmpl().Lookup(name)
-	return found
+	return ns.deps.Tmpl().HasTemplate(name)
 }


Test patch:
diff --git a/tpl/templates/integration_test.go b/tpl/templates/integration_test.go
new file mode 100644
index 00000000000..fea2d7f6e07
--- /dev/null
+++ b/tpl/templates/integration_test.go
@@ -0,0 +1,85 @@
+// Copyright 2022 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 templates_test
+
+import (
+	"testing"
+
+	"github.com/gohugoio/hugo/hugolib"
+)
+
+func TestExists(t *testing.T) {
+	t.Parallel()
+
+	files := `
+-- config.toml --
+baseURL = 'http://example.com/'
+-- layouts/index.html --
+index.html: {{ templates.Exists "index.html" }}
+post/single.html: {{ templates.Exists "post/single.html" }}
+partials/foo.html: {{ templates.Exists "partials/foo.html" }}
+partials/doesnotexist.html: {{ templates.Exists "partials/doesnotexist.html" }}
+-- layouts/post/single.html --
+-- layouts/partials/foo.html --
+  `
+
+	b := hugolib.NewIntegrationTestBuilder(
+		hugolib.IntegrationTestConfig{
+			T:           t,
+			TxtarString: files,
+		},
+	).Build()
+
+	b.AssertFileContent("public/index.html", `
+index.html: true
+post/single.html: true
+partials/foo.html: true
+partials/doesnotexist.html: false  
+`)
+}
+
+func TestExistsWithBaseOf(t *testing.T) {
+	t.Parallel()
+
+	files := `
+-- config.toml --
+baseURL = 'http://example.com/'
+-- layouts/baseof.html --
+{{ block "main" . }}{{ end }}
+-- layouts/index.html --
+{{ define "main" }}
+index.html: {{ templates.Exists "index.html" }}
+post/single.html: {{ templates.Exists "post/single.html" }}
+post/doesnotexist.html: {{ templates.Exists "post/doesnotexist.html" }}
+{{ end }}
+-- layouts/post/single.html --
+{{ define "main" }}MAIN{{ end }}
+
+
+`
+
+	b := hugolib.NewIntegrationTestBuilder(
+		hugolib.IntegrationTestConfig{
+			T:           t,
+			TxtarString: files,
+		},
+	).Build()
+
+	b.AssertFileContent("public/index.html", `
+index.html: true
+post/single.html: true
+post/doesnotexist.html: false
+
+`)
+}