diff --git a/.coverage b/.coverage new file mode 100644 index 00000000..47958ae6 Binary files /dev/null and b/.coverage differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f98852cf --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.venv +__pycache__ +.coverage +coverage.xml \ No newline at end of file diff --git a/conftest.py b/conftest.py new file mode 100644 index 00000000..641eb01f --- /dev/null +++ b/conftest.py @@ -0,0 +1,22 @@ +from functions.level_1_7.models import Expense, Currency, BankCard, ExpenseCategory +import decimal +import datetime +from datetime import datetime + + +def make_expenses( + amount: str = "100", + currency = Currency.RUB, + card = BankCard(last_digits="1234", owner="Alexandr"), + spent_in = "Online Store", + spent_at = datetime(2023, 1, 1, 0, 0, 0), + category: ExpenseCategory | None = None +) -> Expense: + return Expense( + amount=decimal.Decimal(amount), + currency=currency, + card=card, + spent_in=spent_in, + spent_at=spent_at, + category=category + ) diff --git a/coverage.xml b/coverage.xml new file mode 100644 index 00000000..d875dc18 --- /dev/null +++ b/coverage.xml @@ -0,0 +1,266 @@ + + + + + + C:\Users\Beloded\projects\testing_exercises\functions\level_1 + C:\Users\Beloded\projects\testing_exercises\functions\level_1_5 + C:\Users\Beloded\projects\testing_exercises\functions\level_1_7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/functions/level_1_7/four_fraud.py b/functions/level_1_7/four_fraud.py index d70ee572..0ce92676 100644 --- a/functions/level_1_7/four_fraud.py +++ b/functions/level_1_7/four_fraud.py @@ -22,6 +22,6 @@ def find_fraud_expenses(history: list[Expense]) -> list[Expense]: for spent_in, spent_at, amount in fraud_signs: fraud_transactions += [ e for e in history - if e.spent_in == spent_at and e.spent_at == spent_at and e.amount == amount + if e.spent_in == spent_in and e.spent_at == spent_at and e.amount == amount # Выявил ошибку. Исправил. Было:if e.spent_in == spent_at ] return fraud_transactions diff --git a/requirements.txt b/requirements.txt index 805eb2a9..d7570493 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,5 @@ pytest==7.2.1 +pytest-cov==4.1.0 +pytest-testdox +mypy==1.3.0 +freezegun==1.2.2 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..4cb359b1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,10 @@ +[tool:pytest] +addopts = + --cov=functions/level_1 + --cov=functions/level_1_5 + --cov=functions/level_1_7 + --cov-report=xml:coverage.xml + --cov-report=html + --cov-branch + --cov-fail-under=70 + --testdox diff --git a/tests/level_1/test_five_title.py b/tests/level_1/test_five_title.py index fe767004..0fcfe715 100644 --- a/tests/level_1/test_five_title.py +++ b/tests/level_1/test_five_title.py @@ -1,5 +1,39 @@ from functions.level_1.five_title import change_copy_item +import pytest -def test_change_copy_item(): - pass +def test__change_copy_item__add_copy(): + assert change_copy_item('My Item') == 'Copy of My Item' + + +def test__change_copy_item__increase_number_of_copy(): + assert change_copy_item('Copy of My Item (2)') == 'Copy of My Item (3)' + + +@pytest.mark.parametrize( + 'tittle, max_main_item_title_length, expected_result', + [ + ('Very long title with many words', 10, 'Very long title with many words'), + ('Very very very very long title with many words', 20, 'Very very very very long title with many words'), + ('Supep super super very very very very long title with many words', 30, 'Supep super super very very very very long title with many words'), + ] +) +def test__change_copy_item__behavior_for_long_title(tittle, max_main_item_title_length, expected_result): + assert change_copy_item(tittle, max_main_item_title_length) == expected_result + + +def test__change_copy_item__for_basic_case_with_text(): + assert change_copy_item("Copy of My Item") == "Copy of My Item (2)" + + +@pytest.mark.parametrize( + 'title, max_main_item_title_length, expected_result', + [ + ('My Item', 100, 'Copy of My Item'), + ('Copy of My Item (2)', 100, 'Copy of My Item (3)'), + ('Very long title with many words', 10, 'Very long title with many words'), + ('Copy of My Item', 100, 'Copy of My Item (2)'), + ] +) +def test__change_copy_item(title, max_main_item_title_length, expected_result): + assert change_copy_item(title, max_main_item_title_length) == expected_result diff --git a/tests/level_1/test_four_bank_parser.py b/tests/level_1/test_four_bank_parser.py index df6c1b41..d65b10f6 100644 --- a/tests/level_1/test_four_bank_parser.py +++ b/tests/level_1/test_four_bank_parser.py @@ -1,5 +1,21 @@ -from functions.level_1.four_bank_parser import BankCard, SmsMessage, Expense, parse_ineco_expense +from functions.level_1.four_bank_parser import BankCard, SmsMessage, parse_ineco_expense +import datetime +import decimal -def test_parse_ineco_expense(): - pass +def test__parse_ineco_expense__succes(): + sms = SmsMessage( + text="100.00 CARD1234, authcode1234 01.01.23 11:30 Alfa", + author="Alfa Bank", + sent_at=datetime.datetime(2023, 1, 1, 11, 30) + ) + cards = [ + BankCard(last_digits="1234", owner= "Alex"), + BankCard(last_digits="1234", owner= "Alexandr"), + ] + + result = parse_ineco_expense(sms, cards) + + assert result.amount == decimal.Decimal("100.00") + assert result.card.last_digits == '1234' + diff --git a/tests/level_1/test_one_gender.py b/tests/level_1/test_one_gender.py index 31d0bc7f..37074484 100644 --- a/tests/level_1/test_one_gender.py +++ b/tests/level_1/test_one_gender.py @@ -1,5 +1,26 @@ from functions.level_1.one_gender import genderalize +import pytest -def test_genderalize(): - pass +@pytest.mark.parametrize( + 'verb_male, verb_female, gender, expected_result', + [ + ('говорил', 'говорила', 'male', 'говорил'), + ('кричал', 'кричала', 'male', 'кричал'), + ('кукорекал', 'кукорекала', 'male', 'кукорекал'), + ] +) +def test__genderalize__is_male(verb_male, verb_female, gender, expected_result): + assert genderalize(verb_male, verb_female, gender) == expected_result + + +@pytest.mark.parametrize( + 'verb_male, verb_female, gender, expected_result', + [ + ('говорил', 'говорила', 'female', 'говорила'), + ('кричал', 'кричала', 'transgender', 'кричала'), + ('кукорекал', 'кукорекала', 'any str, except "male"', 'кукорекала'), + ] +) +def test__genderalize__where_gender_is_not_male(verb_male, verb_female, gender, expected_result): + assert genderalize(verb_male, verb_female, gender) == expected_result diff --git a/tests/level_1/test_three_url_builder.py b/tests/level_1/test_three_url_builder.py index bb7b54d2..7fa6fb88 100644 --- a/tests/level_1/test_three_url_builder.py +++ b/tests/level_1/test_three_url_builder.py @@ -1,5 +1,32 @@ from functions.level_1.three_url_builder import build_url +import pytest -def test_build_url(): - pass +def test__build_url__with_relative_url(): + assert build_url("example.com", "path/to/resource") == "example.com/path/to/resource" + + +def test__build_url__with_relative_url_and_get_params(): + assert build_url("example.com", "path/to/resource", {"param1": "value1", "param2": "value2"}) == "example.com/path/to/resource?param1=value1¶m2=value2" + + +def test__build_url__with_relative_url_and_empty_get_params(): + assert build_url("example.com", "path", {}) == "example.com/path" + + +@pytest.mark.parametrize( + 'host_name, relative_url, get_params, expected_result', + [ + ('example.com', 'path/to/resource', None, 'example.com/path/to/resource'), + ('example.com', 'path/to/resource', {"param1": "value1", "param2": "value2"}, 'example.com/path/to/resource?param1=value1¶m2=value2'), + ('example.com', 'path', {}, 'example.com/path'), + ], + ids=[ + 'build_url__with_relative_url', + 'build_url__with_relative_url_and_get_params', + 'build_url__with_relative_url_and_empty_get_params', + ] + +) +def test__build_url(host_name, relative_url, get_params, expected_result): + assert build_url(host_name, relative_url, get_params) == expected_result diff --git a/tests/level_1/test_two_date_parser.py b/tests/level_1/test_two_date_parser.py index b0247049..23f37b17 100644 --- a/tests/level_1/test_two_date_parser.py +++ b/tests/level_1/test_two_date_parser.py @@ -1,5 +1,22 @@ from functions.level_1.two_date_parser import compose_datetime_from +import datetime, pytest +from freezegun import freeze_time -def test_compose_datetime_from(): - pass +@freeze_time("2023-06-01 12:00:00") +def test__compose_datetime__from_today(): + result = compose_datetime_from("today", "10:30") + expected_result = datetime.datetime(2023, 6, 1, 10, 30) + assert result == expected_result + + +@freeze_time("2023-06-01 12:00:00") +def test__compose_datetime__from_tomorrow(): + result = compose_datetime_from("tomorrow", "14:45") + expected_result = datetime.datetime(2023, 6, 2, 14, 45) + assert result == expected_result + + +def test__compose_datetime__wrong_time_format(): + with pytest.raises(ValueError): + compose_datetime_from("today", "10-30") diff --git a/tests/level_1_5/test_five_replace_word.py b/tests/level_1_5/test_five_replace_word.py new file mode 100644 index 00000000..3933726c --- /dev/null +++ b/tests/level_1_5/test_five_replace_word.py @@ -0,0 +1,31 @@ +from functions.level_1_5.five_replace_word import replace_word +import pytest + +def test__replace_word__starts_with_case_irrelevant(): + assert replace_word('the big black car', 'big', 'Cool') == 'the Cool black car' + + +@pytest.mark.parametrize( + 'text, replace_from, replace_to, expected_result', + [ + ('the big black car', 'small', 'Cool', 'the big black car'), + ('the big black car', 'white', 'small', 'the big black car'), + ('the BIG black car', 'STRONG', 'cool', 'the BIG black car'), + ] +) +def test__replace_word__unchanged_when_replace_word_not_found_in_text(text, replace_from, replace_to, expected_result): + assert replace_word(text, replace_from, replace_to) == expected_result + + +@pytest.mark.parametrize( + 'text, replace_from, replace_to, expected_result', + [ + ('the big black car', 'big', 'Cool', 'the Cool black car'), + ('the big black car', 'red', 'small', 'the big black car'), + ('the BIG black car', 'big', 'cool', 'the cool black car'), + ('the big black car', 'big', 'COOL', 'the COOL black car'), + ('the big black car', 'BIG', 'cool', 'the cool black car'), + ] +) +def test__replace_word(text, replace_from, replace_to, expected_result): + assert replace_word(text, replace_from, replace_to) == expected_result \ No newline at end of file diff --git a/tests/level_1_5/test_four_sentiment.py b/tests/level_1_5/test_four_sentiment.py new file mode 100644 index 00000000..1d660c6f --- /dev/null +++ b/tests/level_1_5/test_four_sentiment.py @@ -0,0 +1,45 @@ +from functions.level_1_5.four_sentiment import check_tweet_sentiment +import pytest + +@pytest.mark.parametrize( + 'text, good_words, bad_words, expected_result', + [ + ('This text with only good words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], 'GOOD'), + ('This text with only perfect words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], 'GOOD'), + ('This text with only best words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], 'GOOD'), + ] +) +def test__check_tweet_sentiment__return_good_when_only_good_words_found(text, good_words, bad_words, expected_result): + assert check_tweet_sentiment(text, good_words, bad_words) == expected_result + + + +@pytest.mark.parametrize( + 'text, good_words, bad_words, expected_result', + [ + ('This text with only bad words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], 'BAD'), + ('This text with only scary words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], 'BAD'), + ('This text with only terrible words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], 'BAD'), + ] +) +def test__check_tweet_sentiment__return_bad_when_only_bad_words_found(text, good_words, bad_words, expected_result): + assert check_tweet_sentiment(text, good_words, bad_words) == expected_result + + +@pytest.mark.parametrize( + 'text, good_words, bad_words, expected_result', + [ + ('This text with good and bad words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], None), + ('This text with good best and bad scary words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], None), + ('This text with good best perfect and bad scary terrible words', ['good', 'best', 'perfect'], ['bad', 'scary', 'terrible'], None), + ] +) +def test__check_tweet_sentiment__return_none_when_equal_good_and_bad_words_found(text, good_words, bad_words, expected_result): + assert check_tweet_sentiment(text, good_words, bad_words) == expected_result + + +def test__check_tweet_sentiment__return_none_when_no_good_and_bad_words_found(): + text = 'This text without needed words' + good_words = ['good', 'best', 'perfect'] + bad_words = ['bad', 'scary', 'terrible'] + assert check_tweet_sentiment(text, good_words, bad_words) == None \ No newline at end of file diff --git a/tests/level_1_5/test_one_median.py b/tests/level_1_5/test_one_median.py new file mode 100644 index 00000000..c0653068 --- /dev/null +++ b/tests/level_1_5/test_one_median.py @@ -0,0 +1,21 @@ +from functions.level_1_5.one_median import get_median_value +import pytest + + +def test__get_median_value__return_none_if_empty_items_found(): + assert get_median_value([]) == None + + +@pytest.mark.xfail +def test__get_median_value__return_midle_index_if_even_len_of_items_found(): + assert get_median_value([2, 1, 4, 3]) == 1 + + +@pytest.mark.xfail(reason='Incorrect calculation') +def test__get_median_value__return_middle_index_if_more_even_items_found(): + assert get_median_value([2, 1, 4, 3, 5, 6]) == 3 + + +@pytest.mark.xfail(reason='Incorrect calculation') +def test__get_median_value__return_middle_index_if_odd_len_of_items_found(): + assert get_median_value([1, 3, 6, 8, 9]) == 6 diff --git a/tests/level_1_5/test_three_first.py b/tests/level_1_5/test_three_first.py new file mode 100644 index 00000000..3b343fe7 --- /dev/null +++ b/tests/level_1_5/test_three_first.py @@ -0,0 +1,48 @@ +from functions.level_1_5.three_first import first +import pytest + + +@pytest.mark.parametrize( + 'items, default, expected_result', + [ + ([5, 7, 1, 15], None, 5), + ([1, 2, 4, 1], None, 1), + ([7, 14, 1, 28], None, 7), + ([1, 1, 1, 1], None, 1), + ([1, 0, 0, 0], None, 1), + ([0, 0, 0, 0], None, 0), + ([-10, 0, 0, 0], None, -10), + ([-10, -20, -50, -100], None, -10), + ] +) +def test__first__return_first_item_if_items_is_not_empty(items, default, expected_result): + assert first(items, default) == expected_result + + +def test__first__raise_error_if_empty_items_and_default_are_not_set(): + with pytest.raises(AttributeError): + first([]) + + +def test__first__return_none_if_empty_items_found_and_default_is_none(): + assert first([], None) == None + + +def test__first__return_default_if_empty_items_found_and_default_is_int(): + assert first([], 0) == 0 + +@pytest.mark.parametrize( + 'items, default, expected_result', + [ + ([5, 7, 1, 15], None, 5), + ([], None, None), + ([], 0, 0), + ], + ids=[ + 'return_first_item_if_items_is_not_empty', + 'return_none_if_empty_items_found_and_default_is_non', + 'return_default_if_empty_items_found_and_default_is_int' + ] +) +def test__first(items, default, expected_result): + assert first(items, default) == expected_result \ No newline at end of file diff --git a/tests/level_1_5/test_two_square_equation.py b/tests/level_1_5/test_two_square_equation.py new file mode 100644 index 00000000..9fec03f8 --- /dev/null +++ b/tests/level_1_5/test_two_square_equation.py @@ -0,0 +1,35 @@ +from functions.level_1_5.two_square_equation import solve_square_equation +import pytest + + +def test__solve_square_equation__return_none_if_discriminant_is_negative(): + assert solve_square_equation(1.0, 1.0, 1.0) == (None, None) + + +def test__solve_square_equation__return_two_roots_if_discriminant_is_positive(): + assert solve_square_equation(1.0, -3.0, 2.0) == (1.0, 2.0) + + +@pytest.mark.xfail +def test__solve_square_equation__return_one_root_if_discriminant_is_equal_to_zero(): + assert solve_square_equation(1.0, -2.0, 1.0) == (1, None) + + +def test__solve_square_equation__return_one_root_if_square_coefficient_is_equal_to_zero(): + assert solve_square_equation(0, 2.0, 1) == (-0.5, None) + + +def test__solve_square_equation__return_none_if_square_coefficient_and__linear_coefficients_are_equal_to_zero(): + assert solve_square_equation(0, 0, 1) == (None, None) + +@pytest.mark.parametrize( + 'square_coefficient, linear_coefficient, const_coefficient, expected_result', + [ + (1.0, 1.0, 1.0, (None, None)), + (1.0, -3.0, 2.0, (1.0, 2.0)), + (1.0, -2.0, 1.0, (1, 1)), + (0, 0, 1, (None, None)), + ] +) +def test__solve_square_equation(square_coefficient, linear_coefficient, const_coefficient, expected_result): + assert solve_square_equation(square_coefficient, linear_coefficient, const_coefficient) == expected_result \ No newline at end of file diff --git a/tests/level_1_7/test_four_fraud.py b/tests/level_1_7/test_four_fraud.py new file mode 100644 index 00000000..e92e725b --- /dev/null +++ b/tests/level_1_7/test_four_fraud.py @@ -0,0 +1,38 @@ +from functions.level_1_7.four_fraud import find_fraud_expenses +from conftest import make_expenses + +def test__find_fraud_expenses__get_no_fraud_expenses_if_have_amount_more_than_max_amount(): + history = [ + make_expenses(amount='5000.00'), + make_expenses(amount='5001.00'), + make_expenses(amount='6001.00'), + ] + + expected_fraud_transactions = [] + + fraud_transactions = find_fraud_expenses(history) + assert fraud_transactions == expected_fraud_transactions + + +def test__find_fraud_expenses__get_no_fraud_expenses_if_have_len_amount_less_than_min_chain_length(): + history = [ + make_expenses(amount='1000.00'), + make_expenses(amount='2001.00'), + ] + fraud_transactions = find_fraud_expenses(history) + assert fraud_transactions == [] + + +def test__find_fraud_expenses__if_get_multiple_fraud_chains(): + history = [ + make_expenses(amount='1000.00'), + make_expenses(amount='1000.00'), + make_expenses(amount='1000.00'), + make_expenses(amount='1000.00'), + ] + expected_fraud_transactions = history + + fraud_transactions = find_fraud_expenses(history) + assert fraud_transactions == expected_fraud_transactions + + diff --git a/tests/level_1_7/test_one_avg_daily_expenses.py b/tests/level_1_7/test_one_avg_daily_expenses.py new file mode 100644 index 00000000..a4312948 --- /dev/null +++ b/tests/level_1_7/test_one_avg_daily_expenses.py @@ -0,0 +1,45 @@ +import decimal +from datetime import datetime +from functions.level_1_7.one_avg_daily_expenses import calculate_average_daily_expenses +from conftest import make_expenses + + +def test__calculate_average_daily_expenses_if_expenses_occurs_in_different_days(): + expenses = [ + make_expenses( + amount='100.00', + spent_at=datetime(2023, 6, 1, 12, 0, 0, 0), + ), + make_expenses( + amount='200.00', + spent_at=datetime(2023, 6, 1, 13, 0, 0, 0), + ), + make_expenses( + amount='300.00', + spent_at=datetime(2023, 6, 2, 14, 0, 0, 0), + ), + make_expenses( + amount='400.00', + spent_at=datetime(2023, 6, 2, 15, 0, 0, 0), + ), + ] + + expected_result = decimal.Decimal('500.00') + assert calculate_average_daily_expenses(expenses) == expected_result + + +def test__calculate_average_daily_expenses_if_one_expense_occurs(): + expenses = [ + make_expenses( + amount='100.00', + spent_at=datetime(2023, 6, 1, 12, 0, 0, 0), + ), + ] + expected_result = decimal.Decimal('100.00') + assert calculate_average_daily_expenses(expenses) == expected_result + + +# def test__calculate_average_daily_expenses_with_empty_list(): # This test doesn't work, because raisestatistics.StatisticsError: mean requires at least one data point +# expenses = [] +# expected_result = decimal.Decimal('0.00') +# assert calculate_average_daily_expenses(expenses) == expected_result \ No newline at end of file diff --git a/tests/level_1_7/test_three_is_subscription.py b/tests/level_1_7/test_three_is_subscription.py new file mode 100644 index 00000000..6d1efe58 --- /dev/null +++ b/tests/level_1_7/test_three_is_subscription.py @@ -0,0 +1,41 @@ +from functions.level_1_7.three_is_subscription import is_subscription +from datetime import datetime +from conftest import make_expenses + + +def test__is_subscription__no_subscription_when_expense_occurs_in_same_month(): + expense = make_expenses(spent_in='Megafon', spent_at=datetime(2023, 1, 2, 0, 0)) + history = [ + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 1, 1, 0, 0)) + ] + assert is_subscription(expense, history) == False + + +def test__is_subscription__when_successful_subscription_with_three_months_and_one_expense_in_each_month(): + expense = make_expenses(spent_in='Megafon', spent_at=datetime(2023, 6, 1, 0, 0)) + history = [ + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 1, 1, 0, 0)), + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 2, 1, 0, 0)), + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 3, 1, 0, 0)), + ] + assert is_subscription(expense, history) == True + + +def test__is_subscription__when_no_subscription_with_two_months_and_one_expense_in_each_month(): + expense = make_expenses(spent_in='Megafon', spent_at=datetime(2023, 6, 1, 0, 0)) + history = [ + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 1, 1, 0, 0)), + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 2, 1, 0, 0)), + ] + assert is_subscription(expense, history) == False + + +def test__is_subscription__when_no_subscription_with_three_months_and_few_expenses_in_some_month(): + expense = make_expenses(spent_in='Megafon', spent_at=datetime(2023, 3, 2, 0, 0)) + history = [ + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 1, 1, 0, 0)), + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 2, 1, 0, 0)), + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 2, 2, 0, 0)), + make_expenses(spent_in='Megafon', spent_at=datetime(2023, 3, 1, 0, 0)), + ] + assert is_subscription(expense, history) == False \ No newline at end of file diff --git a/tests/level_1_7/test_two_expense_categorizer.py b/tests/level_1_7/test_two_expense_categorizer.py new file mode 100644 index 00000000..b80db2fb --- /dev/null +++ b/tests/level_1_7/test_two_expense_categorizer.py @@ -0,0 +1,42 @@ +from functions.level_1_7.two_expense_categorizer import guess_expense_category +from functions.level_1_7.models import ExpenseCategory +import pytest +from conftest import make_expenses + + +@pytest.mark.parametrize( + 'expense, ExpenseCategory', + [ + (make_expenses(spent_in='Bastard place'), + ExpenseCategory.BAR_RESTAURANT), + (make_expenses(spent_in='nice clean house'), + ExpenseCategory.SUPERMARKET), + (make_expenses(spent_in='Netflix USA'), + ExpenseCategory.ONLINE_SUBSCRIPTIONS), + (make_expenses(spent_in='Wonder pharm'), + ExpenseCategory.MEDICINE_PHARMACY), + ] +) +def test__guess_expense_category_if_spent_in_contains_trigger_words(expense, ExpenseCategory): + assert guess_expense_category(expense) == ExpenseCategory + + +@pytest.mark.parametrize( + 'expense, ExpenseCategory', + [ + (make_expenses(spent_in='Bastard'), + ExpenseCategory.BAR_RESTAURANT), + (make_expenses(spent_in='pharm'), + ExpenseCategory.MEDICINE_PHARMACY), + (make_expenses(spent_in='www.taxi.yandex.ru'), + ExpenseCategory.TRANSPORT), + + ] +) +def test__guess_expense_category_if_spent_in_is_trigger_word(expense, ExpenseCategory): + assert guess_expense_category(expense) == ExpenseCategory + + +def test__guess_expense_category_if_spent_in_does_not_have_trigger_words(): + expense = make_expenses(spent_in='Y Ashota') + assert guess_expense_category(expense) == None \ No newline at end of file