2017-06-18 12:06:17 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package integrations
import (
2017-07-14 01:33:26 +03:00
"fmt"
2017-06-18 12:06:17 +03:00
"net/http"
2020-01-13 19:02:24 +03:00
"net/url"
2017-06-18 12:06:17 +03:00
"testing"
"code.gitea.io/gitea/models"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-16 11:53:21 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2020-10-17 07:23:08 +03:00
"code.gitea.io/gitea/modules/convert"
2019-05-11 13:21:34 +03:00
api "code.gitea.io/gitea/modules/structs"
2017-06-18 12:06:17 +03:00
"github.com/stretchr/testify/assert"
)
2017-07-14 01:33:26 +03:00
func TestAPIListRepoComments ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-07-14 01:33:26 +03:00
2021-11-16 11:53:21 +03:00
comment := unittest . AssertExistsAndLoadBean ( t , & models . Comment { } ,
unittest . Cond ( "type = ?" , models . CommentTypeComment ) ) . ( * models . Comment )
issue := unittest . AssertExistsAndLoadBean ( t , & models . Issue { ID : comment . IssueID } ) . ( * models . Issue )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : issue . RepoID } ) . ( * repo_model . Repository )
2021-11-24 12:49:20 +03:00
repoOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } ) . ( * user_model . User )
2017-07-14 01:33:26 +03:00
session := loginUser ( t , repoOwner . Name )
2020-01-13 19:02:24 +03:00
link , _ := url . Parse ( fmt . Sprintf ( "/api/v1/repos/%s/%s/issues/comments" , repoOwner . Name , repo . Name ) )
req := NewRequest ( t , "GET" , link . String ( ) )
2017-07-14 01:33:26 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
var apiComments [ ] * api . Comment
DecodeJSON ( t , resp , & apiComments )
2020-01-13 19:02:24 +03:00
assert . Len ( t , apiComments , 2 )
2017-07-14 01:33:26 +03:00
for _ , apiComment := range apiComments {
c := & models . Comment { ID : apiComment . ID }
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , c ,
unittest . Cond ( "type = ?" , models . CommentTypeComment ) )
unittest . AssertExistsAndLoadBean ( t , & models . Issue { ID : c . IssueID , RepoID : repo . ID } )
2017-07-14 01:33:26 +03:00
}
2020-01-13 19:02:24 +03:00
2022-01-20 20:46:10 +03:00
// test before and since filters
2020-01-13 19:02:24 +03:00
query := url . Values { }
2022-01-20 20:46:10 +03:00
before := "2000-01-01T00:00:11+00:00" // unix: 946684811
since := "2000-01-01T00:00:12+00:00" // unix: 946684812
2020-01-13 19:02:24 +03:00
query . Add ( "before" , before )
link . RawQuery = query . Encode ( )
req = NewRequest ( t , "GET" , link . String ( ) )
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & apiComments )
assert . Len ( t , apiComments , 1 )
assert . EqualValues ( t , 2 , apiComments [ 0 ] . ID )
query . Del ( "before" )
query . Add ( "since" , since )
link . RawQuery = query . Encode ( )
req = NewRequest ( t , "GET" , link . String ( ) )
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & apiComments )
assert . Len ( t , apiComments , 1 )
assert . EqualValues ( t , 3 , apiComments [ 0 ] . ID )
2017-07-14 01:33:26 +03:00
}
func TestAPIListIssueComments ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-06-18 12:06:17 +03:00
2021-11-16 11:53:21 +03:00
comment := unittest . AssertExistsAndLoadBean ( t , & models . Comment { } ,
unittest . Cond ( "type = ?" , models . CommentTypeComment ) ) . ( * models . Comment )
issue := unittest . AssertExistsAndLoadBean ( t , & models . Issue { ID : comment . IssueID } ) . ( * models . Issue )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : issue . RepoID } ) . ( * repo_model . Repository )
2021-11-24 12:49:20 +03:00
repoOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } ) . ( * user_model . User )
2017-06-18 12:06:17 +03:00
session := loginUser ( t , repoOwner . Name )
2017-06-25 03:15:42 +03:00
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/issues/%d/comments" ,
2017-06-18 12:06:17 +03:00
repoOwner . Name , repo . Name , issue . Index )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-18 12:06:17 +03:00
var comments [ ] * api . Comment
DecodeJSON ( t , resp , & comments )
2021-11-16 11:53:21 +03:00
expectedCount := unittest . GetCount ( t , & models . Comment { IssueID : issue . ID } ,
unittest . Cond ( "type = ?" , models . CommentTypeComment ) )
2017-06-18 12:06:17 +03:00
assert . EqualValues ( t , expectedCount , len ( comments ) )
}
2017-07-14 01:33:26 +03:00
func TestAPICreateComment ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-07-14 01:33:26 +03:00
const commentBody = "Comment body"
2021-11-16 11:53:21 +03:00
issue := unittest . AssertExistsAndLoadBean ( t , & models . Issue { } ) . ( * models . Issue )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : issue . RepoID } ) . ( * repo_model . Repository )
2021-11-24 12:49:20 +03:00
repoOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } ) . ( * user_model . User )
2017-07-14 01:33:26 +03:00
session := loginUser ( t , repoOwner . Name )
2018-09-10 19:15:52 +03:00
token := getTokenForLoggedInUser ( t , session )
urlStr := fmt . Sprintf ( "/api/v1/repos/%s/%s/issues/%d/comments?token=%s" ,
repoOwner . Name , repo . Name , issue . Index , token )
2017-07-14 01:33:26 +03:00
req := NewRequestWithValues ( t , "POST" , urlStr , map [ string ] string {
"body" : commentBody ,
} )
resp := session . MakeRequest ( t , req , http . StatusCreated )
var updatedComment api . Comment
DecodeJSON ( t , resp , & updatedComment )
assert . EqualValues ( t , commentBody , updatedComment . Body )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , & models . Comment { ID : updatedComment . ID , IssueID : issue . ID , Content : commentBody } )
2017-07-14 01:33:26 +03:00
}
2020-01-08 10:00:59 +03:00
func TestAPIGetComment ( t * testing . T ) {
defer prepareTestEnv ( t ) ( )
2021-11-16 11:53:21 +03:00
comment := unittest . AssertExistsAndLoadBean ( t , & models . Comment { ID : 2 } ) . ( * models . Comment )
2020-01-08 10:00:59 +03:00
assert . NoError ( t , comment . LoadIssue ( ) )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : comment . Issue . RepoID } ) . ( * repo_model . Repository )
2021-11-24 12:49:20 +03:00
repoOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } ) . ( * user_model . User )
2020-01-08 10:00:59 +03:00
session := loginUser ( t , repoOwner . Name )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/issues/comments/%d" , repoOwner . Name , repo . Name , comment . ID )
2021-11-18 04:33:06 +03:00
session . MakeRequest ( t , req , http . StatusOK )
2020-01-08 10:00:59 +03:00
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/issues/comments/%d?token=%s" , repoOwner . Name , repo . Name , comment . ID , token )
2021-11-18 04:33:06 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2020-01-08 10:00:59 +03:00
var apiComment api . Comment
DecodeJSON ( t , resp , & apiComment )
assert . NoError ( t , comment . LoadPoster ( ) )
2020-10-17 07:23:08 +03:00
expect := convert . ToComment ( comment )
2020-01-08 10:00:59 +03:00
assert . Equal ( t , expect . ID , apiComment . ID )
assert . Equal ( t , expect . Poster . FullName , apiComment . Poster . FullName )
assert . Equal ( t , expect . Body , apiComment . Body )
assert . Equal ( t , expect . Created . Unix ( ) , apiComment . Created . Unix ( ) )
}
2017-07-14 01:33:26 +03:00
func TestAPIEditComment ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-07-14 01:33:26 +03:00
const newCommentBody = "This is the new comment body"
2021-11-16 11:53:21 +03:00
comment := unittest . AssertExistsAndLoadBean ( t , & models . Comment { } ,
unittest . Cond ( "type = ?" , models . CommentTypeComment ) ) . ( * models . Comment )
issue := unittest . AssertExistsAndLoadBean ( t , & models . Issue { ID : comment . IssueID } ) . ( * models . Issue )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : issue . RepoID } ) . ( * repo_model . Repository )
2021-11-24 12:49:20 +03:00
repoOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } ) . ( * user_model . User )
2017-07-14 01:33:26 +03:00
session := loginUser ( t , repoOwner . Name )
2018-09-10 19:15:52 +03:00
token := getTokenForLoggedInUser ( t , session )
urlStr := fmt . Sprintf ( "/api/v1/repos/%s/%s/issues/comments/%d?token=%s" ,
repoOwner . Name , repo . Name , comment . ID , token )
2017-07-14 01:33:26 +03:00
req := NewRequestWithValues ( t , "PATCH" , urlStr , map [ string ] string {
"body" : newCommentBody ,
} )
resp := session . MakeRequest ( t , req , http . StatusOK )
var updatedComment api . Comment
DecodeJSON ( t , resp , & updatedComment )
assert . EqualValues ( t , comment . ID , updatedComment . ID )
assert . EqualValues ( t , newCommentBody , updatedComment . Body )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , & models . Comment { ID : comment . ID , IssueID : issue . ID , Content : newCommentBody } )
2017-07-14 01:33:26 +03:00
}
func TestAPIDeleteComment ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-07-14 01:33:26 +03:00
2021-11-16 11:53:21 +03:00
comment := unittest . AssertExistsAndLoadBean ( t , & models . Comment { } ,
unittest . Cond ( "type = ?" , models . CommentTypeComment ) ) . ( * models . Comment )
issue := unittest . AssertExistsAndLoadBean ( t , & models . Issue { ID : comment . IssueID } ) . ( * models . Issue )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : issue . RepoID } ) . ( * repo_model . Repository )
2021-11-24 12:49:20 +03:00
repoOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } ) . ( * user_model . User )
2017-07-14 01:33:26 +03:00
session := loginUser ( t , repoOwner . Name )
2018-09-10 19:15:52 +03:00
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "DELETE" , "/api/v1/repos/%s/%s/issues/comments/%d?token=%s" ,
repoOwner . Name , repo . Name , comment . ID , token )
2017-07-14 01:33:26 +03:00
session . MakeRequest ( t , req , http . StatusNoContent )
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , & models . Comment { ID : comment . ID } )
2017-07-14 01:33:26 +03:00
}
2022-01-01 17:12:25 +03:00
func TestAPIListIssueTimeline ( t * testing . T ) {
defer prepareTestEnv ( t ) ( )
// load comment
issue := unittest . AssertExistsAndLoadBean ( t , & models . Issue { ID : 1 } ) . ( * models . Issue )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : issue . RepoID } ) . ( * repo_model . Repository )
repoOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } ) . ( * user_model . User )
// make request
session := loginUser ( t , repoOwner . Name )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/issues/%d/timeline" ,
repoOwner . Name , repo . Name , issue . Index )
resp := session . MakeRequest ( t , req , http . StatusOK )
// check if lens of list returned by API and
// lists extracted directly from DB are the same
var comments [ ] * api . TimelineComment
DecodeJSON ( t , resp , & comments )
expectedCount := unittest . GetCount ( t , & models . Comment { IssueID : issue . ID } )
assert . EqualValues ( t , expectedCount , len ( comments ) )
}