2019-02-21 03:54:05 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-02-21 03:54:05 +03:00
package issues
import (
2022-01-27 11:30:51 +03:00
"context"
2019-02-21 03:54:05 +03:00
"testing"
2023-09-16 06:15:21 +03:00
"code.gitea.io/gitea/models/db"
2024-07-23 21:36:32 +03:00
"code.gitea.io/gitea/models/issues"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2023-09-16 06:15:21 +03:00
"code.gitea.io/gitea/modules/indexer/issues/internal"
2024-03-02 18:42:31 +03:00
"code.gitea.io/gitea/modules/optional"
2019-02-21 03:54:05 +03:00
"code.gitea.io/gitea/modules/setting"
2021-12-15 08:39:34 +03:00
_ "code.gitea.io/gitea/models"
2023-09-08 07:51:15 +03:00
_ "code.gitea.io/gitea/models/actions"
_ "code.gitea.io/gitea/models/activities"
2021-12-15 08:39:34 +03:00
2019-02-21 03:54:05 +03:00
"github.com/stretchr/testify/assert"
)
func TestMain ( m * testing . M ) {
2023-09-28 04:38:53 +03:00
unittest . MainTest ( m )
2019-02-21 03:54:05 +03:00
}
2023-09-16 06:15:21 +03:00
func TestDBSearchIssues ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2019-02-24 19:16:20 +03:00
setting . Indexer . IssueType = "db"
2019-10-15 16:39:51 +03:00
InitIssueIndexer ( true )
2019-02-21 03:54:05 +03:00
2023-09-16 06:15:21 +03:00
t . Run ( "search issues with keyword" , searchIssueWithKeyword )
2024-07-17 01:49:05 +03:00
t . Run ( "search issues by index" , searchIssueByIndex )
2023-09-16 06:15:21 +03:00
t . Run ( "search issues in repo" , searchIssueInRepo )
t . Run ( "search issues by ID" , searchIssueByID )
t . Run ( "search issues is pr" , searchIssueIsPull )
t . Run ( "search issues is closed" , searchIssueIsClosed )
2024-12-12 02:33:31 +03:00
t . Run ( "search issues is archived" , searchIssueIsArchived )
2023-09-16 06:15:21 +03:00
t . Run ( "search issues by milestone" , searchIssueByMilestoneID )
t . Run ( "search issues by label" , searchIssueByLabelID )
t . Run ( "search issues by time" , searchIssueByTime )
t . Run ( "search issues with order" , searchIssueWithOrder )
t . Run ( "search issues in project" , searchIssueInProject )
t . Run ( "search issues with paginator" , searchIssueWithPaginator )
}
2019-02-21 03:54:05 +03:00
2023-09-16 06:15:21 +03:00
func searchIssueWithKeyword ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
Keyword : "issue2" ,
RepoIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 2 } ,
} ,
{
SearchOptions {
Keyword : "first" ,
RepoIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 1 } ,
} ,
{
SearchOptions {
Keyword : "for" ,
RepoIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 11 , 5 , 3 , 2 , 1 } ,
} ,
{
SearchOptions {
Keyword : "good" ,
RepoIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 1 } ,
} ,
}
2019-02-21 08:01:28 +03:00
2023-09-16 06:15:21 +03:00
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
2019-02-21 03:54:05 +03:00
}
2023-09-14 19:35:53 +03:00
2024-07-17 01:49:05 +03:00
func searchIssueByIndex ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
Keyword : "1000" ,
RepoIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { } ,
} ,
{
SearchOptions {
Keyword : "2" ,
RepoIDs : [ ] int64 { 1 , 2 , 3 , 32 } ,
} ,
[ ] int64 { 17 , 12 , 7 , 2 } ,
} ,
{
SearchOptions {
Keyword : "1" ,
RepoIDs : [ ] int64 { 58 } ,
} ,
[ ] int64 { 19 } ,
} ,
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
2023-09-16 06:15:21 +03:00
func searchIssueInRepo ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
RepoIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 11 , 5 , 3 , 2 , 1 } ,
} ,
{
SearchOptions {
RepoIDs : [ ] int64 { 2 } ,
} ,
[ ] int64 { 7 , 4 } ,
} ,
{
SearchOptions {
RepoIDs : [ ] int64 { 3 } ,
} ,
[ ] int64 { 12 , 6 } ,
} ,
{
SearchOptions {
RepoIDs : [ ] int64 { 4 } ,
} ,
[ ] int64 { } ,
} ,
{
SearchOptions {
RepoIDs : [ ] int64 { 5 } ,
} ,
[ ] int64 { 15 } ,
} ,
}
2023-09-14 19:35:53 +03:00
2023-09-16 06:15:21 +03:00
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
2023-09-14 19:35:53 +03:00
2023-09-16 06:15:21 +03:00
func searchIssueByID ( t * testing . T ) {
tests := [ ] struct {
2023-09-14 19:35:53 +03:00
opts SearchOptions
expectedIDs [ ] int64
} {
{
2024-03-13 11:25:53 +03:00
opts : SearchOptions {
PosterID : optional . Some ( int64 ( 1 ) ) ,
2023-09-14 19:35:53 +03:00
} ,
2024-03-13 11:25:53 +03:00
expectedIDs : [ ] int64 { 11 , 6 , 3 , 2 , 1 } ,
2023-09-14 19:35:53 +03:00
} ,
{
2024-03-13 11:25:53 +03:00
opts : SearchOptions {
AssigneeID : optional . Some ( int64 ( 1 ) ) ,
2023-09-14 19:35:53 +03:00
} ,
2024-03-13 11:25:53 +03:00
expectedIDs : [ ] int64 { 6 , 1 } ,
2023-09-16 06:15:21 +03:00
} ,
2024-07-23 21:36:32 +03:00
{
// NOTE: This tests no assignees filtering and also ToSearchOptions() to ensure it will set AssigneeID to 0 when it is passed as -1.
2024-12-11 09:33:24 +03:00
opts : * ToSearchOptions ( "" , & issues . IssuesOptions { AssigneeID : optional . Some ( db . NoConditionID ) } ) ,
2024-07-23 21:36:32 +03:00
expectedIDs : [ ] int64 { 22 , 21 , 16 , 15 , 14 , 13 , 12 , 11 , 20 , 5 , 19 , 18 , 10 , 7 , 4 , 9 , 8 , 3 , 2 } ,
} ,
2023-09-16 06:15:21 +03:00
{
2024-03-13 11:25:53 +03:00
opts : SearchOptions {
MentionID : optional . Some ( int64 ( 4 ) ) ,
2023-09-16 06:15:21 +03:00
} ,
2024-03-13 11:25:53 +03:00
expectedIDs : [ ] int64 { 1 } ,
2023-09-14 19:35:53 +03:00
} ,
{
2024-03-13 11:25:53 +03:00
opts : SearchOptions {
ReviewedID : optional . Some ( int64 ( 1 ) ) ,
2023-09-16 06:15:21 +03:00
} ,
2024-03-13 11:25:53 +03:00
expectedIDs : [ ] int64 { } ,
2023-09-16 06:15:21 +03:00
} ,
{
2024-03-13 11:25:53 +03:00
opts : SearchOptions {
ReviewRequestedID : optional . Some ( int64 ( 1 ) ) ,
2023-09-16 06:15:21 +03:00
} ,
2024-03-13 11:25:53 +03:00
expectedIDs : [ ] int64 { 12 } ,
2023-09-16 06:15:21 +03:00
} ,
{
2024-03-13 11:25:53 +03:00
opts : SearchOptions {
SubscriberID : optional . Some ( int64 ( 1 ) ) ,
2023-09-16 06:15:21 +03:00
} ,
2024-03-13 11:25:53 +03:00
expectedIDs : [ ] int64 { 11 , 6 , 5 , 3 , 2 , 1 } ,
2023-09-16 06:15:21 +03:00
} ,
2023-09-21 14:59:50 +03:00
{
// issue 20 request user 15 and team 5 which user 15 belongs to
// the review request number of issue 20 should be 1
2024-03-13 11:25:53 +03:00
opts : SearchOptions {
ReviewRequestedID : optional . Some ( int64 ( 15 ) ) ,
2023-09-21 14:59:50 +03:00
} ,
2024-03-13 11:25:53 +03:00
expectedIDs : [ ] int64 { 12 , 20 } ,
2023-09-21 14:59:50 +03:00
} ,
{
// user 20 approved the issue 20, so return nothing
2024-03-13 11:25:53 +03:00
opts : SearchOptions {
ReviewRequestedID : optional . Some ( int64 ( 20 ) ) ,
2023-09-21 14:59:50 +03:00
} ,
2024-03-13 11:25:53 +03:00
expectedIDs : [ ] int64 { } ,
2023-09-21 14:59:50 +03:00
} ,
2023-09-16 06:15:21 +03:00
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
func searchIssueIsPull ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
2024-03-02 18:42:31 +03:00
IsPull : optional . Some ( false ) ,
2023-09-16 06:15:21 +03:00
} ,
[ ] int64 { 17 , 16 , 15 , 14 , 13 , 6 , 5 , 18 , 10 , 7 , 4 , 1 } ,
} ,
{
SearchOptions {
2024-03-02 18:42:31 +03:00
IsPull : optional . Some ( true ) ,
2023-09-14 19:35:53 +03:00
} ,
2024-02-24 15:38:43 +03:00
[ ] int64 { 22 , 21 , 12 , 11 , 20 , 19 , 9 , 8 , 3 , 2 } ,
2023-09-14 19:35:53 +03:00
} ,
2023-09-16 06:15:21 +03:00
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
func searchIssueIsClosed ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
2023-09-14 19:35:53 +03:00
{
SearchOptions {
2024-03-02 18:42:31 +03:00
IsClosed : optional . Some ( false ) ,
2023-09-14 19:35:53 +03:00
} ,
2024-02-24 15:38:43 +03:00
[ ] int64 { 22 , 21 , 17 , 16 , 15 , 14 , 13 , 12 , 11 , 20 , 6 , 19 , 18 , 10 , 7 , 9 , 8 , 3 , 2 , 1 } ,
2023-09-14 19:35:53 +03:00
} ,
{
SearchOptions {
2024-03-02 18:42:31 +03:00
IsClosed : optional . Some ( true ) ,
2023-09-14 19:35:53 +03:00
} ,
2023-09-16 06:15:21 +03:00
[ ] int64 { 5 , 4 } ,
} ,
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
2024-12-12 02:33:31 +03:00
func searchIssueIsArchived ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
IsArchived : optional . Some ( false ) ,
} ,
[ ] int64 { 22 , 21 , 17 , 16 , 15 , 13 , 12 , 11 , 20 , 6 , 5 , 19 , 18 , 10 , 7 , 4 , 9 , 8 , 3 , 2 , 1 } ,
} ,
{
SearchOptions {
IsArchived : optional . Some ( true ) ,
} ,
[ ] int64 { 14 } ,
} ,
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
2023-09-16 06:15:21 +03:00
func searchIssueByMilestoneID ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
MilestoneIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 2 } ,
2023-09-14 19:35:53 +03:00
} ,
{
SearchOptions {
2023-09-16 06:15:21 +03:00
MilestoneIDs : [ ] int64 { 3 } ,
2023-09-14 19:35:53 +03:00
} ,
2023-09-16 06:15:21 +03:00
[ ] int64 { 3 } ,
} ,
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
func searchIssueByLabelID ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
IncludedLabelIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 2 , 1 } ,
2023-09-14 19:35:53 +03:00
} ,
{
SearchOptions {
2023-09-16 06:15:21 +03:00
IncludedLabelIDs : [ ] int64 { 4 } ,
} ,
[ ] int64 { 2 } ,
} ,
{
SearchOptions {
ExcludedLabelIDs : [ ] int64 { 1 } ,
} ,
2024-02-24 15:38:43 +03:00
[ ] int64 { 22 , 21 , 17 , 16 , 15 , 14 , 13 , 12 , 11 , 20 , 6 , 5 , 19 , 18 , 10 , 7 , 4 , 9 , 8 , 3 } ,
2023-09-16 06:15:21 +03:00
} ,
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
func searchIssueByTime ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
2024-03-13 11:25:53 +03:00
UpdatedAfterUnix : optional . Some ( int64 ( 0 ) ) ,
2023-09-16 06:15:21 +03:00
} ,
2024-02-24 15:38:43 +03:00
[ ] int64 { 22 , 21 , 17 , 16 , 15 , 14 , 13 , 12 , 11 , 20 , 6 , 5 , 19 , 18 , 10 , 7 , 4 , 9 , 8 , 3 , 2 , 1 } ,
2023-09-16 06:15:21 +03:00
} ,
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
func searchIssueWithOrder ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
SortBy : internal . SortByCreatedAsc ,
} ,
2024-02-24 15:38:43 +03:00
[ ] int64 { 1 , 2 , 3 , 8 , 9 , 4 , 7 , 10 , 18 , 19 , 5 , 6 , 20 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 21 , 22 } ,
2023-09-16 06:15:21 +03:00
} ,
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
func searchIssueInProject ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
2024-03-13 11:25:53 +03:00
ProjectID : optional . Some ( int64 ( 1 ) ) ,
2023-09-16 06:15:21 +03:00
} ,
[ ] int64 { 5 , 3 , 2 , 1 } ,
} ,
{
SearchOptions {
2024-05-27 11:59:54 +03:00
ProjectColumnID : optional . Some ( int64 ( 1 ) ) ,
2023-09-14 19:35:53 +03:00
} ,
[ ] int64 { 1 } ,
} ,
2023-10-25 14:51:49 +03:00
{
SearchOptions {
2024-05-27 11:59:54 +03:00
ProjectColumnID : optional . Some ( int64 ( 0 ) ) , // issue with in default column
2023-10-25 14:51:49 +03:00
} ,
[ ] int64 { 2 } ,
} ,
2023-09-16 06:15:21 +03:00
}
for _ , test := range tests {
issueIDs , _ , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
}
}
func searchIssueWithPaginator ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
expectedTotal int64
} {
2023-09-14 19:35:53 +03:00
{
SearchOptions {
2023-09-16 06:15:21 +03:00
Paginator : & db . ListOptions {
PageSize : 5 ,
} ,
2023-09-14 19:35:53 +03:00
} ,
2024-02-24 15:38:43 +03:00
[ ] int64 { 22 , 21 , 17 , 16 , 15 } ,
22 ,
2023-09-14 19:35:53 +03:00
} ,
2023-09-16 06:15:21 +03:00
}
for _ , test := range tests {
issueIDs , total , err := SearchIssues ( context . TODO ( ) , & test . opts )
if ! assert . NoError ( t , err ) {
return
}
assert . Equal ( t , test . expectedIDs , issueIDs )
assert . Equal ( t , test . expectedTotal , total )
2023-09-14 19:35:53 +03:00
}
}