2017-03-13 18:55:02 -04:00
// Copyright 2017 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package transform
import (
"fmt"
"html/template"
"testing"
2017-06-13 12:42:45 -04:00
"github.com/gohugoio/hugo/config"
"github.com/gohugoio/hugo/deps"
"github.com/gohugoio/hugo/helpers"
"github.com/gohugoio/hugo/hugofs"
2017-03-13 18:55:02 -04:00
"github.com/spf13/viper"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type tstNoStringer struct { }
func TestEmojify ( t * testing . T ) {
t . Parallel ( )
2018-03-21 12:21:46 -04:00
v := viper . New ( )
v . Set ( "contentDir" , "content" )
ns := New ( newDeps ( v ) )
2017-03-13 18:55:02 -04:00
for i , test := range [ ] struct {
s interface { }
expect interface { }
} {
{ ":notamoji:" , template . HTML ( ":notamoji:" ) } ,
{ "I :heart: Hugo" , template . HTML ( "I ❤️ Hugo" ) } ,
// errors
{ tstNoStringer { } , false } ,
} {
errMsg := fmt . Sprintf ( "[%d] %s" , i , test . s )
result , err := ns . Emojify ( test . s )
if b , ok := test . expect . ( bool ) ; ok && ! b {
require . Error ( t , err , errMsg )
continue
}
require . NoError ( t , err , errMsg )
assert . Equal ( t , test . expect , result , errMsg )
}
}
func TestHighlight ( t * testing . T ) {
t . Parallel ( )
2018-03-21 12:21:46 -04:00
v := viper . New ( )
v . Set ( "contentDir" , "content" )
ns := New ( newDeps ( v ) )
2017-03-13 18:55:02 -04:00
for i , test := range [ ] struct {
s interface { }
lang string
opts string
expect interface { }
} {
{ "func boo() {}" , "go" , "" , "boo" } ,
2017-12-29 03:52:43 -05:00
// Issue #4179
{ ` <Foo attr=" < "></Foo> ` , "xml" , "" , ` &lt; ` } ,
2017-03-13 18:55:02 -04:00
{ tstNoStringer { } , "go" , "" , false } ,
} {
errMsg := fmt . Sprintf ( "[%d]" , i )
result , err := ns . Highlight ( test . s , test . lang , test . opts )
if b , ok := test . expect . ( bool ) ; ok && ! b {
require . Error ( t , err , errMsg )
continue
}
require . NoError ( t , err , errMsg )
2017-12-29 03:52:43 -05:00
assert . Contains ( t , result , test . expect . ( string ) , errMsg )
2017-03-13 18:55:02 -04:00
}
}
func TestHTMLEscape ( t * testing . T ) {
t . Parallel ( )
2018-03-21 12:21:46 -04:00
v := viper . New ( )
v . Set ( "contentDir" , "content" )
ns := New ( newDeps ( v ) )
2017-03-13 18:55:02 -04:00
for i , test := range [ ] struct {
s interface { }
expect interface { }
} {
{ ` "Foo & Bar's Diner" <y@z> ` , ` "Foo & Bar's Diner" <y@z> ` } ,
{ "Hugo & Caddy > Wordpress & Apache" , "Hugo & Caddy > Wordpress & Apache" } ,
// errors
{ tstNoStringer { } , false } ,
} {
errMsg := fmt . Sprintf ( "[%d] %s" , i , test . s )
result , err := ns . HTMLEscape ( test . s )
if b , ok := test . expect . ( bool ) ; ok && ! b {
require . Error ( t , err , errMsg )
continue
}
require . NoError ( t , err , errMsg )
assert . Equal ( t , test . expect , result , errMsg )
}
}
func TestHTMLUnescape ( t * testing . T ) {
t . Parallel ( )
2018-03-21 12:21:46 -04:00
v := viper . New ( )
v . Set ( "contentDir" , "content" )
ns := New ( newDeps ( v ) )
2017-03-13 18:55:02 -04:00
for i , test := range [ ] struct {
s interface { }
expect interface { }
} {
{ ` "Foo & Bar's Diner" <y@z> ` , ` "Foo & Bar's Diner" <y@z> ` } ,
{ "Hugo & Caddy > Wordpress & Apache" , "Hugo & Caddy > Wordpress & Apache" } ,
// errors
{ tstNoStringer { } , false } ,
} {
errMsg := fmt . Sprintf ( "[%d] %s" , i , test . s )
result , err := ns . HTMLUnescape ( test . s )
if b , ok := test . expect . ( bool ) ; ok && ! b {
require . Error ( t , err , errMsg )
continue
}
require . NoError ( t , err , errMsg )
assert . Equal ( t , test . expect , result , errMsg )
}
}
func TestMarkdownify ( t * testing . T ) {
t . Parallel ( )
2018-03-21 12:21:46 -04:00
v := viper . New ( )
v . Set ( "contentDir" , "content" )
ns := New ( newDeps ( v ) )
2017-03-13 18:55:02 -04:00
for i , test := range [ ] struct {
s interface { }
expect interface { }
} {
{ "Hello **World!**" , template . HTML ( "Hello <strong>World!</strong>" ) } ,
{ [ ] byte ( "Hello Bytes **World!**" ) , template . HTML ( "Hello Bytes <strong>World!</strong>" ) } ,
{ tstNoStringer { } , false } ,
} {
errMsg := fmt . Sprintf ( "[%d] %s" , i , test . s )
result , err := ns . Markdownify ( test . s )
if b , ok := test . expect . ( bool ) ; ok && ! b {
require . Error ( t , err , errMsg )
continue
}
require . NoError ( t , err , errMsg )
assert . Equal ( t , test . expect , result , errMsg )
}
}
2017-08-09 03:54:21 -04:00
// Issue #3040
func TestMarkdownifyBlocksOfText ( t * testing . T ) {
t . Parallel ( )
assert := require . New ( t )
2018-03-21 12:21:46 -04:00
v := viper . New ( )
v . Set ( "contentDir" , "content" )
ns := New ( newDeps ( v ) )
2017-08-09 03:54:21 -04:00
text := `
# First
This is some * bold * text .
# # Second
This is some more text .
And then some .
`
result , err := ns . Markdownify ( text )
assert . NoError ( err )
assert . Equal ( template . HTML (
"<p>#First</p>\n\n<p>This is some <em>bold</em> text.</p>\n\n<h2 id=\"second\">Second</h2>\n\n<p>This is some more text.</p>\n\n<p>And then some.</p>\n" ) ,
result )
}
2017-03-13 18:55:02 -04:00
func TestPlainify ( t * testing . T ) {
t . Parallel ( )
2018-03-21 12:21:46 -04:00
v := viper . New ( )
v . Set ( "contentDir" , "content" )
ns := New ( newDeps ( v ) )
2017-03-13 18:55:02 -04:00
for i , test := range [ ] struct {
s interface { }
expect interface { }
} {
{ "<em>Note:</em> blah <b>blah</b>" , "Note: blah blah" } ,
// errors
{ tstNoStringer { } , false } ,
} {
errMsg := fmt . Sprintf ( "[%d] %s" , i , test . s )
result , err := ns . Plainify ( test . s )
if b , ok := test . expect . ( bool ) ; ok && ! b {
require . Error ( t , err , errMsg )
continue
}
require . NoError ( t , err , errMsg )
assert . Equal ( t , test . expect , result , errMsg )
}
}
func newDeps ( cfg config . Provider ) * deps . Deps {
l := helpers . NewLanguage ( "en" , cfg )
l . Set ( "i18nDir" , "i18n" )
2017-09-25 02:59:02 -04:00
cs , err := helpers . NewContentSpec ( l )
if err != nil {
panic ( err )
}
2017-03-13 18:55:02 -04:00
return & deps . Deps {
Cfg : cfg ,
Fs : hugofs . NewMem ( l ) ,
2017-09-25 02:59:02 -04:00
ContentSpec : cs ,
2017-03-13 18:55:02 -04:00
}
}