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
338 changes: 338 additions & 0 deletions .idea/workspace.xml

Large diffs are not rendered by default.

19 changes: 19 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import pytest
from praktikum.burger import Burger
from helpers import make_mock_bun, make_mock_ingredient

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

@pytest.fixture
def mock_bun():
return make_mock_bun()

@pytest.fixture
def mock_ingredient():
return make_mock_ingredient()

@pytest.fixture
def another_mock_ingredient():
return make_mock_ingredient(name="Tomato", ing_type="Vegetable", price=0.8)
14 changes: 14 additions & 0 deletions helpers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from unittest.mock import Mock

def make_mock_bun(name="Sesame Bun", price=3.0):
bun = Mock()
bun.get_name.return_value = name
bun.get_price.return_value = price
return bun

def make_mock_ingredient(name="Lettuce", ing_type="Vegetable", price=1.2):
ing = Mock()
ing.get_name.return_value = name
ing.get_type.return_value = ing_type
ing.get_price.return_value = price
return ing
62 changes: 62 additions & 0 deletions models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
class Bun:
def __init__(self, name, price):
self.name = name
self.price = price

def get_name(self):
return self.name

def get_price(self):
return self.price

class Ingredient:
def __init__(self, name, ingredient_type, price):
self.name = name
self.type = ingredient_type
self.price = price

def get_name(self):
return self.name

def get_type(self):
return self.type

def get_price(self):
return self.price

class Burger:
def __init__(self):
self.bun = None
self.ingredients = []

def set_buns(self, bun):
self.bun = bun

def add_ingredient(self, ingredient):
self.ingredients.append(ingredient)

def remove_ingredient(self, ingredient):
self.ingredients.remove(ingredient)

def move_ingredient(self, old_index, new_index):
self.ingredients.insert(new_index, self.ingredients.pop(old_index))

def get_price(self):
total = 0
if self.bun:
total += self.bun.get_price() * 2
for ing in self.ingredients:
total += ing.get_price()
return total

def get_receipt(self):
lines = []
lines.append(f"(==== {self.bun.get_name()} ====)")
for ing in self.ingredients:
lines.append(f"= {str(ing.get_type()).lower()} {ing.get_name()} =")
lines.append(f"(==== {self.bun.get_name()} ====)")
lines.append(f"Price: {self.get_price()}")
return "\n".join(lines)

def clear_ingredients(self):
self.ingredients = []
File renamed without changes.
File renamed without changes.
3 changes: 1 addition & 2 deletions burger.py → praktikum/burger.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from typing import List

from praktikum.bun import Bun
from praktikum.ingredient import Ingredient
from models import Burger, Bun, Ingredient


class Burger:
Expand Down
6 changes: 3 additions & 3 deletions database.py → praktikum/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 praktikum.praktikum import Bun
from praktikum.praktikum import Ingredient
from praktikum.praktikum import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING


class Database:
Expand Down
File renamed without changes.
File renamed without changes.
6 changes: 2 additions & 4 deletions praktikum.py → praktikum/praktikum.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
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 database import Database
from models import Burger, Bun, Ingredient

def main():
# Инициализируем базу данных
Expand Down
Empty file added tests/__init__.py
Empty file.
72 changes: 72 additions & 0 deletions tests/test_burger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import pytest
from praktikum.burger import Burger
from helpers import make_mock_bun, make_mock_ingredient

class TestBurger:
def test_get_price_without_ingredients_and_bun(self, burger, mock_bun):
burger.set_buns(mock_bun)
expected_price = mock_bun.get_price.return_value * 2
assert burger.get_price() == expected_price

def test_get_price_with_single_ingredient(self, burger, mock_bun, mock_ingredient):
burger.set_buns(mock_bun)
burger.add_ingredient(mock_ingredient)
expected_price = mock_bun.get_price.return_value * 2 + mock_ingredient.get_price.return_value
assert burger.get_price() == expected_price

def test_add_ingredient_increases_ingredients_list(self, burger, mock_ingredient):
initial_count = len(burger.get_ingredients())
burger.add_ingredient(mock_ingredient)
assert mock_ingredient in burger.get_ingredients()
assert len(burger.get_ingredients()) == initial_count + 1

def test_get_ingredients_returns_list(self, burger, mock_ingredient):
burger.add_ingredient(mock_ingredient)
ingredients = burger.get_ingredients()
assert isinstance(ingredients, list)
assert mock_ingredient in ingredients

def test_move_ingredient_valid_indices(self, burger, mock_ingredient, another_mock_ingredient):
burger.add_ingredient(mock_ingredient)
burger.add_ingredient(another_mock_ingredient)
burger.move_ingredient(0, 1)
assert burger.get_ingredients()[1] == mock_ingredient

def test_remove_ingredient_valid_index(self, burger, mock_ingredient):
burger.add_ingredient(mock_ingredient)
burger.remove_ingredient(1)
assert mock_ingredient not in burger.get_ingredients()

def test_remove_ingredient_invalid_index_with_assert(self, burger):
with pytest.raises(IndexError):
burger.remove_ingredient(999)

def test_clear_ingredients(self, burger, mock_ingredient):
burger.add_ingredient(mock_ingredient)
while burger.get_ingredients():
burger.remove_ingredient(0)
assert burger.get_ingredients() == []

def test_get_receipt_includes_bun_and_ingredients(self, burger, mock_bun, mock_ingredient):
burger.set_buns(mock_bun)
burger.add_ingredient(mock_ingredient)

total_price = burger.get_price()
bun_name = mock_bun.get_name()
ingredient_type = str(mock_ingredient.get_type()).lower()
ingredient_name = mock_ingredient.get_name()

expected_receipt = (
f"(==== {bun_name} ====)\n"
f"= {ingredient_type} {ingredient_name} =\n"
f"(==== {bun_name} ====)\n"
f"\n"
f"Price: {total_price}"
)

actual_receipt = burger.get_receipt()

print("Expected receipt:\n" + expected_receipt)
print("Actual receipt:\n" + actual_receipt)

assert actual_receipt == expected_receipt