Skip to content

Commit e541385

Browse files
authored
Add unit test for the SDK binding feature (#8902)
1 parent ccbd295 commit e541385

File tree

6 files changed

+99
-19
lines changed

6 files changed

+99
-19
lines changed

src/WebJobs.Script.Analyzers/WebJobs.Script.Analyzers.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.3.1" />
2929

3030
<!-- Packed in Microsoft.Azure.Functions.Analyzers NuGet -->
31-
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.35" PrivateAssets="All" IncludeInPackage="true" />
31+
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.36" PrivateAssets="All" IncludeInPackage="true" />
3232
</ItemGroup>
3333

3434
<ItemGroup>

test/WebJobs.Script.Tests.Analyzers/WebJobs.Script.Tests.Analyzers.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
</PropertyGroup>
1212

1313
<ItemGroup>
14-
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.33" />
14+
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.36" />
1515
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="3.0.11" />
1616
<PackageReference Include="Microsoft.Azure.WebJobs.Host.Storage" Version="4.0.4" />
1717
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.XUnit" Version="1.0.1-beta1.21177.1" />

test/WebJobs.Script.Tests/Binding/FunctionBindingTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,5 +173,26 @@ public void ReadAsCollection_StringArray_WithBOM()
173173
Assert.Equal("Value2", (string)collection[1]);
174174
Assert.Equal("Value3", (string)collection[2]);
175175
}
176+
177+
[Fact]
178+
public async Task BindParameterBindingDataAsync()
179+
{
180+
string contentString = "hello world";
181+
ParameterBindingData bindingData = new("1.0.0", "AzureStorageBlob", BinaryData.FromString(contentString), "application/json");
182+
183+
var binderMock = new Mock<Binder>(MockBehavior.Strict);
184+
var attributes = new Attribute[] { new BlobAttribute("test") };
185+
binderMock.Setup(p => p.BindAsync<ParameterBindingData>(attributes, CancellationToken.None)).ReturnsAsync(bindingData);
186+
187+
BindingContext bindingContext = new BindingContext
188+
{
189+
Attributes = attributes,
190+
Binder = binderMock.Object
191+
};
192+
193+
await FunctionBinding.BindParameterBindingDataAsync(bindingContext);
194+
195+
Assert.Equal(bindingData, bindingContext.Value);
196+
}
176197
}
177198
}

test/WebJobs.Script.Tests/Binding/GeneralScriptBindingProviderTests.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,33 @@ public class GeneralScriptBindingProviderTests
2121
[InlineData(null, null, typeof(object))]
2222
[InlineData(null, "many", typeof(object[]))]
2323
[InlineData("string", null, typeof(string))]
24-
[InlineData("StRing", null, typeof(string))] // case insenstive
25-
[InlineData("string", "mANy", typeof(string[]))] // case insensitve
24+
[InlineData("StRing", null, typeof(string))] // case insensitive
25+
[InlineData("string", "mANy", typeof(string[]))] // case insensitive
2626
[InlineData("binary", null, typeof(byte[]))]
2727
[InlineData("binary", "many", typeof(byte[][]))]
2828
[InlineData("stream", null, typeof(Stream))]
2929
[InlineData("stream", "many", typeof(Stream[]))] // nonsense?
30-
public void Validate(string dataType, string cardinality, Type expectedType)
30+
[InlineData("string", null, typeof(ParameterBindingData), true)]
31+
[InlineData("string", "many", typeof(ParameterBindingData[]), true)]
32+
[InlineData(null, null, typeof(ParameterBindingData), true)]
33+
[InlineData(null, "many", typeof(ParameterBindingData[]), true)]
34+
public void Validate(string dataType, string cardinality, Type expectedType, bool supportsDeferredBinding = false)
3135
{
32-
var ctx = New(dataType, cardinality);
36+
var ctx = New(dataType, cardinality, supportsDeferredBinding);
3337
var type = GeneralScriptBindingProvider.GetRequestedType(ctx);
3438
Assert.Equal(expectedType, type);
3539
}
3640

37-
private static ScriptBindingContext New(string dataType, string cardinality)
41+
private static ScriptBindingContext New(string dataType, string cardinality, bool supportsDeferredBinding)
3842
{
39-
var jobj = new JObject();
40-
jobj["type"] = "test";
41-
jobj["direction"] = "in";
42-
jobj["datatype"] = dataType;
43-
jobj["cardinality"] = cardinality;
44-
return new ScriptBindingContext(jobj);
43+
var bindingMetadataJObject = new JObject();
44+
bindingMetadataJObject["type"] = "test";
45+
bindingMetadataJObject["direction"] = "in";
46+
bindingMetadataJObject["datatype"] = dataType;
47+
bindingMetadataJObject["cardinality"] = cardinality;
48+
bindingMetadataJObject["properties"] = new JObject { { "supportsDeferredBinding", supportsDeferredBinding } };
49+
50+
return new ScriptBindingContext(bindingMetadataJObject);
4551
}
4652

4753
[Fact]

