2017-11-30 18:52:15 +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 repo
import (
"io/ioutil"
"net/http"
"testing"
"code.gitea.io/gitea/models"
2019-03-27 12:33:00 +03:00
"code.gitea.io/gitea/modules/git"
2017-11-30 18:52:15 +03:00
"code.gitea.io/gitea/modules/test"
2021-01-26 18:36:53 +03:00
"code.gitea.io/gitea/modules/web"
2021-04-06 22:44:05 +03:00
"code.gitea.io/gitea/services/forms"
2020-01-07 21:27:36 +03:00
wiki_service "code.gitea.io/gitea/services/wiki"
2017-11-30 18:52:15 +03:00
"github.com/stretchr/testify/assert"
)
const content = "Wiki contents for unit tests"
const message = "Wiki commit message for unit tests"
2018-02-13 12:19:49 +03:00
func wikiEntry ( t * testing . T , repo * models . Repository , wikiName string ) * git . TreeEntry {
wikiRepo , err := git . OpenRepository ( repo . WikiPath ( ) )
assert . NoError ( t , err )
2019-11-13 10:01:19 +03:00
defer wikiRepo . Close ( )
2018-02-13 12:19:49 +03:00
commit , err := wikiRepo . GetBranchCommit ( "master" )
assert . NoError ( t , err )
entries , err := commit . ListEntries ( )
assert . NoError ( t , err )
for _ , entry := range entries {
2020-01-07 21:27:36 +03:00
if entry . Name ( ) == wiki_service . NameToFilename ( wikiName ) {
2018-02-13 12:19:49 +03:00
return entry
}
}
return nil
2017-11-30 18:52:15 +03:00
}
func wikiContent ( t * testing . T , repo * models . Repository , wikiName string ) string {
2018-02-13 12:19:49 +03:00
entry := wikiEntry ( t , repo , wikiName )
if ! assert . NotNil ( t , entry ) {
return ""
}
2019-04-19 15:17:27 +03:00
reader , err := entry . Blob ( ) . DataAsync ( )
2018-02-13 12:19:49 +03:00
assert . NoError ( t , err )
2019-04-19 15:17:27 +03:00
defer reader . Close ( )
2018-02-13 12:19:49 +03:00
bytes , err := ioutil . ReadAll ( reader )
2017-11-30 18:52:15 +03:00
assert . NoError ( t , err )
return string ( bytes )
}
func assertWikiExists ( t * testing . T , repo * models . Repository , wikiName string ) {
2018-02-13 12:19:49 +03:00
assert . NotNil ( t , wikiEntry ( t , repo , wikiName ) )
2017-11-30 18:52:15 +03:00
}
func assertWikiNotExists ( t * testing . T , repo * models . Repository , wikiName string ) {
2018-02-13 12:19:49 +03:00
assert . Nil ( t , wikiEntry ( t , repo , wikiName ) )
2017-11-30 18:52:15 +03:00
}
func assertPagesMetas ( t * testing . T , expectedNames [ ] string , metas interface { } ) {
pageMetas , ok := metas . ( [ ] PageMeta )
if ! assert . True ( t , ok ) {
return
}
if ! assert . EqualValues ( t , len ( expectedNames ) , len ( pageMetas ) ) {
return
}
for i , pageMeta := range pageMetas {
assert . EqualValues ( t , expectedNames [ i ] , pageMeta . Name )
}
}
func TestWiki ( t * testing . T ) {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/_pages" )
ctx . SetParams ( ":page" , "Home" )
test . LoadRepo ( t , ctx , 1 )
Wiki ( ctx )
assert . EqualValues ( t , http . StatusOK , ctx . Resp . Status ( ) )
assert . EqualValues ( t , "Home" , ctx . Data [ "Title" ] )
2019-02-06 04:58:55 +03:00
assertPagesMetas ( t , [ ] string { "Home" , "Page With Image" , "Page With Spaced Name" } , ctx . Data [ "Pages" ] )
2017-11-30 18:52:15 +03:00
}
func TestWikiPages ( t * testing . T ) {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/_pages" )
test . LoadRepo ( t , ctx , 1 )
WikiPages ( ctx )
assert . EqualValues ( t , http . StatusOK , ctx . Resp . Status ( ) )
2019-02-06 04:58:55 +03:00
assertPagesMetas ( t , [ ] string { "Home" , "Page With Image" , "Page With Spaced Name" } , ctx . Data [ "Pages" ] )
2017-11-30 18:52:15 +03:00
}
func TestNewWiki ( t * testing . T ) {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/_new" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 1 )
NewWiki ( ctx )
assert . EqualValues ( t , http . StatusOK , ctx . Resp . Status ( ) )
assert . EqualValues ( t , ctx . Tr ( "repo.wiki.new_page" ) , ctx . Data [ "Title" ] )
}
func TestNewWikiPost ( t * testing . T ) {
for _ , title := range [ ] string {
"New page" ,
"&&&&" ,
} {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/_new" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 1 )
2021-04-06 22:44:05 +03:00
web . SetForm ( ctx , & forms . NewWikiForm {
2017-11-30 18:52:15 +03:00
Title : title ,
Content : content ,
Message : message ,
} )
2021-01-26 18:36:53 +03:00
NewWikiPost ( ctx )
2017-11-30 18:52:15 +03:00
assert . EqualValues ( t , http . StatusFound , ctx . Resp . Status ( ) )
assertWikiExists ( t , ctx . Repo . Repository , title )
assert . Equal ( t , wikiContent ( t , ctx . Repo . Repository , title ) , content )
}
}
func TestNewWikiPost_ReservedName ( t * testing . T ) {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/_new" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 1 )
2021-04-06 22:44:05 +03:00
web . SetForm ( ctx , & forms . NewWikiForm {
2017-11-30 18:52:15 +03:00
Title : "_edit" ,
Content : content ,
Message : message ,
} )
2021-01-26 18:36:53 +03:00
NewWikiPost ( ctx )
2017-11-30 18:52:15 +03:00
assert . EqualValues ( t , http . StatusOK , ctx . Resp . Status ( ) )
assert . EqualValues ( t , ctx . Tr ( "repo.wiki.reserved_page" ) , ctx . Flash . ErrorMsg )
assertWikiNotExists ( t , ctx . Repo . Repository , "_edit" )
}
func TestEditWiki ( t * testing . T ) {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/_edit/Home" )
ctx . SetParams ( ":page" , "Home" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 1 )
EditWiki ( ctx )
assert . EqualValues ( t , http . StatusOK , ctx . Resp . Status ( ) )
assert . EqualValues ( t , "Home" , ctx . Data [ "Title" ] )
assert . Equal ( t , wikiContent ( t , ctx . Repo . Repository , "Home" ) , ctx . Data [ "content" ] )
}
func TestEditWikiPost ( t * testing . T ) {
for _ , title := range [ ] string {
"Home" ,
"New/<page>" ,
} {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/_new/Home" )
ctx . SetParams ( ":page" , "Home" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 1 )
2021-04-06 22:44:05 +03:00
web . SetForm ( ctx , & forms . NewWikiForm {
2017-11-30 18:52:15 +03:00
Title : title ,
Content : content ,
Message : message ,
} )
2021-01-26 18:36:53 +03:00
EditWikiPost ( ctx )
2017-11-30 18:52:15 +03:00
assert . EqualValues ( t , http . StatusFound , ctx . Resp . Status ( ) )
assertWikiExists ( t , ctx . Repo . Repository , title )
assert . Equal ( t , wikiContent ( t , ctx . Repo . Repository , title ) , content )
if title != "Home" {
assertWikiNotExists ( t , ctx . Repo . Repository , "Home" )
}
}
}
func TestDeleteWikiPagePost ( t * testing . T ) {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/Home/delete" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 1 )
DeleteWikiPagePost ( ctx )
assert . EqualValues ( t , http . StatusOK , ctx . Resp . Status ( ) )
assertWikiNotExists ( t , ctx . Repo . Repository , "Home" )
}
2019-02-06 04:58:55 +03:00
func TestWikiRaw ( t * testing . T ) {
for filepath , filetype := range map [ string ] string {
"jpeg.jpg" : "image/jpeg" ,
2020-01-28 12:44:08 +03:00
"images/jpeg.jpg" : "image/jpeg" ,
2019-02-06 04:58:55 +03:00
"Page With Spaced Name" : "text/plain; charset=utf-8" ,
"Page-With-Spaced-Name" : "text/plain; charset=utf-8" ,
"Page With Spaced Name.md" : "text/plain; charset=utf-8" ,
"Page-With-Spaced-Name.md" : "text/plain; charset=utf-8" ,
} {
models . PrepareTestEnv ( t )
ctx := test . MockContext ( t , "user2/repo1/wiki/raw/" + filepath )
ctx . SetParams ( "*" , filepath )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 1 )
WikiRaw ( ctx )
assert . EqualValues ( t , http . StatusOK , ctx . Resp . Status ( ) )
assert . EqualValues ( t , filetype , ctx . Resp . Header ( ) . Get ( "Content-Type" ) )
}
}