/src/Microsoft.DotNet.Interactive.ExtensionLab.Tests/NteractKernelExtensionTests.cs

https://github.com/dotnet/interactive · C# · 215 lines · 155 code · 58 blank · 2 comment · 0 complexity · 04f88c1a212c04130a89838f7962b53d MD5 · raw file

  1. // Copyright (c) .NET Foundation and contributors. All rights reserved.
  2. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
  3. using System;
  4. using System.Diagnostics;
  5. using System.Threading.Tasks;
  6. using Assent;
  7. using FluentAssertions;
  8. using Microsoft.DotNet.Interactive.Formatting;
  9. using Xunit;
  10. using Xunit.Abstractions;
  11. namespace Microsoft.DotNet.Interactive.ExtensionLab.Tests
  12. {
  13. public class NteractKernelExtensionTests : IDisposable
  14. {
  15. private readonly Configuration _configuration;
  16. public NteractKernelExtensionTests(ITestOutputHelper output)
  17. {
  18. _configuration = new Configuration()
  19. .SetInteractive(Debugger.IsAttached)
  20. .UsingExtension("json");
  21. }
  22. [Fact]
  23. public async Task it_registers_formatters()
  24. {
  25. using var kernel = new CompositeKernel();
  26. var kernelExtension = new NteractKernelExtension();
  27. await kernelExtension.OnLoadAsync(kernel);
  28. var data = new[]
  29. {
  30. new {Type="orange", Price=1.2},
  31. new {Type="apple" , Price=1.3},
  32. new {Type="grape" , Price=1.4}
  33. };
  34. var formatted = data.ToTabularJsonString().ToDisplayString(HtmlFormatter.MimeType);
  35. formatted.Should().Contain("getExtensionRequire('nteract','1.0.0')(['nteract/index'], (nteract) => {");
  36. }
  37. [Fact]
  38. public async Task it_can_load_script_from_the_extension()
  39. {
  40. using var kernel = new CompositeKernel();
  41. var kernelExtension = new NteractKernelExtension();
  42. await kernelExtension.OnLoadAsync(kernel);
  43. var data = new[]
  44. {
  45. new {Type="orange", Price=1.2},
  46. new {Type="apple" , Price=1.3},
  47. new {Type="grape" , Price=1.4}
  48. };
  49. var formatted = data.ToTabularJsonString().ToDisplayString(HtmlFormatter.MimeType);
  50. formatted.Should().Contain("getExtensionRequire");
  51. }
  52. [Fact]
  53. public async Task it_checks_and_load_require()
  54. {
  55. using var kernel = new CompositeKernel();
  56. var kernelExtension = new NteractKernelExtension();
  57. DataExplorerExtensions.Settings.UseUri("https://a.cdn.url/script.js");
  58. await kernelExtension.OnLoadAsync(kernel);
  59. var data = new[]
  60. {
  61. new {Type="orange", Price=1.2},
  62. new {Type="apple" , Price=1.3},
  63. new {Type="grape" , Price=1.4}
  64. };
  65. var formatted = data.ToTabularJsonString().ToDisplayString(HtmlFormatter.MimeType);
  66. formatted.Should()
  67. .Contain("if ((typeof(require) !== typeof(Function)) || (typeof(require.config) !== typeof(Function)))")
  68. .And
  69. .Contain("script.onload = function()");
  70. }
  71. [Fact]
  72. public async Task it_can_loads_script_from_uri()
  73. {
  74. using var kernel = new CompositeKernel();
  75. var kernelExtension = new NteractKernelExtension();
  76. DataExplorerExtensions.Settings.UseUri("https://a.cdn.url/script.js");
  77. await kernelExtension.OnLoadAsync(kernel);
  78. var data = new[]
  79. {
  80. new {Type="orange", Price=1.2},
  81. new {Type="apple" , Price=1.3},
  82. new {Type="grape" , Price=1.4}
  83. };
  84. var formatted = data.ToTabularJsonString().ToDisplayString(HtmlFormatter.MimeType);
  85. formatted.Should().Contain("require.config(");
  86. }
  87. [Fact]
  88. public async Task it_can_loads_script_from_uri_and_specify_context()
  89. {
  90. using var kernel = new CompositeKernel();
  91. var kernelExtension = new NteractKernelExtension();
  92. DataExplorerExtensions.Settings.UseUri("https://a.cdn.url/script.js", "2.2.2");
  93. await kernelExtension.OnLoadAsync(kernel);
  94. var data = new[]
  95. {
  96. new {Type="orange", Price=1.2},
  97. new {Type="apple" , Price=1.3},
  98. new {Type="grape" , Price=1.4}
  99. };
  100. var formatted = data.ToTabularJsonString().ToDisplayString(HtmlFormatter.MimeType);
  101. formatted.Should().Contain("'context': '2.2.2'");
  102. }
  103. [Fact]
  104. public async Task uri_is_quoted()
  105. {
  106. using var kernel = new CompositeKernel();
  107. var kernelExtension = new NteractKernelExtension();
  108. DataExplorerExtensions.Settings.UseUri("https://a.cdn.url/script.js");
  109. await kernelExtension.OnLoadAsync(kernel);
  110. var data = new[]
  111. {
  112. new {Type="orange", Price=1.2},
  113. new {Type="apple" , Price=1.3},
  114. new {Type="grape" , Price=1.4}
  115. };
  116. var formatted = data.ToTabularJsonString().ToDisplayString(HtmlFormatter.MimeType);
  117. formatted.Should().Contain("'https://a.cdn.url/script'");
  118. }
  119. [Fact]
  120. public async Task uri_extension_is_removed()
  121. {
  122. using var kernel = new CompositeKernel();
  123. var kernelExtension = new NteractKernelExtension();
  124. DataExplorerExtensions.Settings.UseUri("https://a.cdn.url/script.js");
  125. await kernelExtension.OnLoadAsync(kernel);
  126. var data = new[]
  127. {
  128. new {Type="orange", Price=1.2},
  129. new {Type="apple" , Price=1.3},
  130. new {Type="grape" , Price=1.4}
  131. };
  132. var formatted = data.ToTabularJsonString().ToDisplayString(HtmlFormatter.MimeType);
  133. formatted.Should().NotContain("'https://a.cdn.url/script.js'");
  134. }
  135. [Fact]
  136. public async Task can_specify_cacheBuster()
  137. {
  138. using var kernel = new CompositeKernel();
  139. var kernelExtension = new NteractKernelExtension();
  140. DataExplorerExtensions.Settings.UseUri("https://a.cdn.url/script.js", cacheBuster: "XYZ");
  141. await kernelExtension.OnLoadAsync(kernel);
  142. var data = new[]
  143. {
  144. new {Type="orange", Price=1.2},
  145. new {Type="apple" , Price=1.3},
  146. new {Type="grape" , Price=1.4}
  147. };
  148. var formatted = data.ToTabularJsonString().ToDisplayString(HtmlFormatter.MimeType);
  149. formatted.Should().Contain("'urlArgs': 'cacheBuster=XYZ'");
  150. }
  151. public void Dispose()
  152. {
  153. DataExplorerExtensions.Settings.RestoreDefault();
  154. Formatter.ResetToDefault();
  155. }
  156. }
  157. }