pulumi/sdk/python/lib/test_with_mocks/test_testing_with_mocks.py
2021-04-26 13:22:10 -07:00

124 lines
4.2 KiB
Python

# Copyright 2016-2018, Pulumi Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import unittest
import pulumi
import grpc
class GrpcError(grpc.RpcError):
def __init__(self, code, details):
self._code = code
self._details = details
def code(self):
return self._code
def details(self):
return self._details
class MyMocks(pulumi.runtime.Mocks):
def call(self, args: pulumi.runtime.MockCallArgs):
if args.token == 'test:index:MyFunction':
return {
'out_value': 59,
}
elif args.token == 'test:index:FailFunction':
return ({}, [('none', 'this function fails!')])
elif args.token == 'test:index:ThrowFunction':
raise GrpcError(42, 'this function throws!')
else:
return {}
def new_resource(self, args: pulumi.runtime.MockResourceArgs):
if args.typ == 'aws:ec2/securityGroup:SecurityGroup':
state = {
'arn': 'arn:aws:ec2:us-west-2:123456789012:security-group/sg-12345678',
'name': args.inputs['name'] if 'name' in args.inputs else args.name + '-sg',
}
return ['sg-12345678', dict(args.inputs, **state)]
elif args.typ == 'aws:ec2/instance:Instance':
state = {
'arn': 'arn:aws:ec2:us-west-2:123456789012:instance/i-1234567890abcdef0',
'instanceState': 'running',
'primaryNetworkInterfaceId': 'eni-12345678',
'privateDns': 'ip-10-0-1-17.ec2.internal',
'public_dns': 'ec2-203-0-113-12.compute-1.amazonaws.com',
'public_ip': '203.0.113.12',
}
return ['i-1234567890abcdef0', dict(args.inputs, **state)]
elif args.typ == 'pkg:index:MyCustom':
return [args.name + '_id', args.inputs]
elif args.typ == 'pulumi:pulumi:StackReference' and 'dns' in args.name:
return [args.name, {'outputs': {'haha': 'business'}}]
else:
return ['', {}]
pulumi.runtime.set_mocks(MyMocks())
# Now actually import the code that creates resources, and then test it.
import resources
class TestingWithMocks(unittest.TestCase):
@pulumi.runtime.test
def test_component(self):
def check_outprop(outprop):
self.assertEqual(outprop, 'output: hello')
return resources.mycomponent.outprop.apply(check_outprop)
@pulumi.runtime.test
def test_custom(self):
def check_ip(ip):
self.assertEqual(ip, '203.0.113.12')
return resources.myinstance.public_ip.apply(check_ip)
@pulumi.runtime.test
def test_custom_resource_reference(self):
def check_instance(instance):
self.assertIsInstance(instance, resources.Instance)
def check_ip(ip):
self.assertEqual(ip, '203.0.113.12')
instance.public_ip.apply(check_ip)
return resources.mycustom.instance.apply(check_instance)
@pulumi.runtime.test
def test_invoke(self):
return self.assertEqual(resources.invoke_result, 59)
@pulumi.runtime.test
def test_invoke_failures(self):
caught = False
try:
pulumi.runtime.invoke("test:index:FailFunction", props={})
except Exception:
caught = True
self.assertTrue(caught)
@pulumi.runtime.test
def test_invoke_throws(self):
caught = False
try:
pulumi.runtime.invoke("test:index:ThrowFunction", props={})
except Exception:
caught = True
self.assertTrue(caught)
@pulumi.runtime.test
def test_stack_reference(self):
def check_outputs(outputs):
self.assertEqual(outputs["haha"], "business")
resources.dns_ref.outputs.apply(check_outputs)