blob: e4fbc2f2cda419af0ec09dd893a0fcc6da004747 [file] [log] [blame]
package main
import (
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/testutils/unittest"
)
const sampleHTML = `
<!DOCTYPE html>
<html>
<!--
Commented out head and body tags should be ignored.
<head>
<title>I'm a comment</title>
</head>
<body>
<p>I'm a comment</p>
</body>
-->
<head>
<title>Example</title>
</head>
<body>
<p>
Example Go template variable: {% .SomeVariable %}
</p>
<p {% .SomeVariable %}>
Example Go template variable inside a tag.
</p>
<p class={% .SomeVariable %}>
Example Go template variable inside an unquoted attribute.
</p>
<p class="foo {% .SomeVariable %} bar">
Example Go template variable inside a quoted attribute.
</p>
{% if .SomeCondition %}
<p>Example Go template conditional.</p>
{% else %}
<p>Something else.</p>
{% end %}
<p {% if .SomeCondition %} class="foo" {% else %} class="bar" {% end %}>
Example Go template conditional inside a tag.
</p>
<p class={% if .SomeCondition %}foo{% else %}bar{% end %}>
Example Go template conditional inside an unquoted attribute.
</p>
<p class="foo {% if .SomeCondition %}bar{% else %}baz{% end %} qux">
Example Go template conditional inside a quoted attribute.
</p>
{% range .Items %}
<p>Example Go template range: {% .ItemName %}</p>
{% else %}
<p>No items.</p>
{% end %}
</body>
</html>
`
const (
jsPath = "/dist/index.js"
cssPath = "/dist/index.css"
nonce = "{% .Nonce %}"
)
const expectedHTMLWithNonce = `
<!DOCTYPE html>
<html>
<!--
Commented out head and body tags should be ignored.
<head>
<title>I'm a comment</title>
</head>
<body>
<p>I'm a comment</p>
</body>
-->
<head>
<title>Example</title>
<link rel="stylesheet" href="/dist/index.css" nonce="{% .Nonce %}"></head>
<body>
<p>
Example Go template variable: {% .SomeVariable %}
</p>
<p {% .SomeVariable %}>
Example Go template variable inside a tag.
</p>
<p class={% .SomeVariable %}>
Example Go template variable inside an unquoted attribute.
</p>
<p class="foo {% .SomeVariable %} bar">
Example Go template variable inside a quoted attribute.
</p>
{% if .SomeCondition %}
<p>Example Go template conditional.</p>
{% else %}
<p>Something else.</p>
{% end %}
<p {% if .SomeCondition %} class="foo" {% else %} class="bar" {% end %}>
Example Go template conditional inside a tag.
</p>
<p class={% if .SomeCondition %}foo{% else %}bar{% end %}>
Example Go template conditional inside an unquoted attribute.
</p>
<p class="foo {% if .SomeCondition %}bar{% else %}baz{% end %} qux">
Example Go template conditional inside a quoted attribute.
</p>
{% range .Items %}
<p>Example Go template range: {% .ItemName %}</p>
{% else %}
<p>No items.</p>
{% end %}
<script src="/dist/index.js" nonce="{% .Nonce %}"></script></body>
</html>
`
const expectedHTMLWithoutNonce = `
<!DOCTYPE html>
<html>
<!--
Commented out head and body tags should be ignored.
<head>
<title>I'm a comment</title>
</head>
<body>
<p>I'm a comment</p>
</body>
-->
<head>
<title>Example</title>
<link rel="stylesheet" href="/dist/index.css"></head>
<body>
<p>
Example Go template variable: {% .SomeVariable %}
</p>
<p {% .SomeVariable %}>
Example Go template variable inside a tag.
</p>
<p class={% .SomeVariable %}>
Example Go template variable inside an unquoted attribute.
</p>
<p class="foo {% .SomeVariable %} bar">
Example Go template variable inside a quoted attribute.
</p>
{% if .SomeCondition %}
<p>Example Go template conditional.</p>
{% else %}
<p>Something else.</p>
{% end %}
<p {% if .SomeCondition %} class="foo" {% else %} class="bar" {% end %}>
Example Go template conditional inside a tag.
</p>
<p class={% if .SomeCondition %}foo{% else %}bar{% end %}>
Example Go template conditional inside an unquoted attribute.
</p>
<p class="foo {% if .SomeCondition %}bar{% else %}baz{% end %} qux">
Example Go template conditional inside a quoted attribute.
</p>
{% range .Items %}
<p>Example Go template range: {% .ItemName %}</p>
{% else %}
<p>No items.</p>
{% end %}
<script src="/dist/index.js"></script></body>
</html>
`
func TestInsertAssets_WithNonce_Success(t *testing.T) {
unittest.SmallTest(t)
actualOutput, err := insertAssets(strings.NewReader(sampleHTML), jsPath, cssPath, nonce)
require.NoError(t, err)
assert.Equal(t, expectedHTMLWithNonce, actualOutput)
}
func TestInsertAssets_WithoutNonce_Success(t *testing.T) {
unittest.SmallTest(t)
actualOutput, err := insertAssets(strings.NewReader(sampleHTML), jsPath, cssPath, "" /* =nonce */)
require.NoError(t, err)
assert.Equal(t, expectedHTMLWithoutNonce, actualOutput)
}
func TestInsertAssets_MissingEndHeadTag_Error(t *testing.T) {
unittest.SmallTest(t)
html := `
<html>
<head>
<title>Hello</title>
<body>
<p>Hello, world!</p>
</body>
</html>
`
_, err := insertAssets(strings.NewReader(html), jsPath, cssPath, "" /* =nonce */)
assert.EqualError(t, err, "no </head> tag found")
}
func TestInsertAssets_MalformedEndHeadTag_Error(t *testing.T) {
unittest.SmallTest(t)
html := `
<html>
<head>
<title>Hello</title>
<head>
<body>
<p>Hello, world!</p>
</body>
</html>
`
_, err := insertAssets(strings.NewReader(html), jsPath, cssPath, "" /* =nonce */)
assert.EqualError(t, err, "no </head> tag found")
}
func TestInsertAssets_MissingEndBodyTag_Error(t *testing.T) {
unittest.SmallTest(t)
html := `
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>Hello, world!</p>
</html>
`
_, err := insertAssets(strings.NewReader(html), jsPath, cssPath, "" /* =nonce */)
assert.EqualError(t, err, "no </body> tag found")
}
func TestInsertAssets_MalformedEndBodyTag_Error(t *testing.T) {
unittest.SmallTest(t)
html := `
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>Hello, world!</p>
<body>
</html>
`
_, err := insertAssets(strings.NewReader(html), jsPath, cssPath, "" /* =nonce */)
assert.EqualError(t, err, "no </body> tag found")
}