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 @@
.DS_Store
__pycache__/
.pytest_cache/
.venv/
47 changes: 47 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import pytest
from praktikum.bun import Bun
from praktikum.database import Database
from praktikum.ingredient import Ingredient
from praktikum.burger import Burger
from unittest.mock import Mock, patch
from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING
from data import SPICY_SAUCE, TEST_FILLING, TEST_SAUCE, STONE_BUN, BLACK_BUN

# Фикстуры для моков

@pytest.fixture
def bun_mock():
mock_bun = Mock(spec=Bun)
mock_bun.get_name.return_value = STONE_BUN['name']
mock_bun.get_price.return_value = STONE_BUN['price']
return mock_bun

@pytest.fixture
def ingredient_mock():
mock_ingredient = Mock(spec=Ingredient)
mock_ingredient.get_name.return_value = TEST_SAUCE['name']
mock_ingredient.get_price.return_value = TEST_SAUCE['price']
mock_ingredient.get_type.return_value = INGREDIENT_TYPE_SAUCE
return mock_ingredient

@pytest.fixture
def ingredient_mock_filling():
mock_ingredient = Mock(spec=Ingredient)
mock_ingredient.get_name.return_value = TEST_FILLING['name']
mock_ingredient.get_price.return_value = TEST_FILLING['price']
mock_ingredient.get_type.return_value = INGREDIENT_TYPE_FILLING
return mock_ingredient

@pytest.fixture
def database():
return Database()

@pytest.fixture
def ingredient():
return Ingredient(INGREDIENT_TYPE_SAUCE, SPICY_SAUCE['name'], SPICY_SAUCE['price'])

@pytest.fixture
def burger():
return Burger()


1 change: 1 addition & 0 deletions coverage.json

Large diffs are not rendered by default.

56 changes: 56 additions & 0 deletions data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING



STONE_BUN = {
"name": "Каменная булка",
"price": 1000
}

TEST_SAUCE = {
"name": "Тестовый соус",
"price": 50
}

TEST_FILLING = {
"name": "Тестовая начинка",
"price": 750
}

SPICY_SAUCE = {
"name": "Острый соус",
"price": 99
}


BLACK_BUN = {
"name": "Черная булка",
"price": 99
}

# данные булок для параметризации
TEST_BUN_1 = {
"name": "Булка с кунжутом",
"price": 850
}
TEST_BUN_2 = {
"name": "Бриошь",
"price": 930
}
TEST_BUN_3 = {
"name": "Цельнозерновая",
"price": 750
}

# данные ингредиетов для параметризации
TEST_INGREDIENT_1 = {
"type": INGREDIENT_TYPE_SAUCE,
"name": "Кетчунез",
"price": 70
}

TEST_INGREDIENT_2 = {
"type": INGREDIENT_TYPE_FILLING,
"name": "Карамелизованный лук",
"price": 50
}
File renamed without changes.
File renamed without changes.
1 change: 0 additions & 1 deletion burger.py → praktikum/burger.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from typing import List

from praktikum.bun import Bun
from praktikum.ingredient import Ingredient

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
coverage==7.13.4
pytest==9.0.2
pytest-cov==7.0.0
167 changes: 167 additions & 0 deletions tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import pytest
from praktikum.bun import Bun
from praktikum.ingredient import Ingredient
from unittest.mock import Mock, patch
from data import (
TEST_FILLING,
TEST_SAUCE,
STONE_BUN,
TEST_BUN_1,
TEST_BUN_2,
TEST_BUN_3,
TEST_INGREDIENT_1,
TEST_INGREDIENT_2
)

class TestBun:

# Получение названия булки
@pytest.mark.parametrize("name, price", [
(TEST_BUN_1['name'], TEST_BUN_1['price']),
(TEST_BUN_2['name'], TEST_BUN_2['price']),
(TEST_BUN_3['name'], TEST_BUN_3['price'])
])
def test_bun_get_name(self, name, price):
bun = Bun(name, price)
assert bun.get_name() == name

# Получение цены булки
@pytest.mark.parametrize("name, price", [
(TEST_BUN_1['name'], TEST_BUN_1['price']),
(TEST_BUN_2['name'], TEST_BUN_2['price']),
(TEST_BUN_3['name'], TEST_BUN_3['price'])
])
def test_bun_get_price(self, name, price):
bun = Bun(name, price)
assert bun.get_price() == price



class TestDatabase:

# Проверка получения списка булок
def test_available_buns_returns_list_of_buns(self, database):
buns = database.available_buns()
assert isinstance(buns, list)

