Skip to content

Commit

Permalink
Fix logic error and add a few tests
Browse files Browse the repository at this point in the history
  • Loading branch information
dustinsoftware committed Jul 5, 2019
1 parent 3f09a28 commit fb2d9d8
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 14 deletions.
2 changes: 1 addition & 1 deletion src/React.Core/IReactComponent.cs
Expand Up @@ -74,7 +74,7 @@ public interface IReactComponent
/// server-rendered HTML.
/// </summary>
/// <returns>JavaScript</returns>
string RenderJavaScript();
string RenderJavaScript(bool waitForDOMContentLoad);

/// <summary>
/// Renders the JavaScript required to initialise this component client-side. This will
Expand Down
4 changes: 2 additions & 2 deletions src/React.Core/ReactComponent.cs
Expand Up @@ -231,9 +231,9 @@ public virtual void RenderHtml(TextWriter writer, bool renderContainerOnly = fal
/// server-rendered HTML.
/// </summary>
/// <returns>JavaScript</returns>
public virtual string RenderJavaScript()
public virtual string RenderJavaScript(bool waitForDOMContentLoad)
{
return GetStringFromWriter(renderJsWriter => RenderJavaScript(renderJsWriter, waitForDOMContentLoad: false));
return GetStringFromWriter(renderJsWriter => RenderJavaScript(renderJsWriter, waitForDOMContentLoad));
}

/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion src/React.Core/ReactEnvironment.cs
Expand Up @@ -342,7 +342,7 @@ public virtual void GetInitJavaScript(TextWriter writer, bool clientOnly = false
{
if (!component.ServerOnly)
{
component.RenderJavaScript(writer, waitForDOMContentLoad: true);
component.RenderJavaScript(writer, waitForDOMContentLoad: false);
writer.WriteLine(';');
}
}
Expand Down
8 changes: 4 additions & 4 deletions tests/React.Tests/Core/ReactComponentTest.cs
Expand Up @@ -205,7 +205,7 @@ public void RenderJavaScriptShouldCallRenderComponent()
{
Props = new { hello = "World" }
};
var result = component.RenderJavaScript();
var result = component.RenderJavaScript(false);

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

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

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

Assert.Equal(
@"ReactDOM.render(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
Expand Down
17 changes: 17 additions & 0 deletions tests/React.Tests/Core/ReactEnvironmentTest.cs
Expand Up @@ -13,6 +13,7 @@
using Moq;
using Xunit;
using React.Exceptions;
using System.IO;

namespace React.Tests.Core
{
Expand Down Expand Up @@ -125,6 +126,22 @@ public void CreatesIReactComponent()
Assert.Equal(";" + Environment.NewLine, environment.GetInitJavaScript());
}

[Fact]
public void GetInitJavaScript()
{
var mocks = new Mocks();
var environment = mocks.CreateReactEnvironment();

var component = new Mock<IReactComponent>();

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();

environment.CreateComponent(component.Object);

// A single nameless component was successfully added!
Assert.Equal("JS;" + Environment.NewLine, environment.GetInitJavaScript());
}

[Fact]
public void ServerSideOnlyComponentRendersNoJavaScript()
{
Expand Down
27 changes: 22 additions & 5 deletions tests/React.Tests/Mvc/HtmlHelperExtensionsTests.cs
Expand Up @@ -38,7 +38,7 @@ public void ReactWithInitShouldReturnHtmlAndScript()
component.Setup(x => x.RenderHtml(It.IsAny<TextWriter>(), false, false, null, null))
.Callback((TextWriter writer, bool renderContainerOnly, bool renderServerOnly, Action<Exception, string, string> exceptionHandler, IRenderFunctions renderFunctions) => writer.Write("HTML"));

component.Setup(x => x.RenderJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool waitForDOMContentLoad) => writer.Write("JS"));
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"));

var environment = ConfigureMockEnvironment();
environment.Setup(x => x.CreateComponent(
Expand All @@ -57,11 +57,28 @@ public void ReactWithInitShouldReturnHtmlAndScript()
).ToHtmlString();

Assert.Equal(
"HTML" + System.Environment.NewLine + "<script>JS</script>",
"HTML" + System.Environment.NewLine + "<script>waiting for page load JS</script>",
result.ToString()
);
}

[Fact]
public void GetInitJavaScriptReturns()
{
var component = new Mock<IReactComponent>();

var environment = ConfigureMockEnvironment();

environment.Setup(x => x.GetInitJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool clientOnly) => writer.Write("JS"));

var renderJSResult = HtmlHelperExtensions.ReactInitJavaScript(htmlHelper: null, clientOnly: false);

Assert.Equal(
"<script>JS</script>",
renderJSResult.ToString()
);
}

[Fact]
public void ScriptNonceIsReturned()
{
Expand All @@ -77,7 +94,7 @@ public void ScriptNonceIsReturned()
component.Setup(x => x.RenderHtml(It.IsAny<TextWriter>(), false, false, null, null))
.Callback((TextWriter writer, bool renderContainerOnly, bool renderServerOnly, Action<Exception, string, string> exceptionHandle, IRenderFunctions renderFunctions) => writer.Write("HTML")).Verifiable();

component.Setup(x => x.RenderJavaScript(It.IsAny<TextWriter>(), It.IsAny<bool>())).Callback((TextWriter writer, bool waitForDOMContentLoad) => writer.Write("JS")).Verifiable();
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();

var config = new Mock<IReactSiteConfiguration>();

Expand All @@ -101,7 +118,7 @@ public void ScriptNonceIsReturned()
).ToHtmlString();

Assert.Equal(
"HTML" + System.Environment.NewLine + "<script>JS</script>",
"HTML" + System.Environment.NewLine + "<script>waiting for page load JS</script>",
result.ToString()
);

Expand All @@ -116,7 +133,7 @@ public void ScriptNonceIsReturned()
).ToHtmlString();

Assert.Equal(
"HTML" + System.Environment.NewLine + "<script nonce=\"" + nonce + "\">JS</script>",
"HTML" + System.Environment.NewLine + "<script nonce=\"" + nonce + "\">waiting for page load JS</script>",
result.ToString()
);
}
Expand Down
21 changes: 20 additions & 1 deletion tests/React.Tests/Router/ReactRouterComponentTest.cs
Expand Up @@ -27,13 +27,32 @@ public void RenderJavaScriptShouldNotIncludeContextOrPath()
{
Props = new { hello = "World" }
};
var result = component.RenderJavaScript();
var result = component.RenderJavaScript(false);

Assert.Equal(
@"ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
result
);
}

[Fact]
public void RenderJavaScriptShouldHandleWaitForContentLoad()
{
var environment = new Mock<IReactEnvironment>();
var config = new Mock<IReactSiteConfiguration>();
var reactIdGenerator = new Mock<IReactIdGenerator>();

var component = new ReactRouterComponent(environment.Object, config.Object, reactIdGenerator.Object, "Foo", "container", "/bar")
{
Props = new { hello = "World" }
};
var result = component.RenderJavaScript(true);

Assert.Equal(
@"window.addEventListener('DOMContentLoaded', function() {ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))});",
result
);
}
}
}
#endif

0 comments on commit fb2d9d8

Please sign in to comment.