Skip to content

Commit 2c93c87

Browse files
committed
Use Moq, and add more tests
1 parent 23ebd15 commit 2c93c87

File tree

10 files changed

+101
-102
lines changed

10 files changed

+101
-102
lines changed

src/WebJobs.Script.WebHost/Extensions/FunctionMetadataExtensions.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static async Task<FunctionMetadataResponse> ToFunctionMetadataResponse(th
5252

5353
/// <summary>
5454
/// This method converts a FunctionMetadata into a JObject
55-
/// the scale conteller understands. It's mainly the trigger binding
55+
/// the scale controller understands. It's mainly the trigger binding
5656
/// with functionName inserted in it.
5757
/// </summary>
5858
/// <param name="functionMetadata">FunctionMetadata object to convert to a JObject.</param>
@@ -71,7 +71,6 @@ public static async Task<JObject> ToFunctionTrigger(this FunctionMetadata functi
7171
var functionConfig = await GetFunctionConfig(functionMetadataFilePath);
7272

7373
// Find the trigger and add functionName to it
74-
// Q: Do we plan on supporting multiple triggers?
7574
foreach (JObject binding in (JArray)functionConfig["bindings"])
7675
{
7776
var type = (string)binding["type"];
@@ -99,10 +98,7 @@ private static async Task<JObject> GetFunctionConfig(string path)
9998
{
10099
if (FileUtility.FileExists(path))
101100
{
102-
using (var reader = File.OpenText(path))
103-
{
104-
return JObject.Parse(await reader.ReadToEndAsync());
105-
}
101+
return JObject.Parse(await FileUtility.ReadAsync(path));
106102
}
107103
}
108104
catch

src/WebJobs.Script.WebHost/Management/InstanceManager.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.IO;
77
using System.IO.Compression;
8+
using System.Net.Http;
89
using System.Threading.Tasks;
910
using Microsoft.Azure.WebJobs.Script.WebHost.Models;
1011
using Microsoft.Extensions.Logging;
@@ -19,12 +20,14 @@ public class InstanceManager : IInstanceManager
1920
private readonly ScriptHostManager _scriptHostManager;
2021
private readonly WebHostSettings _webHostSettings;
2122
private readonly ILogger _logger;
23+
private readonly HttpClient _client;
2224

23-
public InstanceManager(WebScriptHostManager scriptHostManager, WebHostSettings webHostSettings, ILoggerFactory loggerFactory)
25+
public InstanceManager(WebScriptHostManager scriptHostManager, WebHostSettings webHostSettings, ILoggerFactory loggerFactory, HttpClient client)
2426
{
2527
_scriptHostManager = scriptHostManager;
2628
_webHostSettings = webHostSettings;
2729
_logger = loggerFactory.CreateLogger(nameof(InstanceManager));
30+
_client = client;
2831
}
2932

3033
public bool StartAssignment(HostAssignmentContext assignmentContext)
@@ -83,9 +86,9 @@ private async Task Specialize(HostAssignmentContext assignmentContext)
8386
}
8487
}
8588

86-
private static async Task DownloadAsync(Uri requestUri, string filePath)
89+
private async Task DownloadAsync(Uri requestUri, string filePath)
8790
{
88-
var response = await HttpClientUtility.Instance.GetAsync(requestUri);
91+
var response = await _client.GetAsync(requestUri);
8992
if (!response.IsSuccessStatusCode)
9093
{
9194
throw new InvalidDataException($"Error downloading zip content {requestUri.Authority}/{requestUri.AbsolutePath}");

src/WebJobs.Script.WebHost/Management/WebFunctionsManager.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
using System.Threading.Tasks;
1212
using Microsoft.AspNetCore.Http;
1313
using Microsoft.Azure.WebJobs.Script.Description;
14-
using Microsoft.Azure.WebJobs.Script.Extensions;
1514
using Microsoft.Azure.WebJobs.Script.Management.Models;
1615
using Microsoft.Azure.WebJobs.Script.WebHost.Extensions;
1716
using Microsoft.Azure.WebJobs.Script.WebHost.Helpers;
@@ -26,11 +25,13 @@ public class WebFunctionsManager : IWebFunctionsManager
2625
{
2726
private readonly ScriptHostConfiguration _config;
2827
private readonly ILogger _logger;
28+
private readonly HttpClient _client;
2929

30-
public WebFunctionsManager(WebHostSettings webSettings, ILoggerFactory loggerFactory)
30+
public WebFunctionsManager(WebHostSettings webSettings, ILoggerFactory loggerFactory, HttpClient client)
3131
{
3232
_config = WebHostResolver.CreateScriptHostConfiguration(webSettings);
3333
_logger = loggerFactory?.CreateLogger(ScriptConstants.LogCategoryKeysController);
34+
_client = client;
3435
}
3536

3637
/// <summary>
@@ -125,7 +126,7 @@ await functionMetadata
125126
/// <returns>(success, FunctionMetadataResponse)</returns>
126127
public async Task<(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request)
127128
{
128-
var functionMetadata = ScriptHost.ReadFunctionMetadata(Path.Combine(_config.RootScriptPath, name), new Dictionary<string, Collection<string>>());
129+
var functionMetadata = ScriptHost.ReadFunctionMetadata(Path.Combine(_config.RootScriptPath, name), new Dictionary<string, Collection<string>>(), fileSystem: FileUtility.Instance);
129130
if (functionMetadata != null)
130131
{
131132
return (true, await functionMetadata.ToFunctionMetadataResponse(request, _config));
@@ -211,7 +212,7 @@ await functionMetadata
211212
request.Headers.Add("x-ms-site-restricted-token", token);
212213
request.Content = new StringContent(content, Encoding.UTF8, "application/json");
213214

214-
var response = await HttpClientUtility.Instance.SendAsync(request);
215+
var response = await _client.SendAsync(request);
215216
return response.IsSuccessStatusCode
216217
? (true, string.Empty)
217218
: (false, $"Sync triggers failed with: {response.StatusCode}");
@@ -221,7 +222,7 @@ await functionMetadata
221222
private IEnumerable<FunctionMetadata> GetFunctionsMetadata()
222223
{
223224
return ScriptHost
224-
.ReadFunctionsMetadata(FileUtility.EnumerateDirectories(_config.RootScriptPath), _logger, new Dictionary<string, Collection<string>>());
225+
.ReadFunctionsMetadata(FileUtility.EnumerateDirectories(_config.RootScriptPath), _logger, new Dictionary<string, Collection<string>>(), fileSystem: FileUtility.Instance);
225226
}
226227

227228
private async Task<string> GetDurableTaskHubName()
@@ -244,8 +245,6 @@ private async Task<string> GetDurableTaskHubName()
244245

245246
private void DeleteFunctionArtifacts(FunctionMetadataResponse function)
246247
{
247-
// TODO: clear secrets
248-
// TODO: clear logs
249248
var testDataPath = function.GetFunctionTestDataFilePath(_config);
250249

251250
if (!string.IsNullOrEmpty(testDataPath))

src/WebJobs.Script.WebHost/WebJobsServiceCollectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Linq;
6+
using System.Net.Http;
67
using Autofac;
78
using Autofac.Core;
89
using Autofac.Extensions.DependencyInjection;
@@ -114,6 +115,7 @@ public static IServiceProvider AddWebJobsScriptHost(this IServiceCollection serv
114115
builder.Register<ISecretManager>(c => c.Resolve<WebHostResolver>().GetSecretManager()).ExternallyOwned();
115116
builder.RegisterType<WebFunctionsManager>().As<IWebFunctionsManager>().SingleInstance();
116117
builder.RegisterType<InstanceManager>().As<IInstanceManager>().SingleInstance();
118+
builder.Register(_ => new HttpClient()).SingleInstance();
117119
builder.RegisterType<VirtualFileSystem>();
118120
builder.RegisterType<VirtualFileSystemMiddleware>();
119121

src/WebJobs.Script/Extensions/HttpClientUtility.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/WebJobs.Script/Host/ScriptHost.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,7 +1086,7 @@ private static FunctionMetadata ParseFunctionMetadata(string functionName, JObje
10861086
return functionMetadata;
10871087
}
10881088

1089-
public static Collection<FunctionMetadata> ReadFunctionsMetadata(IEnumerable<string> functionDirectories, ILogger logger, Dictionary<string, Collection<string>> functionErrors, ScriptSettingsManager settingsManager = null, IEnumerable<string> functionWhitelist = null)
1089+
public static Collection<FunctionMetadata> ReadFunctionsMetadata(IEnumerable<string> functionDirectories, ILogger logger, Dictionary<string, Collection<string>> functionErrors, ScriptSettingsManager settingsManager = null, IEnumerable<string> functionWhitelist = null, IFileSystem fileSystem = null)
10901090
{
10911091
var functions = new Collection<FunctionMetadata>();
10921092
settingsManager = settingsManager ?? ScriptSettingsManager.Instance;
@@ -1098,7 +1098,7 @@ public static Collection<FunctionMetadata> ReadFunctionsMetadata(IEnumerable<str
10981098

10991099
foreach (var scriptDir in functionDirectories)
11001100
{
1101-
var function = ReadFunctionMetadata(scriptDir, functionErrors, settingsManager, functionWhitelist);
1101+
var function = ReadFunctionMetadata(scriptDir, functionErrors, settingsManager, functionWhitelist, fileSystem);
11021102
if (function != null)
11031103
{
11041104
functions.Add(function);
@@ -1108,7 +1108,7 @@ public static Collection<FunctionMetadata> ReadFunctionsMetadata(IEnumerable<str
11081108
return functions;
11091109
}
11101110

1111-
public static FunctionMetadata ReadFunctionMetadata(string scriptDir, Dictionary<string, Collection<string>> functionErrors, ScriptSettingsManager settingsManager = null, IEnumerable<string> functionWhitelist = null)
1111+
public static FunctionMetadata ReadFunctionMetadata(string scriptDir, Dictionary<string, Collection<string>> functionErrors, ScriptSettingsManager settingsManager = null, IEnumerable<string> functionWhitelist = null, IFileSystem fileSystem = null)
11121112
{
11131113
string functionName = null;
11141114

@@ -1119,8 +1119,9 @@ public static FunctionMetadata ReadFunctionMetadata(string scriptDir, Dictionary
11191119
string json = null;
11201120
try
11211121
{
1122-
// This should be async
1123-
json = FileUtility.ReadAllText(functionConfigPath);
1122+
json = fileSystem != null
1123+
? fileSystem.File.ReadAllText(functionConfigPath)
1124+
: FileUtility.ReadAllText(functionConfigPath);
11241125
}
11251126
catch (FileNotFoundException)
11261127
{
@@ -1143,7 +1144,7 @@ public static FunctionMetadata ReadFunctionMetadata(string scriptDir, Dictionary
11431144

11441145
string functionError = null;
11451146
FunctionMetadata functionMetadata = null;
1146-
if (!TryParseFunctionMetadata(functionName, functionConfig, scriptDir, settingsManager, out functionMetadata, out functionError))
1147+
if (!TryParseFunctionMetadata(functionName, functionConfig, scriptDir, settingsManager, out functionMetadata, out functionError, fileSystem))
11471148
{
11481149
// for functions in error, log the error and don't
11491150
// add to the functions collection

test/WebJobs.Script.Tests/Managment/InstanceManagerTests.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
using Microsoft.Azure.WebJobs.Script.WebHost;
1212
using Microsoft.Azure.WebJobs.Script.WebHost.Management;
1313
using Microsoft.Azure.WebJobs.Script.WebHost.Models;
14-
using NSubstitute;
14+
using Moq;
1515
using Xunit;
1616

1717
namespace Microsoft.Azure.WebJobs.Script.Tests.Managment
@@ -22,29 +22,29 @@ public class InstanceManagerTests : IDisposable
2222
public async Task StartAssignmentShouldUpdateEnvironmentVariables()
2323
{
2424
var loggerFactory = MockNullLogerFactory.CreateLoggerFactory();
25-
var scriptHostManager = Substitute.For<WebScriptHostManager>(new ScriptHostConfiguration(),
26-
Substitute.For<ISecretManagerFactory>(),
27-
Substitute.For<IScriptEventManager>(),
25+
var scriptHostManager = new Mock<WebScriptHostManager>(new ScriptHostConfiguration(),
26+
Mock.Of<ISecretManagerFactory>(),
27+
Mock.Of<IScriptEventManager>(),
2828
new ScriptSettingsManager(),
2929
new WebHostSettings { SecretsPath = Path.GetTempPath() },
30-
Substitute.For<IWebJobsRouter>(),
30+
Mock.Of<IWebJobsRouter>(),
3131
loggerFactory,
3232
null, null, null, null, null, 30, 500);
3333

34-
var scriptSettingManager = Substitute.For<ScriptSettingsManager>();
34+
var scriptSettingManager = new Mock<ScriptSettingsManager>();
3535
var restartCalled = false;
3636
var resetCalled = false;
3737

3838
scriptHostManager
39-
.When(m => m.RestartHost())
40-
.Do(_ => restartCalled = true);
39+
.Setup(m => m.RestartHost())
40+
.Callback(() => restartCalled = true);
4141

4242
scriptSettingManager
43-
.When(m => m.Reset())
44-
.Do(_ => resetCalled = true);
43+
.Setup(m => m.Reset())
44+
.Callback(() => resetCalled = true);
4545

46-
ScriptSettingsManager.Instance = scriptSettingManager;
47-
var instanceManager = new InstanceManager(scriptHostManager, null, loggerFactory);
46+
ScriptSettingsManager.Instance = scriptSettingManager.Object;
47+
var instanceManager = new InstanceManager(scriptHostManager.Object, null, loggerFactory, null);
4848

4949
var envValue = new
5050
{

0 commit comments

Comments
 (0)