Added path and urlBuilder to gsp dsl.
This commit is contained in:
parent
3b8cf46260
commit
0371d41ccc
@ -20,13 +20,16 @@ class EmbeddablePart {
|
|||||||
|
|
||||||
private final Collection<Part> allParts
|
private final Collection<Part> allParts
|
||||||
|
|
||||||
|
private final String path
|
||||||
|
|
||||||
String render(Map binding = [:]) {
|
String render(Map binding = [:]) {
|
||||||
def result = part.type.renderer.render(
|
def result = part.type.renderer.render(
|
||||||
this.part,
|
this.part,
|
||||||
binding,
|
binding,
|
||||||
this.globals,
|
this.globals,
|
||||||
this.text,
|
this.text,
|
||||||
this.allParts
|
this.allParts,
|
||||||
|
this.path
|
||||||
)
|
)
|
||||||
if (result.v1.size() > 0) {
|
if (result.v1.size() > 0) {
|
||||||
this.onDiagnostics.call(result.v1)
|
this.onDiagnostics.call(result.v1)
|
||||||
|
@ -14,13 +14,14 @@ class EmbeddablePartsMap {
|
|||||||
Collection<Part> parts,
|
Collection<Part> parts,
|
||||||
Map globals,
|
Map globals,
|
||||||
Closure onDiagnostics,
|
Closure onDiagnostics,
|
||||||
@Nullable EmbeddableText text = null
|
@Nullable EmbeddableText text = null,
|
||||||
|
String path
|
||||||
) {
|
) {
|
||||||
Objects.requireNonNull(parts)
|
Objects.requireNonNull(parts)
|
||||||
Objects.requireNonNull(globals)
|
Objects.requireNonNull(globals)
|
||||||
Objects.requireNonNull(onDiagnostics)
|
Objects.requireNonNull(onDiagnostics)
|
||||||
parts.each {
|
parts.each {
|
||||||
this.put(it.path, new EmbeddablePart(it, globals, onDiagnostics, text, parts))
|
this.put(it.path, new EmbeddablePart(it, globals, onDiagnostics, text, parts, path))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package com.jessebrault.ssg.part
|
|||||||
import com.jessebrault.ssg.Diagnostic
|
import com.jessebrault.ssg.Diagnostic
|
||||||
import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder
|
import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder
|
||||||
import com.jessebrault.ssg.text.EmbeddableText
|
import com.jessebrault.ssg.text.EmbeddableText
|
||||||
|
import com.jessebrault.ssg.url.PathBasedUrlBuilder
|
||||||
import groovy.text.GStringTemplateEngine
|
import groovy.text.GStringTemplateEngine
|
||||||
import groovy.text.TemplateEngine
|
import groovy.text.TemplateEngine
|
||||||
import groovy.transform.EqualsAndHashCode
|
import groovy.transform.EqualsAndHashCode
|
||||||
@ -19,20 +20,24 @@ class GspPartRenderer implements PartRenderer {
|
|||||||
Map binding,
|
Map binding,
|
||||||
Map globals,
|
Map globals,
|
||||||
@Nullable EmbeddableText text = null,
|
@Nullable EmbeddableText text = null,
|
||||||
Collection<Part> allParts
|
Collection<Part> allParts,
|
||||||
|
String path
|
||||||
) {
|
) {
|
||||||
Objects.requireNonNull(part)
|
Objects.requireNonNull(part)
|
||||||
Objects.requireNonNull(binding)
|
Objects.requireNonNull(binding)
|
||||||
Objects.requireNonNull(globals)
|
Objects.requireNonNull(globals)
|
||||||
Objects.requireNonNull(allParts)
|
Objects.requireNonNull(allParts)
|
||||||
|
Objects.requireNonNull(path)
|
||||||
def embeddedPartDiagnostics = []
|
def embeddedPartDiagnostics = []
|
||||||
try {
|
try {
|
||||||
def result = engine.createTemplate(part.text).make([
|
def result = engine.createTemplate(part.text).make([
|
||||||
binding: binding,
|
binding: binding,
|
||||||
globals: globals,
|
globals: globals,
|
||||||
parts: new EmbeddablePartsMap(allParts, globals, embeddedPartDiagnostics.&addAll, text),
|
parts: new EmbeddablePartsMap(allParts, globals, embeddedPartDiagnostics.&addAll, text, path),
|
||||||
|
path: path,
|
||||||
tagBuilder: new DynamicTagBuilder(),
|
tagBuilder: new DynamicTagBuilder(),
|
||||||
text: text
|
text: text,
|
||||||
|
urlBuilder: new PathBasedUrlBuilder(path)
|
||||||
])
|
])
|
||||||
new Tuple2<>([], result.toString())
|
new Tuple2<>([], result.toString())
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -11,7 +11,8 @@ interface PartRenderer {
|
|||||||
Map binding,
|
Map binding,
|
||||||
Map globals,
|
Map globals,
|
||||||
@Nullable EmbeddableText text,
|
@Nullable EmbeddableText text,
|
||||||
Collection<Part> allParts
|
Collection<Part> allParts,
|
||||||
|
String path
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import com.jessebrault.ssg.part.EmbeddablePartsMap
|
|||||||
import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder
|
import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder
|
||||||
import com.jessebrault.ssg.text.EmbeddableTextsCollection
|
import com.jessebrault.ssg.text.EmbeddableTextsCollection
|
||||||
import com.jessebrault.ssg.text.Text
|
import com.jessebrault.ssg.text.Text
|
||||||
|
import com.jessebrault.ssg.url.PathBasedUrlBuilder
|
||||||
import groovy.text.GStringTemplateEngine
|
import groovy.text.GStringTemplateEngine
|
||||||
import groovy.text.TemplateEngine
|
import groovy.text.TemplateEngine
|
||||||
import groovy.transform.EqualsAndHashCode
|
import groovy.transform.EqualsAndHashCode
|
||||||
@ -18,18 +19,23 @@ class GspSpecialPageRenderer implements SpecialPageRenderer {
|
|||||||
private static final TemplateEngine engine = new GStringTemplateEngine()
|
private static final TemplateEngine engine = new GStringTemplateEngine()
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
Tuple2<Collection<Diagnostic>, String> render(SpecialPage specialPage, Collection<Text> texts, Collection<Part> parts, Map globals) {
|
Tuple2<Collection<Diagnostic>, String> render(
|
||||||
|
SpecialPage specialPage,
|
||||||
|
Collection<Text> texts,
|
||||||
|
Collection<Part> parts,
|
||||||
|
Map globals
|
||||||
|
) {
|
||||||
try {
|
try {
|
||||||
Collection<Diagnostic> diagnostics = []
|
Collection<Diagnostic> diagnostics = []
|
||||||
def result = engine.createTemplate(specialPage.text).make([
|
def result = engine.createTemplate(specialPage.text).make([
|
||||||
globals: globals,
|
globals: globals,
|
||||||
parts: new EmbeddablePartsMap(parts, globals, { Collection<Diagnostic> partDiagnostics ->
|
parts: new EmbeddablePartsMap(parts, globals, diagnostics.&addAll, specialPage.path),
|
||||||
diagnostics.addAll(partDiagnostics)
|
path: specialPage.path,
|
||||||
}),
|
|
||||||
tagBuilder: new DynamicTagBuilder(),
|
tagBuilder: new DynamicTagBuilder(),
|
||||||
texts: new EmbeddableTextsCollection(texts, globals, { Collection<Diagnostic> textDiagnostics ->
|
texts: new EmbeddableTextsCollection(texts, globals, { Collection<Diagnostic> textDiagnostics ->
|
||||||
diagnostics.addAll(textDiagnostics)
|
diagnostics.addAll(textDiagnostics)
|
||||||
})
|
}),
|
||||||
|
urlBuilder: new PathBasedUrlBuilder(specialPage.path)
|
||||||
])
|
])
|
||||||
new Tuple2<>(diagnostics, result.toString())
|
new Tuple2<>(diagnostics, result.toString())
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -7,6 +7,7 @@ import com.jessebrault.ssg.tagbuilder.DynamicTagBuilder
|
|||||||
import com.jessebrault.ssg.text.EmbeddableText
|
import com.jessebrault.ssg.text.EmbeddableText
|
||||||
import com.jessebrault.ssg.text.FrontMatter
|
import com.jessebrault.ssg.text.FrontMatter
|
||||||
import com.jessebrault.ssg.text.Text
|
import com.jessebrault.ssg.text.Text
|
||||||
|
import com.jessebrault.ssg.url.PathBasedUrlBuilder
|
||||||
import groovy.text.GStringTemplateEngine
|
import groovy.text.GStringTemplateEngine
|
||||||
import groovy.text.TemplateEngine
|
import groovy.text.TemplateEngine
|
||||||
import groovy.transform.EqualsAndHashCode
|
import groovy.transform.EqualsAndHashCode
|
||||||
@ -36,9 +37,11 @@ class GspTemplateRenderer implements TemplateRenderer {
|
|||||||
def result = engine.createTemplate(template.text).make([
|
def result = engine.createTemplate(template.text).make([
|
||||||
frontMatter: frontMatter,
|
frontMatter: frontMatter,
|
||||||
globals: globals,
|
globals: globals,
|
||||||
parts: new EmbeddablePartsMap(parts, globals, onDiagnostics, embeddableText),
|
parts: new EmbeddablePartsMap(parts, globals, onDiagnostics, embeddableText, text.path),
|
||||||
|
path: text.path,
|
||||||
tagBuilder: new DynamicTagBuilder(),
|
tagBuilder: new DynamicTagBuilder(),
|
||||||
text: embeddableText
|
text: embeddableText,
|
||||||
|
urlBuilder: new PathBasedUrlBuilder(text.path)
|
||||||
])
|
])
|
||||||
new Tuple2<>(diagnostics, result.toString())
|
new Tuple2<>(diagnostics, result.toString())
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.jessebrault.ssg.url
|
||||||
|
|
||||||
|
import java.nio.file.Path
|
||||||
|
|
||||||
|
class PathBasedUrlBuilder implements UrlBuilder {
|
||||||
|
|
||||||
|
private final Path fromDirectory
|
||||||
|
|
||||||
|
PathBasedUrlBuilder(String fromFile) {
|
||||||
|
def fromFilePath = Path.of(fromFile)
|
||||||
|
if (fromFilePath.parent) {
|
||||||
|
this.fromDirectory = fromFilePath.parent
|
||||||
|
} else {
|
||||||
|
this.fromDirectory = Path.of('')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
String relative(String to) {
|
||||||
|
this.fromDirectory.relativize(Path.of(to)).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.jessebrault.ssg.url
|
||||||
|
|
||||||
|
interface UrlBuilder {
|
||||||
|
String relative(String to)
|
||||||
|
}
|
@ -1,35 +1,22 @@
|
|||||||
package com.jessebrault.ssg.part
|
package com.jessebrault.ssg.part
|
||||||
|
|
||||||
import com.jessebrault.ssg.Diagnostic
|
import com.jessebrault.ssg.text.EmbeddableText
|
||||||
import com.jessebrault.ssg.text.*
|
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
import static com.jessebrault.ssg.testutil.DiagnosticsUtil.assertEmptyDiagnostics
|
||||||
import static com.jessebrault.ssg.testutil.DiagnosticsUtil.getDiagnosticsMessageSupplier
|
import static com.jessebrault.ssg.testutil.DiagnosticsUtil.getDiagnosticsMessageSupplier
|
||||||
|
import static com.jessebrault.ssg.text.TextMocks.renderableText
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals
|
import static org.junit.jupiter.api.Assertions.assertEquals
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue
|
import static org.junit.jupiter.api.Assertions.assertTrue
|
||||||
import static org.mockito.ArgumentMatchers.any
|
|
||||||
import static org.mockito.Mockito.mock
|
|
||||||
import static org.mockito.Mockito.when
|
|
||||||
|
|
||||||
class GspPartRendererTests {
|
class GspPartRendererTests {
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: move to a fixture
|
|
||||||
*/
|
|
||||||
private static Text mockRenderableText(String text) {
|
|
||||||
def textRenderer = mock(TextRenderer)
|
|
||||||
when(textRenderer.render(any(), any())).thenReturn(new Tuple2<>([], text))
|
|
||||||
def frontMatterGetter = mock(FrontMatterGetter)
|
|
||||||
def excerptGetter = mock(ExcerptGetter)
|
|
||||||
new Text('', '', new TextType([], textRenderer, frontMatterGetter, excerptGetter))
|
|
||||||
}
|
|
||||||
|
|
||||||
private final PartRenderer renderer = new GspPartRenderer()
|
private final PartRenderer renderer = new GspPartRenderer()
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void rendersWithNoBindingOrGlobals() {
|
void rendersWithNoBindingOrGlobals() {
|
||||||
def part = new Part('', null, 'Hello, World!')
|
def part = new Part('', null, 'Hello, World!')
|
||||||
def r = this.renderer.render(part, [:], [:], null, [part])
|
def r = this.renderer.render(part, [:], [:], null, [part], '')
|
||||||
assertTrue(r.v1.size() == 0)
|
assertTrue(r.v1.size() == 0)
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
@ -42,7 +29,8 @@ class GspPartRendererTests {
|
|||||||
[greeting: 'Hello, World!'],
|
[greeting: 'Hello, World!'],
|
||||||
[:],
|
[:],
|
||||||
null,
|
null,
|
||||||
[part]
|
[part],
|
||||||
|
''
|
||||||
)
|
)
|
||||||
assertTrue(r.v1.size() == 0)
|
assertTrue(r.v1.size() == 0)
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
@ -56,7 +44,8 @@ class GspPartRendererTests {
|
|||||||
[:],
|
[:],
|
||||||
[greeting: 'Hello, World!'],
|
[greeting: 'Hello, World!'],
|
||||||
null,
|
null,
|
||||||
[part]
|
[part],
|
||||||
|
''
|
||||||
)
|
)
|
||||||
assertTrue(r.v1.size() == 0)
|
assertTrue(r.v1.size() == 0)
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
@ -70,12 +59,9 @@ class GspPartRendererTests {
|
|||||||
part,
|
part,
|
||||||
[:],
|
[:],
|
||||||
[:],
|
[:],
|
||||||
new EmbeddableText(
|
new EmbeddableText(renderableText('Hello, World!'), [:], textDiagnostics.&addAll),
|
||||||
mockRenderableText('Hello, World!'),
|
[part],
|
||||||
[:],
|
''
|
||||||
{ Collection<Diagnostic> diagnostics -> textDiagnostics.addAll(diagnostics) }
|
|
||||||
),
|
|
||||||
[part]
|
|
||||||
)
|
)
|
||||||
assertTrue(textDiagnostics.isEmpty())
|
assertTrue(textDiagnostics.isEmpty())
|
||||||
assertTrue(r.v1.isEmpty())
|
assertTrue(r.v1.isEmpty())
|
||||||
@ -85,7 +71,7 @@ class GspPartRendererTests {
|
|||||||
@Test
|
@Test
|
||||||
void tagBuilderAvailable() {
|
void tagBuilderAvailable() {
|
||||||
def part = new Part('', null, '<%= tagBuilder.test() %>')
|
def part = new Part('', null, '<%= tagBuilder.test() %>')
|
||||||
def r = this.renderer.render(part, [:], [:], null, [part])
|
def r = this.renderer.render(part, [:], [:], null, [part], '')
|
||||||
assertTrue(r.v1.isEmpty())
|
assertTrue(r.v1.isEmpty())
|
||||||
assertEquals('<test />', r.v2)
|
assertEquals('<test />', r.v2)
|
||||||
}
|
}
|
||||||
@ -95,9 +81,39 @@ class GspPartRendererTests {
|
|||||||
def partType = new PartType(['.gsp'], this.renderer)
|
def partType = new PartType(['.gsp'], this.renderer)
|
||||||
def part0 = new Part('part0.gsp', partType, '<%= parts["part1.gsp"].render() %>')
|
def part0 = new Part('part0.gsp', partType, '<%= parts["part1.gsp"].render() %>')
|
||||||
def part1 = new Part('part1.gsp', partType, 'Hello, World!')
|
def part1 = new Part('part1.gsp', partType, 'Hello, World!')
|
||||||
def r = this.renderer.render(part0, [:], [:], null, [part0, part1])
|
def r = this.renderer.render(part0, [:], [:], null, [part0, part1], '')
|
||||||
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void pathAvailableIfPresent() {
|
||||||
|
def part = new Part('', null, '<%= path %>')
|
||||||
|
def r = this.renderer.render(
|
||||||
|
part,
|
||||||
|
[:],
|
||||||
|
[:],
|
||||||
|
null,
|
||||||
|
[part],
|
||||||
|
'test.md'
|
||||||
|
)
|
||||||
|
assertEmptyDiagnostics(r)
|
||||||
|
assertEquals('test.md', r.v2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void urlBuilderAvailable() {
|
||||||
|
def part = new Part('', null, '<%= urlBuilder.relative("images/test.jpg") %>')
|
||||||
|
def r = this.renderer.render(
|
||||||
|
part,
|
||||||
|
[:],
|
||||||
|
[:],
|
||||||
|
null,
|
||||||
|
[part],
|
||||||
|
'test.md'
|
||||||
|
)
|
||||||
|
assertEmptyDiagnostics(r)
|
||||||
|
assertEquals('images/test.jpg', r.v2)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@ import org.junit.jupiter.api.extension.ExtendWith
|
|||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
import org.mockito.junit.jupiter.MockitoExtension
|
import org.mockito.junit.jupiter.MockitoExtension
|
||||||
|
|
||||||
|
import static com.jessebrault.ssg.testutil.DiagnosticsUtil.assertEmptyDiagnostics
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals
|
import static org.junit.jupiter.api.Assertions.assertEquals
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue
|
|
||||||
import static org.mockito.ArgumentMatchers.any
|
import static org.mockito.ArgumentMatchers.any
|
||||||
import static org.mockito.ArgumentMatchers.argThat
|
import static org.mockito.ArgumentMatchers.argThat
|
||||||
import static org.mockito.Mockito.when
|
import static org.mockito.Mockito.when
|
||||||
@ -22,39 +22,41 @@ class GspSpecialPageRendererTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void rendersGlobal() {
|
void rendersGlobal() {
|
||||||
def specialPage = new SpecialPage("<%= globals['greeting'] %>", null, null)
|
def specialPage = new SpecialPage("<%= globals['greeting'] %>", 'test.gsp', null)
|
||||||
def globals = [greeting: 'Hello, World!']
|
def globals = [greeting: 'Hello, World!']
|
||||||
def r = this.renderer.render(specialPage, [], [], globals)
|
def r = this.renderer.render(specialPage, [], [], globals)
|
||||||
assertTrue(r.v1.size() == 0)
|
assertEmptyDiagnostics(r)
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void rendersPartWithNoBinding(@Mock PartRenderer partRenderer) {
|
void rendersPartWithNoBinding(@Mock PartRenderer partRenderer) {
|
||||||
when(partRenderer.render(any(), any(), any(), any())).thenReturn(new Tuple2<>([], 'Hello, World!'))
|
when(partRenderer.render(any(), any(), any(), any(), any(), any()))
|
||||||
|
.thenReturn(new Tuple2<>([], 'Hello, World!'))
|
||||||
def partType = new PartType([], partRenderer)
|
def partType = new PartType([], partRenderer)
|
||||||
def part = new Part('test', partType , '')
|
def part = new Part('test', partType , '')
|
||||||
|
|
||||||
def specialPage = new SpecialPage("<%= parts['test'].render() %>", null, null)
|
def specialPage = new SpecialPage("<%= parts['test'].render() %>", 'test.gsp', null)
|
||||||
def r = this.renderer.render(specialPage, [], [part], [:])
|
def r = this.renderer.render(specialPage, [], [part], [:])
|
||||||
assertTrue(r.v1.size() == 0)
|
assertEmptyDiagnostics(r)
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void rendersPartWithBinding(@Mock PartRenderer partRenderer) {
|
void rendersPartWithBinding(@Mock PartRenderer partRenderer) {
|
||||||
when(partRenderer.render(any(), argThat { Map m -> m.get('greeting') == 'Hello, World!'}, any(), any()))
|
when(partRenderer.render(
|
||||||
.thenReturn(new Tuple2<>([], 'Hello, World!'))
|
any(), argThat { Map m -> m.get('greeting') == 'Hello, World!'}, any(), any(), any(), any()
|
||||||
|
)).thenReturn(new Tuple2<>([], 'Hello, World!'))
|
||||||
def partType = new PartType([], partRenderer)
|
def partType = new PartType([], partRenderer)
|
||||||
def part = new Part('test', partType, '')
|
def part = new Part('test', partType, '')
|
||||||
|
|
||||||
def specialPage = new SpecialPage(
|
def specialPage = new SpecialPage(
|
||||||
"<%= parts['test'].render([greeting: 'Hello, World!'])",
|
"<%= parts['test'].render([greeting: 'Hello, World!'])",
|
||||||
null,
|
'test.gsp',
|
||||||
null
|
null
|
||||||
)
|
)
|
||||||
def r = this.renderer.render(specialPage, [], [part], [:])
|
def r = this.renderer.render(specialPage, [], [part], [:])
|
||||||
assertTrue(r.v1.size() == 0)
|
assertEmptyDiagnostics(r)
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,20 +69,40 @@ class GspSpecialPageRendererTests {
|
|||||||
|
|
||||||
def specialPage = new SpecialPage(
|
def specialPage = new SpecialPage(
|
||||||
"<%= texts.find { it.path == 'test' }.render() %>",
|
"<%= texts.find { it.path == 'test' }.render() %>",
|
||||||
null,
|
'test.gsp',
|
||||||
null
|
null
|
||||||
)
|
)
|
||||||
def r = this.renderer.render(specialPage, [text], [], [:])
|
def r = this.renderer.render(specialPage, [text], [], [:])
|
||||||
assertTrue(r.v1.size() == 0)
|
assertEmptyDiagnostics(r)
|
||||||
assertEquals('<p><strong>Hello, World!</strong></p>\n', r.v2)
|
assertEquals('<p><strong>Hello, World!</strong></p>\n', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void tagBuilderAvailable() {
|
void tagBuilderAvailable() {
|
||||||
def specialPage = new SpecialPage('<%= tagBuilder.test() %>', null, null)
|
def specialPage = new SpecialPage('<%= tagBuilder.test() %>', 'test.gsp', null)
|
||||||
def r = this.renderer.render(specialPage, [], [], [:])
|
def r = this.renderer.render(specialPage, [], [], [:])
|
||||||
assertTrue(r.v1.isEmpty())
|
assertEmptyDiagnostics(r)
|
||||||
assertEquals('<test />', r.v2)
|
assertEquals('<test />', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void pathAvailable() {
|
||||||
|
def specialPage = new SpecialPage('<%= path %>', 'test.gsp', null)
|
||||||
|
def r = this.renderer.render(specialPage, [], [], [:])
|
||||||
|
assertEmptyDiagnostics(r)
|
||||||
|
assertEquals('test.gsp', r.v2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void urlBuilderAvailable() {
|
||||||
|
def specialPage = new SpecialPage(
|
||||||
|
'<%= urlBuilder.relative("images/test.jpg") %>',
|
||||||
|
'test.gsp',
|
||||||
|
null
|
||||||
|
)
|
||||||
|
def r = this.renderer.render(specialPage, [], [], [:])
|
||||||
|
assertEmptyDiagnostics(r)
|
||||||
|
assertEquals('images/test.jpg', r.v2)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,48 +3,23 @@ package com.jessebrault.ssg.template
|
|||||||
import com.jessebrault.ssg.part.Part
|
import com.jessebrault.ssg.part.Part
|
||||||
import com.jessebrault.ssg.part.PartRenderer
|
import com.jessebrault.ssg.part.PartRenderer
|
||||||
import com.jessebrault.ssg.part.PartType
|
import com.jessebrault.ssg.part.PartType
|
||||||
import com.jessebrault.ssg.text.ExcerptGetter
|
|
||||||
import com.jessebrault.ssg.text.FrontMatter
|
import com.jessebrault.ssg.text.FrontMatter
|
||||||
import com.jessebrault.ssg.text.FrontMatterGetter
|
|
||||||
import com.jessebrault.ssg.text.Text
|
|
||||||
import com.jessebrault.ssg.text.TextRenderer
|
|
||||||
import com.jessebrault.ssg.text.TextType
|
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.junit.jupiter.api.extension.ExtendWith
|
import org.junit.jupiter.api.extension.ExtendWith
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
import org.mockito.junit.jupiter.MockitoExtension
|
import org.mockito.junit.jupiter.MockitoExtension
|
||||||
|
|
||||||
|
import static com.jessebrault.ssg.testutil.DiagnosticsUtil.getDiagnosticsMessageSupplier
|
||||||
|
import static com.jessebrault.ssg.text.TextMocks.*
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals
|
import static org.junit.jupiter.api.Assertions.assertEquals
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue
|
import static org.junit.jupiter.api.Assertions.assertTrue
|
||||||
import static org.mockito.ArgumentMatchers.any
|
import static org.mockito.ArgumentMatchers.any
|
||||||
import static org.mockito.ArgumentMatchers.argThat
|
import static org.mockito.ArgumentMatchers.argThat
|
||||||
import static org.mockito.Mockito.mock
|
|
||||||
import static org.mockito.Mockito.when
|
import static org.mockito.Mockito.when
|
||||||
|
|
||||||
@ExtendWith(MockitoExtension)
|
@ExtendWith(MockitoExtension)
|
||||||
class GspTemplateRendererTests {
|
class GspTemplateRendererTests {
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: move to a fixture
|
|
||||||
*/
|
|
||||||
private static Text mockBlankText() {
|
|
||||||
def textRenderer = mock(TextRenderer)
|
|
||||||
def frontMatterGetter = mock(FrontMatterGetter)
|
|
||||||
def excerptGetter = mock(ExcerptGetter)
|
|
||||||
new Text('', '', new TextType([], textRenderer, frontMatterGetter, excerptGetter))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: move to a fixture
|
|
||||||
*/
|
|
||||||
private static Text mockRenderableText(String text) {
|
|
||||||
def textRenderer = mock(TextRenderer)
|
|
||||||
when(textRenderer.render(any(), any())).thenReturn(new Tuple2<>([], text))
|
|
||||||
def frontMatterGetter = mock(FrontMatterGetter)
|
|
||||||
def excerptGetter = mock(ExcerptGetter)
|
|
||||||
new Text('', '', new TextType([], textRenderer, frontMatterGetter, excerptGetter))
|
|
||||||
}
|
|
||||||
|
|
||||||
private final TemplateRenderer renderer = new GspTemplateRenderer()
|
private final TemplateRenderer renderer = new GspTemplateRenderer()
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -55,18 +30,19 @@ class GspTemplateRendererTests {
|
|||||||
null
|
null
|
||||||
)
|
)
|
||||||
|
|
||||||
when(partRenderer.render(any(), any(), any(), any())).thenReturn(new Tuple2<>([], 'Hello, World!'))
|
when(partRenderer.render(any(), any(), any(), any(), any(), any()))
|
||||||
|
.thenReturn(new Tuple2<>([], 'Hello, World!'))
|
||||||
def partType = new PartType([], partRenderer)
|
def partType = new PartType([], partRenderer)
|
||||||
def part = new Part('test', partType, null)
|
def part = new Part('test', partType, null)
|
||||||
|
|
||||||
def r = this.renderer.render(
|
def r = this.renderer.render(
|
||||||
template,
|
template,
|
||||||
new FrontMatter(null, [:]),
|
new FrontMatter(null, [:]),
|
||||||
mockBlankText(),
|
blankText(),
|
||||||
[part],
|
[part],
|
||||||
[:]
|
[:]
|
||||||
)
|
)
|
||||||
assertTrue(r.v1.size() == 0)
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +54,7 @@ class GspTemplateRendererTests {
|
|||||||
null
|
null
|
||||||
)
|
)
|
||||||
|
|
||||||
when(partRenderer.render(any(), argThat { Map m -> m.get('person') == 'World' }, any(), any()))
|
when(partRenderer.render(any(), argThat { Map m -> m.get('person') == 'World' }, any(), any(), any(), any()))
|
||||||
.thenReturn(new Tuple2<>([], 'Hello, World!'))
|
.thenReturn(new Tuple2<>([], 'Hello, World!'))
|
||||||
def partType = new PartType([], partRenderer)
|
def partType = new PartType([], partRenderer)
|
||||||
def part = new Part('greeting', partType, null)
|
def part = new Part('greeting', partType, null)
|
||||||
@ -86,11 +62,11 @@ class GspTemplateRendererTests {
|
|||||||
def r = this.renderer.render(
|
def r = this.renderer.render(
|
||||||
template,
|
template,
|
||||||
new FrontMatter(null, [:]),
|
new FrontMatter(null, [:]),
|
||||||
mockBlankText(),
|
blankText(),
|
||||||
[part],
|
[part],
|
||||||
[:]
|
[:]
|
||||||
)
|
)
|
||||||
assertTrue(r.v1.size() == 0)
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,11 +76,11 @@ class GspTemplateRendererTests {
|
|||||||
def r = this.renderer.render(
|
def r = this.renderer.render(
|
||||||
template,
|
template,
|
||||||
new FrontMatter(null, [title: ['Hello!']]),
|
new FrontMatter(null, [title: ['Hello!']]),
|
||||||
mockBlankText(),
|
blankText(),
|
||||||
[],
|
[],
|
||||||
[:]
|
[:]
|
||||||
)
|
)
|
||||||
assertTrue(r.v1.size() == 0)
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
assertEquals('Hello!', r.v2)
|
assertEquals('Hello!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,11 +90,11 @@ class GspTemplateRendererTests {
|
|||||||
def r = this.renderer.render(
|
def r = this.renderer.render(
|
||||||
template,
|
template,
|
||||||
new FrontMatter(null, [:]),
|
new FrontMatter(null, [:]),
|
||||||
mockBlankText(),
|
blankText(),
|
||||||
[],
|
[],
|
||||||
[test: 'Hello, World!']
|
[test: 'Hello, World!']
|
||||||
)
|
)
|
||||||
assertTrue(r.v1.size() == 0)
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,11 +104,11 @@ class GspTemplateRendererTests {
|
|||||||
def r = this.renderer.render(
|
def r = this.renderer.render(
|
||||||
template,
|
template,
|
||||||
new FrontMatter(null, [:]),
|
new FrontMatter(null, [:]),
|
||||||
mockRenderableText('Hello, World!'),
|
renderableText('Hello, World!'),
|
||||||
[],
|
[],
|
||||||
[:]
|
[:]
|
||||||
)
|
)
|
||||||
assertTrue(r.v1.size() == 0)
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
assertEquals('Hello, World!', r.v2)
|
assertEquals('Hello, World!', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,12 +118,40 @@ class GspTemplateRendererTests {
|
|||||||
def r = this.renderer.render(
|
def r = this.renderer.render(
|
||||||
template,
|
template,
|
||||||
new FrontMatter(null, [:]),
|
new FrontMatter(null, [:]),
|
||||||
mockBlankText(),
|
blankText(),
|
||||||
[],
|
[],
|
||||||
[:]
|
[:]
|
||||||
)
|
)
|
||||||
assertTrue(r.v1.isEmpty())
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
assertEquals('<test />', r.v2)
|
assertEquals('<test />', r.v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void pathAvailable() {
|
||||||
|
def template = new Template('<%= path %>', null, null)
|
||||||
|
def r = this.renderer.render(
|
||||||
|
template,
|
||||||
|
new FrontMatter(null, [:]),
|
||||||
|
textWithPath('test.md'),
|
||||||
|
[],
|
||||||
|
[:]
|
||||||
|
)
|
||||||
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
|
assertEquals('test.md', r.v2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void urlBuilderAvailable() {
|
||||||
|
def template = new Template('<%= urlBuilder.relative("images/test.jpg") %>', null, null)
|
||||||
|
def r = this.renderer.render(
|
||||||
|
template,
|
||||||
|
new FrontMatter(null, [:]),
|
||||||
|
textWithPath('test.md'),
|
||||||
|
[],
|
||||||
|
[:]
|
||||||
|
)
|
||||||
|
assertTrue(r.v1.isEmpty(), getDiagnosticsMessageSupplier(r.v1))
|
||||||
|
assertEquals('images/test.jpg', r.v2)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.jessebrault.ssg.url
|
||||||
|
|
||||||
|
class PathBasedUrlBuilderTests extends AbstractUrlBuilderTests {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected UrlBuilder getUrlBuilder(String fromFile) {
|
||||||
|
new PathBasedUrlBuilder(fromFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -2,6 +2,8 @@ package com.jessebrault.ssg.testutil
|
|||||||
|
|
||||||
import com.jessebrault.ssg.Diagnostic
|
import com.jessebrault.ssg.Diagnostic
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue
|
||||||
|
|
||||||
class DiagnosticsUtil {
|
class DiagnosticsUtil {
|
||||||
|
|
||||||
static Closure<String> getDiagnosticsMessageSupplier(Collection<Diagnostic> diagnostics) {
|
static Closure<String> getDiagnosticsMessageSupplier(Collection<Diagnostic> diagnostics) {
|
||||||
@ -15,4 +17,8 @@ class DiagnosticsUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void assertEmptyDiagnostics(Tuple2<Collection<Diagnostic>, ?> result) {
|
||||||
|
assertTrue(result.v1.isEmpty(), getDiagnosticsMessageSupplier(result.v1))
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.jessebrault.ssg.text
|
||||||
|
|
||||||
|
import com.jessebrault.ssg.text.ExcerptGetter
|
||||||
|
import com.jessebrault.ssg.text.FrontMatterGetter
|
||||||
|
import com.jessebrault.ssg.text.Text
|
||||||
|
import com.jessebrault.ssg.text.TextRenderer
|
||||||
|
import com.jessebrault.ssg.text.TextType
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any
|
||||||
|
import static org.mockito.Mockito.mock
|
||||||
|
import static org.mockito.Mockito.when
|
||||||
|
|
||||||
|
class TextMocks {
|
||||||
|
|
||||||
|
static Text blankText() {
|
||||||
|
def textRenderer = mock(TextRenderer)
|
||||||
|
def frontMatterGetter = mock(FrontMatterGetter)
|
||||||
|
def excerptGetter = mock(ExcerptGetter)
|
||||||
|
new Text('', '', new TextType([], textRenderer, frontMatterGetter, excerptGetter))
|
||||||
|
}
|
||||||
|
|
||||||
|
static Text renderableText(String text) {
|
||||||
|
def textRenderer = mock(TextRenderer)
|
||||||
|
when(textRenderer.render(any(), any())).thenReturn(new Tuple2<>([], text))
|
||||||
|
def frontMatterGetter = mock(FrontMatterGetter)
|
||||||
|
def excerptGetter = mock(ExcerptGetter)
|
||||||
|
new Text('', '', new TextType([], textRenderer, frontMatterGetter, excerptGetter))
|
||||||
|
}
|
||||||
|
|
||||||
|
static Text textWithPath(String path) {
|
||||||
|
def textRenderer = mock(TextRenderer)
|
||||||
|
def frontMatterGetter = mock(FrontMatterGetter)
|
||||||
|
def excerptGetter = mock(ExcerptGetter)
|
||||||
|
new Text('', path, new TextType([], textRenderer, frontMatterGetter, excerptGetter))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.jessebrault.ssg.url
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals
|
||||||
|
|
||||||
|
abstract class AbstractUrlBuilderTests {
|
||||||
|
|
||||||
|
protected abstract UrlBuilder getUrlBuilder(String fromFile);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void upDownDown() {
|
||||||
|
def builder = this.getUrlBuilder('posts/post.html')
|
||||||
|
assertEquals('../images/test.jpg', builder.relative('images/test.jpg'))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void downDown() {
|
||||||
|
assertEquals(
|
||||||
|
'images/test.jpg',
|
||||||
|
this.getUrlBuilder('test.html').relative('images/test.jpg')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void upUpDownDown() {
|
||||||
|
assertEquals(
|
||||||
|
'../../images/test.jpg',
|
||||||
|
this.getUrlBuilder('posts/old/test.html').relative('images/test.jpg')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user