From 165969b31621a7eed45cb8683212ca965fb68061 Mon Sep 17 00:00:00 2001 From: SergeiT Date: Thu, 22 Feb 2024 19:43:00 +0200 Subject: [PATCH 1/8] first tests --- functions/level_1/two_date_parser.py | 2 -- tests/level_1/test_five_title.py | 16 ++++++++++++++-- tests/level_1/test_four_bank_parser.py | 14 +++++++++++++- tests/level_1/test_one_gender.py | 20 ++++++++++++++++++-- tests/level_1/test_three_url_builder.py | 2 +- tests/level_1/test_two_date_parser.py | 21 +++++++++++++++++++-- 6 files changed, 65 insertions(+), 10 deletions(-) diff --git a/functions/level_1/two_date_parser.py b/functions/level_1/two_date_parser.py index 4979a02b..4aeeeb62 100644 --- a/functions/level_1/two_date_parser.py +++ b/functions/level_1/two_date_parser.py @@ -14,5 +14,3 @@ def compose_datetime_from(date_str: str, time_str: str) -> datetime.datetime: int(hour_str), int(minute_str), ) - - diff --git a/tests/level_1/test_five_title.py b/tests/level_1/test_five_title.py index fe767004..3605a444 100644 --- a/tests/level_1/test_five_title.py +++ b/tests/level_1/test_five_title.py @@ -1,5 +1,17 @@ +import pytest + from functions.level_1.five_title import change_copy_item -def test_change_copy_item(): - pass +@pytest.mark.parametrize(('title', 'result'), [ + ('Title', 'Copy of Title'), + ('Tit19'*19, f'Copy of {"Tit19"*19}'), # Failed + ('Tit20'*20, 'Tit20'*20), + ('TITLE', 'Copy of TITLE'), + ('Tit18'*18, f'Copy of {"Tit18"*18}'), + ('Copy of Tit18', f'Copy of Tit18 (2)'), + ('Copy of Title (1)', f'Copy of Title (2)'), + ('Copy of Title (2)', f'Copy of Title (3)') +]) +def test_change_copy_item(title, result): + assert change_copy_item(title) == result diff --git a/tests/level_1/test_four_bank_parser.py b/tests/level_1/test_four_bank_parser.py index df6c1b41..0c91d3e7 100644 --- a/tests/level_1/test_four_bank_parser.py +++ b/tests/level_1/test_four_bank_parser.py @@ -1,5 +1,17 @@ +import datetime +from decimal import Decimal + from functions.level_1.four_bank_parser import BankCard, SmsMessage, Expense, parse_ineco_expense def test_parse_ineco_expense(): - pass + assert (parse_ineco_expense( + SmsMessage( + text='7777.55 EUR, ' + '8888 12.02.24 10:47 London authcode 123456', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56) + + ), + [BankCard(last_digits='8888', owner='John Doe')]) == + Expense(amount=Decimal('7777.55'), card=BankCard(last_digits='8888', owner='John Doe'), + spent_in='London', spent_at=datetime.datetime(2024, 2, 12, 10, 47))) diff --git a/tests/level_1/test_one_gender.py b/tests/level_1/test_one_gender.py index 31d0bc7f..7b5c8ee7 100644 --- a/tests/level_1/test_one_gender.py +++ b/tests/level_1/test_one_gender.py @@ -1,5 +1,21 @@ +import pytest + from functions.level_1.one_gender import genderalize -def test_genderalize(): - pass +@pytest.mark.parametrize(("gender", 'verb'), [ + ('male', 'he'), + ('female', 'she'), + ('123', 'she'), + (123, 'she'), + (None, 'she'), + (True, 'she'), + (('male'), 'he'), + (['male'], 'she'), + (['male', 'female'], 'she'), + (('female'), 'she'), + (['female'], 'she'), + (['female', 'male'], 'she') +]) +def test_genderalize(gender, verb): + assert genderalize('he', 'she', gender) == verb diff --git a/tests/level_1/test_three_url_builder.py b/tests/level_1/test_three_url_builder.py index bb7b54d2..d62a1bbf 100644 --- a/tests/level_1/test_three_url_builder.py +++ b/tests/level_1/test_three_url_builder.py @@ -2,4 +2,4 @@ def test_build_url(): - pass + assert build_url('host', 'relative_url', {"key1": "param1", "key2": "param2"}) == 'host/relative_url?key1=param1&key2=param2' diff --git a/tests/level_1/test_two_date_parser.py b/tests/level_1/test_two_date_parser.py index b0247049..db15c8ce 100644 --- a/tests/level_1/test_two_date_parser.py +++ b/tests/level_1/test_two_date_parser.py @@ -1,5 +1,22 @@ +from datetime import datetime +import pytest + from functions.level_1.two_date_parser import compose_datetime_from -def test_compose_datetime_from(): - pass +@pytest.mark.parametrize(('date_str', 'time_str', 'year', 'month', 'day', 'hours', 'minutes'), [ + ('today', '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), + ('tomorrow', '11:22', datetime.now().year, datetime.now().month, datetime.now().day+1, 11, 22), + ('yesterday', '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), + ('123', '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), + (123, '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), + (True, '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), + ('today', '00:01', datetime.now().year, datetime.now().month, datetime.now().day, 0, 1), + ('tomorrow', '01:59', datetime.now().year, datetime.now().month, datetime.now().day+1, 1, 59), + pytest.param('today', '99:99', datetime.now().year, datetime.now().month, datetime.now().day, 99, 99, + marks=pytest.mark.xfail(reason="Expected to fail", strict=True)) +]) +def test_compose_datetime_from(date_str, time_str, year, month, day, hours, minutes): + assert compose_datetime_from(date_str, time_str) == datetime(year, month, day, hours, minutes) + + From a11df57c08fce6769129800f05a9b0069f135ec5 Mon Sep 17 00:00:00 2001 From: SergeiT Date: Mon, 26 Feb 2024 21:43:20 +0200 Subject: [PATCH 2/8] first tests with changes --- tests/level_1/test_five_title.py | 35 ++++++++-- tests/level_1/test_four_bank_parser.py | 86 +++++++++++++++++++++++-- tests/level_1/test_one_gender.py | 25 ++++--- tests/level_1/test_three_url_builder.py | 23 ++++++- tests/level_1/test_two_date_parser.py | 36 +++++++---- 5 files changed, 165 insertions(+), 40 deletions(-) diff --git a/tests/level_1/test_five_title.py b/tests/level_1/test_five_title.py index 3605a444..04306764 100644 --- a/tests/level_1/test_five_title.py +++ b/tests/level_1/test_five_title.py @@ -5,13 +5,34 @@ @pytest.mark.parametrize(('title', 'result'), [ ('Title', 'Copy of Title'), - ('Tit19'*19, f'Copy of {"Tit19"*19}'), # Failed - ('Tit20'*20, 'Tit20'*20), + ('TitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitle6789', + 'Copy of TitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitle6789'), # Failed ('TITLE', 'Copy of TITLE'), - ('Tit18'*18, f'Copy of {"Tit18"*18}'), - ('Copy of Tit18', f'Copy of Tit18 (2)'), - ('Copy of Title (1)', f'Copy of Title (2)'), - ('Copy of Title (2)', f'Copy of Title (3)') + ('TITLE ', 'Copy of TITLE '), + (' TITLE ', 'Copy of TITLE '), + ('Title /!@# $%^&*()_+=- 098765432 1]\};`', 'Copy of Title /!@# $%^&*()_+=- 098765432 1]\};`') ]) -def test_change_copy_item(title, result): +def test_title_length_less_one_hundred(title, result): + assert change_copy_item(title) == result + + +@pytest.mark.parametrize(('title', 'result'), [ + ('TitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitle', + 'TitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitle'), + ('TitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitle1', + 'TitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitleTitle1') + ]) +def test_title_length_more_or_equal_one_hundred(title, result): + assert change_copy_item(title) == result + + +@pytest.mark.parametrize(('title', 'result'), [ + ('Copy of Title', 'Copy of Title (2)'), + ('COPY OF Title', 'Copy of COPY OF Title'), + ('Copy of Title (2)', f'Copy of Title (3)'), + ('Copy Title', 'Copy of Copy Title'), + ('Copy of Title (0)', f'Copy of Title (1)'), + ('Copy of Title (-1)', f'Copy of Title (-1) (2)') + ]) +def test_title_contains_copy(title, result): assert change_copy_item(title) == result diff --git a/tests/level_1/test_four_bank_parser.py b/tests/level_1/test_four_bank_parser.py index 0c91d3e7..37bb9422 100644 --- a/tests/level_1/test_four_bank_parser.py +++ b/tests/level_1/test_four_bank_parser.py @@ -1,17 +1,89 @@ import datetime +import pytest from decimal import Decimal - from functions.level_1.four_bank_parser import BankCard, SmsMessage, Expense, parse_ineco_expense -def test_parse_ineco_expense(): +def test_parse_ineco_expense_correct_data(): assert (parse_ineco_expense( SmsMessage( - text='7777.55 EUR, ' - '8888 12.02.24 10:47 London authcode 123456', - author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56) - - ), + text='7777.55 EUR, 8888 12.02.24 10:47 London authcode 123456', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56)), [BankCard(last_digits='8888', owner='John Doe')]) == Expense(amount=Decimal('7777.55'), card=BankCard(last_digits='8888', owner='John Doe'), spent_in='London', spent_at=datetime.datetime(2024, 2, 12, 10, 47))) + + + +def test_parse_ineco_expense_int_sms_money_amount(): + assert (parse_ineco_expense(SmsMessage( + text='777755 EUR, 8888 12.02.30 10:47 London authcode 123456', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56)), + [BankCard(last_digits='8888', owner='John Doe')]) == + + Expense(amount=Decimal('777755'), card=BankCard(last_digits='8888', owner='John Doe'), + spent_in='London', spent_at=datetime.datetime(2030, 2, 12, 10, 47))) + + +def test_parse_ineco_expense_sms_no_currency(): + with pytest.raises(IndexError): + assert (parse_ineco_expense(SmsMessage( + text='7777.55, 8888 12.02.30 10:47 London authcode 123456', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56)), + [BankCard(last_digits='8888', owner='John Doe')]) == + + Expense(amount=Decimal('7777.55'), card=BankCard(last_digits='8888', owner='John Doe'), + spent_in='London', spent_at=datetime.datetime(2030, 2, 12, 10, 47))) + + +def test_parse_ineco_expense_sms_no_auth_code(): + assert (parse_ineco_expense(SmsMessage( + text='7777.55 EUR, 8888 12.02.30 10:47 London', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56)), + [BankCard(last_digits='8888', owner='John Doe')]) == + + Expense(amount=Decimal('7777.55'), card=BankCard(last_digits='8888', owner='John Doe'), + spent_in='London', spent_at=datetime.datetime(2030, 2, 12, 10, 47))) + + +def test_parse_ineco_expense_sms_no_card_last_digits(): + with pytest.raises(ValueError): + assert (parse_ineco_expense(SmsMessage( + text='7777.55 EUR, 12.02.30 10:47 London authcode 123456', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56)), + [BankCard(last_digits='', owner='John Doe')]) == + + Expense(amount=Decimal('7777.55'), card=BankCard(last_digits='', owner='John Doe'), + spent_in='London', spent_at=datetime.datetime(2030, 2, 12, 10, 47))) + + +def test_parse_ineco_expense_sms_wrong_date(): + with pytest.raises(ValueError): + assert (parse_ineco_expense( + SmsMessage( + text='7777.55 EUR, 8888 40.02.24 10:47 London authcode 123456', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56)), + [BankCard(last_digits='8888', owner='John Doe')]) == + Expense(amount=Decimal('7777.55'), card=BankCard(last_digits='8888', owner='John Doe'), + spent_in='London', spent_at=datetime.datetime(2024, 2, 40, 10, 47))) + + +def test_parse_ineco_expense_sms_wrong_time(): + with pytest.raises(ValueError): + assert (parse_ineco_expense( + SmsMessage( + text='7777.55 EUR, 8888 20.02.24 50:47 London authcode 123456', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56)), + [BankCard(last_digits='8888', owner='John Doe')]) == + Expense(amount=Decimal('7777.55'), card=BankCard(last_digits='8888', owner='John Doe'), + spent_in='London', spent_at=datetime.datetime(2024, 2, 20, 50, 47))) + + +def test_parse_ineco_expense_sms_empty_owner(): + assert (parse_ineco_expense( + SmsMessage( + text='7777.55 EUR, 8888 20.02.24 10:47 London authcode 123456', + author='Alice', sent_at=datetime.datetime(2024, 2, 22, 12, 34, 56)), + [BankCard(last_digits='8888', owner='')]) == + Expense(amount=Decimal('7777.55'), card=BankCard(last_digits='8888', owner=''), + spent_in='London', spent_at=datetime.datetime(2024, 2, 20, 10, 47))) \ No newline at end of file diff --git a/tests/level_1/test_one_gender.py b/tests/level_1/test_one_gender.py index 7b5c8ee7..0c1ae7b6 100644 --- a/tests/level_1/test_one_gender.py +++ b/tests/level_1/test_one_gender.py @@ -5,17 +5,22 @@ @pytest.mark.parametrize(("gender", 'verb'), [ ('male', 'he'), + ('male ', 'she'), + (' male ', 'she'), + ('ma le', 'she') +]) +def test_genderalize_male(gender, verb): + assert genderalize('he', 'she', gender) == verb + + +@pytest.mark.parametrize(("gender", 'verb'), [ ('female', 'she'), + ('fem', 'she'), + ('female1', 'she'), + ('mal', 'she'), + ('male1', 'she'), ('123', 'she'), - (123, 'she'), - (None, 'she'), - (True, 'she'), - (('male'), 'he'), - (['male'], 'she'), - (['male', 'female'], 'she'), - (('female'), 'she'), - (['female'], 'she'), - (['female', 'male'], 'she') + ('', 'she') ]) -def test_genderalize(gender, verb): +def test_genderalize_not_male(gender, verb): assert genderalize('he', 'she', gender) == verb diff --git a/tests/level_1/test_three_url_builder.py b/tests/level_1/test_three_url_builder.py index d62a1bbf..61837048 100644 --- a/tests/level_1/test_three_url_builder.py +++ b/tests/level_1/test_three_url_builder.py @@ -1,5 +1,24 @@ +import pytest + from functions.level_1.three_url_builder import build_url -def test_build_url(): - assert build_url('host', 'relative_url', {"key1": "param1", "key2": "param2"}) == 'host/relative_url?key1=param1&key2=param2' +@pytest.mark.parametrize(('host', 'relative_url', 'get_params', 'result'), [ + ('host', 'relative_url', {"key1": "param1", "key2": "param2"}, 'host/relative_url?key1=param1&key2=param2'), + ('https://example.com', 'relative_url', {"key1": "PARAM1", "key2": "PARAM2"}, 'https://example.com/relative_url?key1=PARAM1&key2=PARAM2'), + ('http://example.com', 'path/to/resource', {"key1": "param1", "key2": "param&2"}, 'http://example.com/path/to/resource?key1=param1&key2=param&2'), + ('!@#$%^&*()_+|}/*-+~`<>?', '!@#$%^&*()_+|}/*-+~`<>?', {"key1": "!@#$%^&*()_+|}/*-+~`<>?", "key2": "!@#$%^&*()_+|}/*-+~`<>?"}, '!@#$%^&*()_+|}/*-+~`<>?/!@#$%^&*()_+|}/*-+~`<>??key1=!@#$%^&*()_+|}/*-+~`<>?&key2=!@#$%^&*()_+|}/*-+~`<>?') +]) +def test_build_url(host, relative_url, get_params, result): + assert (build_url(host, relative_url, get_params) == result) + + +@pytest.mark.parametrize(('host', 'relative_url', 'get_params', 'result'), [ + ('http://example.com', '', {"key1": "param1", "key2": "param2"}, 'http://example.com/?key1=param1&key2=param2'), + ('', '', {"key1": "param1", "key2": "param2"}, '/?key1=param1&key2=param2'), + ('http://example.com', 'path/to/resource', {"key1": "", "key2": "param2"}, 'http://example.com/path/to/resource?key1=&key2=param2'), + ('http://example.com', 'path/to/resource', {"key1": "param1", "": "param2"}, 'http://example.com/path/to/resource?key1=param1&=param2'), + ('', '', {"": "", "": ""}, '/?=') +]) +def test_build_url_with_empty_data(host, relative_url, get_params, result): + assert (build_url(host, relative_url, get_params) == result) diff --git a/tests/level_1/test_two_date_parser.py b/tests/level_1/test_two_date_parser.py index db15c8ce..d37bb34e 100644 --- a/tests/level_1/test_two_date_parser.py +++ b/tests/level_1/test_two_date_parser.py @@ -4,19 +4,27 @@ from functions.level_1.two_date_parser import compose_datetime_from -@pytest.mark.parametrize(('date_str', 'time_str', 'year', 'month', 'day', 'hours', 'minutes'), [ - ('today', '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), - ('tomorrow', '11:22', datetime.now().year, datetime.now().month, datetime.now().day+1, 11, 22), - ('yesterday', '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), - ('123', '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), - (123, '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), - (True, '11:22', datetime.now().year, datetime.now().month, datetime.now().day, 11, 22), - ('today', '00:01', datetime.now().year, datetime.now().month, datetime.now().day, 0, 1), - ('tomorrow', '01:59', datetime.now().year, datetime.now().month, datetime.now().day+1, 1, 59), - pytest.param('today', '99:99', datetime.now().year, datetime.now().month, datetime.now().day, 99, 99, - marks=pytest.mark.xfail(reason="Expected to fail", strict=True)) -]) -def test_compose_datetime_from(date_str, time_str, year, month, day, hours, minutes): - assert compose_datetime_from(date_str, time_str) == datetime(year, month, day, hours, minutes) +@pytest.mark.parametrize('date_str', ['today', 'yesterday']) +def test_compose_datetime_today_or_yesterday(date_str): + assert compose_datetime_from(date_str, '11:22') == datetime(datetime.now().year, datetime.now().month, datetime.now().day, 11, 22) + + +def test_compose_datetime_tomorrow(): + assert compose_datetime_from('tomorrow', '11:22') == datetime(datetime.now().year, datetime.now().month, datetime.now().day+1, 11, 22) +@pytest.mark.parametrize('date_str', ['123', '', ' ']) +def test_compose_datetime_from_improper_date_value(date_str): + assert compose_datetime_from(date_str, '11:22') == datetime(datetime.now().year, datetime.now().month, datetime.now().day, 11, 22) + + +@pytest.mark.parametrize(('time_str', 'hour', 'minute'), [ + ('123', 1, 23), + ('', 0, 0), + ('12:77', 12, 77), + ('77:12', 77, 12), + (' : ', 0, 0) +]) +def test_compose_datetime_from_improper_time_value(time_str, hour, minute): + with pytest.raises(ValueError): + assert compose_datetime_from('today', time_str) == datetime(datetime.now().year, datetime.now().month, datetime.now().day, hour, minute) From ca07225d4dceb6d3f2ddec664e3423c28df04b5d Mon Sep 17 00:00:00 2001 From: SergeiT Date: Wed, 28 Feb 2024 22:14:31 +0200 Subject: [PATCH 3/8] level 2 --- functions/level_2/five_replace_word.py | 3 ++ tests/level_2/test_four_sentiment.py | 17 ++++++++++ tests/level_2/test_one_pr_url.py | 16 ++++++++++ tests/level_2/test_replace_word.py | 21 +++++++++++++ tests/level_2/test_three_first.py | 19 ++++++++++++ tests/level_2/test_two_square_equation.py | 38 +++++++++++++++++++++++ 6 files changed, 114 insertions(+) create mode 100644 tests/level_2/test_four_sentiment.py create mode 100644 tests/level_2/test_one_pr_url.py create mode 100644 tests/level_2/test_replace_word.py create mode 100644 tests/level_2/test_three_first.py create mode 100644 tests/level_2/test_two_square_equation.py diff --git a/functions/level_2/five_replace_word.py b/functions/level_2/five_replace_word.py index c803d0ed..c841282a 100644 --- a/functions/level_2/five_replace_word.py +++ b/functions/level_2/five_replace_word.py @@ -9,3 +9,6 @@ def replace_word(text: str, replace_from: str, replace_to: str) -> str: new_words.append(word) return ' '.join(new_words) + + +print(replace_word('replace', 'replace', 'htllo')) \ No newline at end of file diff --git a/tests/level_2/test_four_sentiment.py b/tests/level_2/test_four_sentiment.py new file mode 100644 index 00000000..4fe84e4b --- /dev/null +++ b/tests/level_2/test_four_sentiment.py @@ -0,0 +1,17 @@ +import pytest + +from functions.level_2.four_sentiment import check_tweet_sentiment + + +@pytest.mark.parametrize(('text', 'result'), [ + ('good news', 'GOOD'), + ('the best of the best news', 'GOOD'), + ('good fff best news', 'GOOD'), + ('ff news', 'BAD'), + ('f and fff news', 'BAD'), + ('good f ff news', 'BAD'), + ('normal news', None), + ('good best f ff news', None) +]) +def test_four_sentiment(text, result): + assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result diff --git a/tests/level_2/test_one_pr_url.py b/tests/level_2/test_one_pr_url.py new file mode 100644 index 00000000..29d52ca9 --- /dev/null +++ b/tests/level_2/test_one_pr_url.py @@ -0,0 +1,16 @@ +import pytest + +from functions.level_2.one_pr_url import is_github_pull_request_url + + +@pytest.mark.parametrize(('url', 'result'), [ + ('https://github.com/test/test/pull/1', True), + ('https://github.com/test/test/pull/', True), + ('https://github.com/test/test/pull/1/test', False), + ('https://git.com/test/test/pull/1', False), + ('https://github.com/test/test/no_pull/1', False), + ('https://github.com/test/test/pull', False), + +]) +def test_four_sentiment(url, result): + assert is_github_pull_request_url(url) == result diff --git a/tests/level_2/test_replace_word.py b/tests/level_2/test_replace_word.py new file mode 100644 index 00000000..258b6d62 --- /dev/null +++ b/tests/level_2/test_replace_word.py @@ -0,0 +1,21 @@ +import pytest + +from functions.level_2.five_replace_word import replace_word + + +@pytest.mark.parametrize(('replace_from', 'replace_to'), [ + ('seven', 'seven'), + ('one', 'one'), + ('seven', 'one') +]) +def test_five_replace_word_no_replacement(replace_from, replace_to): + assert replace_word('one two three four five six', replace_from, replace_to) == 'one two three four five six' + + +@pytest.mark.parametrize(('replace_from', 'replace_to'), [ + ('one', 'seven'), + ('one', 'two') +]) +def test_five_replace_word_with_replacement(replace_from, replace_to): + removed_first_word = 'two three four five six' + assert replace_word('one two three four five six', replace_from, replace_to) == f"{replace_to} {removed_first_word}" \ No newline at end of file diff --git a/tests/level_2/test_three_first.py b/tests/level_2/test_three_first.py new file mode 100644 index 00000000..8ed5d7d3 --- /dev/null +++ b/tests/level_2/test_three_first.py @@ -0,0 +1,19 @@ +import pytest + +from functions.level_2.three_first import first + + +@pytest.mark.parametrize(('items', 'default', 'result'), [ + ([1, 2], 4, 1), + ([1, 2], None, 1), + ([1, 2], 'NOT_SET', 1), + ([], 5, 5), + ([], None, None) +]) +def test_with_return_value(items, default, result): + assert first(items, default) == result + + +def test_with_attribute_error(): + with pytest.raises(AttributeError): + assert first([], 'NOT_SET') == 0 diff --git a/tests/level_2/test_two_square_equation.py b/tests/level_2/test_two_square_equation.py new file mode 100644 index 00000000..fd9c1a16 --- /dev/null +++ b/tests/level_2/test_two_square_equation.py @@ -0,0 +1,38 @@ +import pytest + +from functions.level_2.two_square_equation import solve_square_equation + + +@pytest.mark.parametrize(('square_coeff', 'linear_coeff', 'const_coeff', 'result'),[ + (0.0, 0.1, 0.1, (-1.0, None)), + (0.0, 0.0, 0.1, (None, None)), + (0.0, 0.0, 0.0, (None, None)), + (0.0, -0.1, 0.1, (1.0, None)), + (0.0, 0.1, -0.1, (1.0, None)), + (0.0, -0.1, -0.1, (-1.0, None)) +]) +def test_two_square_zero_data(square_coeff, linear_coeff, const_coeff, result): + assert solve_square_equation(square_coeff, linear_coeff, const_coeff) == result + + +@pytest.mark.parametrize(('square_coeff', 'linear_coeff', 'const_coeff', 'result'), [ + (1.0, 2.0, 1.0, (-1.0, -1.0)), + (1.0, -2.0, 1.0, (1.0, 1.0)), + (0.9, 0.1, 0.1, (None, None)), + (0.1, 0.1, 0.9, (None, None)), + (0.1, 0.1, 0.1, (None, None)), + (-1.0, 2.0, 1.0, (2.414213562373095, -0.41421356237309515)), + (0.9, -0.1, 0.1, (None, None)), + (-0.1, 0.1, -0.9, (None, None)), + (-0.1, -0.1, -0.1, (None, None)) +]) +def test_two_square_some_equal_coefficients(square_coeff, linear_coeff, const_coeff, result): + assert solve_square_equation(square_coeff, linear_coeff, const_coeff) == result + + +@pytest.mark.parametrize(('square_coeff', 'linear_coeff', 'const_coeff', 'result'), [ + (0.01, 0.09, 0.01, (-8.88748219369606, -0.11251780630393907)), + (-0.01, -0.09, -0.01, (-0.11251780630393907, -8.88748219369606)) +]) +def test_two_square(square_coeff, linear_coeff, const_coeff, result): + assert solve_square_equation(square_coeff, linear_coeff, const_coeff) == result From b797757d3d0dd803ab15356a7fb7ff89803fd806 Mon Sep 17 00:00:00 2001 From: SergeiT Date: Fri, 8 Mar 2024 21:10:20 +0200 Subject: [PATCH 4/8] fixes by comments --- functions/level_2/five_replace_word.py | 3 -- pytest.ini | 4 ++ tests/level_2/test_five_replace_word.py | 41 ++++++++++++++++++ tests/level_2/test_four_sentiment.py | 42 ++++++++++++++++-- tests/level_2/test_one_pr_url.py | 21 ++++++--- tests/level_2/test_replace_word.py | 21 --------- tests/level_2/test_three_first.py | 8 ++-- tests/level_2/test_two_square_equation.py | 53 ++++++++--------------- 8 files changed, 122 insertions(+), 71 deletions(-) create mode 100644 pytest.ini create mode 100644 tests/level_2/test_five_replace_word.py delete mode 100644 tests/level_2/test_replace_word.py diff --git a/functions/level_2/five_replace_word.py b/functions/level_2/five_replace_word.py index c841282a..c803d0ed 100644 --- a/functions/level_2/five_replace_word.py +++ b/functions/level_2/five_replace_word.py @@ -9,6 +9,3 @@ def replace_word(text: str, replace_from: str, replace_to: str) -> str: new_words.append(word) return ' '.join(new_words) - - -print(replace_word('replace', 'replace', 'htllo')) \ No newline at end of file diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 00000000..87c2714f --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +addopts = + -vv --diff-width=60 + -vv --diff-symbols \ No newline at end of file diff --git a/tests/level_2/test_five_replace_word.py b/tests/level_2/test_five_replace_word.py new file mode 100644 index 00000000..850337ac --- /dev/null +++ b/tests/level_2/test_five_replace_word.py @@ -0,0 +1,41 @@ +import pytest + +from functions.level_2.five_replace_word import replace_word + + +@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ + ('one two three four five six', 'seven', 'seven'), + ('one two three four five six', 'seven', 'one'), + ('one two three four five six', '', 'one'), + ('one two three four five six', '', ''), + ('one two three four five six', ' ', ' ') +]) +def test____five_replace_word____no_replacement_if_no_replace_from_in_the_text(text, replace_from, replace_to): + assert replace_word(text, replace_from, replace_to) == text + + +@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ + ('one two three four five six', 'one', 'seven'), + ('one two three four five six', 'one', 'two'), + ('one two three four five six', 'one', ''), + ('one two three four five six', 'one', ' ') +]) +def test__five_replace_word__replacement_if_replace_from_is_in_the_text(text, replace_from, replace_to): + removed_first_word = text.split(' ', 1)[1] + assert replace_word(text, replace_from, replace_to) == f"{replace_to} {removed_first_word}" + + +def test__five_replace_word__replacement_without_changes_if_the_same_words_in_all_parameters(): + assert replace_word('one two three four five six', 'one', 'one') == 'one two three four five six' + + +@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ + ('one two three four five six', 'ONE', 'seven'), + ('one two three four five six', 'one', 'TWO'), + ('one two three four five six', 'ONE', ''), + ('one two three four five six', 'ONE', ' '), + ('ONE two three four five six', 'one', 'seven'), +]) +def test__five_replace_word__replacement_if_replace_from_is_in_the_text_ignore_case(text, replace_from, replace_to): + removed_first_word = text.split(' ', 1)[1] + assert replace_word(text, replace_from, replace_to) == f"{replace_to} {removed_first_word}" \ No newline at end of file diff --git a/tests/level_2/test_four_sentiment.py b/tests/level_2/test_four_sentiment.py index 4fe84e4b..96112ee8 100644 --- a/tests/level_2/test_four_sentiment.py +++ b/tests/level_2/test_four_sentiment.py @@ -6,12 +6,48 @@ @pytest.mark.parametrize(('text', 'result'), [ ('good news', 'GOOD'), ('the best of the best news', 'GOOD'), - ('good fff best news', 'GOOD'), + ('good fff best news', 'GOOD') +]) +def test__four_sentiment__return_good_if_good_words_more_than_bad(text, result): + assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result + + +@pytest.mark.parametrize(('text', 'result'), [ ('ff news', 'BAD'), ('f and fff news', 'BAD'), - ('good f ff news', 'BAD'), + ('good f ff news', 'BAD') +]) +def test__four_sentiment__return_bad_if_bad_words_more_than_good(text, result): + assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result + + +@pytest.mark.parametrize(('text', 'result'), [ ('normal news', None), ('good best f ff news', None) ]) -def test_four_sentiment(text, result): +def test__four_sentiment__return_none_if_quantity_of_good_and_bad_words_is_equal(text, result): assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result + + +@pytest.mark.parametrize(('text', 'result'), [ + ('', None), + (' ', None) +]) +def test__four_sentiment__return_none_if_no_words_in_text(text, result): + assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result + + +def test__four_sentiment__return_none_if_good_list_is_empty_and_no_bad_verbs_in_text(): + assert check_tweet_sentiment('good news', {}, {'f', 'ff', 'fff'}) == None + + +def test__four_sentiment__return_none_if_bad_list_is_empty_and_no_good_verbs_in_text(): + assert check_tweet_sentiment('ff news', {'good', 'better', 'best'}, {}) == None + + +def test__four_sentiment__return_bad_if_good_list_is_empty_and_some_bad_verbs_in_text(): + assert check_tweet_sentiment('ff news', {}, {'f', 'ff', 'fff'}) == 'BAD' + + +def test__four_sentiment__return_good_if_bad_list_is_empty_and_some_good_verbs_in_text(): + assert check_tweet_sentiment('good news', {'good', 'better', 'best'}, {}) == 'GOOD' \ No newline at end of file diff --git a/tests/level_2/test_one_pr_url.py b/tests/level_2/test_one_pr_url.py index 29d52ca9..8c35c9e5 100644 --- a/tests/level_2/test_one_pr_url.py +++ b/tests/level_2/test_one_pr_url.py @@ -5,12 +5,23 @@ @pytest.mark.parametrize(('url', 'result'), [ ('https://github.com/test/test/pull/1', True), - ('https://github.com/test/test/pull/', True), + ('https://github.com/test/test/pull/', True) +]) +def test__one_pr_url__return_true_if_len_is_seven_github_on_third_and_pull_on_sixth_place_and_len_is_seven(url, result): + assert is_github_pull_request_url(url) == result + + +@pytest.mark.parametrize(('url', 'result'), [ ('https://github.com/test/test/pull/1/test', False), - ('https://git.com/test/test/pull/1', False), - ('https://github.com/test/test/no_pull/1', False), - ('https://github.com/test/test/pull', False), + ('https://github.com/test/test/pull', False) +]) +def test__one_pr_url__return_false_if_len_is_not_seven(url, result): + assert is_github_pull_request_url(url) == result + +@pytest.mark.parametrize(('url', 'result'), [ + ('https://git.com/test/test/pull/1', False), + ('https://github.com/test/test/no_pull/1', False) ]) -def test_four_sentiment(url, result): +def test__one_pr_url__return_false_if_no_github_on_third_place_or_no_pul_on_sixth_place(url, result): assert is_github_pull_request_url(url) == result diff --git a/tests/level_2/test_replace_word.py b/tests/level_2/test_replace_word.py deleted file mode 100644 index 258b6d62..00000000 --- a/tests/level_2/test_replace_word.py +++ /dev/null @@ -1,21 +0,0 @@ -import pytest - -from functions.level_2.five_replace_word import replace_word - - -@pytest.mark.parametrize(('replace_from', 'replace_to'), [ - ('seven', 'seven'), - ('one', 'one'), - ('seven', 'one') -]) -def test_five_replace_word_no_replacement(replace_from, replace_to): - assert replace_word('one two three four five six', replace_from, replace_to) == 'one two three four five six' - - -@pytest.mark.parametrize(('replace_from', 'replace_to'), [ - ('one', 'seven'), - ('one', 'two') -]) -def test_five_replace_word_with_replacement(replace_from, replace_to): - removed_first_word = 'two three four five six' - assert replace_word('one two three four five six', replace_from, replace_to) == f"{replace_to} {removed_first_word}" \ No newline at end of file diff --git a/tests/level_2/test_three_first.py b/tests/level_2/test_three_first.py index 8ed5d7d3..1a418ab9 100644 --- a/tests/level_2/test_three_first.py +++ b/tests/level_2/test_three_first.py @@ -3,17 +3,17 @@ from functions.level_2.three_first import first -@pytest.mark.parametrize(('items', 'default', 'result'), [ +@pytest.mark.parametrize(('items', 'default', 'expected'), [ ([1, 2], 4, 1), ([1, 2], None, 1), ([1, 2], 'NOT_SET', 1), ([], 5, 5), ([], None, None) ]) -def test_with_return_value(items, default, result): - assert first(items, default) == result +def test__three_first__with_return_value(items, default, expected): + assert first(items, default) == expected -def test_with_attribute_error(): +def test__three_first__attribute_error_if_default_equals_not_set_and_no_items(): with pytest.raises(AttributeError): assert first([], 'NOT_SET') == 0 diff --git a/tests/level_2/test_two_square_equation.py b/tests/level_2/test_two_square_equation.py index fd9c1a16..66b2be1f 100644 --- a/tests/level_2/test_two_square_equation.py +++ b/tests/level_2/test_two_square_equation.py @@ -1,38 +1,21 @@ -import pytest - from functions.level_2.two_square_equation import solve_square_equation -@pytest.mark.parametrize(('square_coeff', 'linear_coeff', 'const_coeff', 'result'),[ - (0.0, 0.1, 0.1, (-1.0, None)), - (0.0, 0.0, 0.1, (None, None)), - (0.0, 0.0, 0.0, (None, None)), - (0.0, -0.1, 0.1, (1.0, None)), - (0.0, 0.1, -0.1, (1.0, None)), - (0.0, -0.1, -0.1, (-1.0, None)) -]) -def test_two_square_zero_data(square_coeff, linear_coeff, const_coeff, result): - assert solve_square_equation(square_coeff, linear_coeff, const_coeff) == result - - -@pytest.mark.parametrize(('square_coeff', 'linear_coeff', 'const_coeff', 'result'), [ - (1.0, 2.0, 1.0, (-1.0, -1.0)), - (1.0, -2.0, 1.0, (1.0, 1.0)), - (0.9, 0.1, 0.1, (None, None)), - (0.1, 0.1, 0.9, (None, None)), - (0.1, 0.1, 0.1, (None, None)), - (-1.0, 2.0, 1.0, (2.414213562373095, -0.41421356237309515)), - (0.9, -0.1, 0.1, (None, None)), - (-0.1, 0.1, -0.9, (None, None)), - (-0.1, -0.1, -0.1, (None, None)) -]) -def test_two_square_some_equal_coefficients(square_coeff, linear_coeff, const_coeff, result): - assert solve_square_equation(square_coeff, linear_coeff, const_coeff) == result - - -@pytest.mark.parametrize(('square_coeff', 'linear_coeff', 'const_coeff', 'result'), [ - (0.01, 0.09, 0.01, (-8.88748219369606, -0.11251780630393907)), - (-0.01, -0.09, -0.01, (-0.11251780630393907, -8.88748219369606)) -]) -def test_two_square(square_coeff, linear_coeff, const_coeff, result): - assert solve_square_equation(square_coeff, linear_coeff, const_coeff) == result +def test__two_square_equation__descriminant_less_than_zero(): + assert solve_square_equation(1.0, 0.1, 0.1) == (None, None) + + +def test__two_square_equation__no_square_coefficient(): + assert solve_square_equation(0.0, 0.1, 0.1) == (-1.0, None) + + +def test__two_square_equation__no_square_coefficient_and_no_linear_coefficient(): + assert solve_square_equation(0.0, 0.0, 0.1) == (None, None) + + +def test__two_square_equation__no_square_coefficient_and_no(): + assert solve_square_equation(0.1, 5.1, 0.1) == (-50.980384612481814, -0.019615387518183702) + + +def test__two_square_equation__descriminant_is_zero(): # + assert solve_square_equation(2.0, 1.0, 1.0) == (None, None) From 858b7537644c6e45a0b03cde449c9398720c8d56 Mon Sep 17 00:00:00 2001 From: SergeiT Date: Sun, 10 Mar 2024 17:21:18 +0200 Subject: [PATCH 5/8] delete all level 2 tests --- tests/level_2/test_five_replace_word.py | 41 ------------------ tests/level_2/test_four_sentiment.py | 53 ----------------------- tests/level_2/test_one_pr_url.py | 27 ------------ tests/level_2/test_three_first.py | 19 -------- tests/level_2/test_two_square_equation.py | 21 --------- 5 files changed, 161 deletions(-) delete mode 100644 tests/level_2/test_five_replace_word.py delete mode 100644 tests/level_2/test_four_sentiment.py delete mode 100644 tests/level_2/test_one_pr_url.py delete mode 100644 tests/level_2/test_three_first.py delete mode 100644 tests/level_2/test_two_square_equation.py diff --git a/tests/level_2/test_five_replace_word.py b/tests/level_2/test_five_replace_word.py deleted file mode 100644 index 850337ac..00000000 --- a/tests/level_2/test_five_replace_word.py +++ /dev/null @@ -1,41 +0,0 @@ -import pytest - -from functions.level_2.five_replace_word import replace_word - - -@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ - ('one two three four five six', 'seven', 'seven'), - ('one two three four five six', 'seven', 'one'), - ('one two three four five six', '', 'one'), - ('one two three four five six', '', ''), - ('one two three four five six', ' ', ' ') -]) -def test____five_replace_word____no_replacement_if_no_replace_from_in_the_text(text, replace_from, replace_to): - assert replace_word(text, replace_from, replace_to) == text - - -@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ - ('one two three four five six', 'one', 'seven'), - ('one two three four five six', 'one', 'two'), - ('one two three four five six', 'one', ''), - ('one two three four five six', 'one', ' ') -]) -def test__five_replace_word__replacement_if_replace_from_is_in_the_text(text, replace_from, replace_to): - removed_first_word = text.split(' ', 1)[1] - assert replace_word(text, replace_from, replace_to) == f"{replace_to} {removed_first_word}" - - -def test__five_replace_word__replacement_without_changes_if_the_same_words_in_all_parameters(): - assert replace_word('one two three four five six', 'one', 'one') == 'one two three four five six' - - -@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ - ('one two three four five six', 'ONE', 'seven'), - ('one two three four five six', 'one', 'TWO'), - ('one two three four five six', 'ONE', ''), - ('one two three four five six', 'ONE', ' '), - ('ONE two three four five six', 'one', 'seven'), -]) -def test__five_replace_word__replacement_if_replace_from_is_in_the_text_ignore_case(text, replace_from, replace_to): - removed_first_word = text.split(' ', 1)[1] - assert replace_word(text, replace_from, replace_to) == f"{replace_to} {removed_first_word}" \ No newline at end of file diff --git a/tests/level_2/test_four_sentiment.py b/tests/level_2/test_four_sentiment.py deleted file mode 100644 index 96112ee8..00000000 --- a/tests/level_2/test_four_sentiment.py +++ /dev/null @@ -1,53 +0,0 @@ -import pytest - -from functions.level_2.four_sentiment import check_tweet_sentiment - - -@pytest.mark.parametrize(('text', 'result'), [ - ('good news', 'GOOD'), - ('the best of the best news', 'GOOD'), - ('good fff best news', 'GOOD') -]) -def test__four_sentiment__return_good_if_good_words_more_than_bad(text, result): - assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result - - -@pytest.mark.parametrize(('text', 'result'), [ - ('ff news', 'BAD'), - ('f and fff news', 'BAD'), - ('good f ff news', 'BAD') -]) -def test__four_sentiment__return_bad_if_bad_words_more_than_good(text, result): - assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result - - -@pytest.mark.parametrize(('text', 'result'), [ - ('normal news', None), - ('good best f ff news', None) -]) -def test__four_sentiment__return_none_if_quantity_of_good_and_bad_words_is_equal(text, result): - assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result - - -@pytest.mark.parametrize(('text', 'result'), [ - ('', None), - (' ', None) -]) -def test__four_sentiment__return_none_if_no_words_in_text(text, result): - assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result - - -def test__four_sentiment__return_none_if_good_list_is_empty_and_no_bad_verbs_in_text(): - assert check_tweet_sentiment('good news', {}, {'f', 'ff', 'fff'}) == None - - -def test__four_sentiment__return_none_if_bad_list_is_empty_and_no_good_verbs_in_text(): - assert check_tweet_sentiment('ff news', {'good', 'better', 'best'}, {}) == None - - -def test__four_sentiment__return_bad_if_good_list_is_empty_and_some_bad_verbs_in_text(): - assert check_tweet_sentiment('ff news', {}, {'f', 'ff', 'fff'}) == 'BAD' - - -def test__four_sentiment__return_good_if_bad_list_is_empty_and_some_good_verbs_in_text(): - assert check_tweet_sentiment('good news', {'good', 'better', 'best'}, {}) == 'GOOD' \ No newline at end of file diff --git a/tests/level_2/test_one_pr_url.py b/tests/level_2/test_one_pr_url.py deleted file mode 100644 index 8c35c9e5..00000000 --- a/tests/level_2/test_one_pr_url.py +++ /dev/null @@ -1,27 +0,0 @@ -import pytest - -from functions.level_2.one_pr_url import is_github_pull_request_url - - -@pytest.mark.parametrize(('url', 'result'), [ - ('https://github.com/test/test/pull/1', True), - ('https://github.com/test/test/pull/', True) -]) -def test__one_pr_url__return_true_if_len_is_seven_github_on_third_and_pull_on_sixth_place_and_len_is_seven(url, result): - assert is_github_pull_request_url(url) == result - - -@pytest.mark.parametrize(('url', 'result'), [ - ('https://github.com/test/test/pull/1/test', False), - ('https://github.com/test/test/pull', False) -]) -def test__one_pr_url__return_false_if_len_is_not_seven(url, result): - assert is_github_pull_request_url(url) == result - - -@pytest.mark.parametrize(('url', 'result'), [ - ('https://git.com/test/test/pull/1', False), - ('https://github.com/test/test/no_pull/1', False) -]) -def test__one_pr_url__return_false_if_no_github_on_third_place_or_no_pul_on_sixth_place(url, result): - assert is_github_pull_request_url(url) == result diff --git a/tests/level_2/test_three_first.py b/tests/level_2/test_three_first.py deleted file mode 100644 index 1a418ab9..00000000 --- a/tests/level_2/test_three_first.py +++ /dev/null @@ -1,19 +0,0 @@ -import pytest - -from functions.level_2.three_first import first - - -@pytest.mark.parametrize(('items', 'default', 'expected'), [ - ([1, 2], 4, 1), - ([1, 2], None, 1), - ([1, 2], 'NOT_SET', 1), - ([], 5, 5), - ([], None, None) -]) -def test__three_first__with_return_value(items, default, expected): - assert first(items, default) == expected - - -def test__three_first__attribute_error_if_default_equals_not_set_and_no_items(): - with pytest.raises(AttributeError): - assert first([], 'NOT_SET') == 0 diff --git a/tests/level_2/test_two_square_equation.py b/tests/level_2/test_two_square_equation.py deleted file mode 100644 index 66b2be1f..00000000 --- a/tests/level_2/test_two_square_equation.py +++ /dev/null @@ -1,21 +0,0 @@ -from functions.level_2.two_square_equation import solve_square_equation - - -def test__two_square_equation__descriminant_less_than_zero(): - assert solve_square_equation(1.0, 0.1, 0.1) == (None, None) - - -def test__two_square_equation__no_square_coefficient(): - assert solve_square_equation(0.0, 0.1, 0.1) == (-1.0, None) - - -def test__two_square_equation__no_square_coefficient_and_no_linear_coefficient(): - assert solve_square_equation(0.0, 0.0, 0.1) == (None, None) - - -def test__two_square_equation__no_square_coefficient_and_no(): - assert solve_square_equation(0.1, 5.1, 0.1) == (-50.980384612481814, -0.019615387518183702) - - -def test__two_square_equation__descriminant_is_zero(): # - assert solve_square_equation(2.0, 1.0, 1.0) == (None, None) From 144c736093264202d458eaa9ecfc74aae116c9b3 Mon Sep 17 00:00:00 2001 From: SergeiT Date: Sun, 10 Mar 2024 17:23:52 +0200 Subject: [PATCH 6/8] level_2 tests --- tests/level_2/test_five_replace_word.py | 41 ++++++++++++++++++ tests/level_2/test_four_sentiment.py | 53 +++++++++++++++++++++++ tests/level_2/test_one_pr_url.py | 27 ++++++++++++ tests/level_2/test_three_first.py | 19 ++++++++ tests/level_2/test_two_square_equation.py | 21 +++++++++ 5 files changed, 161 insertions(+) create mode 100644 tests/level_2/test_five_replace_word.py create mode 100644 tests/level_2/test_four_sentiment.py create mode 100644 tests/level_2/test_one_pr_url.py create mode 100644 tests/level_2/test_three_first.py create mode 100644 tests/level_2/test_two_square_equation.py diff --git a/tests/level_2/test_five_replace_word.py b/tests/level_2/test_five_replace_word.py new file mode 100644 index 00000000..5b85ce7f --- /dev/null +++ b/tests/level_2/test_five_replace_word.py @@ -0,0 +1,41 @@ +import pytest + +from functions.level_2.five_replace_word import replace_word + + +@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ + ('one two three four five six', 'seven', 'seven'), + ('one two three four five six', 'seven', 'one'), + ('one two three four five six', '', 'one'), + ('one two three four five six', '', ''), + ('one two three four five six', ' ', ' ') +]) +def test__five_replace_word__no_replacement_if_no_replace_from_in_the_text(text, replace_from, replace_to): + assert replace_word(text, replace_from, replace_to) == text + + +@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ + ('one two three four five six', 'one', 'seven'), + ('one two three four five six', 'one', 'two'), + ('one two three four five six', 'one', ''), + ('one two three four five six', 'one', ' ') +]) +def test__five_replace_word__replacement_if_replace_from_is_in_the_text(text, replace_from, replace_to): + removed_first_word = text.split(' ', 1)[1] + assert replace_word(text, replace_from, replace_to) == f"{replace_to} {removed_first_word}" + + +def test__five_replace_word__replacement_without_changes_if_the_same_words_in_all_parameters(): + assert replace_word('one two three four five six', 'one', 'one') == 'one two three four five six' + + +@pytest.mark.parametrize(('text', 'replace_from', 'replace_to'), [ + ('one two three four five six', 'ONE', 'seven'), + ('one two three four five six', 'one', 'TWO'), + ('one two three four five six', 'ONE', ''), + ('one two three four five six', 'ONE', ' '), + ('ONE two three four five six', 'one', 'seven'), +]) +def test__five_replace_word__replacement_if_replace_from_is_in_the_text_ignore_case(text, replace_from, replace_to): + removed_first_word = text.split(' ', 1)[1] + assert replace_word(text, replace_from, replace_to) == f"{replace_to} {removed_first_word}" \ No newline at end of file diff --git a/tests/level_2/test_four_sentiment.py b/tests/level_2/test_four_sentiment.py new file mode 100644 index 00000000..96112ee8 --- /dev/null +++ b/tests/level_2/test_four_sentiment.py @@ -0,0 +1,53 @@ +import pytest + +from functions.level_2.four_sentiment import check_tweet_sentiment + + +@pytest.mark.parametrize(('text', 'result'), [ + ('good news', 'GOOD'), + ('the best of the best news', 'GOOD'), + ('good fff best news', 'GOOD') +]) +def test__four_sentiment__return_good_if_good_words_more_than_bad(text, result): + assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result + + +@pytest.mark.parametrize(('text', 'result'), [ + ('ff news', 'BAD'), + ('f and fff news', 'BAD'), + ('good f ff news', 'BAD') +]) +def test__four_sentiment__return_bad_if_bad_words_more_than_good(text, result): + assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result + + +@pytest.mark.parametrize(('text', 'result'), [ + ('normal news', None), + ('good best f ff news', None) +]) +def test__four_sentiment__return_none_if_quantity_of_good_and_bad_words_is_equal(text, result): + assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result + + +@pytest.mark.parametrize(('text', 'result'), [ + ('', None), + (' ', None) +]) +def test__four_sentiment__return_none_if_no_words_in_text(text, result): + assert check_tweet_sentiment(text, {'good', 'better', 'best'}, {'f', 'ff', 'fff'}) == result + + +def test__four_sentiment__return_none_if_good_list_is_empty_and_no_bad_verbs_in_text(): + assert check_tweet_sentiment('good news', {}, {'f', 'ff', 'fff'}) == None + + +def test__four_sentiment__return_none_if_bad_list_is_empty_and_no_good_verbs_in_text(): + assert check_tweet_sentiment('ff news', {'good', 'better', 'best'}, {}) == None + + +def test__four_sentiment__return_bad_if_good_list_is_empty_and_some_bad_verbs_in_text(): + assert check_tweet_sentiment('ff news', {}, {'f', 'ff', 'fff'}) == 'BAD' + + +def test__four_sentiment__return_good_if_bad_list_is_empty_and_some_good_verbs_in_text(): + assert check_tweet_sentiment('good news', {'good', 'better', 'best'}, {}) == 'GOOD' \ No newline at end of file diff --git a/tests/level_2/test_one_pr_url.py b/tests/level_2/test_one_pr_url.py new file mode 100644 index 00000000..8c35c9e5 --- /dev/null +++ b/tests/level_2/test_one_pr_url.py @@ -0,0 +1,27 @@ +import pytest + +from functions.level_2.one_pr_url import is_github_pull_request_url + + +@pytest.mark.parametrize(('url', 'result'), [ + ('https://github.com/test/test/pull/1', True), + ('https://github.com/test/test/pull/', True) +]) +def test__one_pr_url__return_true_if_len_is_seven_github_on_third_and_pull_on_sixth_place_and_len_is_seven(url, result): + assert is_github_pull_request_url(url) == result + + +@pytest.mark.parametrize(('url', 'result'), [ + ('https://github.com/test/test/pull/1/test', False), + ('https://github.com/test/test/pull', False) +]) +def test__one_pr_url__return_false_if_len_is_not_seven(url, result): + assert is_github_pull_request_url(url) == result + + +@pytest.mark.parametrize(('url', 'result'), [ + ('https://git.com/test/test/pull/1', False), + ('https://github.com/test/test/no_pull/1', False) +]) +def test__one_pr_url__return_false_if_no_github_on_third_place_or_no_pul_on_sixth_place(url, result): + assert is_github_pull_request_url(url) == result diff --git a/tests/level_2/test_three_first.py b/tests/level_2/test_three_first.py new file mode 100644 index 00000000..1a418ab9 --- /dev/null +++ b/tests/level_2/test_three_first.py @@ -0,0 +1,19 @@ +import pytest + +from functions.level_2.three_first import first + + +@pytest.mark.parametrize(('items', 'default', 'expected'), [ + ([1, 2], 4, 1), + ([1, 2], None, 1), + ([1, 2], 'NOT_SET', 1), + ([], 5, 5), + ([], None, None) +]) +def test__three_first__with_return_value(items, default, expected): + assert first(items, default) == expected + + +def test__three_first__attribute_error_if_default_equals_not_set_and_no_items(): + with pytest.raises(AttributeError): + assert first([], 'NOT_SET') == 0 diff --git a/tests/level_2/test_two_square_equation.py b/tests/level_2/test_two_square_equation.py new file mode 100644 index 00000000..66b2be1f --- /dev/null +++ b/tests/level_2/test_two_square_equation.py @@ -0,0 +1,21 @@ +from functions.level_2.two_square_equation import solve_square_equation + + +def test__two_square_equation__descriminant_less_than_zero(): + assert solve_square_equation(1.0, 0.1, 0.1) == (None, None) + + +def test__two_square_equation__no_square_coefficient(): + assert solve_square_equation(0.0, 0.1, 0.1) == (-1.0, None) + + +def test__two_square_equation__no_square_coefficient_and_no_linear_coefficient(): + assert solve_square_equation(0.0, 0.0, 0.1) == (None, None) + + +def test__two_square_equation__no_square_coefficient_and_no(): + assert solve_square_equation(0.1, 5.1, 0.1) == (-50.980384612481814, -0.019615387518183702) + + +def test__two_square_equation__descriminant_is_zero(): # + assert solve_square_equation(2.0, 1.0, 1.0) == (None, None) From db8c987e08df27f475c4275c613631aac8f2b3e3 Mon Sep 17 00:00:00 2001 From: SergeiT Date: Wed, 3 Apr 2024 22:53:51 +0300 Subject: [PATCH 7/8] level_4 tests --- tests/level_4/conftest.py | 21 +++++++++++++++++++++ tests/level_4/test_five_extra_fields.py | 12 ++++++++++++ tests/level_4/test_four_lines_counter.py | 10 ++++++++++ tests/level_4/test_one_brackets.py | 9 +++++++++ tests/level_4/test_three_promocodes.py | 17 +++++++++++++++++ tests/level_4/test_two_students.py | 11 +++++++++++ 6 files changed, 80 insertions(+) create mode 100644 tests/level_4/conftest.py create mode 100644 tests/level_4/test_five_extra_fields.py create mode 100644 tests/level_4/test_four_lines_counter.py create mode 100644 tests/level_4/test_one_brackets.py create mode 100644 tests/level_4/test_three_promocodes.py create mode 100644 tests/level_4/test_two_students.py diff --git a/tests/level_4/conftest.py b/tests/level_4/conftest.py new file mode 100644 index 00000000..f39c55b8 --- /dev/null +++ b/tests/level_4/conftest.py @@ -0,0 +1,21 @@ +import os + +import pytest + + +@pytest.fixture +def file_path(): + path_to_file = 'test.txt' + with open(path_to_file, 'w') as file_handler: + file_handler.writelines(['[tool:app-config]\n', 'field1=value1\n', 'field2=value2\n']) + yield path_to_file + os.remove(path_to_file) + + +@pytest.fixture +def file_path_config(): + path_to_file = 'test_config.txt' + with open(path_to_file, 'w') as file_handler: + file_handler.writelines(['[tool:app-config]\n', 'field1=value1\n', 'field2=value2\n']) + yield path_to_file + os.remove(path_to_file) diff --git a/tests/level_4/test_five_extra_fields.py b/tests/level_4/test_five_extra_fields.py new file mode 100644 index 00000000..251fea8b --- /dev/null +++ b/tests/level_4/test_five_extra_fields.py @@ -0,0 +1,12 @@ +import pytest + +from functions.level_4.five_extra_fields import fetch_extra_fields_configuration, fetch_app_config_field + + +@pytest.mark.parametrize('value', ['value1', '[tool:app-config]', 'field']) +def test__five_extra_fields__return_none_if_the_str_is_not_in_config_fields(file_path_config, value): + assert fetch_app_config_field(file_path_config, value) is None + + +def test__five_extra_fields__return_value_if_the_str_is_in_config_fields(file_path_config): + assert fetch_app_config_field(file_path_config, 'field1') == 'value1' diff --git a/tests/level_4/test_four_lines_counter.py b/tests/level_4/test_four_lines_counter.py new file mode 100644 index 00000000..dba96d93 --- /dev/null +++ b/tests/level_4/test_four_lines_counter.py @@ -0,0 +1,10 @@ +from functions.level_4.four_lines_counter import count_lines_in + + +def test__four_line_counter__return_lines_quantity_in_the_file(file_path): + assert count_lines_in(file_path) == 3 + + +def test__four_line_counter__return_none_if_there_is_no_file(): + assert count_lines_in('') is None + \ No newline at end of file diff --git a/tests/level_4/test_one_brackets.py b/tests/level_4/test_one_brackets.py new file mode 100644 index 00000000..2a313141 --- /dev/null +++ b/tests/level_4/test_one_brackets.py @@ -0,0 +1,9 @@ +from functions.level_4.one_brackets import delete_remove_brackets_quotes + + +def test__one_brackets__return_the_same_string_if_there_is_no_brackets(): + assert delete_remove_brackets_quotes('Hello') == 'Hello' + + +def test__one_brackets__return_string_without_two_symbols_if_there_is_brackets_in_the_string(): + assert delete_remove_brackets_quotes('{{{Hello') == '{Hel' diff --git a/tests/level_4/test_three_promocodes.py b/tests/level_4/test_three_promocodes.py new file mode 100644 index 00000000..2c9ec017 --- /dev/null +++ b/tests/level_4/test_three_promocodes.py @@ -0,0 +1,17 @@ +import pytest + +from functions.level_4.three_promocodes import generate_promocode + + +@pytest.mark.parametrize('code_length', [0, 1, 5, 8, 10]) +def test__three_promocodes__return_promo_code_with_passed_len(code_length): + code = generate_promocode(code_length) + assert len(code) == code_length + assert isinstance(code, str) is True + + +def test__three_promocodes__return_promo_code_if_no_len_passed(): + code = generate_promocode() + assert len(code) == 8 + assert isinstance(code, str) is True + \ No newline at end of file diff --git a/tests/level_4/test_two_students.py b/tests/level_4/test_two_students.py new file mode 100644 index 00000000..419e3589 --- /dev/null +++ b/tests/level_4/test_two_students.py @@ -0,0 +1,11 @@ +from functions.level_4.two_students import get_student_by_tg_nickname, Student + + +def test__two_students__return_none_if_username_is_not_the_same_as_tg_account(): + student = Student(first_name='Vasya', last_name='Osipov', telegram_account='@pacman') + assert get_student_by_tg_nickname('mouse', [student]) is None + + +def test__two_students__return_student_if_username_is_the_same_as_tg_account(): + student = Student(first_name='Vasya', last_name='Osipov', telegram_account='@pacman') + assert get_student_by_tg_nickname('pacman', [student]) == student From 42a2aab5a1c7fde8ecefe8f5d350ea4ec358c483 Mon Sep 17 00:00:00 2001 From: SergeiT Date: Thu, 4 Apr 2024 19:21:57 +0300 Subject: [PATCH 8/8] level_4 tests --- tests/level_4/conftest.py | 6 +++--- tests/level_4/test_five_extra_fields.py | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/tests/level_4/conftest.py b/tests/level_4/conftest.py index f39c55b8..f67d27ef 100644 --- a/tests/level_4/conftest.py +++ b/tests/level_4/conftest.py @@ -14,8 +14,8 @@ def file_path(): @pytest.fixture def file_path_config(): - path_to_file = 'test_config.txt' + path_to_file = 'test.txt' with open(path_to_file, 'w') as file_handler: - file_handler.writelines(['[tool:app-config]\n', 'field1=value1\n', 'field2=value2\n']) + file_handler.writelines(['[tool:app-config]\n', 'extra_fields = field1: int\n', 'field2: str\n']) yield path_to_file - os.remove(path_to_file) + os.remove(path_to_file) \ No newline at end of file diff --git a/tests/level_4/test_five_extra_fields.py b/tests/level_4/test_five_extra_fields.py index 251fea8b..b0ffd951 100644 --- a/tests/level_4/test_five_extra_fields.py +++ b/tests/level_4/test_five_extra_fields.py @@ -1,12 +1,20 @@ import pytest -from functions.level_4.five_extra_fields import fetch_extra_fields_configuration, fetch_app_config_field +from functions.level_4.five_extra_fields import fetch_app_config_field, fetch_extra_fields_configuration @pytest.mark.parametrize('value', ['value1', '[tool:app-config]', 'field']) -def test__five_extra_fields__return_none_if_the_str_is_not_in_config_fields(file_path_config, value): - assert fetch_app_config_field(file_path_config, value) is None +def test__five_extra_fields__return_none_if_the_str_is_not_in_config_fields(file_path, value): + assert fetch_app_config_field(file_path, value) is None -def test__five_extra_fields__return_value_if_the_str_is_in_config_fields(file_path_config): - assert fetch_app_config_field(file_path_config, 'field1') == 'value1' +def test__five_extra_fields__return_value_if_the_str_is_in_config_fields(file_path): + assert fetch_app_config_field(file_path, 'field1') == 'value1' + + +def test__fetch_extra_fields_configuration__return_empty_dict_if_there_is_no_extrafield(file_path): + assert fetch_extra_fields_configuration(file_path) == {} + + +def test__fetch_extra_fields_configuration__return_field_and_its_type_if_there_is_extrafield(file_path_config): + assert fetch_extra_fields_configuration(file_path_config) == {'field1': int}