public async Task End_to_end_deployment_basic()

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
  }
]
"""));
    }