From 1eae2aadae0583ab092d6ed857bb727829aa52b7 Mon Sep 17 00:00:00 2001 From: Nanguan Lin <70063547+lng2020@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:51:49 +0800 Subject: [PATCH] Fix issue not showing on default board and add test (#27720) See https://github.com/go-gitea/gitea/pull/27718#issuecomment-1773743014 . Add a test to ensure its behavior. Why this test uses `ProjectBoardID=0`? Because in `SearchOptions`, `ProjectBoardID=0` means what it is. But in `IssueOptions`, `ProjectBoardID=0` means there is no condition, and `ProjectBoardID=db.NoConditionID` means the board ID = 0. It's really confusing. Probably it's better to separate the db search engine and the other issue search code. It's really two different systems. As far as I can see, `IssueOptions` is not necessary for most of the code, which has very simple issue search conditions. --- models/issues/issue_search.go | 2 +- modules/indexer/issues/indexer_test.go | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/models/issues/issue_search.go b/models/issues/issue_search.go index 9b6bf117b1..0bea1fed14 100644 --- a/models/issues/issue_search.go +++ b/models/issues/issue_search.go @@ -186,7 +186,7 @@ func applyProjectBoardCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.S if opts.ProjectBoardID > 0 { sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": opts.ProjectBoardID})) } else if opts.ProjectBoardID == db.NoConditionID { - sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Neq{"project_board_id": 0})) + sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": 0})) } return sess } diff --git a/modules/indexer/issues/indexer_test.go b/modules/indexer/issues/indexer_test.go index 0ec23164c2..da4fc9b878 100644 --- a/modules/indexer/issues/indexer_test.go +++ b/modules/indexer/issues/indexer_test.go @@ -382,6 +382,12 @@ func searchIssueInProject(t *testing.T) { }, []int64{1}, }, + { + SearchOptions{ + ProjectBoardID: int64Pointer(0), // issue with in default board + }, + []int64{2}, + }, } for _, test := range tests { issueIDs, _, err := SearchIssues(context.TODO(), &test.opts)