// Copyright 2018 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 livereloadinject
import (
"bytes"
"io"
"net/url"
"strings"
"testing"
qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/transform"
)
func TestLiveReloadInject(t *testing.T) {
c := qt.New(t)
lrurl, err := url.Parse("http://localhost:1234/subpath")
if err != nil {
t.Errorf("Parsing test URL failed")
return
}
expectBase := ``
apply := func(s string) string {
out := new(bytes.Buffer)
in := strings.NewReader(s)
tr := transform.New(New(lrurl))
tr.Apply(out, in)
return out.String()
}
c.Run("Inject after head tag", func(c *qt.C) {
c.Assert(apply("
after"), qt.Equals, ""+expectBase+"after")
})
c.Run("Inject after head tag when doctype and html omitted", func(c *qt.C) {
c.Assert(apply("after"), qt.Equals, ""+expectBase+"after")
})
c.Run("Inject after html when head omitted", func(c *qt.C) {
c.Assert(apply("after"), qt.Equals, ""+expectBase+"after")
})
c.Run("Inject after doctype when head and html omitted", func(c *qt.C) {
c.Assert(apply("after"), qt.Equals, ""+expectBase+"after")
})
c.Run("Inject before other elements if all else omitted", func(c *qt.C) {
c.Assert(apply("after"), qt.Equals, expectBase+"after")
})
c.Run("Inject before text content if all else omitted", func(c *qt.C) {
c.Assert(apply("after"), qt.Equals, expectBase+"after")
})
c.Run("Inject after HeAd tag MiXed CaSe", func(c *qt.C) {
c.Assert(apply("AfTer"), qt.Equals, ""+expectBase+"AfTer")
})
c.Run("Inject after HtMl tag MiXed CaSe", func(c *qt.C) {
c.Assert(apply("AfTer"), qt.Equals, ""+expectBase+"AfTer")
})
c.Run("Inject after doctype mixed case", func(c *qt.C) {
c.Assert(apply("AfTer"), qt.Equals, ""+expectBase+"AfTer")
})
c.Run("Inject after html tag with attributes", func(c *qt.C) {
c.Assert(apply(`after`), qt.Equals, ``+expectBase+"after")
})
c.Run("Inject after html tag with newline", func(c *qt.C) {
c.Assert(apply("after"), qt.Equals, ""+expectBase+"after")
})
c.Run("Skip comments and whitespace", func(c *qt.C) {
c.Assert(
apply(" \n after"),
qt.Equals,
" \n "+expectBase+"after",
)
})
c.Run("Do not search inside comment", func(c *qt.C) {
c.Assert(apply(""), qt.Equals, ""+expectBase)
})
c.Run("Do not search inside scripts", func(c *qt.C) {
c.Assert(apply(""), qt.Equals, ""+expectBase+"")
})
c.Run("Do not search inside templates", func(c *qt.C) {
c.Assert(apply(""), qt.Not(qt.Equals), ""+expectBase+"")
})
c.Run("Search from the start of the input", func(c *qt.C) {
c.Assert(apply("after"), qt.Equals, ""+expectBase+"after")
})
c.Run("Do not mistake header for head", func(c *qt.C) {
c.Assert(apply(""), qt.Equals, ""+expectBase+"")
})
c.Run("Do not mistake custom elements for head", func(c *qt.C) {
c.Assert(apply(""), qt.Equals, ""+expectBase+"")
})
}
func BenchmarkLiveReloadInject(b *testing.B) {
s := `
`
in := strings.NewReader(s)
lrurl, err := url.Parse("http://localhost:1234/subpath")
if err != nil {
b.Fatalf("Parsing test URL failed")
}
tr := transform.New(New(lrurl))
b.ResetTimer()
for i := 0; i < b.N; i++ {
in.Seek(0, 0)
tr.Apply(io.Discard, in)
}
}