# coding: utf-8

from __future__ import absolute_import, print_function, unicode_literals

import pytest
import salt.runner
from tests.support.helpers import slowTest
from tests.support.mixins import AdaptedConfigurationTestCaseMixin
from tests.support.unit import TestCase


@pytest.mark.windows_whitelisted
class RunnerModuleTest(TestCase, AdaptedConfigurationTestCaseMixin):
    # This is really an integration test since it needs a salt-master running
    eauth_creds = {
        "username": "saltdev_auto",
        "password": "saltdev",
        "eauth": "auto",
    }

    def setUp(self):
        """
        Configure an eauth user to test with
        """
        self.runner = salt.runner.RunnerClient(self.get_config("client_config"))

    @slowTest
    def test_eauth(self):
        """
        Test executing master_call with lowdata

        The choice of using error.error for this is arbitrary and should be
        changed to some mocked function that is more testing friendly.
        """
        low = {
            "client": "runner",
            "fun": "error.error",
        }
        low.update(self.eauth_creds)

        self.runner.master_call(**low)

    @slowTest
    def test_token(self):
        """
        Test executing master_call with lowdata

        The choice of using error.error for this is arbitrary and should be
        changed to some mocked function that is more testing friendly.
        """
        import salt.auth

        auth = salt.auth.LoadAuth(self.get_config("client_config"))
        token = auth.mk_token(self.eauth_creds)

        self.runner.master_call(
            **{"client": "runner", "fun": "error.error", "token": token["token"]}
        )

    @slowTest
    def test_cmd_sync(self):
        low = {
            "client": "runner",
            "fun": "error.error",
        }
        low.update(self.eauth_creds)

        self.runner.cmd_sync(low)

    @slowTest
    def test_cmd_async(self):
        low = {
            "client": "runner",
            "fun": "error.error",
        }
        low.update(self.eauth_creds)

        self.runner.cmd_async(low)

    @slowTest
    def test_cmd_sync_w_arg(self):
        low = {
            "fun": "test.arg",
            "foo": "Foo!",
            "bar": "Bar!",
        }
        low.update(self.eauth_creds)

        ret = self.runner.cmd_sync(low)
        self.assertEqual(ret["kwargs"]["foo"], "Foo!")
        self.assertEqual(ret["kwargs"]["bar"], "Bar!")

    @slowTest
    def test_wildcard_auth(self):
        low = {
            "username": "the_s0und_of_t3ch",
            "password": "willrockyou",
            "eauth": "auto",
            "fun": "test.arg",
            "foo": "Foo!",
            "bar": "Bar!",
        }
        self.runner.cmd_sync(low)

    @slowTest
    def test_full_return_kwarg(self):
        low = {"fun": "test.arg"}
        low.update(self.eauth_creds)
        ret = self.runner.cmd_sync(low, full_return=True)
        self.assertIn("success", ret["data"])

    @slowTest
    def test_cmd_sync_arg_kwarg_parsing(self):
        low = {
            "client": "runner",
            "fun": "test.arg",
            "arg": ["foo", "bar=off", "baz={qux: 123}"],
            "kwarg": {"quux": "Quux"},
            "quuz": "on",
        }
        low.update(self.eauth_creds)

        ret = self.runner.cmd_sync(low)
        self.assertEqual(
            ret,
            {
                "args": ["foo"],
                "kwargs": {
                    "bar": False,
                    "baz": {"qux": 123},
                    "quux": "Quux",
                    "quuz": "on",
                },
            },
        )

    @slowTest
    def test_invalid_kwargs_are_ignored(self):
        low = {
            "client": "runner",
            "fun": "test.metasyntactic",
            "thiskwargisbad": "justpretendimnothere",
        }
        low.update(self.eauth_creds)

        ret = self.runner.cmd_sync(low)
        self.assertEqual(ret[0], "foo")

@@ -1,95 +1,4 @@
-# coding: utf-8%0A%0Afrom __future__ import absolute_import, print_function, unicode_literals%0A%0A
 impo

Drop Py2 and six on tests/integration/client/test_runner.py