4
4
class ReactRailsUJSTest < ActionDispatch ::IntegrationTest
5
5
include Capybara ::DSL
6
6
7
+ compiled = false
7
8
setup do
8
- Capybara . current_driver = Capybara . javascript_driver
9
- WebpackerHelpers . compile_if_missing
9
+ if !compiled
10
+ React ::ServerRendering . reset_pool
11
+ WebpackerHelpers . compile
12
+ end
13
+ end
14
+
15
+ # Normalize for webpacker check:
16
+ def assert_greeting ( page , plain_greeting , refute : false )
17
+ normalized_greeting = if WebpackerHelpers . available?
18
+ greeting , name = plain_greeting . split ( " " )
19
+ "#{ greeting } from Webpacker #{ name } "
20
+ else
21
+ plain_greeting
22
+ end
23
+
24
+ if refute
25
+ assert page . has_no_content? ( normalized_greeting ) , page . body
26
+ else
27
+ assert page . has_content? ( normalized_greeting ) , page . body
28
+ end
29
+ end
30
+
31
+ def refute_greeting ( page , greeting )
32
+ assert_greeting ( page , greeting , refute : true )
10
33
end
11
34
12
35
test 'ujs object present on the global React object and has our methods' do
13
36
visit '/pages/1'
14
- assert page . has_content? ( 'Hello Bob' )
37
+ assert_greeting ( page , 'Hello Bob' )
15
38
16
39
# the exposed ujs object is present
17
40
ujs_present = page . evaluate_script ( 'typeof ReactRailsUJS === "object";' )
@@ -34,82 +57,82 @@ class ReactRailsUJSTest < ActionDispatch::IntegrationTest
34
57
35
58
test 'react_ujs works with rendered HTML' do
36
59
visit '/pages/1'
37
- assert page . has_content? ( 'Hello Bob' )
60
+ assert_greeting ( page , 'Hello Bob' )
38
61
39
62
page . click_button 'Goodbye'
40
- assert page . has_no_content? ( 'Hello Bob' )
41
- assert page . has_content? ( 'Goodbye Bob' )
63
+ refute_greeting ( page , 'Hello Bob' )
64
+ assert_greeting ( page , 'Goodbye Bob' )
42
65
end
43
66
44
67
test 'react_ujs works with Turbolinks' do
45
68
visit '/pages/1'
46
- assert page . has_content? ( 'Hello Bob' )
69
+ assert_greeting ( page , 'Hello Bob' )
47
70
assert page . evaluate_script ( "Turbolinks.supported" )
48
71
49
72
# Try clicking links.
50
73
page . click_link ( 'Alice' )
51
74
wait_for_turbolinks_to_be_available
52
- assert page . has_content? ( 'Hello Alice' )
75
+ assert_greeting ( page , 'Hello Alice' )
53
76
54
77
page . click_link ( 'Bob' )
55
78
wait_for_turbolinks_to_be_available
56
- assert page . has_content? ( 'Hello Bob' )
79
+ assert_greeting ( page , 'Hello Bob' )
57
80
58
81
# Try going back.
59
82
page . execute_script ( 'history.back();' )
60
83
wait_for_turbolinks_to_be_available
61
- assert page . has_content? ( 'Hello Alice' )
84
+ assert_greeting ( page , 'Hello Alice' )
62
85
63
86
# Try Turbolinks javascript API.
64
87
page . execute_script ( 'Turbolinks.visit("/pages/2");' )
65
88
wait_for_turbolinks_to_be_available
66
- assert page . has_content? ( 'Hello Alice' )
89
+ assert_greeting ( page , 'Hello Alice' )
67
90
68
91
69
92
page . execute_script ( 'Turbolinks.visit("/pages/1");' )
70
93
wait_for_turbolinks_to_be_available
71
- assert page . has_content? ( 'Hello Bob' )
94
+ assert_greeting ( page , 'Hello Bob' )
72
95
73
96
# Component state is not persistent after clicking current page link.
74
97
page . click_button 'Goodbye'
75
- assert page . has_content? ( 'Goodbye Bob' )
98
+ assert_greeting ( page , 'Goodbye Bob' )
76
99
77
100
page . click_link ( 'Bob' )
78
101
wait_for_turbolinks_to_be_available
79
- assert page . has_content? ( 'Hello Bob' )
102
+ assert_greeting ( page , 'Hello Bob' )
80
103
end
81
104
82
105
test 'react_ujs can unmount/mount using a selector reference for a component parent' do
83
106
visit '/pages/1'
84
- assert page . has_content? ( 'Hello Bob' ) , page . body
107
+ assert_greeting ( page , 'Hello Bob' )
85
108
86
109
page . click_button "Unmount by parent selector"
87
- assert page . has_no_content? ( 'Hello Bob' ) , page . body
110
+ refute_greeting ( page , 'Hello Bob' )
88
111
89
112
page . click_button "Mount by parent selector"
90
- assert page . has_content? ( 'Hello Bob' ) , page . body
113
+ assert_greeting ( page , 'Hello Bob' )
91
114
end
92
115
93
116
test 'react_ujs can unmount/mount using a selector reference for the component' do
94
117
visit '/pages/1'
95
- assert page . has_content? ( 'Hello Bob' ) , page . body
118
+ assert_greeting ( page , 'Hello Bob' )
96
119
97
120
page . click_button "Unmount by own selector"
98
- assert page . has_no_content? ( 'Hello Bob' ) , page . body
121
+ refute_greeting ( page , 'Hello Bob' )
99
122
100
123
page . click_button "Mount by own selector"
101
- assert page . has_content? ( 'Hello Bob' ) , page . body
124
+ assert_greeting ( page , 'Hello Bob' )
102
125
end
103
126
104
127
test 'react_ujs can unmount/mount using a dom node context' do
105
128
visit '/pages/1'
106
- assert page . has_content? ( 'Hello Bob' ) , page . body
129
+ assert_greeting ( page , 'Hello Bob' )
107
130
108
131
page . click_button "Unmount by parent node"
109
- assert page . has_no_content? ( 'Hello Bob' ) , page . body
132
+ refute_greeting ( page , 'Hello Bob' )
110
133
111
134
page . click_button "Mount by parent node"
112
- assert page . has_content? ( 'Hello Bob' ) , page . body
135
+ assert_greeting ( page , 'Hello Bob' )
113
136
end
114
137
115
138
test 'react server rendering also gets mounted on client' do
0 commit comments