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