2017-04-25 10:24:51 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2017-04-25 10:24:51 +03:00
2022-09-02 22:18:23 +03:00
package integration
2017-04-25 10:24:51 +03:00
import (
"bytes"
2019-12-15 12:51:28 +03:00
"context"
2017-04-25 10:24:51 +03:00
"fmt"
2021-04-06 19:44:02 +03:00
"hash"
"hash/fnv"
2017-04-25 10:24:51 +03:00
"io"
"net/http"
2017-05-02 03:49:55 +03:00
"net/http/cookiejar"
2017-12-04 01:46:01 +03:00
"net/http/httptest"
2017-05-02 03:49:55 +03:00
"net/url"
2017-04-25 10:24:51 +03:00
"os"
2017-11-02 20:51:03 +03:00
"path/filepath"
2017-05-02 03:49:55 +03:00
"strings"
2022-10-20 21:20:01 +03:00
"sync/atomic"
2017-04-25 10:24:51 +03:00
"testing"
2020-06-02 04:39:44 +03:00
"time"
2017-04-25 10:24:51 +03:00
2023-01-18 00:46:03 +03:00
"code.gitea.io/gitea/models/auth"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2023-04-13 22:45:33 +03:00
gitea_context "code.gitea.io/gitea/modules/context"
2019-12-15 12:51:28 +03:00
"code.gitea.io/gitea/modules/graceful"
2021-07-24 19:03:58 +03:00
"code.gitea.io/gitea/modules/json"
2020-10-31 23:51:48 +03:00
"code.gitea.io/gitea/modules/log"
2017-04-25 10:24:51 +03:00
"code.gitea.io/gitea/modules/setting"
2020-08-11 23:05:34 +03:00
"code.gitea.io/gitea/modules/util"
2021-01-26 18:36:53 +03:00
"code.gitea.io/gitea/modules/web"
2017-04-25 10:24:51 +03:00
"code.gitea.io/gitea/routers"
2022-09-02 22:18:23 +03:00
"code.gitea.io/gitea/tests"
2017-04-25 10:24:51 +03:00
2017-12-11 05:15:27 +03:00
"github.com/PuerkitoBio/goquery"
2017-04-28 16:23:28 +03:00
"github.com/stretchr/testify/assert"
2022-12-17 09:22:34 +03:00
"github.com/xeipuuv/gojsonschema"
2017-04-25 10:24:51 +03:00
)
2021-01-26 18:36:53 +03:00
var c * web . Route
2017-04-25 10:24:51 +03:00
2019-02-12 18:09:43 +03:00
type NilResponseRecorder struct {
httptest . ResponseRecorder
Length int
}
func ( n * NilResponseRecorder ) Write ( b [ ] byte ) ( int , error ) {
2019-06-12 22:41:28 +03:00
n . Length += len ( b )
2019-02-12 18:09:43 +03:00
return len ( b ) , nil
}
// NewRecorder returns an initialized ResponseRecorder.
func NewNilResponseRecorder ( ) * NilResponseRecorder {
return & NilResponseRecorder {
ResponseRecorder : * httptest . NewRecorder ( ) ,
}
}
2021-04-06 19:44:02 +03:00
type NilResponseHashSumRecorder struct {
httptest . ResponseRecorder
Hash hash . Hash
Length int
}
func ( n * NilResponseHashSumRecorder ) Write ( b [ ] byte ) ( int , error ) {
_ , _ = n . Hash . Write ( b )
n . Length += len ( b )
return len ( b ) , nil
}
// NewRecorder returns an initialized ResponseRecorder.
func NewNilResponseHashSumRecorder ( ) * NilResponseHashSumRecorder {
return & NilResponseHashSumRecorder {
Hash : fnv . New32 ( ) ,
ResponseRecorder : * httptest . NewRecorder ( ) ,
}
}
2017-04-25 10:24:51 +03:00
func TestMain ( m * testing . M ) {
2020-10-31 23:51:48 +03:00
defer log . Close ( )
2019-12-15 12:51:28 +03:00
managerCtx , cancel := context . WithCancel ( context . Background ( ) )
graceful . InitManager ( managerCtx )
defer cancel ( )
2022-09-02 22:18:23 +03:00
tests . InitTest ( true )
2022-08-28 12:43:25 +03:00
c = routers . NormalRoutes ( context . TODO ( ) )
2017-04-25 10:24:51 +03:00
2020-06-02 04:39:44 +03:00
// integration test settings...
2023-02-19 19:12:01 +03:00
if setting . CfgProvider != nil {
testingCfg := setting . CfgProvider . Section ( "integration-tests" )
2022-09-02 22:18:23 +03:00
tests . SlowTest = testingCfg . Key ( "SLOW_TEST" ) . MustDuration ( tests . SlowTest )
tests . SlowFlush = testingCfg . Key ( "SLOW_FLUSH" ) . MustDuration ( tests . SlowFlush )
2020-06-02 04:39:44 +03:00
}
if os . Getenv ( "GITEA_SLOW_TEST_TIME" ) != "" {
duration , err := time . ParseDuration ( os . Getenv ( "GITEA_SLOW_TEST_TIME" ) )
if err == nil {
2022-09-02 22:18:23 +03:00
tests . SlowTest = duration
2020-06-02 04:39:44 +03:00
}
}
if os . Getenv ( "GITEA_SLOW_FLUSH_TIME" ) != "" {
duration , err := time . ParseDuration ( os . Getenv ( "GITEA_SLOW_FLUSH_TIME" ) )
if err == nil {
2022-09-02 22:18:23 +03:00
tests . SlowFlush = duration
2020-06-02 04:39:44 +03:00
}
}
2022-04-26 23:28:45 +03:00
os . Unsetenv ( "GIT_AUTHOR_NAME" )
os . Unsetenv ( "GIT_AUTHOR_EMAIL" )
os . Unsetenv ( "GIT_AUTHOR_DATE" )
os . Unsetenv ( "GIT_COMMITTER_NAME" )
os . Unsetenv ( "GIT_COMMITTER_EMAIL" )
os . Unsetenv ( "GIT_COMMITTER_DATE" )
2021-11-12 17:36:47 +03:00
err := unittest . InitFixtures (
unittest . FixturesOptions {
2021-09-24 14:32:56 +03:00
Dir : filepath . Join ( filepath . Dir ( setting . AppPath ) , "models/fixtures/" ) ,
} ,
2017-04-25 10:24:51 +03:00
)
if err != nil {
fmt . Printf ( "Error initializing test database: %v\n" , err )
os . Exit ( 1 )
}
2023-04-19 16:40:42 +03:00
// FIXME: the console logger is deleted by mistake, so if there is any `log.Fatal`, developers won't see any error message.
// Instead, "No tests were found", last nonsense log is "According to the configuration, subsequent logs will not be printed to the console"
2017-09-16 23:16:21 +03:00
exitCode := m . Run ( )
2022-09-02 22:18:23 +03:00
tests . WriterCloser . Reset ( )
2019-04-11 14:49:49 +03:00
2020-08-11 23:05:34 +03:00
if err = util . RemoveAll ( setting . Indexer . IssuePath ) ; err != nil {
fmt . Printf ( "util.RemoveAll: %v\n" , err )
2017-09-16 23:16:21 +03:00
os . Exit ( 1 )
}
2020-08-11 23:05:34 +03:00
if err = util . RemoveAll ( setting . Indexer . RepoPath ) ; err != nil {
2017-10-27 09:10:54 +03:00
fmt . Printf ( "Unable to remove repo indexer: %v\n" , err )
os . Exit ( 1 )
}
2017-09-16 23:16:21 +03:00
os . Exit ( exitCode )
2017-04-25 10:24:51 +03:00
}
2017-05-02 03:49:55 +03:00
type TestSession struct {
jar http . CookieJar
}
func ( s * TestSession ) GetCookie ( name string ) * http . Cookie {
baseURL , err := url . Parse ( setting . AppURL )
if err != nil {
return nil
}
for _ , c := range s . jar . Cookies ( baseURL ) {
if c . Name == name {
return c
}
}
return nil
}
2017-12-04 01:46:01 +03:00
func ( s * TestSession ) MakeRequest ( t testing . TB , req * http . Request , expectedStatus int ) * httptest . ResponseRecorder {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-05-02 03:49:55 +03:00
baseURL , err := url . Parse ( setting . AppURL )
assert . NoError ( t , err )
for _ , c := range s . jar . Cookies ( baseURL ) {
req . AddCookie ( c )
}
2017-07-07 22:36:47 +03:00
resp := MakeRequest ( t , req , expectedStatus )
2017-05-02 03:49:55 +03:00
ch := http . Header { }
2019-06-12 22:41:28 +03:00
ch . Add ( "Cookie" , strings . Join ( resp . Header ( ) [ "Set-Cookie" ] , ";" ) )
2017-05-02 03:49:55 +03:00
cr := http . Request { Header : ch }
s . jar . SetCookies ( baseURL , cr . Cookies ( ) )
return resp
}
2019-02-12 18:09:43 +03:00
func ( s * TestSession ) MakeRequestNilResponseRecorder ( t testing . TB , req * http . Request , expectedStatus int ) * NilResponseRecorder {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2019-02-12 18:09:43 +03:00
baseURL , err := url . Parse ( setting . AppURL )
assert . NoError ( t , err )
for _ , c := range s . jar . Cookies ( baseURL ) {
req . AddCookie ( c )
}
resp := MakeRequestNilResponseRecorder ( t , req , expectedStatus )
ch := http . Header { }
2019-06-12 22:41:28 +03:00
ch . Add ( "Cookie" , strings . Join ( resp . Header ( ) [ "Set-Cookie" ] , ";" ) )
2019-02-12 18:09:43 +03:00
cr := http . Request { Header : ch }
s . jar . SetCookies ( baseURL , cr . Cookies ( ) )
return resp
}
2021-04-06 19:44:02 +03:00
func ( s * TestSession ) MakeRequestNilResponseHashSumRecorder ( t testing . TB , req * http . Request , expectedStatus int ) * NilResponseHashSumRecorder {
t . Helper ( )
baseURL , err := url . Parse ( setting . AppURL )
assert . NoError ( t , err )
for _ , c := range s . jar . Cookies ( baseURL ) {
req . AddCookie ( c )
}
resp := MakeRequestNilResponseHashSumRecorder ( t , req , expectedStatus )
ch := http . Header { }
ch . Add ( "Cookie" , strings . Join ( resp . Header ( ) [ "Set-Cookie" ] , ";" ) )
cr := http . Request { Header : ch }
s . jar . SetCookies ( baseURL , cr . Cookies ( ) )
return resp
}
2017-06-17 07:49:45 +03:00
const userPassword = "password"
2017-08-23 10:30:33 +03:00
func emptyTestSession ( t testing . TB ) * TestSession {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-08-23 10:30:33 +03:00
jar , err := cookiejar . New ( nil )
assert . NoError ( t , err )
return & TestSession { jar : jar }
}
2023-01-18 00:46:03 +03:00
func getUserToken ( t testing . TB , userName string , scope ... auth . AccessTokenScope ) string {
return getTokenForLoggedInUser ( t , loginUser ( t , userName ) , scope ... )
2022-04-08 07:22:10 +03:00
}
2017-06-17 18:01:03 +03:00
func loginUser ( t testing . TB , userName string ) * TestSession {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2022-12-22 16:09:35 +03:00
return loginUserWithPassword ( t , userName , userPassword )
2017-06-17 07:49:45 +03:00
}
2017-06-17 18:01:03 +03:00
func loginUserWithPassword ( t testing . TB , userName , password string ) * TestSession {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-06-10 03:41:36 +03:00
req := NewRequest ( t , "GET" , "/user/login" )
2017-07-07 22:36:47 +03:00
resp := MakeRequest ( t , req , http . StatusOK )
2017-05-02 03:49:55 +03:00
2017-06-17 19:29:59 +03:00
doc := NewHTMLParser ( t , resp . Body )
2017-06-17 07:49:45 +03:00
req = NewRequestWithValues ( t , "POST" , "/user/login" , map [ string ] string {
"_csrf" : doc . GetCSRF ( ) ,
"user_name" : userName ,
"password" : password ,
} )
2022-03-23 07:54:07 +03:00
resp = MakeRequest ( t , req , http . StatusSeeOther )
2017-05-02 03:49:55 +03:00
ch := http . Header { }
2019-06-12 22:41:28 +03:00
ch . Add ( "Cookie" , strings . Join ( resp . Header ( ) [ "Set-Cookie" ] , ";" ) )
2017-05-02 03:49:55 +03:00
cr := http . Request { Header : ch }
2017-08-23 10:30:33 +03:00
session := emptyTestSession ( t )
2017-05-02 03:49:55 +03:00
baseURL , err := url . Parse ( setting . AppURL )
assert . NoError ( t , err )
2017-08-23 10:30:33 +03:00
session . jar . SetCookies ( baseURL , cr . Cookies ( ) )
2017-05-02 03:49:55 +03:00
2017-08-23 10:30:33 +03:00
return session
2017-05-02 03:49:55 +03:00
}
2022-01-20 20:46:10 +03:00
// token has to be unique this counter take care of
2020-04-13 22:02:48 +03:00
var tokenCounter int64
2023-01-18 00:46:03 +03:00
// getTokenForLoggedInUser returns a token for a logged in user.
// The scope is an optional list of snake_case strings like the frontend form fields,
// but without the "scope_" prefix.
func getTokenForLoggedInUser ( t testing . TB , session * TestSession , scopes ... auth . AccessTokenScope ) string {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2022-12-21 04:46:16 +03:00
var token string
2018-09-10 19:15:52 +03:00
req := NewRequest ( t , "GET" , "/user/settings/applications" )
resp := session . MakeRequest ( t , req , http . StatusOK )
2022-12-21 04:46:16 +03:00
var csrf string
for _ , cookie := range resp . Result ( ) . Cookies ( ) {
if cookie . Name != "_csrf" {
continue
}
csrf = cookie . Value
break
}
if csrf == "" {
doc := NewHTMLParser ( t , resp . Body )
csrf = doc . GetCSRF ( )
}
assert . NotEmpty ( t , csrf )
2023-01-18 00:46:03 +03:00
urlValues := url . Values { }
urlValues . Add ( "_csrf" , csrf )
urlValues . Add ( "name" , fmt . Sprintf ( "api-testing-token-%d" , atomic . AddInt64 ( & tokenCounter , 1 ) ) )
for _ , scope := range scopes {
urlValues . Add ( "scope" , string ( scope ) )
}
req = NewRequestWithURLValues ( t , "POST" , "/user/settings/applications" , urlValues )
2022-12-21 04:46:16 +03:00
resp = session . MakeRequest ( t , req , http . StatusSeeOther )
// Log the flash values on failure
if ! assert . Equal ( t , resp . Result ( ) . Header [ "Location" ] , [ ] string { "/user/settings/applications" } ) {
for _ , cookie := range resp . Result ( ) . Cookies ( ) {
2023-04-13 22:45:33 +03:00
if cookie . Name != gitea_context . CookieNameFlash {
2022-12-21 04:46:16 +03:00
continue
}
flash , _ := url . ParseQuery ( cookie . Value )
for key , value := range flash {
t . Logf ( "Flash %q: %q" , key , value )
}
}
}
2018-09-10 19:15:52 +03:00
req = NewRequest ( t , "GET" , "/user/settings/applications" )
resp = session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
2022-12-21 04:46:16 +03:00
token = htmlDoc . doc . Find ( ".ui.info p" ) . Text ( )
2022-10-20 21:20:01 +03:00
assert . NotEmpty ( t , token )
2018-09-10 19:15:52 +03:00
return token
}
2017-06-17 18:01:03 +03:00
func NewRequest ( t testing . TB , method , urlStr string ) * http . Request {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-06-17 07:49:45 +03:00
return NewRequestWithBody ( t , method , urlStr , nil )
}
2017-06-25 03:15:42 +03:00
func NewRequestf ( t testing . TB , method , urlFormat string , args ... interface { } ) * http . Request {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-06-25 03:15:42 +03:00
return NewRequest ( t , method , fmt . Sprintf ( urlFormat , args ... ) )
}
2017-06-17 18:01:03 +03:00
func NewRequestWithValues ( t testing . TB , method , urlStr string , values map [ string ] string ) * http . Request {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-06-17 07:49:45 +03:00
urlValues := url . Values { }
for key , value := range values {
urlValues [ key ] = [ ] string { value }
}
2023-01-18 00:46:03 +03:00
return NewRequestWithURLValues ( t , method , urlStr , urlValues )
}
func NewRequestWithURLValues ( t testing . TB , method , urlStr string , urlValues url . Values ) * http . Request {
t . Helper ( )
2017-06-25 03:15:42 +03:00
req := NewRequestWithBody ( t , method , urlStr , bytes . NewBufferString ( urlValues . Encode ( ) ) )
req . Header . Add ( "Content-Type" , "application/x-www-form-urlencoded" )
return req
2017-06-17 07:49:45 +03:00
}
2017-06-17 18:01:03 +03:00
func NewRequestWithJSON ( t testing . TB , method , urlStr string , v interface { } ) * http . Request {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2021-03-02 00:08:10 +03:00
2017-06-17 07:49:45 +03:00
jsonBytes , err := json . Marshal ( v )
assert . NoError ( t , err )
2017-06-25 02:52:51 +03:00
req := NewRequestWithBody ( t , method , urlStr , bytes . NewBuffer ( jsonBytes ) )
req . Header . Add ( "Content-Type" , "application/json" )
return req
2017-06-10 03:41:36 +03:00
}
2017-06-17 18:01:03 +03:00
func NewRequestWithBody ( t testing . TB , method , urlStr string , body io . Reader ) * http . Request {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2021-01-26 18:36:53 +03:00
if ! strings . HasPrefix ( urlStr , "http" ) && ! strings . HasPrefix ( urlStr , "/" ) {
urlStr = "/" + urlStr
}
2017-06-17 07:49:45 +03:00
request , err := http . NewRequest ( method , urlStr , body )
2017-06-10 03:41:36 +03:00
assert . NoError ( t , err )
2017-06-17 07:49:45 +03:00
request . RequestURI = urlStr
2017-06-10 03:41:36 +03:00
return request
}
2018-07-07 04:54:30 +03:00
func AddBasicAuthHeader ( request * http . Request , username string ) * http . Request {
request . SetBasicAuth ( username , userPassword )
return request
}
2017-07-07 22:36:47 +03:00
const NoExpectedStatus = - 1
2017-12-04 01:46:01 +03:00
func MakeRequest ( t testing . TB , req * http . Request , expectedStatus int ) * httptest . ResponseRecorder {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-12-04 01:46:01 +03:00
recorder := httptest . NewRecorder ( )
2023-04-19 16:40:42 +03:00
if req . RemoteAddr == "" {
req . RemoteAddr = "test-mock:12345"
}
2020-11-13 15:51:07 +03:00
c . ServeHTTP ( recorder , req )
2017-07-07 22:36:47 +03:00
if expectedStatus != NoExpectedStatus {
2023-04-19 16:40:42 +03:00
if ! assert . EqualValues ( t , expectedStatus , recorder . Code , "Request: %s %s" , req . Method , req . URL . String ( ) ) {
2017-12-11 05:15:27 +03:00
logUnexpectedResponse ( t , recorder )
}
2017-07-07 22:36:47 +03:00
}
2017-12-04 01:46:01 +03:00
return recorder
2017-04-25 10:24:51 +03:00
}
2017-06-18 12:06:17 +03:00
2019-02-12 18:09:43 +03:00
func MakeRequestNilResponseRecorder ( t testing . TB , req * http . Request , expectedStatus int ) * NilResponseRecorder {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2019-02-12 18:09:43 +03:00
recorder := NewNilResponseRecorder ( )
2020-11-13 15:51:07 +03:00
c . ServeHTTP ( recorder , req )
2019-02-12 18:09:43 +03:00
if expectedStatus != NoExpectedStatus {
2021-04-06 19:44:02 +03:00
if ! assert . EqualValues ( t , expectedStatus , recorder . Code ,
"Request: %s %s" , req . Method , req . URL . String ( ) ) {
logUnexpectedResponse ( t , & recorder . ResponseRecorder )
}
}
return recorder
}
func MakeRequestNilResponseHashSumRecorder ( t testing . TB , req * http . Request , expectedStatus int ) * NilResponseHashSumRecorder {
t . Helper ( )
recorder := NewNilResponseHashSumRecorder ( )
c . ServeHTTP ( recorder , req )
if expectedStatus != NoExpectedStatus {
2019-02-12 18:09:43 +03:00
if ! assert . EqualValues ( t , expectedStatus , recorder . Code ,
"Request: %s %s" , req . Method , req . URL . String ( ) ) {
logUnexpectedResponse ( t , & recorder . ResponseRecorder )
}
}
return recorder
}
2017-12-11 05:15:27 +03:00
// logUnexpectedResponse logs the contents of an unexpected response.
func logUnexpectedResponse ( t testing . TB , recorder * httptest . ResponseRecorder ) {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-12-11 05:15:27 +03:00
respBytes := recorder . Body . Bytes ( )
if len ( respBytes ) == 0 {
return
} else if len ( respBytes ) < 500 {
// if body is short, just log the whole thing
2023-04-19 16:40:42 +03:00
t . Log ( "Response: " , string ( respBytes ) )
2017-12-11 05:15:27 +03:00
return
2023-04-19 16:40:42 +03:00
} else {
t . Log ( "Response length: " , len ( respBytes ) )
2017-12-11 05:15:27 +03:00
}
// log the "flash" error message, if one exists
// we must create a new buffer, so that we don't "use up" resp.Body
htmlDoc , err := goquery . NewDocumentFromReader ( bytes . NewBuffer ( respBytes ) )
if err != nil {
return // probably a non-HTML response
}
errMsg := htmlDoc . Find ( ".ui.negative.message" ) . Text ( )
if len ( errMsg ) > 0 {
t . Log ( "A flash error message was found:" , errMsg )
}
}
2017-12-04 01:46:01 +03:00
func DecodeJSON ( t testing . TB , resp * httptest . ResponseRecorder , v interface { } ) {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2021-03-02 00:08:10 +03:00
2017-12-04 01:46:01 +03:00
decoder := json . NewDecoder ( resp . Body )
2017-06-18 12:06:17 +03:00
assert . NoError ( t , decoder . Decode ( v ) )
}
2017-07-07 22:36:47 +03:00
2022-12-17 09:22:34 +03:00
func VerifyJSONSchema ( t testing . TB , resp * httptest . ResponseRecorder , schemaFile string ) {
t . Helper ( )
schemaFilePath := filepath . Join ( filepath . Dir ( setting . AppPath ) , "tests" , "integration" , "schemas" , schemaFile )
_ , schemaFileErr := os . Stat ( schemaFilePath )
assert . Nil ( t , schemaFileErr )
schema , schemaFileReadErr := os . ReadFile ( schemaFilePath )
assert . Nil ( t , schemaFileReadErr )
assert . True ( t , len ( schema ) > 0 )
nodeinfoSchema := gojsonschema . NewStringLoader ( string ( schema ) )
nodeinfoString := gojsonschema . NewStringLoader ( resp . Body . String ( ) )
result , schemaValidationErr := gojsonschema . Validate ( nodeinfoSchema , nodeinfoString )
assert . Nil ( t , schemaValidationErr )
assert . Empty ( t , result . Errors ( ) )
assert . True ( t , result . Valid ( ) )
}
2017-07-07 22:36:47 +03:00
func GetCSRF ( t testing . TB , session * TestSession , urlStr string ) string {
2019-07-29 07:15:18 +03:00
t . Helper ( )
2017-07-07 22:36:47 +03:00
req := NewRequest ( t , "GET" , urlStr )
resp := session . MakeRequest ( t , req , http . StatusOK )
doc := NewHTMLParser ( t , resp . Body )
return doc . GetCSRF ( )
}