File: test_cli.py

package info (click to toggle)
khard 0.20.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 1,428 kB
  • sloc: python: 6,361; makefile: 24; sh: 7
file content (143 lines) | stat: -rw-r--r-- 5,518 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
"""Tests for the cli module"""

import tempfile
import unittest
from argparse import ArgumentTypeError
from unittest import mock

from khard import cli, query

from .helpers import mock_stream


class TestFieldsArgument(unittest.TestCase):
    def test_works_when_choices_match(self):
        t = cli.FieldsArgument("a", "b")
        actual = t("a,b")
        expected = ["a", "b"]
        self.assertListEqual(actual, expected)

    def test_raises_exception_when_choices_dont_match(self):
        t = cli.FieldsArgument("a", "b")
        with self.assertRaises(ArgumentTypeError):
            t("a,c")

    def test_case_does_not_matter(self):
        t = cli.FieldsArgument("a", "b")
        actual = t("a,B")
        expected = ["a", "b"]
        self.assertListEqual(actual, expected)

    def test_only_first_component_must_match_choices_with_nested(self):
        t = cli.FieldsArgument("a", "b", nested=True)
        actual = t("a.c,b")
        expected = ["a.c", "b"]
        self.assertListEqual(actual, expected)


@mock.patch.dict("os.environ", KHARD_CONFIG="test/fixture/minimal.conf")
class TestParseArgs(unittest.TestCase):
    foo = query.TermQuery("foo")
    bar = query.TermQuery("bar")
    baz = query.TermQuery("baz")
    uid = query.FieldQuery("uid", "foo")

    def test_normal_search_terms_create_term_queries(self):
        expected = self.foo
        args, _config = cli.parse_args(["list", "foo"])
        actual = args.search_terms
        self.assertEqual(expected, actual)

    def test_uid_options_create_uid_queries(self):
        expected = self.uid
        args, _config = cli.parse_args(["list", "uid:foo"])
        actual = args.search_terms
        self.assertEqual(expected, actual)

    def test_multiple_search_terms_generate_and_queries(self):
        expected = query.AndQuery(self.foo, self.bar)
        args, _config = cli.parse_args(["list", "foo", "bar"])
        actual = args.search_terms
        self.assertEqual(expected, actual)

    def test_no_search_terms_create_an_any_query(self):
        expected = query.AnyQuery()
        args, _config = cli.parse_args(["list"])
        actual = args.search_terms
        self.assertEqual(expected, actual)

    def test_target_search_terms_are_typed(self):
        args, _config = cli.parse_args(["merge", "--target=foo", "bar"])
        self.assertEqual(self.foo, args.target_contact)
        self.assertEqual(self.bar, args.source_search_terms)

    def test_second_target_search_term_overrides_first(self):
        args, _config = cli.parse_args(["merge", "--target=foo", "--target=bar", "baz"])
        self.assertEqual(self.bar, args.target_contact)
        self.assertEqual(self.baz, args.source_search_terms)

    def test_target_uid_option_creates_uid_queries(self):
        args, _config = cli.parse_args(["merge", "--target", "uid:foo", "bar"])
        self.assertEqual(self.uid, args.target_contact)
        self.assertEqual(self.bar, args.source_search_terms)

    def test_uid_option_is_combined_with_search_terms_for_merge_command(self):
        args, _config = cli.parse_args(["merge", "uid:foo", "--target=bar"])
        self.assertEqual(self.uid, args.source_search_terms)
        self.assertEqual(self.bar, args.target_contact)

    def test_no_target_specification_results_in_an_any_query(self):
        expected = query.AnyQuery()
        args, _config = cli.parse_args(["merge"])
        actual = args.target_contact
        self.assertEqual(expected, actual)

    def test_add_email_defaults_to_from_lowercase(self):
        args, _config = cli.parse_args(["add-email"])
        actual = args.headers
        self.assertEqual(["from"], actual)

    def test_add_email_from_field(self):
        args, _config = cli.parse_args(["add-email", "-H", "from"])
        actual = args.headers
        self.assertEqual(["from"], actual)

    def test_add_email_another_field(self):
        args, _config = cli.parse_args(["add-email", "-H", "OtHer"])
        actual = args.headers
        self.assertEqual(["other"], actual)

    def test_add_email_multiple_headers_separate_args_takes_last(self):
        args, _config = cli.parse_args(["add-email", "-H", "OtHer", "-H", "myfield"])
        actual = args.headers
        self.assertEqual(["myfield"], actual)

    def test_add_email_multiple_headers_comma_separated(self):
        args, _config = cli.parse_args(["add-email", "-H", "OtHer,myfield,from"])
        actual = args.headers
        self.assertEqual(["other", "myfield", "from"], actual)

    def test_exit_user_friendly_without_config_file(self):
        with mock_stream("stderr") as stderr:
            with self.assertRaises(SystemExit):
                cli.parse_args(["-c", "/this file should hopefully never exist."])
        self.assertTrue(
            stderr.getvalue().startswith(
                "Error reading config file: Config file not found:"
            )
        )

    def test_exit_user_friendly_without_contacts_folder(self):
        with tempfile.NamedTemporaryFile("w", delete=False) as config:
            config.write(
                """[general]
                            editor = editor
                            merge_editor = merge_editor
                            [addressbooks]
                            [[tmp]]
                            path = /this file should hopefully never exist.
                            """
            )
            config.flush()
            with self.assertRaises(SystemExit):
                cli.init(["-c", config.name, "ls"])