WebSockerScriptInjectionTest.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // Copyright (c) .NET Foundation. All rights reserved.
  2. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  3. using System;
  4. using System.IO;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using Xunit;
  8. namespace Microsoft.AspNetCore.Watch.BrowserRefresh
  9. {
  10. public class WebSockerScriptInjectionTest
  11. {
  12. private const string ClientScript = "<script><!--My cool script--></script>";
  13. private readonly WebSocketScriptInjection ScriptInjection = new WebSocketScriptInjection(ClientScript);
  14. [Fact]
  15. public async Task TryInjectLiveReloadScriptAsync_DoesNotInjectMarkup_IfInputDoesNotContainBodyTag()
  16. {
  17. // Arrange
  18. var stream = new MemoryStream();
  19. var input = Encoding.UTF8.GetBytes("<div>this is not a real body tag.</div>");
  20. // Act
  21. var result = await ScriptInjection.TryInjectLiveReloadScriptAsync(stream, input);
  22. // Assert
  23. Assert.False(result);
  24. Assert.Equal(input, stream.ToArray());
  25. }
  26. [Fact]
  27. public async Task TryInjectLiveReloadScriptAsync_InjectsMarkupIfBodyTagAppearsInTheMiddle()
  28. {
  29. // Arrange
  30. var expected =
  31. $@"<footer>
  32. This is the footer
  33. </footer>
  34. {ClientScript}</body>
  35. </html>";
  36. var stream = new MemoryStream();
  37. var input = Encoding.UTF8.GetBytes(
  38. @"<footer>
  39. This is the footer
  40. </footer>
  41. </body>
  42. </html>");
  43. // Act
  44. var result = await ScriptInjection.TryInjectLiveReloadScriptAsync(stream, input);
  45. // Assert
  46. Assert.True(result);
  47. var output = Encoding.UTF8.GetString(stream.ToArray());
  48. Assert.Equal(expected, output, ignoreLineEndingDifferences: true);
  49. }
  50. [Fact]
  51. public async Task TryInjectLiveReloadScriptAsync_WithOffsetBodyTagAppearsInMiddle()
  52. {
  53. // Arrange
  54. var expected = $"</table>{ClientScript}</body>";
  55. var stream = new MemoryStream();
  56. var input = Encoding.UTF8.GetBytes("unused</table></body>");
  57. // Act
  58. var result = await ScriptInjection.TryInjectLiveReloadScriptAsync(stream, input.AsMemory(6));
  59. // Assert
  60. Assert.True(result);
  61. var output = Encoding.UTF8.GetString(stream.ToArray());
  62. Assert.Equal(expected, output);
  63. }
  64. [Fact]
  65. public async Task TryInjectLiveReloadScriptAsync_WithOffsetBodyTagAppearsAtStartOfOffset()
  66. {
  67. // Arrange
  68. var expected = $"{ClientScript}</body>";
  69. var stream = new MemoryStream();
  70. var input = Encoding.UTF8.GetBytes("unused</body>");
  71. // Act
  72. var result = await ScriptInjection.TryInjectLiveReloadScriptAsync(stream, input.AsMemory(6));
  73. // Assert
  74. Assert.True(result);
  75. var output = Encoding.UTF8.GetString(stream.ToArray());
  76. Assert.Equal(expected, output);
  77. }
  78. [Fact]
  79. public async Task TryInjectLiveReloadScriptAsync_InjectsMarkupIfBodyTagAppearsAtTheStartOfOutput()
  80. {
  81. // Arrange
  82. var expected = $"{ClientScript}</body></html>";
  83. var stream = new MemoryStream();
  84. var input = Encoding.UTF8.GetBytes("</body></html>");
  85. // Act
  86. var result = await ScriptInjection.TryInjectLiveReloadScriptAsync(stream, input);
  87. // Assert
  88. Assert.True(result);
  89. var output = Encoding.UTF8.GetString(stream.ToArray());
  90. Assert.Equal(expected, output);
  91. }
  92. [Fact]
  93. public async Task TryInjectLiveReloadScriptAsync_InjectsMarkupIfBodyTagAppearsByItself()
  94. {
  95. // Arrange
  96. var expected = $"{ClientScript}</body>";
  97. var stream = new MemoryStream();
  98. var input = Encoding.UTF8.GetBytes("</body>");
  99. // Act
  100. var result = await ScriptInjection.TryInjectLiveReloadScriptAsync(stream, input);
  101. // Assert
  102. Assert.True(result);
  103. var output = Encoding.UTF8.GetString(stream.ToArray());
  104. Assert.Equal(expected, output);
  105. }
  106. [Fact]
  107. public async Task TryInjectLiveReloadScriptAsync_MultipleBodyTags()
  108. {
  109. // Arrange
  110. var expected = $"<p></body>some text</p>{ClientScript}</body>";
  111. var stream = new MemoryStream();
  112. var input = Encoding.UTF8.GetBytes("abc<p></body>some text</p></body>").AsMemory(3);
  113. // Act
  114. var result = await ScriptInjection.TryInjectLiveReloadScriptAsync(stream, input);
  115. // Assert
  116. Assert.True(result);
  117. var output = Encoding.UTF8.GetString(stream.ToArray());
  118. Assert.Equal(expected, output);
  119. }
  120. [Fact]
  121. public void TryInjectLiveReloadScript_NoBodyTag()
  122. {
  123. // Arrange
  124. var expected = "<p>Hello world</p>";
  125. var stream = new MemoryStream();
  126. var input = Encoding.UTF8.GetBytes(expected).AsSpan();
  127. // Act
  128. var result = ScriptInjection.TryInjectLiveReloadScript(stream, input);
  129. // Assert
  130. Assert.False(result);
  131. var output = Encoding.UTF8.GetString(stream.ToArray());
  132. Assert.Equal(expected, output);
  133. }
  134. [Fact]
  135. public void TryInjectLiveReloadScript_NoOffset()
  136. {
  137. // Arrange
  138. var expected = $"</table>{ClientScript}</body>";
  139. var stream = new MemoryStream();
  140. var input = Encoding.UTF8.GetBytes("</table></body>").AsSpan();
  141. // Act
  142. var result = ScriptInjection.TryInjectLiveReloadScript(stream, input);
  143. // Assert
  144. Assert.True(result);
  145. var output = Encoding.UTF8.GetString(stream.ToArray());
  146. Assert.Equal(expected, output);
  147. }
  148. [Fact]
  149. public void TryInjectLiveReloadScript_WithOffset()
  150. {
  151. // Arrange
  152. var expected = $"</table>{ClientScript}</body>";
  153. var stream = new MemoryStream();
  154. var input = Encoding.UTF8.GetBytes("unused</table></body>").AsSpan(6);
  155. // Act
  156. var result = ScriptInjection.TryInjectLiveReloadScript(stream, input);
  157. // Assert
  158. Assert.True(result);
  159. var output = Encoding.UTF8.GetString(stream.ToArray());
  160. Assert.Equal(expected, output);
  161. }
  162. [Fact]
  163. public void GetWebSocketClientJavaScript_Works()
  164. {
  165. // Act
  166. var script = WebSocketScriptInjection.GetWebSocketClientJavaScript("some-host");
  167. // Assert
  168. Assert.Contains("// dotnet-watch browser reload script", script);
  169. Assert.Contains("'some-host'", script);
  170. }
  171. }
  172. }