import unittest

from mock import patch

from lesspass.cli import parse_args


class TestParseArgs(unittest.TestCase):
    def test_parse_args_site(self):
        self.assertEqual(parse_args(["site"]).site, "site")

    def test_parse_args_login(self):
        self.assertEqual(parse_args(["site", "login"]).login, "login")

    def test_parse_args_LESSPASS_MASTER_PASSWORD_env_variable(self):
        with patch.dict("os.environ", {"LESSPASS_MASTER_PASSWORD": "password"}):
            self.assertEqual(parse_args([]).master_password, "password")

    def test_parse_args_master_password(self):
        self.assertEqual(
            parse_args(["site", "login", "masterpassword"]).master_password,
            "masterpassword",
        )

    def test_parse_args_l(self):
        self.assertTrue(parse_args(["site", "-l"]).l)
        self.assertTrue(parse_args(["site", "--lowercase"]).l)

    def test_parse_args_u(self):
        self.assertTrue(parse_args(["site", "-u"]).u)
        self.assertTrue(parse_args(["site", "--uppercase"]).u)

    def test_parse_args_d(self):
        self.assertTrue(parse_args(["site", "-d"]).d)
        self.assertTrue(parse_args(["site", "--digits"]).d)

    def test_parse_args_s(self):
        self.assertTrue(parse_args(["site", "-s"]).s)
        self.assertTrue(parse_args(["site", "--symbols"]).s)

    def test_parse_args_lu(self):
        args = parse_args(["site", "-lu"])
        self.assertTrue(args.l)
        self.assertTrue(args.u)
        self.assertFalse(args.d)
        self.assertFalse(args.s)

    def test_parse_args_lud(self):
        args = parse_args(["site", "-lud"])
        self.assertTrue(args.l)
        self.assertTrue(args.u)
        self.assertTrue(args.d)
        self.assertFalse(args.s)

    def test_parse_args_luds(self):
        args = parse_args(["site", "-luds"])
        self.assertTrue(args.l)
        self.assertTrue(args.u)
        self.assertTrue(args.d)
        self.assertTrue(args.s)

    def test_parse_args_no_lowercase(self):
        self.assertTrue(parse_args(["site", "--no-lowercase"]).nl)

    def test_parse_args_no_uppercase(self):
        self.assertTrue(parse_args(["site", "--no-uppercase"]).nu)

    def test_parse_args_no_digits(self):
        self.assertTrue(parse_args(["site", "--no-digits"]).nd)

    def test_parse_args_no_symbols(self):
        self.assertTrue(parse_args(["site", "--no-symbols"]).ns)

    def test_parse_args_length_default(self):
        self.assertEqual(parse_args(["site"]).length, 16)

    def test_parse_args_length_long(self):
        self.assertEqual(parse_args(["site", "--length", "8"]).length, 8)

    def test_parse_args_length_short(self):
        self.assertEqual(parse_args(["site", "-L6"]).length, 6)
        self.assertEqual(parse_args(["site", "-L", "12"]).length, 12)

    def test_parse_args_counter_default(self):
        self.assertEqual(parse_args(["site"]).counter, 1)

    def test_parse_args_counter_long(self):
        self.assertEqual(parse_args(["site", "--counter", "2"]).counter, 2)

    def test_parse_args_counter_short(self):
        self.assertEqual(parse_args(["site", "-C99"]).counter, 99)
        self.assertEqual(parse_args(["site", "-C", "100"]).counter, 100)

    def test_parse_args_clipboard_default(self):
        self.assertFalse(parse_args(["site"]).clipboard)

    def test_parse_args_clipboard_long(self):
        self.assertTrue(parse_args(["site", "--copy"]).clipboard)

    def test_parse_args_clipboard_short(self):
        self.assertTrue(parse_args(["site", "-c"]).clipboard)

    def test_parse_args_prompt_long(self):
        self.assertTrue(parse_args(["--prompt"]).prompt)

    def test_parse_args_prompt_short(self):
        self.assertTrue(parse_args(["-p"]).prompt)

    def test_parse_args_exclude_default(self):
        self.assertEqual(parse_args(["site"]).exclude, None)

    def test_parse_args_exclude(self):
        self.assertEqual(parse_args(["site", "--exclude", "!@$*+-"]).exclude, "!@$*+-")

    def test_parse_args_exclude_single_and_double_quote(self):
        self.assertEqual(parse_args(["site", "--exclude", "\"'"]).exclude, "\"'")

    def test_parse_no_fingerprint(self):
        self.assertTrue(parse_args(["site", "--no-fingerprint"]).no_fingerprint)
        self.assertFalse(parse_args(["site"]).no_fingerprint)

    def test_parse_args_save_path(self):
        self.assertEqual(
            parse_args(["--save", "/tmp/profiles.json"]).save_path, "/tmp/profiles.json"
        )
        self.assertEqual(parse_args(["site"]).save_path, None)
        with patch.dict("os.environ", {"XDG_CONFIG_HOME": "/tmp"}):
            self.assertEqual(
                parse_args(["--save"]).save_path, "/tmp/lesspass/profiles.json"
            )

    def test_parse_args_load_path(self):
        self.assertEqual(
            parse_args(["--load", "/tmp/profiles.json"]).load_path, "/tmp/profiles.json"
        )
        self.assertEqual(parse_args(["site"]).load_path, None)

    def test_parse_args_config_home_path(self):
        self.assertTrue(parse_args([]).config_home_path.endswith("/.config/lesspass"))

    def test_parse_args_XDG_CONFIG_HOME_env_variable(self):
        with patch.dict("os.environ", {"XDG_CONFIG_HOME": "/tmp"}):
            self.assertEqual(parse_args([]).config_home_path, "/tmp/lesspass")

    def test_parse_args_default_base_url(self):
        self.assertEqual(parse_args([]).url, "https://api.lesspass.com/")

    def test_parse_args_default_base_url(self):
        self.assertEqual(
            parse_args(["--url", "https://example.org/"]).url, "https://example.org/"
        )

    def test_nrt_parse_url_add_trailing_slash(self):
        self.assertEqual(
            parse_args(["--url", "https://example.org"]).url, "https://example.org/"
        )
