Skip to content

Commit cdaaa59

Browse files
committed
feat(ExecJSRenderer) test ExecJSRenderer
1 parent e8f2da0 commit cdaaa59

File tree

2 files changed

+74
-2
lines changed

2 files changed

+74
-2
lines changed

lib/react/server_rendering/exec_js_renderer.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module React
55
module ServerRendering
66
class ExecJSRenderer
77
def initialize(options={})
8-
js_code = options.fetch(:code) || raise("Pass `code:` option to instantiate a JS context!")
8+
js_code = options[:code] || raise("Pass `code:` option to instantiate a JS context!")
99
@context = ExecJS.compile(GLOBAL_WRAPPER + js_code)
1010
end
1111

@@ -19,7 +19,7 @@ def render(component_name, props, prerender_options)
1919
return result;
2020
})()
2121
JS
22-
@context.eval(js_code)
22+
@context.eval(js_code).html_safe
2323
rescue ExecJS::ProgramError => err
2424
raise React::ServerRendering::PrerenderError.new(component_name, props, err)
2525
end
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
require 'test_helper'
2+
3+
DUMMY_IMPLEMENTATION = "
4+
var Todo = null
5+
var React = {
6+
renderToString: function() {
7+
return 'renderToString was called'
8+
},
9+
createElement: function() {}
10+
}
11+
"
12+
13+
class ExecJSRendererTest < ActiveSupport::TestCase
14+
setup do
15+
react_source = Rails.application.assets["react.js"].to_s
16+
todo_component_source = Rails.application.assets["components/Todo.js"].to_s
17+
@renderer = React::ServerRendering::ExecJSRenderer.new(code: react_source + todo_component_source)
18+
end
19+
20+
test '#render returns HTML' do
21+
result = @renderer.render("Todo", {todo: "write tests"}.to_json, {})
22+
assert_match(/<li.*write tests<\/li>/, result)
23+
assert_match(/data-react-checksum/, result)
24+
end
25+
26+
test '#render accepts render_function:' do
27+
result = @renderer.render("Todo", {todo: "write more tests"}.to_json, render_function: "renderToStaticMarkup")
28+
assert_match(/<li>write more tests<\/li>/, result)
29+
assert_no_match(/data-react-checksum/, result)
30+
end
31+
32+
test '#before_render is called before #after_render' do
33+
def @renderer.before_render(name, props, opts)
34+
"throw 'before_render ' + afterRenderVar"
35+
end
36+
37+
def @renderer.after_render(name, props, opts)
38+
"var afterRenderVar = 'assigned_after_render'"
39+
end
40+
41+
error = assert_raises(React::ServerRendering::PrerenderError) do
42+
@renderer.render("Todo", {todo: "write tests"}.to_json, {})
43+
end
44+
45+
assert_match(/before_render/, error.message)
46+
assert_no_match(/assigned_after_render/, error.message)
47+
end
48+
49+
50+
test '#after_render is called after #before_render' do
51+
def @renderer.before_render(name, props, opts)
52+
"var beforeRenderVar = 'assigned_before_render'"
53+
end
54+
55+
def @renderer.after_render(name, props, opts)
56+
"throw 'after_render ' + beforeRenderVar"
57+
end
58+
59+
error = assert_raises(React::ServerRendering::PrerenderError) do
60+
@renderer.render("Todo", {todo: "write tests"}.to_json, {})
61+
end
62+
63+
assert_match(/after_render/, error.message)
64+
assert_match(/assigned_before_render/, error.message)
65+
end
66+
67+
test '.new accepts code:' do
68+
dummy_renderer = React::ServerRendering::ExecJSRenderer.new(code: DUMMY_IMPLEMENTATION)
69+
result = dummy_renderer.render("Todo", {todo: "get a real job"}.to_json, {})
70+
assert_equal("renderToString was called", result)
71+
end
72+
end

0 commit comments

Comments
 (0)