mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-05-10 16:48:31 +02:00
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:
parent
b7b7bad2fb
commit
5572833652
4 changed files with 56 additions and 55 deletions
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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,7 +24,8 @@ 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
|
||||||
|
colors:
|
||||||
date: none
|
date: none
|
||||||
title: none
|
title: none
|
||||||
body: none
|
body: none
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Add table
Reference in a new issue