Squashed commit of the following:
commit36403ecbae
Author: smilerz <smilerz@gmail.com> Date: Fri Sep 1 12:04:04 2023 -0500 update migration for new Automation Types commit4620ebaf30
Author: smilerz <smilerz@gmail.com> Date: Fri Sep 1 07:49:10 2023 -0500 add Name and Instruction automation to YouTube importer commitc907da84c1
Author: smilerz <smilerz@gmail.com> Date: Fri Sep 1 07:45:32 2023 -0500 remove old commented automation code commit9b5e39415e
Author: smilerz <smilerz@gmail.com> Date: Fri Sep 1 07:37:36 2023 -0500 test for automations applied during url import renamed TITLE_REPLACE to NAME_REPLACE commit2679a22464
Author: smilerz <smilerz@gmail.com> Date: Thu Aug 31 15:29:59 2023 -0500 added tests for regex_replace commit8bae21025b
Author: smilerz <smilerz@gmail.com> Date: Thu Aug 31 13:51:46 2023 -0500 updated Automation Modal and translations commit4120adc546
Author: smilerz <smilerz@gmail.com> Date: Thu Aug 31 13:12:41 2023 -0500 applied regex_replace automation to food and unit automations updated automation documentation commit30c891abfc
Author: smilerz <smilerz@gmail.com> Date: Thu Aug 31 12:46:34 2023 -0500 migrate regex_replace functions to AutomationEngine create TITLE_REPLACE, UNIT_REPLACE and FOOD REPLACE automation types create migration for new types commitb8317c2c29
Author: smilerz <smilerz@gmail.com> Date: Wed Aug 30 20:44:40 2023 -0500 move transpose words to AutomationEngine create tests for transpose words commit39253cfd02
Author: smilerz <smilerz@gmail.com> Date: Wed Aug 30 17:03:29 2023 -0500 refactor never_unit automation to AutomationEngine create tests for never_unit commit7c0b8b151c
Author: smilerz <smilerz@gmail.com> Date: Wed Aug 30 11:21:06 2023 -0500 update ingredient parser to use AutomationEngine for unt, keyword, food update test_ingredient_parser tests to accomodate changes commit8e1b8923af
Author: smilerz <smilerz@gmail.com> Date: Mon Aug 28 16:44:35 2023 -0500 keyword and unit Automtations refactored to Automation Engine keyword and unit automation tests added commit52eb876a08
Author: smilerz <smilerz@gmail.com> Date: Mon Aug 28 15:03:19 2023 -0500 food_alias tests added commita820b9c09e
Author: smilerz <smilerz@gmail.com> Date: Sat Aug 26 12:37:16 2023 -0500 create AutomationEngine class create food_automation method refactor food automations to use AutomationEngine
This commit is contained in:
@ -1,50 +1,173 @@
|
||||
import pytest
|
||||
from django.contrib import auth
|
||||
from django.urls import reverse
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from cookbook.forms import ImportExportBase
|
||||
from cookbook.helper.ingredient_parser import IngredientParser
|
||||
from cookbook.models import ExportLog, Automation
|
||||
import json
|
||||
import os
|
||||
|
||||
import pytest
|
||||
from django.urls import reverse
|
||||
from django.contrib import auth
|
||||
from django.test import RequestFactory
|
||||
from django_scopes import scope
|
||||
|
||||
from cookbook.tests.conftest import validate_recipe
|
||||
from cookbook.helper.automation_helper import AutomationEngine
|
||||
from cookbook.helper.recipe_url_import import get_from_scraper
|
||||
from cookbook.helper.scrapers.scrapers import text_scraper
|
||||
from cookbook.models import Automation
|
||||
|
||||
IMPORT_SOURCE_URL = 'api_recipe_from_source'
|
||||
DATA_DIR = "cookbook/tests/other/test_data/"
|
||||
|
||||
|
||||
# for some reason this tests cant run due to some kind of encoding issue, needs to be fixed
|
||||
# def test_description_replace_automation(u1_s1, space_1):
|
||||
# if 'cookbook' in os.getcwd():
|
||||
# test_file = os.path.join(os.getcwd(), 'other', 'test_data', 'chefkoch2.html')
|
||||
# else:
|
||||
# test_file = os.path.join(os.getcwd(), 'cookbook', 'tests', 'other', 'test_data', 'chefkoch2.html')
|
||||
#
|
||||
# # original description
|
||||
# # Brokkoli - Bratlinge. Über 91 Bewertungen und für vorzüglich befunden. Mit ► Portionsrechner ► Kochbuch ► Video-Tipps! Jetzt entdecken und ausprobieren!
|
||||
#
|
||||
# with scopes_disabled():
|
||||
# Automation.objects.create(
|
||||
# name='test1',
|
||||
# created_by=auth.get_user(u1_s1),
|
||||
# space=space_1,
|
||||
# param_1='.*',
|
||||
# param_2='.*',
|
||||
# param_3='',
|
||||
# order=1000,
|
||||
# )
|
||||
#
|
||||
# with open(test_file, 'r', encoding='UTF-8') as d:
|
||||
# response = u1_s1.post(
|
||||
# reverse(IMPORT_SOURCE_URL),
|
||||
# {
|
||||
# 'data': d.read(),
|
||||
# 'url': 'https://www.chefkoch.de/rezepte/804871184310070/Brokkoli-Bratlinge.html',
|
||||
# },
|
||||
# content_type='application/json')
|
||||
# recipe = json.loads(response.content)['recipe_json']
|
||||
# assert recipe['description'] == ''
|
||||
@pytest.mark.parametrize("arg", [
|
||||
['Match', True],
|
||||
['mAtCh', True],
|
||||
['No Match', False],
|
||||
['Màtch', False],
|
||||
])
|
||||
def test_food_automation(u1_s1, arg):
|
||||
target_name = "Matched Automation"
|
||||
user = auth.get_user(u1_s1)
|
||||
space = user.userspace_set.first().space
|
||||
request = RequestFactory()
|
||||
request.user = user
|
||||
request.space = space
|
||||
automation = AutomationEngine(request, False)
|
||||
|
||||
with scope(space=space):
|
||||
Automation.objects.get_or_create(name='food test', type=Automation.FOOD_ALIAS, param_1=arg[0], param_2=target_name, created_by=user, space=space)
|
||||
assert (automation.apply_food_automation(arg[0]) == target_name) is True
|
||||
|
||||
|
||||
@pytest.mark.parametrize("arg", [
|
||||
['Match', True],
|
||||
['mAtCh', True],
|
||||
['No Match', False],
|
||||
['Màtch', False],
|
||||
])
|
||||
def test_keyword_automation(u1_s1, arg):
|
||||
target_name = "Matched Automation"
|
||||
user = auth.get_user(u1_s1)
|
||||
space = user.userspace_set.first().space
|
||||
request = RequestFactory()
|
||||
request.user = user
|
||||
request.space = space
|
||||
automation = AutomationEngine(request, False)
|
||||
|
||||
with scope(space=space):
|
||||
Automation.objects.get_or_create(name='keyword test', type=Automation.KEYWORD_ALIAS, param_1=arg[0], param_2=target_name, created_by=user, space=space)
|
||||
assert (automation.apply_keyword_automation(arg[0]) == target_name) is True
|
||||
|
||||
|
||||
@pytest.mark.parametrize("arg", [
|
||||
['Match', True],
|
||||
['mAtCh', True],
|
||||
['No Match', False],
|
||||
['Màtch', False],
|
||||
])
|
||||
def test_unit_automation(u1_s1, arg):
|
||||
target_name = "Matched Automation"
|
||||
user = auth.get_user(u1_s1)
|
||||
space = user.userspace_set.first().space
|
||||
request = RequestFactory()
|
||||
request.user = user
|
||||
request.space = space
|
||||
automation = AutomationEngine(request, False)
|
||||
|
||||
with scope(space=space):
|
||||
Automation.objects.get_or_create(name='unit test', type=Automation.UNIT_ALIAS, param_1=arg[0], param_2=target_name, created_by=user, space=space)
|
||||
assert (automation.apply_unit_automation(arg[0]) == target_name) is True
|
||||
|
||||
|
||||
@pytest.mark.parametrize("arg", [
|
||||
[[1, 'egg', 'white'], '', [1, '', 'egg', 'white']],
|
||||
[[1, 'Egg', 'white'], '', [1, '', 'Egg', 'white']],
|
||||
[[1, 'êgg', 'white'], '', [1, 'êgg', 'white']],
|
||||
[[1, 'egg', 'white'], 'whole', [1, 'whole', 'egg', 'white']],
|
||||
])
|
||||
def test_never_unit_automation(u1_s1, arg):
|
||||
user = auth.get_user(u1_s1)
|
||||
space = user.userspace_set.first().space
|
||||
request = RequestFactory()
|
||||
request.user = user
|
||||
request.space = space
|
||||
automation = AutomationEngine(request, False)
|
||||
|
||||
with scope(space=space):
|
||||
Automation.objects.get_or_create(name='never unit test', type=Automation.NEVER_UNIT, param_1='egg', param_2=arg[1], created_by=user, space=space)
|
||||
assert automation.apply_never_unit_automation(arg[0]) == arg[2]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("source", [
|
||||
['.*', True],
|
||||
['.*allrecipes.*', True],
|
||||
['.*google.*', False],
|
||||
])
|
||||
@pytest.mark.parametrize("arg", [
|
||||
[Automation.DESCRIPTION_REPLACE],
|
||||
[Automation.INSTRUCTION_REPLACE],
|
||||
[Automation.NAME_REPLACE],
|
||||
[Automation.FOOD_REPLACE],
|
||||
[Automation.UNIT_REPLACE],
|
||||
])
|
||||
def test_regex_automation(u1_s1, arg, source):
|
||||
user = auth.get_user(u1_s1)
|
||||
space = user.userspace_set.first().space
|
||||
request = RequestFactory()
|
||||
request.user = user
|
||||
request.space = space
|
||||
automation = AutomationEngine(request, use_cache=False, source='https://www.allrecipes.com/recipe/24010/easy-chicken-marsala/')
|
||||
middle = 'test_remove_phrase'
|
||||
beginning = 'remove_test phrase'
|
||||
fail = 'test remove_phrase'
|
||||
target = 'test phrase'
|
||||
|
||||
with scope(space=space):
|
||||
Automation.objects.get_or_create(name='regex middle test', type=arg[0], param_1=source[0], param_2='_remove_', param_3=' ', created_by=user, space=space)
|
||||
Automation.objects.get_or_create(name='regex beginning test', type=arg[0], param_1=source[0], param_2='^remove_', param_3='', created_by=user, space=space)
|
||||
assert (automation.apply_regex_replace_automation(middle, arg[0]) == target) == source[1]
|
||||
assert (automation.apply_regex_replace_automation(beginning, arg[0]) == target) == source[1]
|
||||
assert (automation.apply_regex_replace_automation(fail, arg[0]) == target) == False
|
||||
|
||||
|
||||
@pytest.mark.parametrize("arg", [
|
||||
['second first', 'first second'],
|
||||
['longer string second first longer string', 'longer string first second longer string'],
|
||||
['second fails first', 'second fails first'],
|
||||
])
|
||||
def test_transpose_automation(u1_s1, arg):
|
||||
user = auth.get_user(u1_s1)
|
||||
space = user.userspace_set.first().space
|
||||
request = RequestFactory()
|
||||
request.user = user
|
||||
request.space = space
|
||||
automation = AutomationEngine(request, False)
|
||||
|
||||
with scope(space=space):
|
||||
Automation.objects.get_or_create(name='transpose words test', type=Automation.TRANSPOSE_WORDS, param_1='second', param_2='first', created_by=user, space=space)
|
||||
assert automation.apply_transpose_automation(arg[0]) == arg[1]
|
||||
|
||||
|
||||
def test_url_import_regex_replace(u1_s1):
|
||||
# TODO this does not test import with multiple steps - do any sites import with this pattern? It doesn't look like the url_importer supports it
|
||||
user = auth.get_user(u1_s1)
|
||||
space = user.userspace_set.first().space
|
||||
request = RequestFactory()
|
||||
request.user = user
|
||||
request.space = space
|
||||
recipe = 'regex_recipe.html'
|
||||
types = [Automation.DESCRIPTION_REPLACE, Automation.INSTRUCTION_REPLACE, Automation.NAME_REPLACE, Automation.FOOD_REPLACE, Automation.UNIT_REPLACE]
|
||||
find_text = "_remove"
|
||||
target_text = "Test"
|
||||
|
||||
if 'cookbook' in os.getcwd():
|
||||
test_file = os.path.join(os.getcwd(), 'other', 'test_data', recipe)
|
||||
else:
|
||||
test_file = os.path.join(os.getcwd(), 'cookbook', 'tests', 'other', 'test_data', recipe)
|
||||
with open(test_file, 'r', encoding='UTF-8') as d:
|
||||
scrape = text_scraper(text=d.read(), url="https://www.allrecipes.com")
|
||||
with scope(space=space):
|
||||
for t in types:
|
||||
Automation.objects.get_or_create(name=t, type=t, param_1='.*', param_2=find_text, param_3='', created_by=user, space=space)
|
||||
recipe_json = get_from_scraper(scrape, request)
|
||||
assert recipe_json['name'] == target_text
|
||||
assert recipe_json['description'] == target_text
|
||||
assert recipe_json['steps'][0]['instruction'] == target_text
|
||||
assert recipe_json['steps'][0]['ingredients'][0]['food']['name'] == target_text
|
||||
assert recipe_json['steps'][0]['ingredients'][0]['food']['name'] == target_text
|
||||
assert recipe_json['steps'][0]['ingredients'][1]['unit']['name'] == target_text
|
||||
assert recipe_json['steps'][0]['ingredients'][1]['unit']['name'] == target_text
|
||||
|
Reference in New Issue
Block a user