diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..6955efc0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +__pycache__/ \ No newline at end of file diff --git a/tests/level_1/test_five_title.py b/tests/level_1/test_five_title.py index fe767004..f61b82d6 100644 --- a/tests/level_1/test_five_title.py +++ b/tests/level_1/test_five_title.py @@ -1,5 +1,17 @@ from functions.level_1.five_title import change_copy_item -def test_change_copy_item(): - pass +def test_title_with_additional_copy_text(): + assert change_copy_item('THIS IS TITLE', 100) == 'Copy of THIS IS TITLE' + +def test_return_title(): + assert change_copy_item('THIS IS TITLE', 10) == 'THIS IS TITLE' + +def test_if_has_copy_number_no_space(): + assert change_copy_item('Copy of something(17)', 100) == 'Copy of (18)' + +def test_if_has_copy_number_with_space(): + assert change_copy_item('Copy of something (17)', 100) == 'Copy of something (18)' + +def test_if_no_has_copy_number(): + assert change_copy_item('Copy of something(1fvd7)', 100) == 'Copy of something(1fvd7) (2)' \ No newline at end of file diff --git a/tests/level_1/test_four_bank_parser.py b/tests/level_1/test_four_bank_parser.py index df6c1b41..b446459b 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 +import datetime +import decimal +from typing import NamedTuple def test_parse_ineco_expense(): - pass + text = "112.3 $, 40004234 13.05.23 17:23 Shop_name authcode jhtfj" + author = "Masha" + sent_at = datetime.datetime.now().time() + # Входное значение для функции + sms= SmsMessage(text, author, sent_at) + + bank_card1 = BankCard(last_digits='0123', owner= 'User1') + bank_card2 = BankCard(last_digits = '4234', owner = 'User2') + # Входное значение для функции + cards = [bank_card1, bank_card2] + + expense_result=Expense(amount = decimal.Decimal('112.3'), card = BankCard(last_digits ='4234', owner ='User2'), spent_in = 'Shop_name', spent_at = datetime.datetime(2023, 5, 13, 17, 23)) + assert parse_ineco_expense(sms, cards) == expense_result + diff --git a/tests/level_1/test_one_gender.py b/tests/level_1/test_one_gender.py index 31d0bc7f..1909cb17 100644 --- a/tests/level_1/test_one_gender.py +++ b/tests/level_1/test_one_gender.py @@ -1,5 +1,19 @@ from functions.level_1.one_gender import genderalize +import pytest -def test_genderalize(): - pass +def test__genderalize__gender_is_male(): + assert genderalize("verb_male", "VF", "male") == "verb_male" + + +def test__genderalize__gender_is_female(): + assert genderalize("verb_male", "verb_female", "female") == "verb_female" + + +def test__genderalize__gender_is_other(): + assert genderalize("verb_male", "verb_female", '254654') == "verb_female" + + +def test__genderalize_only_two_parameters_typeerror(): + with pytest.raises(TypeError): + genderalize("verb_male", "verb_female") \ No newline at end of file diff --git a/tests/level_1/test_three_url_builder.py b/tests/level_1/test_three_url_builder.py index bb7b54d2..66e493f6 100644 --- a/tests/level_1/test_three_url_builder.py +++ b/tests/level_1/test_three_url_builder.py @@ -1,5 +1,43 @@ from functions.level_1.three_url_builder import build_url +import pytest +def test__build_url__two_parameters(): + assert build_url('host_name', 'relative_url') == 'host_name/relative_url' -def test_build_url(): - pass + +def test__build_url__get_parameters(): + get_params = {'k': 'k_str', 'v': 'v_str'} + assert build_url('str1', 'relative_url', get_params) == 'str1/relative_url?k=k_str&v=v_str' + + +def test__build_url__get_parameters_short(): + assert build_url('host_name', 'relative_url', {'k': 'k_str'}) == 'host_name/relative_url?k=k_str' + + +def tesr__build_url__get_parameters_empty(): + assert build_url('host_name', 'relative_url', {}) == 'host_name/relative_url' + + +def test__build_url_only_host_name_typeerror(): + with pytest.raises(TypeError): + build_url('host_name') + + +def test_build_url_only_get_params_typeerror(): + with pytest.raises(TypeError): + build_url({'k': 'k_str'}) + + +def test__build_url_value_error_no_parmeters(): + with pytest.raises(TypeError): + build_url() + + +def test__build_url_bad_key_in_get_params_typeerror(): + with pytest.raises(TypeError): + build_url('host_name', 'relative_url', {[1,1]: None}) + + +def test__build_url_bad_key_in_get_params_attributeerror(): + with pytest.raises(AttributeError): + build_url('host_name', 'relative_url', [1,1]) \ No newline at end of file diff --git a/tests/level_1/test_two_date_parser.py b/tests/level_1/test_two_date_parser.py index b0247049..805c3752 100644 --- a/tests/level_1/test_two_date_parser.py +++ b/tests/level_1/test_two_date_parser.py @@ -1,5 +1,23 @@ from functions.level_1.two_date_parser import compose_datetime_from +import datetime +import pytest +def test__compose_datetime_from_date_with_coma(): + assert compose_datetime_from("2023,12,15", "19:55") == datetime.datetime(datetime.date.today().year,datetime.date.today().month,datetime.date.today().day,19,55) -def test_compose_datetime_from(): - pass + +def test__compose_datetime_from_date_is_tomorrow(): + assert compose_datetime_from("tomorrow", "19:55") == datetime.datetime(datetime.date.today().year,datetime.date.today().month,datetime.date.today().day+1,19,55) + + +def test__compose_datetime_from_date_is_chaos(): + assert compose_datetime_from("202yhbmj5", "19:33") == datetime.datetime(datetime.date.today().year,datetime.date.today().month,datetime.date.today().day,19,33) + + +def test__compose_datetime_from_wrong_date(): + with pytest.raises(AttributeError): + compose_datetime_from("202yhbmj5", 14645) + +def test__compose_datetime_from_no_date_str(): + with pytest.raises(TypeError): + compose_datetime_from("19:33") 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..ee33c9fb --- /dev/null +++ b/tests/level_1_5/test_five_replace_word.py @@ -0,0 +1,46 @@ +from functions.level_1_5.five_replace_word import replace_word +import pytest + + +def test__replace_word__one_word_replaced(): + assert replace_word('one two three four', 'two', 'replace_to') == 'one replace_to three four' + + +def test__replace_word__two_words_replaced(): + assert replace_word('one two three Two four', 'two', 'replace_to') == 'one replace_to three replace_to four' + + +def test__replace_word__replace_with_upper_letters(): + assert replace_word('one two three four', 'TWo', 'replace_to') == 'one replace_to three four' + + +def test__replace_word__not_replaced(): + assert replace_word('one two three four', '1234', 'replace_to') == 'one two three four' + + +def test__replace_word__replace_from_is_empty(): + assert replace_word('one two three four', '', 'replace_to') == 'one two three four' + + +def test__replace_word__replace_to_is_empty(): + assert replace_word('one two three four', 'two', '') == 'one three four' + + +def test__replace_word__replace_to_is_int_typeerror(): + with pytest.raises(TypeError): + replace_word('one two three four', 'two', 123) + + +def test__replace_word__replace_from_is_int_attributeerror(): + with pytest.raises(AttributeError): + replace_word('one two three four', 2, '123') + + +def test__replace_word__text_is_int_attributeerror(): + with pytest.raises(AttributeError): + replace_word(123314, 'two', '123') + + +def test__replace_word__not_enough_params_typeerror(): + with pytest.raises(TypeError): + replace_word('123', 'bsrbg') \ No newline at end of file diff --git a/tests/level_1_5/test_four_check_tweet_sentiment.py b/tests/level_1_5/test_four_check_tweet_sentiment.py new file mode 100644 index 00000000..6da3228f --- /dev/null +++ b/tests/level_1_5/test_four_check_tweet_sentiment.py @@ -0,0 +1,57 @@ +from functions.level_1_5.four_sentiment import check_tweet_sentiment +import pytest + + + +def test__check_tweet_sentiment__one_length_for_gw_and_bw(): + assert check_tweet_sentiment('g1 b1 g2 b2 g3 b3 ', {'g1','g2'}, {'b1', 'b2'}) == 'BAD' + + +def test__check_tweet_sentiment__not_bw_and_gw_in_text(): + assert check_tweet_sentiment('g0 b0 g0 b0 g3 b3 ', {'g1','g2'}, {'b1', 'b2'}) == None + + +def test__check_tweet_sentiment_gw_equal_to_bw(): + assert check_tweet_sentiment('g1 b2 g0 b0 g3 b3 ', {'g1','g2'}, {'g1', 'g2'}) == None + + +def test__check_tweet_sentiment__gw_longer_than_bw(): + assert check_tweet_sentiment('g1 b2 g0 b0 g3 b3 g4 b4', {'g1','g2', 'g3'}, {'g1', 'g2'}) == 'GOOD' + + +def test__check_tweet_sentiment__no_set_in_gw_and_bw(): + assert check_tweet_sentiment('1 2', '5 6 7 4', '2') == 'GOOD' + + +def test__check_tweet_sentiment__gw_longer_than_bw_and_nothing_in_text(): + assert check_tweet_sentiment('g0 b0 g0 b0 g0 b3 g4 b4', {'g1','g2', 'g3'}, {'g1', 'g2'}) == None + + +def test__check_tweet_sentiment__gw_shorter_than_bw_and_bw_in_text(): + assert check_tweet_sentiment('g0 b0 g3 b3 g4 b4', {'g1','g2'}, {'g1', 'g2', 'g3'}) == 'BAD' + + +def test__check_tweet_sentiment__gw_shorter_than_bw_and_bw_in_text(): + assert check_tweet_sentiment('g0 b0 g3 b3 g4 b4', {''}, {'g1', 'g2', 'g3'}) == 'BAD' + + +def test__check_tweet_sentiment__gw_and_bw_empty(): + assert check_tweet_sentiment('g0 b0 g3 b3 g4 b4', {''}, {''}) == None + + +def test__check_tweet_sentiment__everything_is_empty(): + assert check_tweet_sentiment('', {''}, {''}) == None + + +def test__check_tweet_sentiment__everything_is_str(): + assert check_tweet_sentiment('one two', 'one', 'two') == 'BAD' + + +def test__check_tweet_sentiment__no_bw_typeerror(): + with pytest.raises(TypeError): + check_tweet_sentiment('', {''}) + + +def test__check_tweet_sentiment__text_is_int_attributeerror(): + with pytest.raises(AttributeError): + check_tweet_sentiment(123, '5 6 7 4', '2') \ 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..27f38d78 --- /dev/null +++ b/tests/level_1_5/test_one_median.py @@ -0,0 +1,52 @@ +from functions.level_1_5.one_median import get_median_value +import pytest + +def test__get_median_value__empty_params(): + items = '' + get_median_value_result = get_median_value(items) + assert get_median_value_result == None + + +def test__get_median_value__list_of_three_params(): + items = [2,1,5] + get_median_value_result = get_median_value(items) + assert get_median_value_result == 5 + + +def test__get_median__value__list_of_negative_values(): + items = [-2,-1,5] + get_median_value_result = get_median_value(items) + assert get_median_value_result == 5 + + +def test__get_median__value__list_of_odd_params(): + items = [2,1,3,9, 10] + get_median_value_result = get_median_value(items) + assert get_median_value_result == 9 + + +def test__get_median__value__list_of_even_params(): + items = [2,1,1,1,3,3,2,9,9,3,9, 10] + get_median_value_result = get_median_value(items) + assert get_median_value_result == 9 + + +def test__get_median__value__list_of_float_params(): + items = [0.6, 99.4, 13.2] + get_median_value_result = get_median_value(items) + assert get_median_value([0.6, 99.4, 13.2])==13.2 + + +def test__get_median_value__no_params_typeerror(): + with pytest.raises(TypeError): + get_median_value() + + +def test__get_median_value__list_of_four_params_indexerror(): + with pytest.raises(IndexError): + get_median_value([2,1,3,9]) + + +def test__get_median_value__one_int_in_params_typeerror(): + with pytest.raises(TypeError): + get_median_value(1) \ No newline at end of file diff --git a/tests/level_1_5/test_three.py b/tests/level_1_5/test_three.py new file mode 100644 index 00000000..f4ff4c94 --- /dev/null +++ b/tests/level_1_5/test_three.py @@ -0,0 +1,54 @@ +from functions.level_1_5.three_first import first, NOT_SET +import pytest + + +def test__first__only_items(): + assert first([1,2,3]) == 1 + + +def test__first__items_and_no_set(): + assert first([1,2,3], NOT_SET) == 1 + + +def test__first__no_items_empty_list(): + assert first([], 'default') == 'default' + + +def test__first__items_empty(): + assert first('', 'default') == 'default' + +def test__first__items_is_none(): + assert first(None, 'default') == 'default' + + +def test__first__default_is_int(): + assert first(None, 1234) == 1234 + +def test__first__items_and_defaults_are_none(): + assert first(None, None) == None + +def test__first__defaults_is_tuple(): + assert first(None, (5,56)) == (5, 56) + + +def test__first__defaults_is_string(): + assert first('default') == 'd' + + +def test__first__defaults_is_not_set(): + assert first(NOT_SET) == 'N' + + +def test__first__items_is_empty_no_defaults_attributeerror(): + with pytest.raises(AttributeError): + first([]) + + +def test__first__items_is_empty_attributeerror(): + with pytest.raises(AttributeError): + first([], NOT_SET) + + +def test__first__no_parameters(): + with pytest.raises(TypeError): + first() \ 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..c670232d --- /dev/null +++ b/tests/level_1_5/test_two__square_equation.py @@ -0,0 +1,53 @@ +from functions.level_1_5.two_square_equation import solve_square_equation +import pytest + + +def test__solve_square_equation__all_params_zero(): + assert solve_square_equation(0,0,0) == (None, None) + + +def test__solve_square_equation__const_coefficient_zero(): + assert solve_square_equation(5,2,0) == (-0.4, 0.0) + + +def test__solve_square_equation__square_coefficient_zero(): + assert solve_square_equation(0,2,10) == (-5.0, None) + + +def test__solve_square_equation__only_linear_coefficient(): + assert solve_square_equation(0,2,0) == (0.0, None) + + +def test__solve_square_equation__linear_coefficient_zero(): + assert solve_square_equation(4,0,-16) == (-2.0, 2.0) + + +def test__solve_square_equation__all_coefficients_int(): + assert solve_square_equation(5,3,-26) == (-2.6, 2.0) + + +def test__solve_square_equation__discriminant_below_zero(): + assert solve_square_equation(1,2,5) == (None, None) + + +def test__solve_square_equation__all_coefficients_float(): + assert solve_square_equation(1.1, 2.2, -5.5) == (-3.449489742783178, 1.4494897427831779) + + +def test__solve_square_equation__not_enougt_params(): + with pytest.raises(TypeError): + solve_square_equation(0,0) + + +def test__solve_square_equation__too_many_params(): + with pytest.raises(TypeError): + solve_square_equation(5,2,0, 9) + + +def test__solve_square_equation__params_are_string(): + with pytest.raises(TypeError): + solve_square_equation('a','b','c') + +def test__solve_square_equation__params_are_lists(): + with pytest.raises(TypeError): + solve_square_equation([0],[0],[0])