// Copyright 2016-2020, Pulumi Corporation using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Threading.Tasks; using Pulumi.Testing; using Xunit; namespace Pulumi.Tests.Mocks { class MyMocks : IMocks { public Task CallAsync(string token, ImmutableDictionary args, string? provider) { return Task.FromResult(args); } public Task<(string id, object state)> NewResourceAsync(string type, string name, ImmutableDictionary inputs, string? provider, string? id) { switch (type) { case "aws:ec2/instance:Instance": return Task.FromResult<(string, object)>(("i-1234567890abcdef0", new Dictionary { { "publicIp", "203.0.113.12" }, })); case "pkg:index:MyCustom": return Task.FromResult<(string, object)>((name + "_id", inputs)); default: throw new Exception($"Unknown resource {type}"); } } } public partial class MocksTests { [Fact] public async Task TestCustom() { var resources = await Testing.RunAsync(); var instance = resources.OfType().FirstOrDefault(); Assert.NotNull(instance); var ip = await instance.PublicIp.GetValueAsync(); Assert.Equal("203.0.113.12", ip); } [Fact] public async Task TestCustomWithResourceReference() { var resources = await Testing.RunAsync(); var mycustom = resources.OfType().FirstOrDefault(); Assert.NotNull(mycustom); var instance = await mycustom.Instance.GetValueAsync(); Assert.IsType(instance); var ip = await instance.PublicIp.GetValueAsync(); Assert.Equal("203.0.113.12", ip); } [Fact] public async Task TestStack() { var resources = await Testing.RunAsync(); var stack = resources.OfType().FirstOrDefault(); Assert.NotNull(stack); var ip = await stack.PublicIp.GetValueAsync(); Assert.Equal("203.0.113.12", ip); } } public static class Testing { public static Task> RunAsync() where T : Stack, new() { return Deployment.TestAsync(new MyMocks(), new TestOptions { IsPreview = false }); } public static Task GetValueAsync(this Output output) { var tcs = new TaskCompletionSource(); output.Apply(v => { tcs.SetResult(v); return v; }); return tcs.Task; } } }