Ejemplo n.º 1
0
 def setup_method(self):
     self.resource_builder = package.ResourceBuilder(
         application_builder=ApplicationGraphBuilder(),
         deps_builder=DependencyBuilder(),
         build_stage=mock.Mock(spec=BuildStage)
     )
     self.template_gen = package.SAMTemplateGenerator()
Ejemplo n.º 2
0
def test_sam_injects_swagger_doc(sample_app, mock_swagger_generator,
                                 mock_policy_generator):
    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(chalice_app=sample_app, api_gateway_stage='dev')
    template = p.generate_sam_template(config)
    properties = template['Resources']['RestAPI']['Properties']
    assert properties['DefinitionBody'] == {'swagger': 'document'}
Ejemplo n.º 3
0
def test_default_function_memory_size(sample_app, mock_swagger_generator,
                                      mock_policy_generator):
    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(chalice_app=sample_app, api_gateway_stage='dev')
    template = p.generate_sam_template(config)
    properties = template['Resources']['APIHandler']['Properties']
    assert properties['MemorySize'] == 128
Ejemplo n.º 4
0
def test_sam_generates_sam_template_basic(sample_app, mock_swagger_generator,
                                          mock_policy_generator):
    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)
    config = Config.create(chalice_app=sample_app, api_gateway_stage='dev')
    template = p.generate_sam_template(config, 'code-uri')
    # Verify the basic structure is in place.  The specific parts
    # are validated in other tests.
    assert template['AWSTemplateFormatVersion'] == '2010-09-09'
    assert template['Transform'] == 'AWS::Serverless-2016-10-31'
    assert 'Outputs' in template
    assert 'Resources' in template
Ejemplo n.º 5
0
def test_timeout_added_to_function(sample_app,
                                   mock_swagger_generator,
                                   mock_policy_generator):
    p = package.SAMTemplateGenerator(
        mock_swagger_generator, mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(chalice_app=sample_app, api_gateway_stage='dev',
                           app_name='myapp', lambda_timeout=240)
    template = p.generate_sam_template(config)
    properties = template['Resources']['APIHandler']['Properties']
    assert properties['Timeout'] == 240
Ejemplo n.º 6
0
def test_can_inject_environment_vars(sample_app, mock_swagger_generator,
                                     mock_policy_generator):
    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(chalice_app=sample_app,
                           api_gateway_stage='dev',
                           environment_variables={'FOO': 'BAR'})
    template = p.generate_sam_template(config)
    properties = template['Resources']['APIHandler']['Properties']
    assert 'Environment' in properties
    assert properties['Environment']['Variables'] == {'FOO': 'BAR'}
Ejemplo n.º 7
0
def test_sam_injects_policy(sample_app, mock_swagger_generator,
                            mock_policy_generator):
    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)

    mock_policy_generator.generate_policy_from_app_source.return_value = {
        'iam': 'policy',
    }
    config = Config.create(chalice_app=sample_app, api_gateway_stage='dev')
    template = p.generate_sam_template(config)
    assert template['Resources']['APIHandler']['Properties']['Policies'] == [{
        'iam':
        'policy',
    }]
def test_fails_with_custom_auth(sample_app_with_auth, mock_swagger_generator,
                                mock_policy_generator):
    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(chalice_app=sample_app_with_auth,
                           api_gateway_stage='dev',
                           app_name='myapp',
                           manage_iam_role=False,
                           iam_role_arn='role-arn')
    with pytest.raises(package.UnsupportedFeatureError):
        p.generate_sam_template(config)
