# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
#     http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file 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.
from awscli.arguments import CLIArgument
from awscli.clidriver import create_clidriver
from awscli.customizations.configservice.putconfigurationrecorder import (
    ConfigurationRecorderArgument,
    RecordingGroupArgument,
    extract_recording_group,
)
from awscli.testutils import unittest


class TestPutConfigurationRecorder(unittest.TestCase):
    def setUp(self):
        self.clidriver = create_clidriver()
        self.session = self.clidriver.session
        self.argument_table = {}
        self.service_model = self.session.get_service_model('config')
        self.operation_model = self.service_model.operation_model(
            'PutConfigurationRecorder'
        )
        configuration_recorder_model = (
            self.operation_model.input_shape.members['ConfigurationRecorder']
        )
        self.old_configuration_recorder_argument = CLIArgument(
            name='configuration-recorder',
            argument_model=configuration_recorder_model,
            operation_model=self.operation_model,
            is_required=True,
            event_emitter=self.session.get_component('event_emitter'),
            serialized_name='ConfigurationRecorder',
        )
        self.argument_table['configuration-recorder'] = (
            self.old_configuration_recorder_argument
        )

    def test_extract_recording_group(self):
        extract_recording_group(self.session, self.argument_table)
        self.assertEqual(len(self.argument_table), 2)

        # Ensure the original argument was replaced with the updated argument.
        self.assertIn('configuration-recorder', self.argument_table)
        new_configuration_recorder_argument = self.argument_table[
            'configuration-recorder'
        ]
        self.assertIsNot(
            new_configuration_recorder_argument,
            self.old_configuration_recorder_argument,
        )
        self.assertIsInstance(
            new_configuration_recorder_argument, ConfigurationRecorderArgument
        )

        # Ensure the recording group member was extracted to an argument
        self.assertIn('recording-group', self.argument_table)
        recording_group_argument = self.argument_table['recording-group']
        self.assertIsInstance(recording_group_argument, RecordingGroupArgument)

    def test_configuration_recorder_when_new_value(self):
        value = '{"name":"myname","roleARN":"myarn"}'
        parameters = {}
        extract_recording_group(self.session, self.argument_table)
        configuration_recorder_argument = self.argument_table[
            'configuration-recorder'
        ]
        configuration_recorder_argument.add_to_params(parameters, value)
        self.assertEqual(
            {'ConfigurationRecorder': {'name': 'myname', 'roleARN': 'myarn'}},
            parameters,
        )

    def test_configuration_recorder_when_update_value(self):
        value = '{"name":"myname","roleARN":"myarn"}'
        parameters = {
            'ConfigurationRecorder': {
                'recordingGroup': {
                    'allSupported': True,
                    'resourceTypes': ['AWS::EC2::Volume'],
                }
            }
        }
        extract_recording_group(self.session, self.argument_table)
        configuration_recorder_argument = self.argument_table[
            'configuration-recorder'
        ]
        configuration_recorder_argument.add_to_params(parameters, value)
        self.assertEqual(
            {
                'ConfigurationRecorder': {
                    'name': 'myname',
                    'roleARN': 'myarn',
                    'recordingGroup': {
                        'allSupported': True,
                        'resourceTypes': ['AWS::EC2::Volume'],
                    },
                }
            },
            parameters,
        )

    def test_recording_group_when_new_value(self):
        value = '{"allSupported":true,"resourceTypes":["AWS::EC2::Volume"]}'
        parameters = {}
        extract_recording_group(self.session, self.argument_table)
        recording_group_argument = self.argument_table['recording-group']
        recording_group_argument.add_to_params(parameters, value)
        self.assertEqual(
            {
                'ConfigurationRecorder': {
                    'recordingGroup': {
                        'allSupported': True,
                        'resourceTypes': ['AWS::EC2::Volume'],
                    }
                }
            },
            parameters,
        )

    def test_recording_group_when_update_value(self):
        value = '{"allSupported":true,"resourceTypes":["AWS::EC2::Volume"]}'
        parameters = {
            'ConfigurationRecorder': {
                'name': 'myname',
                'roleARN': 'myarn',
            }
        }
        extract_recording_group(self.session, self.argument_table)
        recording_group_argument = self.argument_table['recording-group']
        recording_group_argument.add_to_params(parameters, value)
        self.assertEqual(
            {
                'ConfigurationRecorder': {
                    'name': 'myname',
                    'roleARN': 'myarn',
                    'recordingGroup': {
                        'allSupported': True,
                        'resourceTypes': ['AWS::EC2::Volume'],
                    },
                }
            },
            parameters,
        )
