Skip to content

Commit 9dfcf67

Browse files
committed
Add basic SSR tests
1 parent ae4dda2 commit 9dfcf67

6 files changed

Lines changed: 217 additions & 0 deletions

File tree

build.mill

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ object ssr extends ScalaModule {
126126
ivy"org.seleniumhq.selenium:selenium-support:4.33.0",
127127
ivy"org.slf4j:slf4j-api:2.0.17"
128128
)
129+
object test extends ScalaTests with TestModule.Munit {
130+
def ivyDeps = Agg(
131+
ivy"org.scalameta::munit::1.1.0",
132+
ivy"org.jsoup:jsoup:1.21.1",
133+
ivy"org.slf4j:slf4j-simple:2.0.17"
134+
)
135+
}
129136
}
130137

131138
trait CustomJpackageModule extends JpackageModule {

ssr/src/ba/sake/flatmark/ssr/WebDriverHolder.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class WebDriverHolder {
1919
driverLogPrefs.enable(LogType.BROWSER, Level.ALL)
2020
chromeOptions.setCapability("goog:loggingPrefs", driverLogPrefs)
2121
chromeOptions.addArguments("--headless=new")
22+
chromeOptions.setBrowserVersion("138")
2223
val webDriver = new ChromeDriver(chromeOptions)
2324
initialized = true
2425
logger.debug("WebDriver started")
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package ba.sake.flatmark.ssr
2+
3+
import ba.sake.sharaf.undertow.UndertowSharafServer
4+
import ba.sake.sharaf.SharafHandler
5+
import ba.sake.sharaf.utils.NetworkUtils
6+
import org.jsoup.Jsoup
7+
8+
class CodeHighlighterSuite extends munit.FunSuite {
9+
10+
var server: UndertowSharafServer = null
11+
var webDriverHolder: WebDriverHolder = WebDriverHolder()
12+
val port = NetworkUtils.getFreePort()
13+
14+
override def beforeAll(): Unit =
15+
server = UndertowSharafServer("localhost", port, routes)
16+
server.start()
17+
18+
override def afterAll(): Unit =
19+
server.stop()
20+
webDriverHolder.close()
21+
22+
test("highlight scala code") {
23+
val ssr = FlatmarkSsr(s"http://localhost:${port}", webDriverHolder)
24+
val res = ssr.highlight(
25+
"""|object HelloWorld {
26+
| def main(args: Array[String]): Unit = {
27+
| println("Hello, world!")
28+
| }
29+
|}""".stripMargin,
30+
Some("scala")
31+
)
32+
val resHtml = Jsoup.parse(res)
33+
val expectedHtml = Jsoup.parse(
34+
"""<pre> <code class="language-scala hljs" data-highlighted="yes"><span class="hljs-class"><span class="hljs-keyword">object</span> <span class="hljs-title">HelloWorld</span> </span>{
35+
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span></span>(args: <span class="hljs-type">Array</span>[<span class="hljs-type">String</span>]): <span class="hljs-type">Unit</span> = {
36+
println(<span class="hljs-string">"Hello, world!"</span>)
37+
}
38+
}</code>
39+
</pre>"""
40+
)
41+
assertEquals(resHtml.html, expectedHtml.html)
42+
}
43+
44+
// these are sensitive, because of HMTL encoding etc
45+
test("highlight HTML code") {
46+
val ssr = FlatmarkSsr(s"http://localhost:${port}", webDriverHolder)
47+
val res = ssr.highlight(
48+
"""|<!DOCTYPE html>
49+
|<html>
50+
|<head>
51+
|<title>Page Title</title>
52+
|</head>
53+
|<body>
54+
|
55+
|<h1>This is a Heading</h1>
56+
|<p>This is a paragraph.</p>
57+
|
58+
|</body>
59+
|</html>
60+
|""".stripMargin,
61+
Some("html")
62+
)
63+
val resHtml = Jsoup.parse(res)
64+
val expectedHtml = Jsoup.parse(
65+
"""<pre> <code class="language-html hljs language-xml" data-highlighted="yes"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span>
66+
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
67+
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
68+
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Page Title<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
69+
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
70+
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
71+
72+
<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>This is a Heading<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
73+
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>This is a paragraph.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
74+
75+
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
76+
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
77+
</code>
78+
</pre>"""
79+
)
80+
assertEquals(resHtml.html, expectedHtml.html)
81+
}
82+
83+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package ba.sake.flatmark.ssr
2+
3+
import ba.sake.sharaf.undertow.UndertowSharafServer
4+
import ba.sake.sharaf.SharafHandler
5+
import ba.sake.sharaf.utils.NetworkUtils
6+
7+
class GraphvizRendererSuite extends munit.FunSuite {
8+
9+
var server: UndertowSharafServer = null
10+
var webDriverHolder: WebDriverHolder = WebDriverHolder()
11+
val port = NetworkUtils.getFreePort()
12+
13+
override def beforeAll(): Unit =
14+
server = UndertowSharafServer("localhost", port, routes)
15+
server.start()
16+
17+
override def afterAll(): Unit =
18+
server.stop()
19+
webDriverHolder.close()
20+
21+
test("render graphviz graph to SVG") {
22+
val ssr = FlatmarkSsr(s"http://localhost:${port}", webDriverHolder)
23+
val res = ssr.renderGraphviz("""digraph G {Hello->World}""", "dot")
24+
assertEquals(
25+
res,
26+
"""<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
27+
28+
<!-- Generated by graphviz version 12.2.1 (0)
29+
-->
30+
<!-- Title: G Pages: 1 -->
31+
<svg width="79pt" height="116pt" viewBox="0.00 0.00 79.41 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
32+
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
33+
<title>G</title>
34+
<polygon fill="white" stroke="none" points="-4,4 -4,-112 75.41,-112 75.41,4 -4,4"></polygon>
35+
<!-- Hello -->
36+
<g id="node1" class="node">
37+
<title>Hello</title>
38+
<ellipse fill="none" stroke="black" cx="35.71" cy="-90" rx="32.49" ry="18"></ellipse>
39+
<text text-anchor="middle" x="35.71" y="-85.8" font-family="Times,serif" font-size="14.00">Hello</text>
40+
</g>
41+
<!-- World -->
42+
<g id="node2" class="node">
43+
<title>World</title>
44+
<ellipse fill="none" stroke="black" cx="35.71" cy="-18" rx="35.71" ry="18"></ellipse>
45+
<text text-anchor="middle" x="35.71" y="-13.8" font-family="Times,serif" font-size="14.00">World</text>
46+
</g>
47+
<!-- Hello&#45;&gt;World -->
48+
<g id="edge1" class="edge">
49+
<title>Hello-&gt;World</title>
50+
<path fill="none" stroke="black" d="M35.71,-71.7C35.71,-64.41 35.71,-55.73 35.71,-47.54"></path>
51+
<polygon fill="black" stroke="black" points="39.21,-47.62 35.71,-37.62 32.21,-47.62 39.21,-47.62"></polygon>
52+
</g>
53+
</g>
54+
</svg>
55+
"""
56+
)
57+
}
58+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package ba.sake.flatmark.ssr
2+
3+
import ba.sake.sharaf.undertow.UndertowSharafServer
4+
import ba.sake.sharaf.SharafHandler
5+
import ba.sake.sharaf.utils.NetworkUtils
6+
7+
class MathRendererSuite extends munit.FunSuite {
8+
9+
var server: UndertowSharafServer = null
10+
var webDriverHolder: WebDriverHolder = WebDriverHolder()
11+
val port = NetworkUtils.getFreePort()
12+
13+
override def beforeAll(): Unit =
14+
server = UndertowSharafServer("localhost", port, routes)
15+
server.start()
16+
17+
override def afterAll(): Unit =
18+
server.stop()
19+
webDriverHolder.close()
20+
21+
test("highlight math expression") {
22+
val ssr = FlatmarkSsr(s"http://localhost:${port}", webDriverHolder)
23+
val res = ssr.renderMath("""x = 5""")
24+
assertEquals(
25+
res,
26+
"""<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex"> x = 5
27+
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.2778em;"></span></span><span class="base"><span class="strut" style="height: 0.6444em;"></span><span class="mord">5</span></span></span></span>"""
28+
)
29+
}
30+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package ba.sake.flatmark.ssr
2+
3+
import ba.sake.sharaf.undertow.UndertowSharafServer
4+
import ba.sake.sharaf.SharafHandler
5+
import ba.sake.sharaf.utils.NetworkUtils
6+
7+
class MermaidRendererSuite extends munit.FunSuite {
8+
9+
var server: UndertowSharafServer = null
10+
var webDriverHolder: WebDriverHolder = WebDriverHolder()
11+
val port = NetworkUtils.getFreePort()
12+
13+
override def beforeAll(): Unit =
14+
server = UndertowSharafServer("localhost", port, routes)
15+
server.start()
16+
17+
override def afterAll(): Unit =
18+
server.stop()
19+
webDriverHolder.close()
20+
21+
test("render mermaid flowchart diagram to HTML") {
22+
val ssr = FlatmarkSsr(s"http://localhost:${port}", webDriverHolder)
23+
val source =
24+
"""|pie title pita
25+
| "Dogs" : 50
26+
| "Cats" : 50
27+
|""".stripMargin
28+
val res = ssr.renderMermaid(source).trim
29+
assert(
30+
res.startsWith("""<pre class="mermaid" data-processed="true"><svg id="mermaid-""")
31+
)
32+
assert(
33+
res.endsWith(
34+
"""<g transform="translate(225,225)"><circle cx="0" cy="0" r="186" class="pieOuterCircle"></circle><path d="M0,-185A185,185,0,1,1,0,185L0,0Z" fill="#ECECFF" class="pieCircle"></path><path d="M0,185A185,185,0,1,1,0,-185L0,0Z" fill="#ffffde" class="pieCircle"></path><text transform="translate(138.75,3.0808688933348094e-14)" class="slice" style="text-anchor: middle;">50%</text><text transform="translate(-138.75,-1.0624278139522284e-13)" class="slice" style="text-anchor: middle;">50%</text><text x="0" y="-200" class="pieTitleText">pita</text><g class="legend" transform="translate(216,-22)"><rect width="18" height="18" style="fill: rgb(236, 236, 255); stroke: rgb(236, 236, 255);"></rect><text x="22" y="14">Dogs</text></g><g class="legend" transform="translate(216,0)"><rect width="18" height="18" style="fill: rgb(255, 255, 222); stroke: rgb(255, 255, 222);"></rect><text x="22" y="14">Cats</text></g></g></svg></pre>"""
35+
)
36+
)
37+
}
38+
}

0 commit comments

Comments
 (0)