Ejemplo n.º 9
0
def test_chalice_tag_added_to_function(sample_app,
                                       mock_swagger_generator,
                                       mock_policy_generator):
    p = package.SAMTemplateGenerator(
        mock_swagger_generator, mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(chalice_app=sample_app, api_gateway_stage='dev',
                           app_name='myapp')
    template = p.generate_sam_template(config)
    properties = template['Resources']['APIHandler']['Properties']
    assert properties['Tags'] == {
        'aws-chalice': 'version=%s:stage=dev:app=myapp' % chalice_version}
Ejemplo n.º 10
0
def test_maps_python_version(sample_app, mock_swagger_generator,
                             mock_policy_generator):
    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(
        chalice_app=sample_app,
        api_gateway_stage='dev',
    )
    template = p.generate_sam_template(config)
    expected = config.lambda_python_version
    actual = template['Resources']['APIHandler']['Properties']['Runtime']
    assert actual == expected
Ejemplo n.º 11
0
def test_endpoint_url_reflects_apig_stage(sample_app, mock_swagger_generator,
                                          mock_policy_generator):
    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(
        chalice_app=sample_app,
        api_gateway_stage='prod',
    )
    template = p.generate_sam_template(config)
    endpoint_url = template['Outputs']['EndpointURL']['Value']['Fn::Sub']
    assert endpoint_url == (
        'https://${RestAPI}.execute-api.${AWS::Region}.amazonaws.com/prod/')
Ejemplo n.º 12
0
def test_role_arn_added_to_function(sample_app,
                                    mock_swagger_generator,
                                    mock_policy_generator):
    p = package.SAMTemplateGenerator(
        mock_swagger_generator, mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(
        chalice_app=sample_app, api_gateway_stage='dev', app_name='myapp',
        manage_iam_role=False, iam_role_arn='role-arn')
    template = p.generate_sam_template(config)
    properties = template['Resources']['APIHandler']['Properties']
    assert properties['Role'] == 'role-arn'
    assert 'Policies' not in properties
Ejemplo n.º 13
0
def test_app_with_auth_but_invalid_cfn_name(sample_app,
                                            mock_swagger_generator,
                                            mock_policy_generator):

    # Underscores are not allowed for CFN resource names
    # This instead should be referred to as customauth in CFN templates
    # where the underscore is removed.
    @sample_app.authorizer('custom_auth')
    def custom_auth(auth_request):
        pass

    @sample_app.route('/authorized', authorizer=custom_auth)
    def foo():
        return {}

    # The last four digits come from the hash of the auth name
    cfn_auth_name = 'customauth8767'
    p = package.SAMTemplateGenerator(
        mock_swagger_generator, mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(
        chalice_app=sample_app,
        api_gateway_stage='dev',
    )
    template = p.generate_sam_template(config)
    assert cfn_auth_name in template['Resources']
    auth_function = template['Resources'][cfn_auth_name]
    assert auth_function['Type'] == 'AWS::Serverless::Function'
    assert auth_function['Properties']['Handler'] == 'app.custom_auth'

    # Assert that the invoke permsissions were added as well.
    assert cfn_auth_name + 'InvokePermission' in template['Resources']
    assert template['Resources'][cfn_auth_name + 'InvokePermission'] == {
        'Type': 'AWS::Lambda::Permission',
        'Properties': {
            'Action': 'lambda:InvokeFunction',
            'FunctionName': {
                'Fn::GetAtt': [
                    cfn_auth_name,
                    'Arn'
                ]
            },
            'Principal': 'apigateway.amazonaws.com'
        }
    }
def test_app_incompatible_with_cf(sample_app, mock_swagger_generator,
                                  mock_policy_generator):
    @sample_app.route('/foo')
    def foo_invalid():
        return {}

    p = package.SAMTemplateGenerator(mock_swagger_generator,
                                     mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(chalice_app=sample_app,
                           api_gateway_stage='dev',
                           app_name='sample_invalid_cf')
    template = p.generate_sam_template(config)
    events = template['Resources']['APIHandler']['Properties']['Events']
    # The underscore should be removed from the event name.
    assert 'fooinvalidget2cda' in events
Ejemplo n.º 15
0
def test_app_with_auth(sample_app,
                       mock_swagger_generator,
                       mock_policy_generator):

    @sample_app.authorizer('myauth')
    def myauth(auth_request):
        pass

    @sample_app.route('/authorized', authorizer=myauth)
    def foo():
        return {}
    # The last four digits come from the hash of the auth name
    cfn_auth_name = 'myauthdb6d'

    p = package.SAMTemplateGenerator(
        mock_swagger_generator, mock_policy_generator)
    mock_swagger_generator.generate_swagger.return_value = {
        'swagger': 'document'
    }
    config = Config.create(
        chalice_app=sample_app,
        api_gateway_stage='dev',
    )
    template = p.generate_sam_template(config)
    assert cfn_auth_name in template['Resources']
    auth_function = template['Resources'][cfn_auth_name]
    assert auth_function['Type'] == 'AWS::Serverless::Function'
    assert auth_function['Properties']['Handler'] == 'app.myauth'

    # Assert that the invoke permsissions were added as well.
    assert cfn_auth_name + 'InvokePermission' in template['Resources']
    assert template['Resources'][cfn_auth_name + 'InvokePermission'] == {
        'Type': 'AWS::Lambda::Permission',
        'Properties': {
            'Action': 'lambda:InvokeFunction',
            'FunctionName': {
                'Fn::GetAtt': [
                    cfn_auth_name,
                    'Arn'
                ]
            },
            'Principal': 'apigateway.amazonaws.com'
        }
    }