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")
}
