in src/Bicep.Local.Deploy.IntegrationTests/EndToEndDeploymentTests.cs [51:197]
public async Task End_to_end_deployment_basic()
{
var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(GetMockLocalDeployPackage(), new(ExtensibilityEnabled: true, LocalDeployEnabled: true));
var result = await CompilationHelper.RestoreAndCompileParams(services,
("bicepconfig.json", """
{
"extensions": {
"http": "br:example.azurecr.io/extensions/foo:1.2.3"
},
"experimentalFeaturesEnabled": {
"extensibility": true,
"localDeploy": true
}
}
"""),
("main.bicep", """
targetScope = 'local'
extension http
param coords {
latitude: string
longitude: string
}
resource gridpointsReq 'request@v1' = {
uri: 'https://api.weather.gov/points/${coords.latitude},${coords.longitude}'
format: 'raw'
}
var gridpoints = json(gridpointsReq.body).properties
resource forecastReq 'request@v1' = {
uri: 'https://api.weather.gov/gridpoints/${gridpoints.gridId}/${gridpoints.gridX},${gridpoints.gridY}/forecast'
format: 'raw'
}
var forecast = json(forecastReq.body).properties
type forecastType = {
name: string
temperature: int
}
var val = 'Name'
func getForecast() string => 'Forecast: ${val}'
output forecast forecastType[] = map(forecast.periods, p => {
name: p.name
temperature: p.temperature
})
output forecastString string = getForecast()
"""),
("parameters.bicepparam", """
using 'main.bicep'
param coords = {
latitude: '47.6363726'
longitude: '-122.1357068'
}
"""));
result.Should().NotHaveAnyDiagnostics();
var parametersFile = result.Compilation.Emitter.Parameters().Parameters!;
var templateFile = result.Compilation.Emitter.Parameters().Template!.Template!;
JsonObject identifiers = new()
{
{ "name", "someName" },
{ "namespace", "someNamespace" }
};
var extensionMock = StrictMock.Of<LocalExtensibilityHost>();
extensionMock.Setup(x => x.CreateOrUpdate(It.Is<ResourceSpecification>(req => req.Properties["uri"]!.ToString() == "https://api.weather.gov/points/47.6363726,-122.1357068"), It.IsAny<CancellationToken>()))
.Returns<ResourceSpecification, CancellationToken>((req, _) =>
{
req.Type.Should().Be("request");
req.ApiVersion.Should().Be("v1");
req.Properties["body"] = """
{
"properties": {
"gridId": "SEW",
"gridX": "131",
"gridY": "68"
}
}
""";
return Task.FromResult(new LocalExtensibilityOperationResponse(new Resource(req.Type, req.ApiVersion, identifiers, req.Properties, "Succeeded"), null));
});
extensionMock.Setup(x => x.CreateOrUpdate(It.Is<ResourceSpecification>(req => req.Properties["uri"]!.ToString() == "https://api.weather.gov/gridpoints/SEW/131,68/forecast"), It.IsAny<CancellationToken>()))
.Returns<ResourceSpecification, CancellationToken>((req, _) =>
{
req.Type.Should().Be("request");
req.ApiVersion.Should().Be("v1");
req.Properties["body"] = """
{
"properties": {
"periods": [
{
"number": 1,
"name": "Tonight",
"temperature": 47
},
{
"number": 2,
"name": "Wednesday",
"temperature": 68
}
]
}
}
""";
return Task.FromResult(new LocalExtensibilityOperationResponse(new Resource(req.Type, req.ApiVersion, identifiers, req.Properties, "Succeeded"), null));
});
var serviceProvider = services.Build().Construct<IServiceProvider>();
var dispatcher = BicepTestConstants.CreateModuleDispatcher(serviceProvider);
await using LocalExtensibilityHostManager extensibilityHandler = new(
serviceProvider.GetRequiredService<IFileExplorer>(),
dispatcher,
StrictMock.Of<IConfigurationManager>().Object,
StrictMock.Of<ITokenCredentialFactory>().Object,
uri => Task.FromResult(extensionMock.Object));
await extensibilityHandler.InitializeExtensions(result.Compilation);
var localDeployResult = await extensibilityHandler.Deploy(templateFile, parametersFile, TestContext.CancellationTokenSource.Token);
localDeployResult.Deployment.Properties.ProvisioningState.Should().Be(ProvisioningState.Succeeded);
localDeployResult.Deployment.Properties.Outputs["forecastString"].Value.Should().DeepEqual("Forecast: Name");
localDeployResult.Deployment.Properties.Outputs["forecast"].Value.Should().DeepEqual(JToken.Parse("""
[
{
"name": "Tonight",
"temperature": 47
},
{
"name": "Wednesday",
"temperature": 68
}
]
"""));
}