Skip to content

Commit fb2d9d8

Browse files
Fix logic error and add a few tests
1 parent 3f09a28 commit fb2d9d8

7 files changed

+67
-14
lines changed

src/React.Core/IReactComponent.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public interface IReactComponent
7474
/// server-rendered HTML.
7575
/// </summary>
7676
/// <returns>JavaScript</returns>
77-
string RenderJavaScript();
77+
string RenderJavaScript(bool waitForDOMContentLoad);
7878

7979
/// <summary>
8080
/// Renders the JavaScript required to initialise this component client-side. This will

src/React.Core/ReactComponent.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -231,9 +231,9 @@ public virtual void RenderHtml(TextWriter writer, bool renderContainerOnly = fal
231231
/// server-rendered HTML.
232232
/// </summary>
233233
/// <returns>JavaScript</returns>
234-
public virtual string RenderJavaScript()
234+
public virtual string RenderJavaScript(bool waitForDOMContentLoad)
235235
{
236-
return GetStringFromWriter(renderJsWriter => RenderJavaScript(renderJsWriter, waitForDOMContentLoad: false));
236+
return GetStringFromWriter(renderJsWriter => RenderJavaScript(renderJsWriter, waitForDOMContentLoad));
237237
}
238238

239239
/// <summary>

src/React.Core/ReactEnvironment.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ public virtual void GetInitJavaScript(TextWriter writer, bool clientOnly = false
342342
{
343343
if (!component.ServerOnly)
344344
{
345-
component.RenderJavaScript(writer, waitForDOMContentLoad: true);
345+
component.RenderJavaScript(writer, waitForDOMContentLoad: false);
346346
writer.WriteLine(';');
347347
}
348348
}

tests/React.Tests/Core/ReactComponentTest.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ public void RenderJavaScriptShouldCallRenderComponent()
205205
{
206206
Props = new { hello = "World" }
207207
};
208-
var result = component.RenderJavaScript();
208+
var result = component.RenderJavaScript(false);
209209

210210
Assert.Equal(
211211
@"ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
@@ -225,7 +225,7 @@ public void RenderJavaScriptShouldCallRenderComponentWithReactDOMRender()
225225
ClientOnly = true,
226226
Props = new { hello = "World" }
227227
};
228-
var result = component.RenderJavaScript();
228+
var result = component.RenderJavaScript(false);
229229

230230
Assert.Equal(
231231
@"ReactDOM.render(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
@@ -245,7 +245,7 @@ public void RenderJavaScriptShouldCallRenderComponentwithReactDOMHydrate()
245245
ClientOnly = false,
246246
Props = new { hello = "World" }
247247
};
248-
var result = component.RenderJavaScript();
248+
var result = component.RenderJavaScript(false);
249249

250250
Assert.Equal(
251251
@"ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
@@ -266,7 +266,7 @@ public void RenderJavaScriptShouldCallRenderComponentWithReactDomRenderWhenSsrDi
266266
ClientOnly = false,
267267
Props = new {hello = "World"}
268268
};
269-
var result = component.RenderJavaScript();
269+
var result = component.RenderJavaScript(false);
270270

271271
Assert.Equal(
272272
@"ReactDOM.render(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",

tests/React.Tests/Core/ReactEnvironmentTest.cs

+17
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using Moq;
1414
using Xunit;
1515
using React.Exceptions;
16+
using System.IO;
1617

1718
namespace React.Tests.Core
1819
{
@@ -125,6 +126,22 @@ public void CreatesIReactComponent()
125126
Assert.Equal(";" + Environment.NewLine, environment.GetInitJavaScript());
126127
}
127128

129+
[Fact]
130+
public void GetInitJavaScript()
131+
{
132+
var mocks = new Mocks();
133+
var environment = mocks.CreateReactEnvironment();
134+
135+
var component = new Mock<IReactComponent>();
136+
137+
component.Setup(x => x.RenderJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool waitForDOMContentLoad) => writer.Write(waitForDOMContentLoad ? "waiting for page load JS" : "JS")).Verifiable();
138+
139+
environment.CreateComponent(component.Object);
140+
141+
// A single nameless component was successfully added!
142+
Assert.Equal("JS;" + Environment.NewLine, environment.GetInitJavaScript());
143+
}
144+
128145
[Fact]
129146
public void ServerSideOnlyComponentRendersNoJavaScript()
130147
{

tests/React.Tests/Mvc/HtmlHelperExtensionsTests.cs

+22-5
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void ReactWithInitShouldReturnHtmlAndScript()
3838
component.Setup(x => x.RenderHtml(It.IsAny<TextWriter>(), false, false, null, null))
3939
.Callback((TextWriter writer, bool renderContainerOnly, bool renderServerOnly, Action<Exception, string, string> exceptionHandler, IRenderFunctions renderFunctions) => writer.Write("HTML"));
4040

41-
component.Setup(x => x.RenderJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool waitForDOMContentLoad) => writer.Write("JS"));
41+
component.Setup(x => x.RenderJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool waitForDOMContentLoad) => writer.Write(waitForDOMContentLoad ? "waiting for page load JS" : "JS"));
4242

4343
var environment = ConfigureMockEnvironment();
4444
environment.Setup(x => x.CreateComponent(
@@ -57,11 +57,28 @@ public void ReactWithInitShouldReturnHtmlAndScript()
5757
).ToHtmlString();
5858

5959
Assert.Equal(
60-
"HTML" + System.Environment.NewLine + "<script>JS</script>",
60+
"HTML" + System.Environment.NewLine + "<script>waiting for page load JS</script>",
6161
result.ToString()
6262
);
6363
}
6464

65+
[Fact]
66+
public void GetInitJavaScriptReturns()
67+
{
68+
var component = new Mock<IReactComponent>();
69+
70+
var environment = ConfigureMockEnvironment();
71+
72+
environment.Setup(x => x.GetInitJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool clientOnly) => writer.Write("JS"));
73+
74+
var renderJSResult = HtmlHelperExtensions.ReactInitJavaScript(htmlHelper: null, clientOnly: false);
75+
76+
Assert.Equal(
77+
"<script>JS</script>",
78+
renderJSResult.ToString()
79+
);
80+
}
81+
6582
[Fact]
6683
public void ScriptNonceIsReturned()
6784
{
@@ -77,7 +94,7 @@ public void ScriptNonceIsReturned()
7794
component.Setup(x => x.RenderHtml(It.IsAny<TextWriter>(), false, false, null, null))
7895
.Callback((TextWriter writer, bool renderContainerOnly, bool renderServerOnly, Action<Exception, string, string> exceptionHandle, IRenderFunctions renderFunctions) => writer.Write("HTML")).Verifiable();
7996

80-
component.Setup(x => x.RenderJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool waitForDOMContentLoad) => writer.Write("JS")).Verifiable();
97+
component.Setup(x => x.RenderJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool waitForDOMContentLoad) => writer.Write(waitForDOMContentLoad ? "waiting for page load JS" : "JS")).Verifiable();
8198

