126 lines
3.4 KiB
Swift
126 lines
3.4 KiB
Swift
import PathKit
|
|
import Spectre
|
|
@testable import Stencil
|
|
import XCTest
|
|
|
|
final class EnvironmentBaseAndChildTemplateTests: XCTestCase {
|
|
private var environment = Environment(loader: ExampleLoader())
|
|
private var childTemplate: Template = ""
|
|
private var baseTemplate: Template = ""
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
|
|
let path = Path(#file as String) + ".." + "fixtures"
|
|
let loader = FileSystemLoader(paths: [path])
|
|
environment = Environment(loader: loader)
|
|
childTemplate = ""
|
|
baseTemplate = ""
|
|
}
|
|
|
|
override func tearDown() {
|
|
super.tearDown()
|
|
}
|
|
|
|
func testSyntaxErrorInBaseTemplate() throws {
|
|
childTemplate = try environment.loadTemplate(name: "invalid-child-super.html")
|
|
baseTemplate = try environment.loadTemplate(name: "invalid-base.html")
|
|
|
|
try expectError(
|
|
reason: "Unknown filter 'unknown'. Found similar filters: 'uppercase'.",
|
|
childToken: "extends \"invalid-base.html\"",
|
|
baseToken: "target|unknown"
|
|
)
|
|
}
|
|
|
|
func testRuntimeErrorInBaseTemplate() throws {
|
|
let filterExtension = Extension()
|
|
filterExtension.registerFilter("unknown") { (_: Any?) in
|
|
throw TemplateSyntaxError("filter error")
|
|
}
|
|
environment.extensions += [filterExtension]
|
|
|
|
childTemplate = try environment.loadTemplate(name: "invalid-child-super.html")
|
|
baseTemplate = try environment.loadTemplate(name: "invalid-base.html")
|
|
|
|
try expectError(
|
|
reason: "filter error",
|
|
childToken: "extends \"invalid-base.html\"",
|
|
baseToken: "target|unknown"
|
|
)
|
|
}
|
|
|
|
func testSyntaxErrorInChildTemplate() throws {
|
|
childTemplate = Template(
|
|
templateString: """
|
|
{% extends "base.html" %}
|
|
{% block body %}Child {{ target|unknown }}{% endblock %}
|
|
""",
|
|
environment: environment,
|
|
name: nil
|
|
)
|
|
|
|
try expectError(
|
|
reason: "Unknown filter 'unknown'. Found similar filters: 'uppercase'.",
|
|
childToken: "target|unknown",
|
|
baseToken: nil
|
|
)
|
|
}
|
|
|
|
func testRuntimeErrorInChildTemplate() throws {
|
|
let filterExtension = Extension()
|
|
filterExtension.registerFilter("unknown") { (_: Any?) in
|
|
throw TemplateSyntaxError("filter error")
|
|
}
|
|
environment.extensions += [filterExtension]
|
|
|
|
childTemplate = Template(
|
|
templateString: """
|
|
{% extends "base.html" %}
|
|
{% block body %}Child {{ target|unknown }}{% endblock %}
|
|
""",
|
|
environment: environment,
|
|
name: nil
|
|
)
|
|
|
|
try expectError(
|
|
reason: "filter error",
|
|
childToken: "target|unknown",
|
|
baseToken: nil
|
|
)
|
|
}
|
|
|
|
private func expectError(
|
|
reason: String,
|
|
childToken: String,
|
|
baseToken: String?,
|
|
file: String = #file,
|
|
line: Int = #line,
|
|
function: String = #function
|
|
) throws {
|
|
var expectedError = expectedSyntaxError(token: childToken, template: childTemplate, description: reason)
|
|
if let baseToken = baseToken {
|
|
expectedError.stackTrace = [
|
|
expectedSyntaxError(
|
|
token: baseToken,
|
|
template: baseTemplate,
|
|
description: reason
|
|
).token
|
|
].compactMap { $0 }
|
|
}
|
|
let error = try expect(
|
|
self.environment.render(template: self.childTemplate, context: ["target": "World"]),
|
|
file: file,
|
|
line: line,
|
|
function: function
|
|
).toThrow() as TemplateSyntaxError
|
|
let reporter = SimpleErrorReporter()
|
|
try expect(
|
|
reporter.renderError(error),
|
|
file: file,
|
|
line: line,
|
|
function: function
|
|
) == reporter.renderError(expectedError)
|
|
}
|
|
}
|