#   Copyright 2021 Red Hat, Inc.
#
#   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.
#
try:
    from unittest import mock
except ImportError:
    import mock

from unittest import TestCase
from validations_libs.cli import parseractions

import argparse
from validations_libs.tests.cli.fakes import KEYVALUEACTION_VALUES


class TestParserActions(TestCase):

    def setUp(self):
        self.action = parseractions.KeyValueAction("", "fizz")
        self.mock_parser = mock.MagicMock()
        self.test_values = KEYVALUEACTION_VALUES

        self.mock_namespace = mock.MagicMock()
        self.mock_namespace.fizz = None

        super(TestParserActions, self).setUp()

    def test_keyvalueaction_valid(self):

        self.action(
            self.mock_parser,
            self.mock_namespace,
            self.test_values['valid'])

        self.assertIn('fizz', dir(self.mock_namespace))
        self.assertDictEqual({'foo': 'bar'}, self.mock_namespace.fizz)
        self.tearDown()

    def test_keyvalueaction_invalid_no_eq_sign(self):

        self.assertRaises(
            argparse.ArgumentTypeError,
            self.action,
            self.mock_parser,
            self.mock_namespace,
            self.test_values['invalid_noeq']
        )

        self.assertIn('fizz', dir(self.mock_namespace))
        self.assertDictEqual({}, self.mock_namespace.fizz)
        self.tearDown()

    def test_keyvalueaction_invalid_invalid_multieq(self):

        self.assertRaises(
            argparse.ArgumentTypeError,
            self.action,
            self.mock_parser,
            self.mock_namespace,
            self.test_values['invalid_multieq']
        )

        self.assertIn('fizz', dir(self.mock_namespace))
        self.assertDictEqual({}, self.mock_namespace.fizz)
        self.tearDown()

    def test_keyvalueaction_invalid_invalid_nokey(self):

        self.assertRaises(
            argparse.ArgumentTypeError,
            self.action,
            self.mock_parser,
            self.mock_namespace,
            self.test_values['invalid_nokey']
        )

        self.assertIn('fizz', dir(self.mock_namespace))
        self.assertDictEqual({}, self.mock_namespace.fizz)
        self.tearDown()