Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .coverage
Binary file not shown.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.venv
__pycache__
.coverage
coverage.xml
22 changes: 22 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -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
)
266 changes: 266 additions & 0 deletions coverage.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,266 @@
<?xml version="1.0" ?>
<coverage version="7.2.7" timestamp="1686905874672" lines-valid="171" lines-covered="171" line-rate="1" branches-valid="70" branches-covered="70" branch-rate="1" complexity="0">
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.2.7 -->
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
<sources>
<source>C:\Users\Beloded\projects\testing_exercises\functions\level_1</source>
<source>C:\Users\Beloded\projects\testing_exercises\functions\level_1_5</source>
<source>C:\Users\Beloded\projects\testing_exercises\functions\level_1_7</source>
</sources>
<packages>
<package name="." line-rate="1" branch-rate="1" complexity="0">
<classes>
<class name="__init__.py" filename="__init__.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines/>
</class>
<class name="five_replace_word.py" filename="five_replace_word.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="6" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="7" hits="1"/>
<line number="9" hits="1"/>
<line number="11" hits="1"/>
</lines>
</class>
<class name="five_title.py" filename="five_title.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1"/>
<line number="6" hits="1"/>
<line number="8" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="9" hits="1"/>
<line number="10" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="11" hits="1"/>
<line number="13" hits="1"/>
<line number="14" hits="1"/>
<line number="15" hits="1"/>
<line number="16" hits="1"/>
</lines>
</class>
<class name="four_bank_parser.py" filename="four_bank_parser.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="6" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="11" hits="1"/>
<line number="12" hits="1"/>
<line number="13" hits="1"/>
<line number="14" hits="1"/>
<line number="17" hits="1"/>
<line number="18" hits="1"/>
<line number="19" hits="1"/>
<line number="20" hits="1"/>
<line number="21" hits="1"/>
<line number="24" hits="1"/>
<line number="25" hits="1"/>
<line number="26" hits="1"/>
<line number="27" hits="1"/>
<line number="28" hits="1" branch="true" condition-coverage="100% (2/2)"/>
</lines>
</class>
<class name="four_fraud.py" filename="four_fraud.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1"/>
<line number="6" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="10" hits="1"/>
<line number="11" hits="1"/>
<line number="13" hits="1"/>
<line number="14" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="15" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="19" hits="1"/>
<line number="21" hits="1"/>
<line number="22" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="23" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="27" hits="1"/>
</lines>
</class>
<class name="four_sentiment.py" filename="four_sentiment.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="3" hits="1"/>
<line number="4" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="5" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="6" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="7" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="8" hits="1"/>
<line number="9" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="10" hits="1"/>
<line number="11" hits="1"/>
</lines>
</class>
<class name="models.py" filename="models.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="4" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="1"/>
<line number="10" hits="1"/>
<line number="11" hits="1"/>
<line number="14" hits="1"/>
<line number="15" hits="1"/>
<line number="16" hits="1"/>
<line number="17" hits="1"/>
<line number="18" hits="1"/>
<line number="19" hits="1"/>
<line number="20" hits="1"/>
<line number="23" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="24" hits="1"/>
<line number="25" hits="1"/>
<line number="26" hits="1"/>
<line number="29" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="30" hits="1"/>
<line number="31" hits="1"/>
<line number="32" hits="1"/>
<line number="33" hits="1"/>
<line number="36" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="37" hits="1"/>
<line number="38" hits="1"/>
<line number="39" hits="1"/>
<line number="40" hits="1"/>
<line number="41" hits="1"/>
<line number="42" hits="1"/>
<line number="43" hits="1"/>
</lines>
</class>
<class name="one_avg_daily_expenses.py" filename="one_avg_daily_expenses.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="5" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="1"/>
<line number="10" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="11" hits="1"/>
<line number="12" hits="1"/>
</lines>
</class>
<class name="one_gender.py" filename="one_gender.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
</lines>
</class>
<class name="one_median.py" filename="one_median.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="3" hits="1"/>
<line number="9" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="10" hits="1"/>
<line number="12" hits="1"/>
<line number="14" hits="1"/>
<line number="15" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="16" hits="1"/>
<line number="18" hits="1"/>
</lines>
</class>
<class name="three_first.py" filename="three_first.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="6" hits="1"/>
<line number="7" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="8" hits="1"/>
<line number="9" hits="1"/>
</lines>
</class>
<class name="three_is_subscription.py" filename="three_is_subscription.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="4" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="13" hits="1"/>
<line number="14" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="15" hits="1"/>
<line number="17" hits="1"/>
</lines>
</class>
<class name="three_url_builder.py" filename="three_url_builder.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1"/>
<line number="6" hits="1"/>
<line number="7" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="8" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="9" hits="1"/>
</lines>
</class>
<class name="two_date_parser.py" filename="two_date_parser.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1"/>
<line number="6" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="7" hits="1"/>
<line number="9" hits="1"/>
<line number="10" hits="1"/>
</lines>
</class>
<class name="two_expense_categorizer.py" filename="two_expense_categorizer.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1"/>
<line number="13" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="14" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="15" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="16" hits="1"/>
<line number="17" hits="1"/>
<line number="20" hits="1"/>
<line number="21" hits="1"/>
<line number="23" hits="1"/>
<line number="24" hits="1" branch="true" condition-coverage="100% (2/2)"/>
</lines>
</class>
<class name="two_square_equation.py" filename="two_square_equation.py" complexity="0" line-rate="1" branch-rate="1">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="4" hits="1"/>
<line number="9" hits="1"/>
<line number="11" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="12" hits="1"/>
<line number="14" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="15" hits="1" branch="true" condition-coverage="100% (2/2)"/>
<line number="16" hits="1"/>
<line number="18" hits="1"/>
<line number="20" hits="1"/>
<line number="21" hits="1"/>
<line number="22" hits="1"/>
</lines>
</class>
</classes>
</package>
</packages>
</coverage>
2 changes: 1 addition & 1 deletion functions/level_1_7/four_fraud.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
pytest==7.2.1
pytest-cov==4.1.0
pytest-testdox
mypy==1.3.0
freezegun==1.2.2
10 changes: 10 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -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
38 changes: 36 additions & 2 deletions tests/level_1/test_five_title.py
Original file line number Diff line number Diff line change
@@ -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
22 changes: 19 additions & 3 deletions tests/level_1/test_four_bank_parser.py
Original file line number Diff line number Diff line change
@@ -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'

Loading