From 4eb0e4286a69678d56c0044c5fbb43193f5449c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 21 Apr 2025 11:53:38 +0200 Subject: [PATCH] tpl/collections: Fix where ... not in with empty slice Fixes #13621 --- .../collections_integration_test.go | 20 +++++++++++++++++++ tpl/collections/where.go | 3 +++ tpl/collections/where_test.go | 1 + 3 files changed, 24 insertions(+) diff --git a/tpl/collections/collections_integration_test.go b/tpl/collections/collections_integration_test.go index cc60770f9..b60aaea87 100644 --- a/tpl/collections/collections_integration_test.go +++ b/tpl/collections/collections_integration_test.go @@ -278,3 +278,23 @@ disableKinds = ['rss','sitemap', 'taxonomy', 'term', 'page'] b.AssertFileContentExact("public/index.html", "0: /a3_b1.html\n\n1: /b2.html\n\n2: /a1.html\n\n3: /a2.html\n$") } + +// Issue 13621. +func TestWhereNotInEmptySlice(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- layouts/home.html -- +{{- $pages := where site.RegularPages "Kind" "not in" (slice) -}} +Len: {{ $pages | len }}| +-- layouts/all.html -- +All|{{ .Title }}| +-- content/p1.md -- + +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", "Len: 1|") +} diff --git a/tpl/collections/where.go b/tpl/collections/where.go index b15cfe781..ee49d0bbb 100644 --- a/tpl/collections/where.go +++ b/tpl/collections/where.go @@ -138,6 +138,9 @@ func (ns *Namespace) checkCondition(v, mv reflect.Value, op string) (bool, error } if mv.Len() == 0 { + if op == "not in" { + return true, nil + } return false, nil } diff --git a/tpl/collections/where_test.go b/tpl/collections/where_test.go index 60f97e607..ecf748f93 100644 --- a/tpl/collections/where_test.go +++ b/tpl/collections/where_test.go @@ -761,6 +761,7 @@ func TestCheckCondition(t *testing.T) { expect{true, false}, }, {reflect.ValueOf(123), reflect.ValueOf([]int{45, 678}), "not in", expect{true, false}}, + {reflect.ValueOf(123), reflect.ValueOf([]int{}), "not in", expect{true, false}}, {reflect.ValueOf("foo"), reflect.ValueOf([]string{"bar", "baz"}), "not in", expect{true, false}}, { reflect.ValueOf(time.Date(2015, time.May, 26, 19, 18, 56, 12345, time.UTC)),