public async void Configure_ConfiguresOptions()
        {
            // Arrange
            const int    dummyInitialInvocationResult = 1;
            const string dummyTestVariableName1       = "TEST_VARIABLE_1";
            const string dummyTestVariableValue1      = "testVariableValue1";
            const string dummyTestVariableName2       = "TEST_VARIABLE_2";
            const string dummyTestVariableValue2      = "testVariableValue2";

            // Act
            // Invoke javascript once to ensure that an initial NodeJSService is created. The invocation after configuration should properly dispose of this initial instance and create a new one with the
            // specified options.
            int initialInvocationResult = await StaticNodeJSService.
                                          InvokeFromStringAsync <int>($"module.exports = (callback) => callback(null, {dummyInitialInvocationResult});").ConfigureAwait(false);

            StaticNodeJSService.
            Configure <NodeJSProcessOptions>(options => options.EnvironmentVariables.Add(dummyTestVariableName1, dummyTestVariableValue1));
            StaticNodeJSService.
            Configure <NodeJSProcessOptions>(options => options.EnvironmentVariables.Add(dummyTestVariableName2, dummyTestVariableValue2));

            // Assert
            Assert.Equal(dummyInitialInvocationResult, initialInvocationResult);
            DummyResult result = await StaticNodeJSService.
                                 InvokeFromStringAsync <DummyResult>($"module.exports = (callback) => callback(null, {{result: process.env.{dummyTestVariableName1} + process.env.{dummyTestVariableName2}}});").
                                 ConfigureAwait(false);

            Assert.Equal(dummyTestVariableValue1 + dummyTestVariableValue2, result.Result);
        }
        public async Task <DummyResult> INodeServices_Latency()
        {
            _args[0] = _counter++;
            DummyResult result = await _nodeServices !.InvokeAsync <DummyResult>(DUMMY_LATENCY_MODULE_FILE, _args).ConfigureAwait(false);

            return(result);
        }
        public void INodeJSService_InvokeFromCache_Setup()
        {
            var services = new ServiceCollection();

            services.AddNodeJS();
            _serviceProvider = services.BuildServiceProvider();
            _nodeJSService   = _serviceProvider.GetRequiredService <INodeJSService>(); // Default INodeJSService is HttpNodeJSService
            _counter         = 0;

            // Cache module
            DummyResult _ = _nodeJSService.InvokeFromStringAsync <DummyResult>("module.exports = (callback, resultString) => callback(null, { result: resultString });", DUMMY_MODULE_IDENTIFIER, args: new object[] { $"success {_counter++}" }).Result;
        }
        public async void InvokeFromFileAsync_InvokesJavascript()
        {
            // Arrange
            const string dummyResultString = "success";

            // Act
            DummyResult result = await StaticNodeJSService.
                                 InvokeFromFileAsync <DummyResult>("dummyModule.js", args : new[] { dummyResultString }).ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyResultString, result.Result);
        }
        public async void InvokeFromStringAsync_InvokesJavascript()
        {
            // Arrange
            const string dummyResultString = "success";

            // Act
            DummyResult result = await StaticNodeJSService.
                                 InvokeFromStringAsync <DummyResult>("module.exports = (callback, resultString) => callback(null, {result: resultString});", args : new[] { dummyResultString }).ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyResultString, result.Result);
        }
        public async void InvokeFromFileAsync_InvokesJavascript()
        {
            const string      dummyResultString = "success";
            HttpNodeJSService testSubject       = CreateHttpNodeJSService();

            // Act
            DummyResult result = await testSubject.
                                 InvokeFromFileAsync <DummyResult>("dummyModule.js", args : new[] { dummyResultString }).ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyResultString, result.Result);
        }
        public async void InvokeFromFileAsync_WithTypeParameter_InvokesFromFile()
        {
            const string      dummyArg    = "success";
            HttpNodeJSService testSubject = CreateHttpNodeJSService(projectPath: _projectPath);

            // Act
            DummyResult result = await testSubject.
                                 InvokeFromFileAsync <DummyResult>(DUMMY_RETURNS_ARG_MODULE_FILE, args : new[] { dummyArg }).ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyArg, result.Result);
        }
