diff --git a/.coverage b/.coverage new file mode 100644 index 000000000..725ce3024 Binary files /dev/null and b/.coverage differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..8c85dd01f --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +venv/ +.venv/ + +__pycache__/ +*.pyc +*.pyo +*.pyd + +.vscode/ +.idea/ + +allure-results/ +allure-report/ diff --git a/README.md b/README.md index 272081708..3cce61036 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,4 @@ **Запуск автотестов и создание HTML-отчета о покрытии** > `$ pytest --cov=praktikum --cov-report=html` + diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/burger.py b/burger.py index 2b3b6a88b..7fbc74f8d 100644 --- a/burger.py +++ b/burger.py @@ -1,7 +1,7 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient +from bun import Bun +from ingredient import Ingredient class Burger: @@ -46,3 +46,4 @@ def get_receipt(self) -> str: receipt.append(f'Price: {self.get_price()}') return '\n'.join(receipt) + diff --git a/database.py b/database.py index 4c75baf71..84d3685d0 100644 --- a/database.py +++ b/database.py @@ -1,8 +1,8 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient -from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING +from bun import Bun +from ingredient import Ingredient +from ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING class Database: diff --git a/praktikum.py b/praktikum.py index ec522fa6d..88b77abd1 100644 --- a/praktikum.py +++ b/praktikum.py @@ -1,9 +1,9 @@ from typing import List -from praktikum.bun import Bun -from praktikum.burger import Burger -from praktikum.database import Database -from praktikum.ingredient import Ingredient +from bun import Bun +from burger import Burger +from database import Database +from ingredient import Ingredient def main(): diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..cffeec658 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest +pytest-cov \ No newline at end of file diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..a59e6c57d --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,13 @@ + +from bun import Bun + +class TestBun: + + def test_get_name_returns_correct_value(self): + bun = Bun("test_bun", 999.99) + assert bun.get_name() == "test_bun" + + def test_get_price_returns_correct_value(self): + bun = Bun("test_bun", 999.99) + assert bun.get_price() == 999.99 + diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..9c64cf3e1 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,143 @@ +import pytest + +from burger import Burger +from bun import Bun +from ingredient import Ingredient +from ingredient_types import INGREDIENT_TYPE_FILLING, INGREDIENT_TYPE_SAUCE + +class TestBurger: + + + def test_set_buns_succsess(self): + burger = Burger() + test_bun = Bun("Origin bun",50) + burger.set_buns(test_bun) + assert burger.bun == test_bun + + + @pytest.mark.parametrize("ingredient_type, name, price", [ + (INGREDIENT_TYPE_FILLING,"chicken",100), + (INGREDIENT_TYPE_FILLING,"meet",120), + (INGREDIENT_TYPE_SAUCE, "salsa", 50), + (INGREDIENT_TYPE_SAUCE, "ancle bens", 60) + ]) + def test_add_ingredient_several_succsess(self,ingredient_type, name, price): + burger = Burger() + bun = Bun("Origin Bun", 40) + burger.set_buns(bun) + + initial_count= len(burger.ingredients) + ingredient = Ingredient( ingredient_type,name,price) + burger.add_ingredient(ingredient) + final_count = len(burger.ingredients) + assert final_count == initial_count + 1 + assert ingredient in burger.ingredients + + + def test_rremove_ingredient_only_one_leaves_empty_list(self): + + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + one_ing= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + burger.add_ingredient(one_ing) + + burger.remove_ingredient(0) + + assert len(burger.ingredients) == 0 + assert one_ing not in burger.ingredients + + + def test_remove_ingredient_from_empty_list_wait_error(self): + + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + with pytest.raises(IndexError): + burger.remove_ingredient(0) + + def test_remove_ingredient_for_index_del_correctly_ingredient(self): + + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + first_ing= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + second_ing= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + burger.add_ingredient(first_ing) + burger.add_ingredient(second_ing) + burger.remove_ingredient(0) + + assert len(burger.ingredients) == 1 + assert first_ing not in burger.ingredients + + def test_move_ingredient_single_to_new_position(self): + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + ing1= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + ing2= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + ing3 = Ingredient(INGREDIENT_TYPE_FILLING,"meet",120) + + burger.add_ingredient(ing1) + burger.add_ingredient(ing2) + burger.add_ingredient(ing3) + + burger.move_ingredient(0, 1) + + moved_ingredients = burger.ingredients + assert len(moved_ingredients) == 3 + assert moved_ingredients[0] is ing2 + assert moved_ingredients[1] is ing1 + assert moved_ingredients[2] is ing3 + + def test_move_ingredient_from_bad_position_wait_error(self): + burger = Burger() + burger.set_buns(Bun("Origin Bun", 40)) + + ing1= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + ing2= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + + burger.add_ingredient(ing1) + burger.add_ingredient(ing2) + + with pytest.raises(IndexError): + burger.move_ingredient(5,0) + + def test_get_price_includes_bun_twice_and_ingredients(self): + burger = Burger() + bun =Bun("Origin Bun", 40) + burger.set_buns(bun) + + ing1= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + ing2= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + + burger.add_ingredient(ing1) + burger.add_ingredient(ing2) + + expected_price = (bun.get_price() * 2) + ing1.get_price() + ing2.get_price() + + assert burger.get_price() == expected_price + + def test_get_receipt_full_content(self): + burger = Burger() + bun =Bun("Origin Bun", 40) + burger.set_buns(bun) + + ing1= Ingredient(INGREDIENT_TYPE_FILLING,"chicken",100) + ing2= Ingredient(INGREDIENT_TYPE_SAUCE, "salsa", 50) + + burger.add_ingredient(ing1) + burger.add_ingredient(ing2) + + receipt = burger.get_receipt() + + expected_lines: List[str] = [ + f'(==== {bun.get_name()} ====)', + f'= {str(ing1.get_type()).lower()} {ing1.get_name()} =', + f'= {str(ing2.get_type().lower())} {ing2.get_name()} =', # исправлено: .lower() после get_type() + f'(==== {bun.get_name()} ====)', + "", + f'Price: {burger.get_price()}', + ] + expected = '\n'.join(expected_lines) + assert receipt == expected \ No newline at end of file diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..f902ce961 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,42 @@ +from database import Database + +from ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestDatabase: + + def test_available_buns_init_buns_in_database(self): + + db = Database() + buns = db.available_buns() + + + actual_pairs = [(bun.get_name(), bun.get_price()) for bun in buns] + + expected_pairs = [ + ("black bun", 100), + ("white bun", 200), + ("red bun", 300), + ] + + assert actual_pairs == expected_pairs + + def test_available_ingredients_init_in_database(self): + db = Database() + ingredients = db.available_ingredients() + + actual = [ + (ing.get_type(), ing.get_name(), ing.get_price()) + for ing in ingredients + ] + + # Ожидаемый набор — ровно в том порядке, как они добавлены в __init__ + expected = [ + (INGREDIENT_TYPE_SAUCE, "hot sauce", 100), + (INGREDIENT_TYPE_SAUCE, "sour cream", 200), + (INGREDIENT_TYPE_SAUCE, "chili sauce", 300), + (INGREDIENT_TYPE_FILLING, "cutlet", 100), + (INGREDIENT_TYPE_FILLING, "dinosaur", 200), + (INGREDIENT_TYPE_FILLING, "sausage", 300), + ] + + assert actual == expected \ No newline at end of file diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..c4b97e1cf --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,27 @@ +from ingredient import Ingredient + +class TestIngredient: + + def test_get_price_sucsess(self): + ingredient_type = "INGREDIENT_TYPE_FILLING" + name = "chicken" + price = 100.0 + + ing = Ingredient(ingredient_type, name, price) + assert ing.get_price() == price + + def test_get_name_sucsess(self): + ingredient_type = "INGREDIENT_TYPE_FILLING" + name = "chicken" + price = 100.0 + + ing = Ingredient(ingredient_type, name, price) + assert ing.get_name() == name + + def test_get_type_sucsess(self): + ingredient_type = "INGREDIENT_TYPE_FILLING" + name = "chicken" + price = 100.0 + + ing = Ingredient(ingredient_type, name, price) + assert ing.get_type() == ingredient_type \ No newline at end of file