|
|
@@ -0,0 +1,134 @@
|
|
|
+// Copyright (c) .NET Foundation. All rights reserved.
|
|
|
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
+
|
|
|
+using Microsoft.AspNetCore.NodeServices.HostingModels;
|
|
|
+using Microsoft.Extensions.DependencyInjection;
|
|
|
+using System;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using Xunit;
|
|
|
+
|
|
|
+namespace Microsoft.AspNetCore.NodeServices
|
|
|
+{
|
|
|
+ public class NodeServicesTest : IDisposable
|
|
|
+ {
|
|
|
+ private readonly INodeServices _nodeServices;
|
|
|
+
|
|
|
+ public NodeServicesTest()
|
|
|
+ {
|
|
|
+ // In typical ASP.NET Core applications, INodeServices is made available
|
|
|
+ // through DI using services.AddNodeServices(). But for these tests we
|
|
|
+ // create our own INodeServices instance manually, since the tests are
|
|
|
+ // not about DI (and we might want different config for each test).
|
|
|
+ var serviceProvider = new ServiceCollection().BuildServiceProvider();
|
|
|
+ var options = new NodeServicesOptions(serviceProvider);
|
|
|
+ _nodeServices = NodeServicesFactory.CreateNodeServices(options);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task CanGetSuccessResult()
|
|
|
+ {
|
|
|
+ // Act
|
|
|
+ var result = await _nodeServices.InvokeExportAsync<string>(
|
|
|
+ ModulePath("testCases"),
|
|
|
+ "getFixedString");
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal("test result", result);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task CanGetErrorResult()
|
|
|
+ {
|
|
|
+ // Act/Assert
|
|
|
+ var ex = await Assert.ThrowsAsync<NodeInvocationException>(() =>
|
|
|
+ _nodeServices.InvokeExportAsync<string>(
|
|
|
+ ModulePath("testCases"),
|
|
|
+ "raiseError"));
|
|
|
+ Assert.StartsWith("This is an error from Node", ex.Message);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task CanGetResultAsynchronously()
|
|
|
+ {
|
|
|
+ // Act
|
|
|
+ // All the invocations are async, but this test shows we're not reliant
|
|
|
+ // on the response coming back immediately
|
|
|
+ var result = await _nodeServices.InvokeExportAsync<string>(
|
|
|
+ ModulePath("testCases"),
|
|
|
+ "getFixedStringWithDelay");
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal("delayed test result", result);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task CanPassParameters()
|
|
|
+ {
|
|
|
+ // Act
|
|
|
+ var result = await _nodeServices.InvokeExportAsync<string>(
|
|
|
+ ModulePath("testCases"),
|
|
|
+ "echoSimpleParameters",
|
|
|
+ "Hey",
|
|
|
+ 123);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal("Param0: Hey; Param1: 123", result);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task CanPassParametersWithCamelCaseNameConversion()
|
|
|
+ {
|
|
|
+ // Act
|
|
|
+ var result = await _nodeServices.InvokeExportAsync<string>(
|
|
|
+ ModulePath("testCases"),
|
|
|
+ "echoComplexParameters",
|
|
|
+ new ComplexModel { StringProp = "Abc", IntProp = 123, BoolProp = true });
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal("Received: [{\"stringProp\":\"Abc\",\"intProp\":123,\"boolProp\":true}]", result);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task CanReceiveComplexResultWithPascalCaseNameConversion()
|
|
|
+ {
|
|
|
+ // Act
|
|
|
+ var result = await _nodeServices.InvokeExportAsync<ComplexModel>(
|
|
|
+ ModulePath("testCases"),
|
|
|
+ "getComplexObject");
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal("Hi from Node", result.StringProp);
|
|
|
+ Assert.Equal(456, result.IntProp);
|
|
|
+ Assert.True(result.BoolProp);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task CanInvokeDefaultModuleExport()
|
|
|
+ {
|
|
|
+ // Act
|
|
|
+ var result = await _nodeServices.InvokeAsync<string>(
|
|
|
+ ModulePath("moduleWithDefaultExport"),
|
|
|
+ "This is from .NET");
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal("Hello from the default export. You passed: This is from .NET", result);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static string ModulePath(string testModuleName)
|
|
|
+ => $"../../../js/{testModuleName}";
|
|
|
+
|
|
|
+ public void Dispose()
|
|
|
+ {
|
|
|
+ _nodeServices.Dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ class ComplexModel
|
|
|
+ {
|
|
|
+ public string StringProp { get; set; }
|
|
|
+
|
|
|
+ public int IntProp { get; set; }
|
|
|
+
|
|
|
+ public bool BoolProp { get; set; }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|