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" Given we use the config "encrypted.yaml"
When we run "jrnl --decrypt" and enter "bad doggie no biscuit" When we run "jrnl --decrypt" and enter "bad doggie no biscuit"
Then we should see the message "Journal decrypted" 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" When we run "jrnl -99 --short"
Then the output should be Then the output should be
2013-06-09 15:39 My first entry. 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 # This should warn the user that the journal is already encrypted
Given we use the config "simple.yaml" Given we use the config "simple.yaml"
When we run "jrnl --decrypt" 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" When we run "jrnl -99 --short"
Then the output should be Then the output should be
2013-06-09 15:39 My first entry. 2013-06-09 15:39 My first entry.
@ -35,7 +35,7 @@ Feature: Encrypting and decrypting journals
swordfish swordfish
n n
Then we should see the message "Journal encrypted" 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" When we run "jrnl -n 1" and enter "swordfish"
Then we should be prompted for a password Then we should be prompted for a password
And the output should contain "2013-06-10 15:40 Life is good" 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
sabertooth sabertooth
Y 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" When we run "jrnl simple -n 1"
Then the output should contain "2013-06-10 15:40 Life is good" 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" Then we should see the message "Failed to retrieve keyring"
And we should get no error And we should get no error
And we should be prompted for a password 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 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 get no error
And we should be prompted for a password And we should be prompted for a password
And we should see the message "Journal decrypted" 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" When we run "jrnl --short"
Then we should not be prompted for a password Then we should not be prompted for a password
And the output should be And the output should be
@ -97,7 +97,7 @@ Feature: Using the installed keyring
sordfish sordfish
Then we should be prompted for a password Then we should be prompted for a password
And we should see the message "Passwords did not match" 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" When we run "jrnl --short"
Then the output should be Then the output should be
2013-06-09 15:39 My first entry. 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 Then we should be prompted for a password
And we should see the message "Passwords did not match" And we should see the message "Passwords did not match"
And we should see the message "Journal encrypted" 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" When we run "jrnl -1" and enter "swordfish"
Then we should be prompted for a password Then we should be prompted for a password
And the output should contain "2013-06-10 15:40 Life is good" 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 -9" and enter "Y"
When we run "jrnl -99 --short" When we run "jrnl -99 --short"
Then the output should be 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 And the output should contain
2010-06-10 15:00 A life without chocolate is like a bad analogy. 2010-06-10 15:00 A life without chocolate is like a bad analogy.
And the output should contain 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 Scenario: Upgrading a config without colors to colors
Given we use the config "no_colors.yaml" Given we use the config "no_colors.yaml"
When we run "jrnl -n 1" When we run "jrnl -n 1"
Then the config should have "colors" set to Then the config should contain
date: none colors:
title: none date: none
body: none title: none
tags: none body: none
tags: none
Scenario: Upgrade and parse journals with little endian date format Scenario: Upgrade and parse journals with little endian date format
Given we use the config "upgrade_from_195_little_endian_dates.json" Given we use the config "upgrade_from_195_little_endian_dates.json"

View file

@ -15,6 +15,7 @@ import string
import re import re
import shutil import shutil
import tempfile import tempfile
import yaml
from unittest.mock import patch from unittest.mock import patch
from unittest.mock import MagicMock from unittest.mock import MagicMock
from xml.etree import ElementTree from xml.etree import ElementTree
@ -103,17 +104,6 @@ def pytest_bdd_apply_tag(tag, function):
# ----- UTILS ----- # # ----- 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): def does_directory_contain_files(file_list, directory_path):
if not os.path.isdir(directory_path): if not os.path.isdir(directory_path):
return False return False
@ -523,37 +513,46 @@ def should_see_the_message(text, cli_run):
assert text in out, [text, out] assert text in out, [text, out]
@then(parse('the config should have "{key}" set to\n{str_value}')) def parse_should_or_should_not(should_or_should_not):
@then(parse('the config should have "{key}" set to "{str_value}"')) if should_or_should_not == "should":
@then( return True
parse( elif should_or_should_not == "should not":
'the config for journal "{journal_name}" should have "{key}" set to "{str_value}"' return False
)
)
@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
else: else:
assert key in configuration raise Exception(
assert configuration[key] == str_value "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") @then("we should be prompted for a password")