8299
var config = new Mock<IReactSiteConfiguration>();
83100

@@ -101,7 +118,7 @@ public void ScriptNonceIsReturned()
101118
).ToHtmlString();
102119

103120
Assert.Equal(
104-
"HTML" + System.Environment.NewLine + "<script>JS</script>",
121+
"HTML" + System.Environment.NewLine + "<script>waiting for page load JS</script>",
105122
result.ToString()
106123
);
107124

@@ -116,7 +133,7 @@ public void ScriptNonceIsReturned()
116133
).ToHtmlString();
117134

118135
Assert.Equal(
119-
"HTML" + System.Environment.NewLine + "<script nonce=\"" + nonce + "\">JS</script>",
136+
"HTML" + System.Environment.NewLine + "<script nonce=\"" + nonce + "\">waiting for page load JS</script>",
120137
result.ToString()
121138
);
122139
}

tests/React.Tests/Router/ReactRouterComponentTest.cs

+20-1
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,32 @@ public void RenderJavaScriptShouldNotIncludeContextOrPath()
2727
{
2828
Props = new { hello = "World" }
2929
};
30-
var result = component.RenderJavaScript();
30+
var result = component.RenderJavaScript(false);
3131

3232
Assert.Equal(
3333
@"ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
3434
result
3535
);
3636
}
37+
38+
[Fact]
39+
public void RenderJavaScriptShouldHandleWaitForContentLoad()
40+
{
41+
var environment = new Mock<IReactEnvironment>();
42+
var config = new Mock<IReactSiteConfiguration>();
43+
var reactIdGenerator = new Mock<IReactIdGenerator>();
44+
45+
var component = new ReactRouterComponent(environment.Object, config.Object, reactIdGenerator.Object, "Foo", "container", "/bar")
46+
{
47+
Props = new { hello = "World" }
48+
};
49+
var result = component.RenderJavaScript(true);
50+
51+
Assert.Equal(
52+
@"window.addEventListener('DOMContentLoaded', function() {ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))});",
53+
result
54+
);
55+
}
3756
}
3857
}
3958
#endif

0 commit comments

Comments
 (0)