summaryrefslogtreecommitdiffstats
path: root/tests/unit/test_parse_args.py
blob: 0725d33d736564033eb199b96d18ca18a103f8c9 (plain)
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
import shlex

import pytest

from jrnl.args import parse_args
from jrnl.config import make_yaml_valid_dict


def cli_as_dict(str):
    cli = shlex.split(str)
    args = parse_args(cli)
    return vars(args)


def expected_args(**kwargs):
    default_args = {
        "contains": None,
        "debug": False,
        "delete": False,
        "edit": False,
        "end_date": None,
        "today_in_history": False,
        "month": None,
        "day": None,
        "year": None,
        "excluded": [],
        "export": False,
        "filename": None,
        "limit": None,
        "on_date": None,
        "preconfig_cmd": None,
        "postconfig_cmd": None,
        "short": False,
        "starred": False,
        "start_date": None,
        "strict": False,
        "tags": False,
        "text": [],
        "config_override": [],
    }
    return {**default_args, **kwargs}


def test_empty():
    assert cli_as_dict("") == expected_args()


def test_contains_alone():
    assert cli_as_dict("-contains whatever") == expected_args(contains="whatever")


def test_debug_alone():
    assert cli_as_dict("--debug") == expected_args(debug=True)


def test_delete_alone():
    assert cli_as_dict("--delete") == expected_args(delete=True)


def test_diagnostic_alone():
    from jrnl.commands import preconfig_diagnostic

    assert cli_as_dict("--diagnostic") == expected_args(
        preconfig_cmd=preconfig_diagnostic
    )


def test_edit_alone():
    assert cli_as_dict("--edit") == expected_args(edit=True)


def test_encrypt_alone():
    from jrnl.commands import postconfig_encrypt

    assert cli_as_dict("--encrypt") == expected_args(postconfig_cmd=postconfig_encrypt)


def test_decrypt_alone():
    from jrnl.commands import postconfig_decrypt

    assert cli_as_dict("--decrypt") == expected_args(postconfig_cmd=postconfig_decrypt)


def test_end_date_alone():
    expected = expected_args(end_date="2020-01-01")
    assert expected == cli_as_dict("-until 2020-01-01")
    assert expected == cli_as_dict("-to 2020-01-01")


def test_not_alone():
    assert cli_as_dict("-not test") == expected_args(excluded=["test"])


def test_not_multiple_alone():
    assert cli_as_dict("-not one -not two") == expected_args(excluded=["one", "two"])
    assert cli_as_dict("-not one -not two -not three") == expected_args(
        excluded=["one", "two", "three"]
    )


@pytest.mark.parametrize(
    "cli",
    [
        "two -not one -not three",
        "-not one two -not three",
        "-not one -not three two",
    ],
)
def test_not_mixed(cli):
    result = expected_args(excluded=["one", "three"], text=["two"])
    assert cli_as_dict(cli) == result


def test_not_interspersed():
    result = expected_args(excluded=["one", "three"], text=["two", "two", "two"])
    assert cli_as_dict("two -not one two -not three two") == result


def test_export_alone():
    assert cli_as_dict("--export json") == expected_args(export="json")


def test_import_alone():
    from jrnl.commands import postconfig_import

    assert cli_as_dict("--import") == expected_args(postconfig_cmd=postconfig_import)


def test_file_flag_alone():
    assert cli_as_dict("--file test.txt") == expected_args(filename="test.txt")
    assert cli_as_dict("--file 'lorem ipsum.txt'") == expected_args(
        filename="lorem ipsum.txt"
    )


def test_limit_alone():
    assert cli_as_dict("-n 5") == expected_args(limit=5)
    assert cli_as_dict("-n 999") == expected_args(limit=999)


def test_limit_shorthand_alone():
    assert cli_as_dict("-5") == expected_args(limit=5)
    assert cli_as_dict("-999") == expected_args(limit=999)


def test_list_alone():
    from jrnl.commands import postconfig_list

    assert cli_as_dict("--ls") == expected_args(postconfig_cmd=postconfig_list)


def test_on_date_alone():
    assert cli_as_dict("-on 'saturday'") == expected_args(on_date="saturday")


