1"""Tests for the cli module"""
2
3import unittest
4from unittest import mock
5
6from khard import cli
7from khard import query
8
9from .helpers import mock_stream
10
11
12@mock.patch.dict('os.environ', KHARD_CONFIG='test/fixture/minimal.conf')
13class TestParseArgs(unittest.TestCase):
14
15    foo = query.TermQuery("foo")
16    bar = query.TermQuery("bar")
17    baz = query.TermQuery("baz")
18    uid = query.FieldQuery("uid", "foo")
19
20    def test_normal_search_terms_create_term_queries(self):
21        expected = self.foo
22        args, _config = cli.parse_args(['list', 'foo'])
23        actual = args.search_terms
24        self.assertEqual(expected, actual)
25
26    def test_uid_options_create_uid_queries(self):
27        expected = self.uid
28        args, _config = cli.parse_args(['list', '--uid=foo'])
29        actual = args.search_terms
30        self.assertEqual(expected, actual)
31
32    def test_multible_search_terms_generate_and_queries(self):
33        expected = query.AndQuery(self.foo, self.bar)
34        args, _config = cli.parse_args(['list', 'foo', 'bar'])
35        actual = args.search_terms
36        self.assertEqual(expected, actual)
37
38    def test_no_search_terms_create_an_any_query(self):
39        expected = query.AnyQuery()
40        args, _config = cli.parse_args(['list'])
41        actual = args.search_terms
42        self.assertEqual(expected, actual)
43
44    def test_target_search_terms_are_typed(self):
45        args, _config = cli.parse_args(['merge', '--target=foo', 'bar'])
46        self.assertEqual(self.foo, args.target_contact)
47        self.assertEqual(self.bar, args.source_search_terms)
48
49    def test_second_target_search_term_overrides_first(self):
50        args, _config = cli.parse_args(['merge', '--target=foo',
51                                        '--target=bar', 'baz'])
52        self.assertEqual(self.bar, args.target_contact)
53        self.assertEqual(self.baz, args.source_search_terms)
54
55    def test_target_uid_option_creates_uid_queries(self):
56        args, _config = cli.parse_args(['merge', '--target-uid=foo', 'bar'])
57        self.assertEqual(self.uid, args.target_contact)
58        self.assertEqual(self.bar, args.source_search_terms)
59
60    def test_uid_option_is_combined_with_search_terms_for_merge_command(self):
61        args, _config = cli.parse_args(['merge', '--uid=foo', '--target=bar'])
62        self.assertEqual(self.uid, args.source_search_terms)
63        self.assertEqual(self.bar, args.target_contact)
64
65    def test_uid_and_free_search_terms_produce_a_conflict(self):
66        with self.assertRaises(SystemExit):
67            with mock_stream("stderr"):  # just silence stderr
68                cli.parse_args(['list', '--uid=foo', 'bar'])
69
70    def test_target_uid_and_free_target_search_terms_produce_a_conflict(self):
71        with self.assertRaises(SystemExit):
72            with mock_stream("stderr"):  # just silence stderr
73                cli.parse_args(['merge', '--target-uid=foo', '--target=bar'])
74
75    def test_no_target_specification_results_in_an_any_query(self):
76        expected = query.AnyQuery()
77        args, _config = cli.parse_args(['merge'])
78        actual = args.target_contact
79        self.assertEqual(expected, actual)
80
81    def test_add_email_defaults_to_from_lowercase(self):
82        args, _config = cli.parse_args(["add-email"])
83        actual = args.fields
84        self.assertEqual(["from"], actual)
85
86    def test_add_email_from_field(self):
87        args, _config = cli.parse_args(["add-email", "-H", "from"])
88        actual = args.fields
89        self.assertEqual(["from"], actual)
90
91    def test_add_email_another_field(self):
92        args, _config = cli.parse_args(["add-email", "-H", "OtHer"])
93        actual = args.fields
94        self.assertEqual(["other"], actual)
95
96    def test_add_email_multiple_headers_separate_args_takes_last(self):
97        args, _config = cli.parse_args(
98            ["add-email", "-H", "OtHer", "-H", "myfield"])
99        actual = args.fields
100        self.assertEqual(["myfield"], actual)
101
102    def test_add_email_multiple_headers_comma_separated(self):
103        args, _config = cli.parse_args(
104            ["add-email", "-H", "OtHer,myfield,from"])
105        actual = args.fields
106        self.assertEqual(["other", "myfield", "from"], actual)
107