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

# Testing
.pytest_cache/
.coverage
htmlcov/
.tox/
.allure/
allure-results/
allure-report/

# IDE
.vscode/
.idea/
*.iml

# OS
.DS_Store
Thumbs.db

# Logs
*.log
Empty file removed __init__.py
Empty file.
37 changes: 37 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import pytest
from unittest.mock import Mock

from praktikum.burger import Burger
from praktikum.database import Database
from praktikum.bun import Bun
from praktikum.ingredient import Ingredient
from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING


@pytest.fixture
def db():
db = Database()
return db

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

@pytest.fixture
def mock_bun():
bun = Mock(spec=Bun)
bun.get_name.return_value = "test bun"
bun.get_price.return_value = 100.0
return bun

@pytest.fixture
def mock_ingredients():
ingredients = []
for i in range(3):
ingredient = Mock(spec=Ingredient)
ingredient.get_name.return_value = f"ingredient_{i}"
ingredient.get_price.return_value = float(50 * (i + 1))
ingredient.get_type.return_value = INGREDIENT_TYPE_SAUCE if i % 2 == 0 else INGREDIENT_TYPE_FILLING
ingredients.append(ingredient)
return ingredients
35 changes: 35 additions & 0 deletions data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING


BUN_DATA1 = {
"name": "bun1",
"price": 111,
}

BUN_DATA2 = {
"name": "bun2",
"price": 111.5,
}

BUN_DATA3 = {
"name": "",
"price": 0,
}

INGREDIENT_DATA1 = {
"ingredient_type": INGREDIENT_TYPE_SAUCE,
"name": "hot sauce",
"price": 200,
}

INGREDIENT_DATA2 = {
"ingredient_type": INGREDIENT_TYPE_FILLING,
"name": "cutlet",
"price": 150.5
}

INGREDIENT_DATA3 = {
"ingredient_type": INGREDIENT_TYPE_SAUCE,
"name": "",
"price": 0
}
File renamed without changes.
1 change: 1 addition & 0 deletions praktikum/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# tests package
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file added requirements.txt
Binary file not shown.
1 change: 1 addition & 0 deletions tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# tests package
24 changes: 24 additions & 0 deletions tests/bun_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import pytest
from praktikum.bun import Bun
from data import BUN_DATA1, BUN_DATA2, BUN_DATA3


class TestBun:

@pytest.mark.parametrize("name, price", [
(BUN_DATA1["name"], BUN_DATA1["price"]),
(BUN_DATA2["name"], BUN_DATA2["price"]),
(BUN_DATA3["name"], BUN_DATA3["price"]),
])
def test_bun_creation(self, name, price):
bun = Bun(name, price)
assert bun.get_name() == name
assert bun.get_price() == price

def test_bun_get_name(self):
bun = Bun(BUN_DATA1['name'], BUN_DATA1['price'])
assert bun.get_name() == BUN_DATA1['name']

def test_bun_get_price(self):
bun = Bun(BUN_DATA2['name'], BUN_DATA2['price'])
assert bun.get_price() == BUN_DATA2['price']
90 changes: 90 additions & 0 deletions tests/burger_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import pytest
from unittest.mock import Mock
from praktikum.bun import Bun
from praktikum.ingredient import Ingredient


class TestBurger:

def test_burger_initialization_allows_adding_bun(self, burger, mock_bun):
burger.set_buns(mock_bun)
assert burger.get_price() == 200.0

def test_set_buns(self, burger, mock_bun):
burger.set_buns(mock_bun)
assert burger.bun == mock_bun

def test_add_one_ingredient(self, burger, mock_ingredients):
burger.add_ingredient(mock_ingredients[0])
assert len(burger.ingredients) == 1
assert burger.ingredients[0] == mock_ingredients[0]

def test_add_two_ingredients(self, burger, mock_ingredients):
burger.add_ingredient(mock_ingredients[0])
burger.add_ingredient(mock_ingredients[1])
assert len(burger.ingredients) == 2
assert burger.ingredients[0] == mock_ingredients[0]
assert burger.ingredients[1] == mock_ingredients[1]

def test_remove_ingredient(self, burger, mock_ingredients):
for ingredient in mock_ingredients:
burger.add_ingredient(ingredient)

burger.remove_ingredient(1)
assert len(burger.ingredients) == 2
assert burger.ingredients[0] == mock_ingredients[0]
assert burger.ingredients[1] == mock_ingredients[2]

def test_move_ingredient_moves_from_end_to_beginning(self, burger, mock_ingredients):
for ingredient in mock_ingredients:
burger.add_ingredient(ingredient)

burger.move_ingredient(2, 0)
assert burger.ingredients[0] == mock_ingredients[2]
assert burger.ingredients[1] == mock_ingredients[0]
assert burger.ingredients[2] == mock_ingredients[1]

def test_move_ingredient_moves_from_middle_to_end(self, burger, mock_ingredients):
for ingredient in mock_ingredients:
burger.add_ingredient(ingredient)

burger.move_ingredient(1, 2)
assert burger.ingredients[0] == mock_ingredients[0]
assert burger.ingredients[1] == mock_ingredients[2]
assert burger.ingredients[2] == mock_ingredients[1]