def test_month_alone():
    assert cli_as_dict("-month 1") == expected_args(month="1")
    assert cli_as_dict("-month 01") == expected_args(month="01")
    assert cli_as_dict("-month January") == expected_args(month="January")
    assert cli_as_dict("-month Jan") == expected_args(month="Jan")


def test_day_alone():
    assert cli_as_dict("-day 1") == expected_args(day="1")
    assert cli_as_dict("-day 01") == expected_args(day="01")


def test_year_alone():
    assert cli_as_dict("-year 2021") == expected_args(year="2021")
    assert cli_as_dict("-year 21") == expected_args(year="21")


def test_today_in_history_alone():
    assert cli_as_dict("-today-in-history") == expected_args(today_in_history=True)


def test_short_alone():
    assert cli_as_dict("--short") == expected_args(short=True)


def test_starred_alone():
    assert cli_as_dict("-starred") == expected_args(starred=True)


def test_start_date_alone():
    assert cli_as_dict("-from 2020-01-01") == expected_args(start_date="2020-01-01")
    assert cli_as_dict("-from 'January 1st'") == expected_args(start_date="January 1st")


def test_and_alone():
    assert cli_as_dict("-and") == expected_args(strict=True)


def test_tags_alone():
    assert cli_as_dict("--tags") == expected_args(tags=True)


def test_text_alone():
    assert cli_as_dict("lorem ipsum dolor sit amet") == expected_args(
        text=["lorem", "ipsum", "dolor", "sit", "amet"]
    )


def test_version_alone():
    from jrnl.commands import preconfig_version

    assert cli_as_dict("--version") == expected_args(preconfig_cmd=preconfig_version)


def test_editor_override():

    parsed_args = cli_as_dict('--config-override editor "nano"')
    assert parsed_args == expected_args(config_override=[["editor", "nano"]])


def test_color_override():
    assert cli_as_dict("--config-override colors.body blue") == expected_args(
        config_override=[["colors.body", "blue"]]
    )


def test_multiple_overrides():
    parsed_args = cli_as_dict(
        '--config-override colors.title green --config-override editor "nano" --config-override journal.scratchpad "/tmp/scratchpad"'
    )
    assert parsed_args == expected_args(
        config_override=[
            ["colors.title", "green"],
            ["editor", "nano"],
            ["journal.scratchpad", "/tmp/scratchpad"],
        ]
    )


# @see https://github.com/jrnl-org/jrnl/issues/520
@pytest.mark.parametrize(
    "cli",
    [
        "-and second @oldtag @newtag",
        "second @oldtag @newtag -and",
        "second -and @oldtag @newtag",
        "second @oldtag -and @newtag",
    ],
)
def test_and_ordering(cli):
    result = expected_args(strict=True, text=["second", "@oldtag", "@newtag"])
    assert cli_as_dict(cli) == result


# @see https://github.com/jrnl-org/jrnl/issues/520
@pytest.mark.parametrize(
    "cli",
    [
        "--edit second @oldtag @newtag",
        "second @oldtag @newtag --edit",
        "second --edit @oldtag @newtag",
        "second @oldtag --edit @newtag",
    ],
)
def test_edit_ordering(cli):
    result = expected_args(edit=True, text=["second", "@oldtag", "@newtag"])
    assert cli_as_dict(cli) == result


class TestDeserialization:
    @pytest.mark.parametrize(
        "input_str",
        [
            ["editor", "nano"],
            ["colors.title", "blue"],
            ["default", "/tmp/egg.txt"],
        ],
    )
    def test_deserialize_multiword_strings(self, input_str):

        runtime_config = make_yaml_valid_dict(input_str)
        assert runtime_config.__class__ == dict
        assert input_str[0] in runtime_config.keys()
        assert runtime_config[input_str[0]] == input_str[1]

    def test_deserialize_multiple_datatypes(self):
        cfg = make_yaml_valid_dict(["linewrap", "23"])
        assert cfg["linewrap"] == 23

        cfg = make_yaml_valid_dict(["encrypt", "false"])
        assert cfg["encrypt"] is False

        cfg = make_yaml_valid_dict(["editor", "vi -c startinsert"])
        assert cfg["editor"] == "vi -c startinsert"

        cfg = make_yaml_valid_dict(["highlight", "true"])
        assert cfg["highlight"] is True