"""
Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: MIT-0
"""
from test.testlib.testcase import BaseTestCase
from cfnlint.rules import CloudFormationLintRule  # pylint: disable=E0401


class TestCloudFormationRule(BaseTestCase):
    """ Test CloudFormation Rule """

    def test_base(self):
        """ Test Base Rule """
        class TestRule(CloudFormationLintRule):
            """ Def Rule """
            id = 'E1000'
            shortdesc = 'Test Rule'
            description = 'Test Rule Description'
            source_url = 'https://github.com/aws-cloudformation/cfn-python-lint/'
            tags = ['resources']

        self.assertEqual(TestRule.id, 'E1000')
        self.assertEqual(TestRule.shortdesc, 'Test Rule')
        self.assertEqual(TestRule.description, 'Test Rule Description')
        self.assertEqual(TestRule.source_url,
                         'https://github.com/aws-cloudformation/cfn-python-lint/')
        self.assertEqual(TestRule.tags, ['resources'])

    def test_config(self):
        """ Test Configuration """
        class TestRule(CloudFormationLintRule):
            """ Def Rule """
            id = 'E1000'
            shortdesc = 'Test Rule'
            description = 'Test Rule'
            source_url = 'https://github.com/aws-cloudformation/cfn-python-lint/'
            tags = ['resources']

            def __init__(self):
                """Init"""
                super(TestRule, self).__init__()
                self.config_definition = {
                    'testBoolean': {
                        'default': True,
                        'type': 'boolean'
                    },
                    'testString': {
                        'default': 'default',
                        'type': 'string'
                    },
                    'testInteger': {
                        'default': 1,
                        'type': 'integer'
                    }
                }
                self.configure()

            def get_config(self):
                """ Get the Config """
                return self.config

        rule = TestRule()
        config = rule.get_config()
        self.assertTrue(config.get('testBoolean'))
        self.assertEqual(config.get('testString'), 'default')
        self.assertEqual(config.get('testInteger'), 1)

        rule.configure({
            'testBoolean': 'false',
            'testString': 'new',
            'testInteger': 2
        })

        self.assertFalse(config.get('testBoolean'))
        self.assertEqual(config.get('testString'), 'new')
        self.assertEqual(config.get('testInteger'), 2)
