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
40 changes: 40 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# pytest
.pytest_cache/
.coverage
htmlcov/

# VS Code
.vscode/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

# Temporary files
*.tmp
*.temp
6 changes: 3 additions & 3 deletions burger.py
Original file line number Diff line number Diff line change
@@ -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:
Expand Down Expand Up @@ -45,4 +45,4 @@ def get_receipt(self) -> str:
receipt.append(f'(==== {self.bun.get_name()} ====)\n')
receipt.append(f'Price: {self.get_price()}')

return '\n'.join(receipt)
return '\n'.join(receipt)
58 changes: 58 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""
Общие фикстуры для всех тестов
"""
import pytest
from unittest.mock import Mock
import sys
import os

# Добавляем текущую директорию в путь для импортов
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

@pytest.fixture
def bun():
"""Фикстура для создания булочки"""
from bun import Bun
return Bun("Краторная булочка", 100.0)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно лучше здесь и далее: лучше выносить тестовые данные во внешний модуль (например, data). Это позволит облегчить их поддержку



@pytest.fixture
def mock_bun():
"""Фикстура для мока булочки"""
mock = Mock()
mock.get_price.return_value = 100
mock.get_name.return_value = "test bun"
return mock


@pytest.fixture
def ingredient():
"""Фикстура для создания ингредиента"""
from ingredient import Ingredient
from ingredient_types import INGREDIENT_TYPE_SAUCE
return Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100.0)


@pytest.fixture
def mock_ingredient():
"""Фикстура для мока ингредиента"""
from ingredient_types import INGREDIENT_TYPE_SAUCE
mock = Mock()
mock.get_price.return_value = 50
mock.get_name.return_value = "test ingredient"
mock.get_type.return_value = INGREDIENT_TYPE_SAUCE
return mock


@pytest.fixture
def burger():
"""Фикстура для создания бургера"""
from burger import Burger
return Burger()


@pytest.fixture
def database():
"""Фикстура для создания базы данных"""
from database import Database
return Database()
6 changes: 3 additions & 3 deletions database.py
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
19 changes: 6 additions & 13 deletions praktikum.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,32 @@
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():
# Инициализируем базу данных

database: Database = Database()

# Создадим новый бургер
burger: Burger = Burger()

# Считаем список доступных булок из базы данных
buns: List[Bun] = database.available_buns()

# Считаем список доступных ингредиентов из базы данных
ingredients: List[Ingredient] = database.available_ingredients()

# Соберём бургер
burger.set_buns(buns[0])

burger.add_ingredient(ingredients[1])
burger.add_ingredient(ingredients[4])
burger.add_ingredient(ingredients[3])
burger.add_ingredient(ingredients[5])

# Переместим слой с ингредиентом
burger.move_ingredient(2, 1)

# Удалим ингредиент

burger.remove_ingredient(3)

# Распечатаем рецепт бургера
print(burger.get_receipt())


Expand Down
Empty file added tests/__init__.py
Empty file.
38 changes: 38 additions & 0 deletions tests/test_bun.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import pytest
import sys
import os

# Добавляем путь к корню проекта
sys.path.append(os.path.dirname(os.path.dirname(__file__)))


class TestBun:
"""Тесты для класса Bun"""

def test_bun_name_initialization(self, bun):
"""Только инициализация имени"""
assert bun.name == "Краторная булочка"

def test_bun_price_initialization(self, bun):
"""Только инициализация цены"""
assert bun.price == 100.0

def test_bun_get_name(self, bun):
"""Только получение названия"""
assert bun.get_name() == "Краторная булочка"

def test_bun_get_price(self, bun):
"""Только получение цены"""
assert bun.get_price() == 100.0

@pytest.mark.parametrize("name, price", [
("Булочка 1", 50.0),
("Булочка 2", 150.5),
("С кунжутом", 75.25),
])
def test_bun_different_parameters(self, name, price):
"""Тестируем разные параметры"""
from bun import Bun
bun = Bun(name, price)
assert bun.get_name() == name
assert bun.get_price() == price
94 changes: 94 additions & 0 deletions tests/test_burger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import pytest
from unittest.mock import Mock, patch
import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(__file__)))

from burger import Burger
from bun import Bun
from ingredient import Ingredient
from ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING

@pytest.fixture
def burger():
"""Создает новый бургер для каждого теста"""
return Burger()

@pytest.fixture
def mock_bun():
"""Создает мок булочки"""
mock = Mock()
mock.get_price.return_value = 100
mock.get_name.return_value = "test bun"
return mock

@pytest.fixture
def mock_ingredient():
"""Создает мок ингредиента"""
mock = Mock()
mock.get_price.return_value = 50
mock.get_name.return_value = "test ingredient"
mock.get_type.return_value = INGREDIENT_TYPE_SAUCE
return mock
Comment on lines +13 to +33

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Необходимо исправить здесь и далее: фикстуры стоит вынести к остальным в модуль conftest

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А тут фикстуры все еще в теле теста, дублируют те что уже есть в conftest. От этих можно избавиться


class TestBurger:
"""Тесты для класса Burger"""

def test_burger_initialization(self, burger):
"""ТЕСТ 1: Только инициализация"""
assert burger.bun is None
assert burger.ingredients == []

def test_set_buns(self, burger, mock_bun):
"""ТЕСТ 2: Только установка булочки"""
burger.set_buns(mock_bun)
assert burger.bun == mock_bun

def test_add_ingredient(self, burger, mock_ingredient):
"""ТЕСТ 3: Только добавление ингредиента"""
burger.add_ingredient(mock_ingredient)
assert len(burger.ingredients) == 1
assert burger.ingredients[0] == mock_ingredient

def test_remove_ingredient(self, burger, mock_ingredient):
"""ТЕСТ 4: Только удаление ингредиента"""
burger.add_ingredient(mock_ingredient)
burger.remove_ingredient(0)
assert len(burger.ingredients) == 0

def test_move_ingredient(self, burger):
"""ТЕСТ 5: Только перемещение ингредиента"""
mock1, mock2, mock3 = Mock(), Mock(), Mock()
burger.ingredients = [mock1, mock2, mock3]

burger.move_ingredient(2, 1)
assert burger.ingredients == [mock1, mock3, mock2]

def test_get_price(self, burger, mock_bun):
"""ТЕСТ 6: Только расчет цены"""
burger.set_buns(mock_bun)

mock_ingredient = Mock()
mock_ingredient.get_price.return_value = 50
burger.ingredients = [mock_ingredient]

assert burger.get_price() == 250 # 2*100 + 50

def test_get_receipt(self, burger, mock_bun):
"""ТЕСТ 7: Формирование чека"""
burger.set_buns(mock_bun)
mock_ingredient = Mock()
mock_ingredient.get_type.return_value = INGREDIENT_TYPE_SAUCE
mock_ingredient.get_name.return_value = "test sauce"
mock_ingredient.get_price.return_value = 50
burger.ingredients = [mock_ingredient]

receipt = burger.get_receipt()
# ИСПРАВЛЕНИЕ: заменили "in" на полное сравнение строки
expected_receipt = """(==== test bun ====)
= sauce test sauce =
(==== test bun ====)

Price: 250"""
assert receipt == expected_receipt
40 changes: 40 additions & 0 deletions tests/test_database.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import pytest
import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(__file__)))

from database import Database


@pytest.fixture
def database():
"""Фикстура для создания базы данных"""
return Database()


class TestDatabase:
"""Тесты для класса Database"""

def test_database_initialization(self, database):
"""Только инициализация"""
buns = database.available_buns()
ingredients = database.available_ingredients()

assert len(buns) == 3
assert len(ingredients) == 6

def test_available_buns(self, database):
"""Только получение булочек"""
buns = database.available_buns()

assert len(buns) == 3
# ИСПРАВЛЕНИЕ: заменили "in" на точное сравнение
bun_names = [bun.get_name() for bun in buns]
assert bun_names == ["black bun", "white bun", "red bun"]

def test_available_ingredients(self, database):
"""Только получение ингредиентов"""
ingredients = database.available_ingredients()

assert len(ingredients) == 6
Loading