2019-02-21 08:54:05 +08:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2019-02-21 08:54:05 +08:00
package issues
import (
2022-01-27 10:30:51 +02:00
"context"
2019-02-21 08:54:05 +08:00
"path/filepath"
"testing"
2023-09-16 11:15:21 +08:00
"code.gitea.io/gitea/models/db"
2021-11-12 22:36:47 +08:00
"code.gitea.io/gitea/models/unittest"
2023-09-16 11:15:21 +08:00
"code.gitea.io/gitea/modules/indexer/issues/internal"
2019-02-21 08:54:05 +08:00
"code.gitea.io/gitea/modules/setting"
2023-09-15 00:35:53 +08:00
"code.gitea.io/gitea/modules/util"
2019-02-21 08:54:05 +08:00
2021-12-15 06:39:34 +01:00
_ "code.gitea.io/gitea/models"
2023-09-08 12:51:15 +08:00
_ "code.gitea.io/gitea/models/actions"
_ "code.gitea.io/gitea/models/activities"
2021-12-15 06:39:34 +01:00
2019-02-21 08:54:05 +08:00
"github.com/stretchr/testify/assert"
)
func TestMain ( m * testing . M ) {
2022-04-14 21:58:21 +08:00
unittest . MainTest ( m , & unittest . TestOptions {
GiteaRootPath : filepath . Join ( ".." , ".." , ".." ) ,
} )
2019-02-21 08:54:05 +08:00
}
2023-09-16 11:15:21 +08:00
func TestDBSearchIssues ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2019-02-25 00:16:20 +08:00
setting . Indexer . IssueType = "db"
2019-10-15 14:39:51 +01:00
InitIssueIndexer ( true )
2019-02-21 08:54:05 +08:00
2023-09-16 11:15:21 +08:00
t . Run ( "search issues with keyword" , searchIssueWithKeyword )
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 )
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 08:54:05 +08:00
2023-09-16 11:15:21 +08: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 13:01:28 +08:00
2023-09-16 11:15:21 +08: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 08:54:05 +08:00
}
2023-09-15 00:35:53 +08:00
2023-09-16 11:15:21 +08: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-15 00:35:53 +08:00
2023-09-16 11:15:21 +08: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-15 00:35:53 +08:00
2023-09-16 11:15:21 +08:00
func searchIssueByID ( t * testing . T ) {
2023-09-15 00:35:53 +08:00
int64Pointer := func ( x int64 ) * int64 {
return & x
}
2023-09-16 11:15:21 +08:00
tests := [ ] struct {
2023-09-15 00:35:53 +08:00
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
2023-09-16 11:15:21 +08:00
PosterID : int64Pointer ( 1 ) ,
2023-09-15 00:35:53 +08:00
} ,
2023-09-16 11:15:21 +08:00
[ ] int64 { 11 , 6 , 3 , 2 , 1 } ,
2023-09-15 00:35:53 +08:00
} ,
{
SearchOptions {
AssigneeID : int64Pointer ( 1 ) ,
} ,
2023-09-16 11:15:21 +08:00
[ ] int64 { 6 , 1 } ,
} ,
{
SearchOptions {
MentionID : int64Pointer ( 4 ) ,
} ,
2023-09-15 00:35:53 +08:00
[ ] int64 { 1 } ,
} ,
{
SearchOptions {
2023-09-16 11:15:21 +08:00
ReviewedID : int64Pointer ( 1 ) ,
} ,
[ ] int64 { } ,
} ,
{
SearchOptions {
ReviewRequestedID : int64Pointer ( 1 ) ,
} ,
[ ] int64 { 12 } ,
} ,
{
SearchOptions {
SubscriberID : int64Pointer ( 1 ) ,
} ,
[ ] int64 { 11 , 6 , 5 , 3 , 2 , 1 } ,
} ,
}
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 {
IsPull : util . OptionalBoolFalse ,
} ,
[ ] int64 { 17 , 16 , 15 , 14 , 13 , 6 , 5 , 18 , 10 , 7 , 4 , 1 } ,
} ,
{
SearchOptions {
IsPull : util . OptionalBoolTrue ,
2023-09-15 00:35:53 +08:00
} ,
2023-09-16 11:15:21 +08:00
[ ] int64 { 12 , 11 , 19 , 9 , 8 , 3 , 2 } ,
2023-09-15 00:35:53 +08:00
} ,
2023-09-16 11:15:21 +08: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-15 00:35:53 +08:00
{
SearchOptions {
IsClosed : util . OptionalBoolFalse ,
} ,
2023-09-16 11:15:21 +08:00
[ ] int64 { 17 , 16 , 15 , 14 , 13 , 12 , 11 , 6 , 19 , 18 , 10 , 7 , 9 , 8 , 3 , 2 , 1 } ,
2023-09-15 00:35:53 +08:00
} ,
{
SearchOptions {
IsClosed : util . OptionalBoolTrue ,
} ,
2023-09-16 11:15:21 +08: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 )
}
}
func searchIssueByMilestoneID ( t * testing . T ) {
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
MilestoneIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 2 } ,
2023-09-15 00:35:53 +08:00
} ,
{
SearchOptions {
2023-09-16 11:15:21 +08:00
MilestoneIDs : [ ] int64 { 3 } ,
2023-09-15 00:35:53 +08:00
} ,
2023-09-16 11:15:21 +08: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-15 00:35:53 +08:00
} ,
{
SearchOptions {
2023-09-16 11:15:21 +08:00
IncludedLabelIDs : [ ] int64 { 4 } ,
} ,
[ ] int64 { 2 } ,
} ,
{
SearchOptions {
ExcludedLabelIDs : [ ] int64 { 1 } ,
} ,
[ ] int64 { 17 , 16 , 15 , 14 , 13 , 12 , 11 , 6 , 5 , 19 , 18 , 10 , 7 , 4 , 9 , 8 , 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 searchIssueByTime ( t * testing . T ) {
int64Pointer := func ( i int64 ) * int64 {
return & i
}
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
UpdatedAfterUnix : int64Pointer ( 0 ) ,
} ,
[ ] int64 { 17 , 16 , 15 , 14 , 13 , 12 , 11 , 6 , 5 , 19 , 18 , 10 , 7 , 4 , 9 , 8 , 3 , 2 , 1 } ,
} ,
}
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 ,
} ,
[ ] int64 { 1 , 2 , 3 , 8 , 9 , 4 , 7 , 10 , 18 , 19 , 5 , 6 , 11 , 12 , 13 , 14 , 15 , 16 , 17 } ,
} ,
}
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 ) {
int64Pointer := func ( i int64 ) * int64 {
return & i
}
tests := [ ] struct {
opts SearchOptions
expectedIDs [ ] int64
} {
{
SearchOptions {
ProjectID : int64Pointer ( 1 ) ,
} ,
[ ] int64 { 5 , 3 , 2 , 1 } ,
} ,
{
SearchOptions {
ProjectBoardID : int64Pointer ( 1 ) ,
2023-09-15 00:35:53 +08:00
} ,
[ ] int64 { 1 } ,
} ,
2023-09-16 11:15:21 +08: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-15 00:35:53 +08:00
{
SearchOptions {
2023-09-16 11:15:21 +08:00
Paginator : & db . ListOptions {
PageSize : 5 ,
} ,
2023-09-15 00:35:53 +08:00
} ,
2023-09-16 11:15:21 +08:00
[ ] int64 { 17 , 16 , 15 , 14 , 13 } ,
19 ,
2023-09-15 00:35:53 +08:00
} ,
2023-09-16 11:15:21 +08: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-15 00:35:53 +08:00
}
}