Пример #8
0
        public void BeCreatedResult_Throws_When_Subject_Isnt_ContentResult()
        {
            // Arrange
            var target = new DummyResult();
            var sut    = new ResultAssertions(target);

            // Act & Assert
            sut.Invoking(x => x.BeCreatedResult())
            .Should()
            .Throw <XunitException>()
            .WithMessage($"Expected result to be of type Microsoft.AspNetCore.Mvc.ContentResult, but found {target.GetType().FullName}.");
        }
        public async void InvokeFromStreamAsync_WithTypeParameter_WithRawStreamModule_InvokesFromStream()
        {
            // Arrange
            const string      dummyArg     = "success";
            HttpNodeJSService testSubject  = CreateHttpNodeJSService();
            MemoryStream      memoryStream = CreateMemoryStream(_dummyReturnsArgModule);

            // Act
            DummyResult result = await testSubject.InvokeFromStreamAsync <DummyResult>(memoryStream, args : new[] { dummyArg }).ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyArg, result.Result);
        }
        public async void AllInvokeMethods_InvokeAsyncJavascriptMethods()
        {
            // Arrange
            const string      dummyArg    = "success";
            HttpNodeJSService testSubject = CreateHttpNodeJSService();

            // Act
            DummyResult result = await testSubject.
                                 InvokeFromStringAsync <DummyResult>("module.exports = async (resultString) => {return {result: resultString};}", args : new[] { dummyArg }).ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyArg, result.Result);
        }
        public async void AllInvokeMethods_InvokeASpecificExportIfExportNameIsNotNull()
        {
            // Arrange
            const string      dummyArg        = "success";
            const string      dummyExportName = "dummyExportName";
            HttpNodeJSService testSubject     = CreateHttpNodeJSService();

            // Act
            DummyResult result = await testSubject.
                                 InvokeFromStringAsync <DummyResult>($"module.exports = {{ {dummyExportName}: (callback, resultString) => callback(null, {{result: resultString}}) }};", exportName : dummyExportName, args : new[] { dummyArg }).ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyArg, result.Result);
        }
        public async void InvokeFromFileAsync_WithoutTypeParameter_InvokesFromFile()
        {
            const string      dummyArg    = "success";
            HttpNodeJSService testSubject = CreateHttpNodeJSService(projectPath: _projectPath);

            // Act
            await testSubject.InvokeFromFileAsync(DUMMY_EXPORTS_MULTIPLE_FUNCTIONS_MODULE_FILE, "setString", new[] { dummyArg }).ConfigureAwait(false);

            // Assert
            DummyResult result = await testSubject.
                                 InvokeFromFileAsync <DummyResult>(DUMMY_EXPORTS_MULTIPLE_FUNCTIONS_MODULE_FILE, "getString").ConfigureAwait(false);

            Assert.Equal(dummyArg, result.Result);
        }
        public async void InvokeFromStringAsync_WithTypeParameter_WithModuleFactory_InvokesFromCacheIfModuleIsCached()
        {
            // Arrange
            const string      dummyArg    = "success";
            HttpNodeJSService testSubject = CreateHttpNodeJSService();
            await testSubject.InvokeFromStringAsync(_dummyExportsMultipleFunctionsModule, DUMMY_CACHE_IDENTIFIER, "setString", new[] { dummyArg }).ConfigureAwait(false);

            // Act
            DummyResult result = await testSubject.
                                 InvokeFromStringAsync <DummyResult>(() => null, DUMMY_CACHE_IDENTIFIER, "getString").ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyArg, result.Result);
        }
        public async void InvokeFromStringAsync_WithoutTypeParameter_WithRawStringModule_InvokesFromString()
        {
            const string      dummyArg    = "success";
            HttpNodeJSService testSubject = CreateHttpNodeJSService(projectPath: _projectPath);

            // Act
            await testSubject.InvokeFromStringAsync(_dummyExportsMultipleFunctionsModule, DUMMY_CACHE_IDENTIFIER, "setString", new[] { dummyArg }).ConfigureAwait(false);

            // Assert
            DummyResult result = await testSubject.
                                 InvokeFromStringAsync <DummyResult>(_dummyExportsMultipleFunctionsModule, DUMMY_CACHE_IDENTIFIER, "getString").ConfigureAwait(false);

            Assert.Equal(dummyArg, result.Result);
        }
        public async void InvokeFromStringAsync_WithTypeParameter_WithModuleFactory_InvokesFromStringAndCachesModuleIfModuleIsNotCached()
        {
            // Arrange
            const string      dummyArg    = "success";
            HttpNodeJSService testSubject = CreateHttpNodeJSService();

            // Act
            // Module hasn't been cached, so if this returns the expected value, string was sent over
            DummyResult result1 = await testSubject.
                                  InvokeFromStringAsync <DummyResult>(() => _dummyReturnsArgModule, DUMMY_CACHE_IDENTIFIER, args : new[] { dummyArg }).ConfigureAwait(false);

            // Assert
            // Ensure module was cached
            (bool success, DummyResult result2) = await testSubject.TryInvokeFromCacheAsync <DummyResult>(DUMMY_CACHE_IDENTIFIER, args : new[] { dummyArg }).ConfigureAwait(false);

            Assert.Equal(dummyArg, result1.Result);
            Assert.True(success);
            Assert.Equal(dummyArg, result2.Result);
        }
        public async void DisposeServiceProvider_DisposesServiceProvider()
        {
            // Arrange
            const string dummyTestVariableName  = "TEST_VARIABLE";
            const string dummyTestVariableValue = "testVariableValue";

            StaticNodeJSService.
            Configure <NodeJSProcessOptions>(options => options.EnvironmentVariables.Add(dummyTestVariableName, dummyTestVariableValue));
            DummyResult initialInvocationResult = await StaticNodeJSService.
                                                  InvokeFromStringAsync <DummyResult>($"module.exports = (callback) => callback(null, {{result: process.env.{dummyTestVariableName}}});").
                                                  ConfigureAwait(false);

            // Act
            StaticNodeJSService.DisposeServiceProvider(); // Dispose, environment variable should not be set in the next call
            DummyResult result = await StaticNodeJSService.
                                 InvokeFromStringAsync <DummyResult>($"module.exports = (callback) => callback(null, {{result: process.env.{dummyTestVariableName}}});").
                                 ConfigureAwait(false);

            // Assert
            Assert.Equal(dummyTestVariableValue, initialInvocationResult.Result);
            Assert.Null(result.Result);
        }