# Проверка получения списка ингредиентов
def test_available_buns_returns_list_of_ingredients(self, database):
ingredients = database.available_ingredients()
assert isinstance(ingredients, list)

# Проверка того, что метод возвращает ожидаемые булки
def test_available_buns_returns_expected_buns(self, database):
buns = database.available_buns()
bun_names = [bun.get_name() for bun in buns]
assert "black bun" in bun_names
assert "white bun" in bun_names
assert "red bun" in bun_names

# Проверка того, что метод возвращает ожидаемые ингредиенты
def test_available_ingredients_returns_expected_ingredients(self, database):
ingredients = database.available_ingredients()
ingredient_names = [ingredient.get_name() for ingredient in ingredients]
expected_names = [
"hot sauce", "sour cream", "chili sauce", "cutlet", "dinosaur", "sausage"
]
for expected_name in expected_names:
assert expected_name in ingredient_names



class TestBurger:

# Выбор булок
def test_set_buns(self, burger, bun_mock):
burger.set_buns(bun_mock)
assert burger.bun == bun_mock

# Добавление ингредиента
def test_add_ingredient(self, burger, ingredient_mock):

burger.add_ingredient(ingredient_mock)
assert len(burger.ingredients) == 1
assert burger.ingredients[0] == ingredient_mock

# Удаление ингредиента
def test_remove_ingredient(self, burger, ingredient_mock):

burger.add_ingredient(ingredient_mock)
burger.remove_ingredient(0)
assert len(burger.ingredients) == 0

# Перемещение ингредиента
def test_move_ingredient(self, burger):

ingredient1 = Mock(spec=Ingredient)
ingredient2 = Mock(spec=Ingredient)

burger.add_ingredient(ingredient1)
burger.add_ingredient(ingredient2)

burger.move_ingredient(0, 1)
assert burger.ingredients[0] == ingredient2
assert burger.ingredients[1] == ingredient1

# Получение цены бургера
def test_get_burger_price(self, burger, bun_mock, ingredient_mock, ingredient_mock_filling):

burger.set_buns(bun_mock)
burger.add_ingredient(ingredient_mock)
burger.add_ingredient(ingredient_mock_filling)
# рассчитываем цену через переменные
expected_price = (STONE_BUN['price'] * 2) + TEST_SAUCE['price'] + TEST_FILLING['price']
assert burger.get_price() == expected_price

# Получение чека
@patch('praktikum.burger.Burger.get_price')
def test_get_receipt(self, mock_get_price, burger, bun_mock, ingredient_mock):
# рассчитываем цену через переменные
expected_price = (STONE_BUN['price'] * 2) + TEST_SAUCE['price']
mock_get_price.return_value = expected_price
# Сборка бургера
burger.set_buns(bun_mock)
burger.add_ingredient(ingredient_mock)
receipt = burger.get_receipt()
# Проверка содержимого чека
assert f'(==== {STONE_BUN['name']} ====)' in receipt
assert f'= sauce {TEST_SAUCE['name']} =' in receipt
assert f'Price: {expected_price}' in receipt



class TestIngredient:

# Получение типа ингредиента
@pytest.mark.parametrize("ingredient_type, name, price", [
(TEST_INGREDIENT_1['type'], TEST_INGREDIENT_1['name'], TEST_INGREDIENT_1['price']),
(TEST_INGREDIENT_2['type'], TEST_INGREDIENT_2['name'], TEST_INGREDIENT_2['price']),
])
def test_ingredient_get_type(self, ingredient_type, name, price):

ingredient = Ingredient(ingredient_type, name, price)
assert ingredient.get_type() == ingredient_type

# Получение цены ингредиента
@pytest.mark.parametrize("ingredient_type, name, price", [
(TEST_INGREDIENT_1['type'], TEST_INGREDIENT_1['name'], TEST_INGREDIENT_1['price']),
(TEST_INGREDIENT_2['type'], TEST_INGREDIENT_2['name'], TEST_INGREDIENT_2['price']),
])
def test_ingredient_get_price(self, ingredient_type, name, price):

ingredient = Ingredient(ingredient_type, name, price)
assert ingredient.get_price() == price

# Получение названия ингредиента
@pytest.mark.parametrize("ingredient_type, name, price", [
(TEST_INGREDIENT_1['type'], TEST_INGREDIENT_1['name'], TEST_INGREDIENT_1['price']),
(TEST_INGREDIENT_2['type'], TEST_INGREDIENT_2['name'], TEST_INGREDIENT_2['price']),
])
def test_ingredient_get_name(self, ingredient_type, name, price):

ingredient = Ingredient(ingredient_type, name, price)
assert ingredient.get_name() == name