2017-05-07 17:40:31 +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 (
2019-08-09 05:13:03 +03:00
"encoding/json"
2017-05-07 17:40:31 +03:00
"net/http"
2019-08-09 05:13:03 +03:00
"net/http/httptest"
2017-05-07 17:40:31 +03:00
"path"
"testing"
2019-08-09 05:13:03 +03:00
"code.gitea.io/gitea/modules/setting"
2019-05-11 13:21:34 +03:00
api "code.gitea.io/gitea/modules/structs"
2017-06-17 07:49:45 +03:00
2017-05-07 17:40:31 +03:00
"github.com/stretchr/testify/assert"
)
func TestRepoCommits ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-05-07 17:40:31 +03:00
2017-06-17 07:49:45 +03:00
session := loginUser ( t , "user2" )
2017-05-07 17:40:31 +03:00
// Request repository commits page
2017-10-30 05:04:25 +03:00
req := NewRequest ( t , "GET" , "/user2/repo1/commits/branch/master" )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-05-07 17:40:31 +03:00
2017-06-17 19:29:59 +03:00
doc := NewHTMLParser ( t , resp . Body )
2017-05-07 17:40:31 +03:00
commitURL , exists := doc . doc . Find ( "#commits-table tbody tr td.sha a" ) . Attr ( "href" )
assert . True ( t , exists )
assert . NotEmpty ( t , commitURL )
}
func doTestRepoCommitWithStatus ( t * testing . T , state string , classes ... string ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-05-07 17:40:31 +03:00
2017-06-17 07:49:45 +03:00
session := loginUser ( t , "user2" )
2018-09-10 19:15:52 +03:00
token := getTokenForLoggedInUser ( t , session )
2017-05-07 17:40:31 +03:00
// Request repository commits page
2017-10-30 05:04:25 +03:00
req := NewRequest ( t , "GET" , "/user2/repo1/commits/branch/master" )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-05-07 17:40:31 +03:00
2017-06-17 19:29:59 +03:00
doc := NewHTMLParser ( t , resp . Body )
2017-05-07 17:40:31 +03:00
// Get first commit URL
commitURL , exists := doc . doc . Find ( "#commits-table tbody tr td.sha a" ) . Attr ( "href" )
assert . True ( t , exists )
assert . NotEmpty ( t , commitURL )
// Call API to add status for commit
2018-09-10 19:15:52 +03:00
req = NewRequestWithJSON ( t , "POST" , "/api/v1/repos/user2/repo1/statuses/" + path . Base ( commitURL ) + "?token=" + token ,
2017-06-17 07:49:45 +03:00
api . CreateStatusOption {
State : api . StatusState ( state ) ,
TargetURL : "http://test.ci/" ,
Description : "" ,
Context : "testci" ,
} ,
)
2017-05-07 17:40:31 +03:00
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusCreated )
2017-05-07 17:40:31 +03:00
2017-10-30 05:04:25 +03:00
req = NewRequest ( t , "GET" , "/user2/repo1/commits/branch/master" )
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
2017-05-07 17:40:31 +03:00
2017-06-17 19:29:59 +03:00
doc = NewHTMLParser ( t , resp . Body )
2017-05-07 17:40:31 +03:00
// Check if commit status is displayed in message column
sel := doc . doc . Find ( "#commits-table tbody tr td.message i.commit-status" )
assert . Equal ( t , sel . Length ( ) , 1 )
for _ , class := range classes {
assert . True ( t , sel . HasClass ( class ) )
}
2019-08-09 05:13:03 +03:00
//By SHA
req = NewRequest ( t , "GET" , "/api/v1/repos/user2/repo1/commits/" + path . Base ( commitURL ) + "/statuses" )
testRepoCommitsWithStatus ( t , session . MakeRequest ( t , req , http . StatusOK ) , state )
//By Ref
req = NewRequest ( t , "GET" , "/api/v1/repos/user2/repo1/commits/master/statuses" )
testRepoCommitsWithStatus ( t , session . MakeRequest ( t , req , http . StatusOK ) , state )
req = NewRequest ( t , "GET" , "/api/v1/repos/user2/repo1/commits/v1.1/statuses" )
testRepoCommitsWithStatus ( t , session . MakeRequest ( t , req , http . StatusOK ) , state )
}
func testRepoCommitsWithStatus ( t * testing . T , resp * httptest . ResponseRecorder , state string ) {
decoder := json . NewDecoder ( resp . Body )
statuses := [ ] * api . Status { }
assert . NoError ( t , decoder . Decode ( & statuses ) )
assert . Len ( t , statuses , 1 )
for _ , s := range statuses {
assert . Equal ( t , api . StatusState ( state ) , s . State )
assert . Equal ( t , setting . AppURL + "api/v1/repos/user2/repo1/statuses/65f1bf27bc3bf70f64657658635e66094edbcb4d" , s . URL )
assert . Equal ( t , "http://test.ci/" , s . TargetURL )
assert . Equal ( t , "" , s . Description )
assert . Equal ( t , "testci" , s . Context )
}
2017-05-07 17:40:31 +03:00
}
func TestRepoCommitsWithStatusPending ( t * testing . T ) {
doTestRepoCommitWithStatus ( t , "pending" , "circle" , "yellow" )
}
func TestRepoCommitsWithStatusSuccess ( t * testing . T ) {
doTestRepoCommitWithStatus ( t , "success" , "check" , "green" )
}
func TestRepoCommitsWithStatusError ( t * testing . T ) {
doTestRepoCommitWithStatus ( t , "error" , "warning" , "red" )
}
func TestRepoCommitsWithStatusFailure ( t * testing . T ) {
doTestRepoCommitWithStatus ( t , "failure" , "remove" , "red" )
}
func TestRepoCommitsWithStatusWarning ( t * testing . T ) {
doTestRepoCommitWithStatus ( t , "warning" , "warning" , "sign" , "yellow" )
}