diff --git a/tests/features/encrypt.feature b/tests/features/encrypt.feature index daa9f109..31d53520 100644 --- a/tests/features/encrypt.feature +++ b/tests/features/encrypt.feature @@ -4,7 +4,7 @@ Feature: Encrypting and decrypting journals Given we use the config "encrypted.yaml" When we run "jrnl --decrypt" and enter "bad doggie no biscuit" Then we should see the message "Journal decrypted" - Then the config for journal "default" should have "encrypt" set to "bool:False" + And the config for journal "default" should contain "encrypt: false" When we run "jrnl -99 --short" Then the output should be 2013-06-09 15:39 My first entry. @@ -16,7 +16,7 @@ Feature: Encrypting and decrypting journals # This should warn the user that the journal is already encrypted Given we use the config "simple.yaml" When we run "jrnl --decrypt" - Then the config for journal "default" should have "encrypt" set to "bool:False" + Then the config for journal "default" should contain "encrypt: false" When we run "jrnl -99 --short" Then the output should be 2013-06-09 15:39 My first entry. @@ -35,7 +35,7 @@ Feature: Encrypting and decrypting journals swordfish n Then we should see the message "Journal encrypted" - And the config for journal "default" should have "encrypt" set to "bool:True" + And the config for journal "default" should contain "encrypt: true" When we run "jrnl -n 1" and enter "swordfish" Then we should be prompted for a password And the output should contain "2013-06-10 15:40 Life is good" diff --git a/tests/features/password.feature b/tests/features/password.feature index d3116fed..ed8aea5f 100644 --- a/tests/features/password.feature +++ b/tests/features/password.feature @@ -7,7 +7,7 @@ Feature: Using the installed keyring sabertooth sabertooth Y - Then the config for journal "simple" should have "encrypt" set to "bool:True" + Then the config for journal "simple" should contain "encrypt: true" When we run "jrnl simple -n 1" Then the output should contain "2013-06-10 15:40 Life is good" @@ -58,7 +58,7 @@ Feature: Using the installed keyring Then we should see the message "Failed to retrieve keyring" And we should get no error And we should be prompted for a password - And the config for journal "default" should have "encrypt" set to "bool:True" + And the config for journal "default" should contain "encrypt: true" Scenario: Decrypt journal when keyring exists but fails @@ -70,7 +70,7 @@ Feature: Using the installed keyring And we should get no error And we should be prompted for a password And we should see the message "Journal decrypted" - And the config for journal "default" should have "encrypt" set to "bool:False" + And the config for journal "default" should contain "encrypt: false" When we run "jrnl --short" Then we should not be prompted for a password And the output should be @@ -97,7 +97,7 @@ Feature: Using the installed keyring sordfish Then we should be prompted for a password And we should see the message "Passwords did not match" - And the config for journal "default" should not have "encrypt" set + And the config for journal "default" should not contain "encrypt: true" When we run "jrnl --short" Then the output should be 2013-06-09 15:39 My first entry. @@ -115,7 +115,7 @@ Feature: Using the installed keyring Then we should be prompted for a password And we should see the message "Passwords did not match" And we should see the message "Journal encrypted" - And the config for journal "default" should have "encrypt" set to "bool:True" + And the config for journal "default" should contain "encrypt: true" When we run "jrnl -1" and enter "swordfish" Then we should be prompted for a password And the output should contain "2013-06-10 15:40 Life is good" diff --git a/tests/features/upgrade.feature b/tests/features/upgrade.feature index 115eb8ff..bb050fa1 100644 --- a/tests/features/upgrade.feature +++ b/tests/features/upgrade.feature @@ -5,7 +5,8 @@ Feature: Upgrading Journals from 1.x.x to 2.x.x When we run "jrnl -9" and enter "Y" When we run "jrnl -99 --short" Then the output should be - @todo something + 2010-06-10 15:00 A life without chocolate is like a bad analogy. + 2013-06-10 15:40 He said "[this] is the best time to be alive".Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada And the output should contain 2010-06-10 15:00 A life without chocolate is like a bad analogy. And the output should contain @@ -23,11 +24,12 @@ Feature: Upgrading Journals from 1.x.x to 2.x.x Scenario: Upgrading a config without colors to colors Given we use the config "no_colors.yaml" When we run "jrnl -n 1" - Then the config should have "colors" set to - date: none - title: none - body: none - tags: none + Then the config should contain + colors: + date: none + title: none + body: none + tags: none Scenario: Upgrade and parse journals with little endian date format Given we use the config "upgrade_from_195_little_endian_dates.json" diff --git a/tests/step_defs/conftest.py b/tests/step_defs/conftest.py index c6d36f89..4f934d31 100644 --- a/tests/step_defs/conftest.py +++ b/tests/step_defs/conftest.py @@ -15,6 +15,7 @@ import string import re import shutil import tempfile +import yaml from unittest.mock import patch from unittest.mock import MagicMock from xml.etree import ElementTree @@ -103,17 +104,6 @@ def pytest_bdd_apply_tag(tag, function): # ----- UTILS ----- # -def read_value_from_string(string): - if string[0] == "{": - # Handle value being a dictionary - return ast.literal_eval(string) - - # Takes strings like "bool:true" or "int:32" and coerces them into proper type - t, value = string.split(":") - value = {"bool": lambda v: v.lower() == "true", "int": int, "str": str}[t](value) - return value - - def does_directory_contain_files(file_list, directory_path): if not os.path.isdir(directory_path): return False @@ -523,37 +513,46 @@ def should_see_the_message(text, cli_run): assert text in out, [text, out] -@then(parse('the config should have "{key}" set to\n{str_value}')) -@then(parse('the config should have "{key}" set to "{str_value}"')) -@then( - parse( - 'the config for journal "{journal_name}" should have "{key}" set to "{str_value}"' - ) -) -@then(parse('the config should {should_not} have "{key}" set')) -@then(parse('the config should {should_not} have "{key}" set')) -@then( - parse( - 'the config for journal "{journal_name}" should {should_not} have "{key}" set' - ) -) -def config_var(config_data, key, str_value, journal_name, should_not): - str_value = read_value_from_string(str_value) if len(str_value) else str_value - - configuration = config_data - if journal_name: - configuration = configuration["journals"][journal_name] - - # is the config a string? - # @todo this should probably be a function - if type(configuration) is str: - configuration = {"journal": configuration} - - if should_not: - assert key not in configuration +def parse_should_or_should_not(should_or_should_not): + if should_or_should_not == "should": + return True + elif should_or_should_not == "should not": + return False else: - assert key in configuration - assert configuration[key] == str_value + raise Exception( + "should_or_should_not valid values are 'should' or 'should not'" + ) + + +@then( + parse( + 'the config for journal "{journal_name}" {should_or_should_not} contain "{some_yaml}"' + ) +) +@then( + parse( + 'the config for journal "{journal_name}" {should_or_should_not} contain\n{some_yaml}' + ) +) +@then(parse('the config {should_or_should_not} contain "{some_yaml}"')) +@then(parse("the config {should_or_should_not} contain\n{some_yaml}")) +def config_var(config_data, journal_name, should_or_should_not, some_yaml): + we_should = parse_should_or_should_not(should_or_should_not) + + actual = config_data + if journal_name: + actual = actual["journals"][journal_name] + + expected = yaml.load(some_yaml, Loader=yaml.FullLoader) + + actual_slice = actual + if type(actual) is dict: + actual_slice = {key: actual.get(key, None) for key in expected.keys()} + + if we_should: + assert expected == actual_slice + else: + assert expected != actual_slice @then("we should be prompted for a password")