test/WebJobs.Script.Tests/Description/Worker/WorkerFunctionDescriptorProviderTests.cs

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,54 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.IO;
7+
using System.Threading.Tasks;
68
using Microsoft.Azure.WebJobs.Script.Binding;
79
using Microsoft.Azure.WebJobs.Script.Description;
810
using Microsoft.Azure.WebJobs.Script.Extensibility;
911
using Microsoft.Azure.WebJobs.Script.Workers;
12+
using Microsoft.Extensions.DependencyInjection;
1013
using Microsoft.Extensions.Hosting;
1114
using Microsoft.Extensions.Logging;
1215
using Microsoft.Extensions.Logging.Abstractions;
16+
using Microsoft.Extensions.Options;
1317
using Microsoft.WebJobs.Script.Tests;
1418
using Moq;
1519
using Newtonsoft.Json.Linq;
1620
using Xunit;
1721

1822
namespace Microsoft.Azure.WebJobs.Script.Tests
1923
{
20-
public class WorkerFunctionDescriptorProviderTests
24+
public class WorkerFunctionDescriptorProviderTests : IDisposable
2125
{
2226
private IHost _host;
2327
private TestWorkerDescriptorProvider _provider;
2428

2529
public WorkerFunctionDescriptorProviderTests()
2630
{
27-
var scriptHostOptions = new ScriptJobHostOptions();
28-
var bindingProviders = new Mock<ICollection<IScriptBindingProvider>>();
2931
var mockApplicationLifetime = new Mock<Microsoft.AspNetCore.Hosting.IApplicationLifetime>();
3032
var mockFunctionInvocationDispatcher = new Mock<IFunctionInvocationDispatcher>();
3133

34+
string rootPath = Path.Combine(Environment.CurrentDirectory, @"TestScripts\Node");
35+
3236
_host = new HostBuilder().ConfigureDefaultTestWebScriptHost(b =>
3337
{
3438
b.AddAzureStorage();
35-
}).Build();
39+
},
40+
o =>
41+
{
42+
o.ScriptPath = rootPath;
43+
o.LogPath = TestHelpers.GetHostLogFileDirectory().Parent.FullName;
44+
})
45+
.Build();
3646

3747
var scriptHost = _host.GetScriptHost();
48+
scriptHost.InitializeAsync().GetAwaiter().GetResult();
49+
50+
var config = _host.Services.GetService<IOptions<ScriptJobHostOptions>>().Value;
51+
var providers = _host.Services.GetService<ICollection<IScriptBindingProvider>>();
3852

39-
_provider = new TestWorkerDescriptorProvider(scriptHost, null, bindingProviders.Object, mockFunctionInvocationDispatcher.Object,
53+
_provider = new TestWorkerDescriptorProvider(scriptHost, config, providers, mockFunctionInvocationDispatcher.Object,
4054
NullLoggerFactory.Instance, mockApplicationLifetime.Object, TimeSpan.FromSeconds(5));
4155
}
4256

@@ -97,6 +111,45 @@ public void BindingAttributeContainsExpression_DoesNotFindRegexMatch_ReturnsFals
97111
Assert.False(result);
98112
}
99113

114+
[Theory]
115+
[InlineData(true, true, typeof(byte[]))]
116+
[InlineData(false, true, typeof(byte[]))]
117+
[InlineData(false, false, typeof(byte[]))]
118+
public async Task CreateTriggerParameter_DeferredBindingFlags_SetsTriggerType(bool supportsDeferredBinding, bool skipDeferredBinding, Type expectedType)
119+
{
120+
string bindingJson = $@"{{""name"":""book"",""direction"":""In"",""type"":""blobTrigger"",""blobPath"":""expression-trigger"",""connection"":""AzureWebJobsStorage"",""properties"":{{""SupportsDeferredBinding"":""{supportsDeferredBinding}""}}}}";
121+
122+
BindingMetadata metadata = BindingMetadata.Create(JObject.Parse(bindingJson));
123+
metadata.Properties.Add("SkipDeferredBinding", skipDeferredBinding);
124+
125+
FunctionMetadata functionMetadata = new FunctionMetadata();
126+
functionMetadata.Bindings.Add(metadata);
127+
128+
try
129+
{
130+
var (created, descriptor) = await _provider.TryCreate(functionMetadata);
131+
Assert.Equal(expectedType, descriptor.TriggerParameter.Type);
132+
}
133+
catch (Exception ex)
134+
{
135+
Assert.True(false, "Exception not expected:" + ex.Message);
136+
throw;
137+
}
138+
}
139+
140+
protected virtual void Dispose(bool disposing)
141+
{
142+
if (disposing)
143+
{
144+
_host?.Dispose();
145+
}
146+
}
147+
148+
public void Dispose()
149+
{
150+
Dispose(true);
151+
}
152+
100153
private class TestWorkerDescriptorProvider : WorkerFunctionDescriptorProvider
101154
{
102155
public TestWorkerDescriptorProvider(ScriptHost host, ScriptJobHostOptions config, ICollection<IScriptBindingProvider> bindingProviders,

tools/ExtensionsMetadataGenerator/test/ExtensionsMetadataGeneratorTests/ExtensionsMetadataGeneratorTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
</ItemGroup>
1212

1313
<ItemGroup>
14-
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.5" />
14+
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.36" />
1515
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
1616
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
1717
<PackageReference Include="xunit" Version="2.4.0" />

0 commit comments

Comments
 (0)