@@ -7,6 +7,7 @@ package integrations
7
7
import (
8
8
"fmt"
9
9
"net/http"
10
+ "net/url"
10
11
"path"
11
12
"strconv"
12
13
"strings"
@@ -20,6 +21,7 @@ import (
20
21
"code.gitea.io/gitea/modules/indexer/issues"
21
22
"code.gitea.io/gitea/modules/references"
22
23
"code.gitea.io/gitea/modules/setting"
24
+ api "code.gitea.io/gitea/modules/structs"
23
25
"code.gitea.io/gitea/modules/test"
24
26
25
27
"github.com/PuerkitoBio/goquery"
@@ -347,3 +349,209 @@ func TestIssueRedirect(t *testing.T) {
347
349
resp = session .MakeRequest (t , req , http .StatusSeeOther )
348
350
assert .Equal (t , "/" + path .Join ("org26" , "repo_external_tracker_alpha" , "pulls" , "1" ), test .RedirectURL (resp ))
349
351
}
352
+
353
+ func TestSearchIssues (t * testing.T ) {
354
+ defer prepareTestEnv (t )()
355
+
356
+ session := loginUser (t , "user2" )
357
+
358
+ link , _ := url .Parse ("/issues/search" )
359
+ req := NewRequest (t , "GET" , link .String ())
360
+ resp := session .MakeRequest (t , req , http .StatusOK )
361
+ var apiIssues []* api.Issue
362
+ DecodeJSON (t , resp , & apiIssues )
363
+ assert .Len (t , apiIssues , 10 )
364
+
365
+ req = NewRequest (t , "GET" , link .String ())
366
+ resp = session .MakeRequest (t , req , http .StatusOK )
367
+ DecodeJSON (t , resp , & apiIssues )
368
+ assert .Len (t , apiIssues , 10 )
369
+
370
+ since := "2000-01-01T00%3A50%3A01%2B00%3A00" // 946687801
371
+ before := time .Unix (999307200 , 0 ).Format (time .RFC3339 )
372
+ query := url.Values {}
373
+ query .Add ("since" , since )
374
+ query .Add ("before" , before )
375
+ link .RawQuery = query .Encode ()
376
+ req = NewRequest (t , "GET" , link .String ())
377
+ resp = session .MakeRequest (t , req , http .StatusOK )
378
+ DecodeJSON (t , resp , & apiIssues )
379
+ assert .Len (t , apiIssues , 8 )
380
+ query .Del ("since" )
381
+ query .Del ("before" )
382
+
383
+ query .Add ("state" , "closed" )
384
+ link .RawQuery = query .Encode ()
385
+ req = NewRequest (t , "GET" , link .String ())
386
+ resp = session .MakeRequest (t , req , http .StatusOK )
387
+ DecodeJSON (t , resp , & apiIssues )
388
+ assert .Len (t , apiIssues , 2 )
389
+
390
+ query .Set ("state" , "all" )
391
+ link .RawQuery = query .Encode ()
392
+ req = NewRequest (t , "GET" , link .String ())
393
+ resp = session .MakeRequest (t , req , http .StatusOK )
394
+ DecodeJSON (t , resp , & apiIssues )
395
+ assert .EqualValues (t , "15" , resp .Header ().Get ("X-Total-Count" ))
396
+ assert .Len (t , apiIssues , 10 ) // there are more but 10 is page item limit
397
+
398
+ query .Add ("limit" , "20" )
399
+ link .RawQuery = query .Encode ()
400
+ req = NewRequest (t , "GET" , link .String ())
401
+ resp = session .MakeRequest (t , req , http .StatusOK )
402
+ DecodeJSON (t , resp , & apiIssues )
403
+ assert .Len (t , apiIssues , 15 )
404
+
405
+ query = url.Values {"assigned" : {"true" }, "state" : {"all" }}
406
+ link .RawQuery = query .Encode ()
407
+ req = NewRequest (t , "GET" , link .String ())
408
+ resp = session .MakeRequest (t , req , http .StatusOK )
409
+ DecodeJSON (t , resp , & apiIssues )
410
+ assert .Len (t , apiIssues , 1 )
411
+
412
+ query = url.Values {"milestones" : {"milestone1" }, "state" : {"all" }}
413
+ link .RawQuery = query .Encode ()
414
+ req = NewRequest (t , "GET" , link .String ())
415
+ resp = session .MakeRequest (t , req , http .StatusOK )
416
+ DecodeJSON (t , resp , & apiIssues )
417
+ assert .Len (t , apiIssues , 1 )
418
+
419
+ query = url.Values {"milestones" : {"milestone1,milestone3" }, "state" : {"all" }}
420
+ link .RawQuery = query .Encode ()
421
+ req = NewRequest (t , "GET" , link .String ())
422
+ resp = session .MakeRequest (t , req , http .StatusOK )
423
+ DecodeJSON (t , resp , & apiIssues )
424
+ assert .Len (t , apiIssues , 2 )
425
+
426
+ query = url.Values {"owner" : {"user2" }} // user
427
+ link .RawQuery = query .Encode ()
428
+ req = NewRequest (t , "GET" , link .String ())
429
+ resp = session .MakeRequest (t , req , http .StatusOK )
430
+ DecodeJSON (t , resp , & apiIssues )
431
+ assert .Len (t , apiIssues , 6 )
432
+
433
+ query = url.Values {"owner" : {"user3" }} // organization
434
+ link .RawQuery = query .Encode ()
435
+ req = NewRequest (t , "GET" , link .String ())
436
+ resp = session .MakeRequest (t , req , http .StatusOK )
437
+ DecodeJSON (t , resp , & apiIssues )
438
+ assert .Len (t , apiIssues , 3 )
439
+
440
+ query = url.Values {"owner" : {"user3" }, "team" : {"team1" }} // organization + team
441
+ link .RawQuery = query .Encode ()
442
+ req = NewRequest (t , "GET" , link .String ())
443
+ resp = session .MakeRequest (t , req , http .StatusOK )
444
+ DecodeJSON (t , resp , & apiIssues )
445
+ assert .Len (t , apiIssues , 2 )
446
+ }
447
+
448
+ func TestSearchIssuesWithLabels (t * testing.T ) {
449
+ defer prepareTestEnv (t )()
450
+
451
+ session := loginUser (t , "user1" )
452
+
453
+ link , _ := url .Parse ("/api/v1/repos/issues/search" )
454
+ req := NewRequest (t , "GET" , link .String ())
455
+ resp := session .MakeRequest (t , req , http .StatusOK )
456
+ var apiIssues []* api.Issue
457
+ DecodeJSON (t , resp , & apiIssues )
458
+
459
+ assert .Len (t , apiIssues , 10 )
460
+
461
+ query := url.Values {}
462
+ link .RawQuery = query .Encode ()
463
+ req = NewRequest (t , "GET" , link .String ())
464
+ resp = session .MakeRequest (t , req , http .StatusOK )
465
+ DecodeJSON (t , resp , & apiIssues )
466
+ assert .Len (t , apiIssues , 10 )
467
+
468
+ query .Add ("labels" , "label1" )
469
+ link .RawQuery = query .Encode ()
470
+ req = NewRequest (t , "GET" , link .String ())
471
+ resp = session .MakeRequest (t , req , http .StatusOK )
472
+ DecodeJSON (t , resp , & apiIssues )
473
+ assert .Len (t , apiIssues , 2 )
474
+
475
+ // multiple labels
476
+ query .Set ("labels" , "label1,label2" )
477
+ link .RawQuery = query .Encode ()
478
+ req = NewRequest (t , "GET" , link .String ())
479
+ resp = session .MakeRequest (t , req , http .StatusOK )
480
+ DecodeJSON (t , resp , & apiIssues )
481
+ assert .Len (t , apiIssues , 2 )
482
+
483
+ // an org label
484
+ query .Set ("labels" , "orglabel4" )
485
+ link .RawQuery = query .Encode ()
486
+ req = NewRequest (t , "GET" , link .String ())
487
+ resp = session .MakeRequest (t , req , http .StatusOK )
488
+ DecodeJSON (t , resp , & apiIssues )
489
+ assert .Len (t , apiIssues , 1 )
490
+
491
+ // org and repo label
492
+ query .Set ("labels" , "label2,orglabel4" )
493
+ query .Add ("state" , "all" )
494
+ link .RawQuery = query .Encode ()
495
+ req = NewRequest (t , "GET" , link .String ())
496
+ resp = session .MakeRequest (t , req , http .StatusOK )
497
+ DecodeJSON (t , resp , & apiIssues )
498
+ assert .Len (t , apiIssues , 2 )
499
+
500
+ // org and repo label which share the same issue
501
+ query .Set ("labels" , "label1,orglabel4" )
502
+ link .RawQuery = query .Encode ()
503
+ req = NewRequest (t , "GET" , link .String ())
504
+ resp = session .MakeRequest (t , req , http .StatusOK )
505
+ DecodeJSON (t , resp , & apiIssues )
506
+ assert .Len (t , apiIssues , 2 )
507
+ }
508
+
509
+ func TestGetIssueInfo (t * testing.T ) {
510
+ defer prepareTestEnv (t )()
511
+
512
+ issue := unittest .AssertExistsAndLoadBean (t , & models.Issue {ID : 10 }).(* models.Issue )
513
+ repo := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : issue .RepoID }).(* repo_model.Repository )
514
+ owner := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : repo .OwnerID }).(* user_model.User )
515
+ assert .NoError (t , issue .LoadAttributes ())
516
+ assert .Equal (t , int64 (1019307200 ), int64 (issue .DeadlineUnix ))
517
+ assert .Equal (t , api .StateOpen , issue .State ())
518
+
519
+ session := loginUser (t , owner .Name )
520
+
521
+ urlStr := fmt .Sprintf ("/%s/%s/issues/%d/info" , owner .Name , repo .Name , issue .Index )
522
+ req := NewRequest (t , "GET" , urlStr )
523
+ resp := session .MakeRequest (t , req , http .StatusOK )
524
+ var apiIssue api.Issue
525
+ DecodeJSON (t , resp , & apiIssue )
526
+
527
+ assert .EqualValues (t , issue .ID , apiIssue .ID )
528
+ }
529
+
530
+ func TestUpdateIssueDeadline (t * testing.T ) {
531
+ defer prepareTestEnv (t )()
532
+
533
+ issueBefore := unittest .AssertExistsAndLoadBean (t , & models.Issue {ID : 10 }).(* models.Issue )
534
+ repoBefore := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : issueBefore .RepoID }).(* repo_model.Repository )
535
+ owner := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : repoBefore .OwnerID }).(* user_model.User )
536
+ assert .NoError (t , issueBefore .LoadAttributes ())
537
+ assert .Equal (t , int64 (1019307200 ), int64 (issueBefore .DeadlineUnix ))
538
+ assert .Equal (t , api .StateOpen , issueBefore .State ())
539
+
540
+ session := loginUser (t , owner .Name )
541
+
542
+ issueURL := fmt .Sprintf ("%s/%s/issues/%d" , owner .Name , repoBefore .Name , issueBefore .Index )
543
+ req := NewRequest (t , "GET" , issueURL )
544
+ resp := session .MakeRequest (t , req , http .StatusOK )
545
+ htmlDoc := NewHTMLParser (t , resp .Body )
546
+
547
+ urlStr := issueURL + "/deadline?_csrf=" + htmlDoc .GetCSRF ()
548
+ req = NewRequestWithJSON (t , "POST" , urlStr , map [string ]string {
549
+ "due_date" : "2022-04-06T00:00:00.000Z" ,
550
+ })
551
+
552
+ resp = session .MakeRequest (t , req , http .StatusCreated )
553
+ var apiIssue api.IssueDeadline
554
+ DecodeJSON (t , resp , & apiIssue )
555
+
556
+ assert .EqualValues (t , "2022-04-06" , apiIssue .Deadline .Format ("2006-01-02" ))
557
+ }
0 commit comments