Rewrite config checking steps in pytest-bdd

- Take out old type coersion (it was causing needles complexity)
- Take out `read_value_from_string` function
- Use taml parser to parse yaml instead of using custom function
- Update tests to use new implementation

Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
This commit is contained in:
Jonathan Wren 2021-05-22 17:11:14 -07:00
parent b7b7bad2fb
commit 5572833652
4 changed files with 56 additions and 55 deletions

View file

@ -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"

View file

@ -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"

View file

@ -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,7 +24,8 @@ 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
Then the config should contain
colors:
date: none
title: none
body: none

View file

@ -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")