Пример #17
0
 public SpyComponent(List <SpyComponent> invokedComponents, DummyResult result = null)
 {
     _invokedComponents = invokedComponents;
     _result            = result;
 }
Пример #18
0
 public SpyMiddlewareFactory(List <SpyComponent> invokedFactories, List <SpyComponent> invokedComponents, DummyResult result = null) : base(invokedComponents, result)
 {
     _invokedFactories = invokedFactories;
 }
Пример #19
0
        public void Layers_and_Invoke()
        {
            {
                var invokedFactories  = new List <SpyComponent>();
                var invokedComponents = new List <SpyComponent>();
                var factory1          = new SpyMiddlewareFactory(invokedFactories, invokedComponents);
                var factory2          = new SpyMiddlewareFactory(invokedFactories, invokedComponents);
                var factory3          = new SpyMiddlewareFactory(invokedFactories, invokedComponents);
                var handlerResult     = new DummyResult();
                var handler           = new SpyHandler(invokedComponents, handlerResult);

                var expectedResult     = handlerResult;
                var expectedFactories  = new SpyComponent[] { factory1, factory2, factory3 };
                var expectedComponents = new SpyComponent[] { factory3, factory2, factory1, handler };

                new TestCaseRunner("middlewares 及び handler が順番通りに呼ばれる")
                .Run(() => new Func <DummyContext, DummyResult>(handler.Invoke)
                     .Layer(factory1.Create)
                     .Layer(factory2.Create)
                     .Layer(factory3.Create)
                     )
                .Verify((actual, desc) => {
                    var context      = new DummyContext();
                    var actualResult = actual(context);

                    Assert.AreEqual(expectedResult, actualResult, desc);
                    CollectionAssert.AreEqual(expectedFactories, invokedFactories, $"{desc}: ファクトリーの呼び出し順序が一致しません。");
                    CollectionAssert.AreEqual(expectedComponents, invokedComponents, $"{desc}: コンポーネントの実行順序が一致しません。");
                    Assert.IsTrue(invokedComponents.All(x => x.ActualContext == context), desc);
                }, (Type)null);
            }

            {
                var invokedFactories  = new List <SpyComponent>();
                var invokedComponents = new List <SpyComponent>();
                var result2           = new DummyResult();
                var factory1          = new SpyMiddlewareFactory(invokedFactories, invokedComponents);
                var factory2          = new SpyMiddlewareFactory(invokedFactories, invokedComponents, result2);
                var factory3          = new SpyMiddlewareFactory(invokedFactories, invokedComponents);
                var handler           = new SpyHandler(invokedComponents, new DummyResult());

                var expectedResult     = result2;
                var expectedFactories  = new SpyComponent[] { factory1, factory2, factory3 };
                var expectedComponents = new SpyComponent[] { factory3, factory2 };

                new TestCaseRunner("middleware2 でショートサーキット")
                .Run(() => new Func <DummyContext, DummyResult>(handler.Invoke)
                     .Layer(factory1.Create)
                     .Layer(factory2.Create)
                     .Layer(factory3.Create)
                     )
                .Verify((actual, desc) => {
                    var context      = new DummyContext();
                    var actualResult = actual(context);

                    Assert.AreEqual(expectedResult, actualResult, desc);
                    CollectionAssert.AreEqual(expectedFactories, invokedFactories, $"{desc}: ファクトリーの呼び出し順序が一致しません。");
                    CollectionAssert.AreEqual(expectedComponents, invokedComponents, $"{desc}: コンポーネントの実行順序が一致しません。");
                    Assert.IsTrue(invokedComponents.All(x => x.ActualContext == context), desc);
                }, (Type)null);
            }
        }
Пример #20
0
        public async Task <DummyResult> INodeServices_Latency()
        {
            DummyResult result = await _nodeServices.InvokeAsync <DummyResult>(DUMMY_LATENCY_MODULE_FILE, _counter ++);

            return(result);
        }
Пример #21
0
        public async Task <DummyResult> INodeServices()
        {
            DummyResult result = await _nodeServices.InvokeAsync <DummyResult>("dummyModule.js", $"success {_counter++}");

            return(result);
        }
Пример #22
0
        public async Task <DummyResult> INodeJSService_InvokeFromFile()
        {
            DummyResult result = await _nodeJSService.InvokeFromFileAsync <DummyResult>("dummyModule.js", args : new object[] { $"success {_counter++}" });

            return(result);
        }
Пример #23
0
 public SpyHandler(List <SpyComponent> invokedComponents, DummyResult result) : base(invokedComponents, result)
 {
 }