def test_get_price_with_bun_no_ingredients(self, burger, mock_bun):
burger.set_buns(mock_bun)
price = burger.get_price()
assert price == 200.0
mock_bun.get_price.assert_called_once()

def test_get_price_with_bun_and_ingredients(self, burger, mock_bun, mock_ingredients):
burger.set_buns(mock_bun)
for ingredient in mock_ingredients:
burger.add_ingredient(ingredient)

expected_price = 200.0 + 50 + 100 + 150
assert burger.get_price() == expected_price

mock_bun.get_price.assert_called_once()
for ingredient in mock_ingredients:
ingredient.get_price.assert_called_once()

@pytest.mark.parametrize("bun_price, ingredient_prices, expected_price", [
(100, [50, 75], 100*2 + 50 + 75),
(200, [100, 150, 200], 200*2 + 100 + 150 + 200),
(150, [], 150*2),
])
def test_get_price_parametrized(self, burger, bun_price, ingredient_prices, expected_price):
mock_bun = Mock(spec=Bun)
mock_bun.get_price.return_value = float(bun_price)
burger.set_buns(mock_bun)

for price in ingredient_prices:
mock_ingredient = Mock(spec=Ingredient)
mock_ingredient.get_price.return_value = float(price)
burger.add_ingredient(mock_ingredient)

assert burger.get_price() == expected_price
57 changes: 57 additions & 0 deletions tests/database_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from praktikum.bun import Bun
from praktikum.ingredient import Ingredient
from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING


class TestDatabase:

def test_database_initialization(self,db):
assert len(db.buns) == 3
assert len(db.ingredients) == 6

def test_available_buns(self,db):
buns = db.available_buns()

assert len(buns) == 3
assert all(isinstance(bun, Bun) for bun in buns)

assert buns[0].get_name() == "black bun"
assert buns[0].get_price() == 100
assert buns[1].get_name() == "white bun"
assert buns[1].get_price() == 200
assert buns[2].get_name() == "red bun"
assert buns[2].get_price() == 300

def test_available_ingredients(self,db):
ingredients = db.available_ingredients()

assert len(ingredients) == 6
assert all(isinstance(ingredient, Ingredient) for ingredient in ingredients)

sauces = [i for i in ingredients if i.get_type() == INGREDIENT_TYPE_SAUCE]
assert len(sauces) == 3
assert sauces[0].get_name() == "hot sauce"
assert sauces[0].get_price() == 100
assert sauces[1].get_name() == "sour cream"
assert sauces[1].get_price() == 200
assert sauces[2].get_name() == "chili sauce"
assert sauces[2].get_price() == 300

fillings = [i for i in ingredients if i.get_type() == INGREDIENT_TYPE_FILLING]
assert len(fillings) == 3
assert fillings[0].get_name() == "cutlet"
assert fillings[0].get_price() == 100
assert fillings[1].get_name() == "dinosaur"
assert fillings[1].get_price() == 200
assert fillings[2].get_name() == "sausage"
assert fillings[2].get_price() == 300

def test_database_buns_are_different_objects(self,db):
buns = db.available_buns()
assert buns[0] is not buns[1]
assert buns[1] is not buns[2]

def test_database_ingredients_are_different_objects(self,db):
ingredients = db.available_ingredients()
for i in range(len(ingredients) - 1):
assert ingredients[i] is not ingredients[i + 1]
28 changes: 28 additions & 0 deletions tests/ingredient_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import pytest
from praktikum.ingredient import Ingredient
from data import INGREDIENT_DATA1, INGREDIENT_DATA2, INGREDIENT_DATA3

class TestIngredient:

@pytest.mark.parametrize("ingredient_type, name, price", [
(INGREDIENT_DATA1["ingredient_type"], INGREDIENT_DATA1["name"], INGREDIENT_DATA1["price"]),
(INGREDIENT_DATA2["ingredient_type"], INGREDIENT_DATA2["name"], INGREDIENT_DATA2["price"]),
(INGREDIENT_DATA3["ingredient_type"], INGREDIENT_DATA3["name"], INGREDIENT_DATA3["price"])
])
def test_ingredient_creation(self, ingredient_type, name, price):
ingredient = Ingredient(ingredient_type, name, price)
assert ingredient.get_type() == ingredient_type
assert ingredient.get_name() == name
assert ingredient.get_price() == price

def test_ingredient_get_type(self):
ingredient = Ingredient(INGREDIENT_DATA1['ingredient_type'], INGREDIENT_DATA1['name'], INGREDIENT_DATA1['price'])
assert ingredient.get_type() == INGREDIENT_DATA1['ingredient_type']

def test_ingredient_get_name(self):
ingredient = Ingredient(INGREDIENT_DATA1['ingredient_type'], INGREDIENT_DATA1['name'], INGREDIENT_DATA1['price'])
assert ingredient.get_name() == INGREDIENT_DATA1['name']

def test_ingredient_get_price(self):
ingredient = Ingredient(INGREDIENT_DATA2['ingredient_type'], INGREDIENT_DATA2['name'], INGREDIENT_DATA2['price'])
assert ingredient.get_price() == INGREDIENT_DATA2['price']