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.
18 changes: 14 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,24 @@
### Структура проекта

- `praktikum` - пакет, содержащий код программы
- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д.
- `tests` - пакет, содержащий тесты, разделенные по классам:
- Для `Bun` и `Ingredient` использована параметризация
- Для `Burger` использованы моки
- Для `Database` проверяются типы и контрольные значения

### Запуск автотестов

**Установка зависимостей**

> `$ pip install -r requirements.txt`
> `pip install -r requirements.txt`

**Запуск автотестов и создание HTML-отчета о покрытии**

> `$ pytest --cov=praktikum --cov-report=html`
python -m pytest -v
python -m pytest --cov=praktikum --cov-report=html

## Покрытие
```bash
python -m pytest -v
python -m pytest --cov=praktikum --cov-report=term-missing
python -m pytest --cov=praktikum --cov-report=html
```
7 changes: 0 additions & 7 deletions ingredient_types.py

This file was deleted.

File renamed without changes.
Binary file added praktikum/__pycache__/__init__.cpython-313.pyc
Binary file not shown.
Binary file added praktikum/__pycache__/bun.cpython-313.pyc
Binary file not shown.
Binary file added praktikum/__pycache__/burger.cpython-313.pyc
Binary file not shown.
Binary file added praktikum/__pycache__/database.cpython-313.pyc
Binary file not shown.
Binary file added praktikum/__pycache__/ingredient.cpython-313.pyc
Binary file not shown.
Binary file not shown.
8 changes: 3 additions & 5 deletions bun.py → praktikum/bun.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
class Bun:
"""
Модель булочки для бургера.
Булочке можно дать название и назначить цену.
"""

# Модель булочки для бургера.
#Булочке можно дать название и назначить цену.

def __init__(self, name: str, price: float):
self.name = name
self.price = price
Expand Down
12 changes: 5 additions & 7 deletions burger.py → praktikum/burger.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@


class Burger:
"""
Модель бургера.
Бургер состоит из булочек и ингредиентов (начинка или соус).
Ингредиенты можно перемещать и удалять.
Можно распечать чек с информацией о бургере.
"""

# Модель бургера.
# Бургер состоит из булочек и ингредиентов (начинка или соус).
# Ингредиенты можно перемещать и удалять.
# Можно распечать чек с информацией о бургере.

def __init__(self):
self.bun = None
self.ingredients: List[Ingredient] = []
Expand Down
6 changes: 2 additions & 4 deletions database.py → praktikum/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@


class Database:
"""
Класс с методами по работе с базой данных.
"""

# Класс с методами по работе с базой данных.

def __init__(self):
self.buns: List[Bun] = []
self.ingredients: List[Ingredient] = []
Expand Down
10 changes: 4 additions & 6 deletions ingredient.py → praktikum/ingredient.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
class Ingredient:
"""
Модель ингредиента.
Ингредиент: начинка или соус.
У ингредиента есть тип (начинка или соус), название и цена.
"""

# Модель ингредиента.
#Ингредиент: начинка или соус.
#У ингредиента есть тип (начинка или соус), название и цена.

def __init__(self, ingredient_type: str, name: str, price: float):
self.type = ingredient_type
self.name = name
Expand Down
6 changes: 6 additions & 0 deletions praktikum/ingredient_types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#Перечисление с типами ингредиентов.
#SAUCE – соус
#FILLING – начинка

INGREDIENT_TYPE_SAUCE = 'SAUCE'
INGREDIENT_TYPE_FILLING = 'FILLING'
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pytest
pytest-cov
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
18 changes: 18 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import pytest
from praktikum.bun import Bun
from praktikum.ingredient import Ingredient


@pytest.fixture
def bun():
return Bun('Флюоресцентная булка R2-D3', 988)


@pytest.fixture
def ingredient_main():
return Ingredient('Начинка', 'Говяжий метеорит (отбивная)', 3000)


@pytest.fixture
def ingredient_sauce():
return Ingredient('Соус', 'Соус Spicy-X', 90)
39 changes: 39 additions & 0 deletions tests/test_bun.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import pytest
from praktikum.bun import Bun


class TestBun:
@pytest.mark.parametrize(
'name, price',
[
('Флюоресцентная булка R2-D3', 988),
('Краторная булка N-200i', 1255),
],
)
def test_bun_fields(self, name, price):
bun = Bun(name, price)

assert bun.name == name
assert bun.price == price

@pytest.mark.parametrize(
'name, price',
[
('Флюоресцентная булка R2-D3', 988),
('Краторная булка N-200i', 1255),
],
)
def test_get_bun_name(self, name, price): # Проверяем метод get_name()bun = Bun(name, price)
bun = Bun(name, price)
assert bun.get_name() == name

@pytest.mark.parametrize(
'name, price',
[
('Флюоресцентная булка R2-D3', 988),
('Краторная булка N-200i', 1255),
],
)
def test_get_bun_price(self, name, price): # Проверяем метод get_name()bun = Bun(name, price)
bun = Bun(name, price)
assert bun.get_price() == price
78 changes: 78 additions & 0 deletions tests/test_burger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
from unittest.mock import Mock
from praktikum.burger import Burger

class TestBurger:
def test_set_buns_sets_bun(self, bun):

burger = Burger()
burger.set_buns(bun)

assert burger.bun == bun

def test_add_ingredient_adds_item_to_list(self, ingredient_main):

burger = Burger()
burger.add_ingredient(ingredient_main)

assert burger.ingredients == [ingredient_main]

def test_remove_ingredient_removes_item_by_index(self, ingredient_main, ingredient_sauce):

burger = Burger()
burger.add_ingredient(ingredient_main)
burger.add_ingredient(ingredient_sauce)
burger.remove_ingredient(0)

assert burger.ingredients == [ingredient_sauce]

def test_move_ingredient_moves_item_to_new_index(self, ingredient_main, ingredient_sauce):

second_ingredient = Mock()
second_ingredient.get_price.return_value = 100
second_ingredient.get_name.return_value = 'Сыр с астероидной плесенью'
second_ingredient.get_type.return_value = 'Начинка'

burger = Burger()
burger.add_ingredient(ingredient_main)
burger.add_ingredient(ingredient_sauce)
burger.add_ingredient(second_ingredient)
burger.move_ingredient(2, 0)

assert burger.ingredients == [second_ingredient, ingredient_main, ingredient_sauce]

def test_get_price_returns_sum_of_bun_and_ingredients_prices(self):

bun = Mock()
bun.get_price.return_value = 100

ingredient_1 = Mock()
ingredient_1.get_price.return_value = 50

ingredient_2 = Mock()
ingredient_2.get_price.return_value = 25

burger = Burger()
burger.set_buns(bun)
burger.add_ingredient(ingredient_1)
burger.add_ingredient(ingredient_2)

assert burger.get_price() == 275

def test_get_receipt_returns_expected_string(self):

bun = Mock()
bun.get_name.return_value = 'Булка'
bun.get_price.return_value = 100

ingredient = Mock()
ingredient.get_type.return_value = 'Соус'
ingredient.get_name.return_value = 'Соус Spicy-X'
ingredient.get_price.return_value = 50

burger = Burger()
burger.set_buns(bun)
burger.add_ingredient(ingredient)

expected = '(==== Булка ====)\n= соус Соус Spicy-X =\n(==== Булка ====)\n\nPrice: 250'

assert burger.get_receipt() == expected
84 changes: 84 additions & 0 deletions tests/test_database.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
from praktikum.database import Database
from praktikum.bun import Bun
from praktikum.ingredient import Ingredient


class TestDatabase:
def test_available_buns_returns_non_empty_list(self):
database = Database()
buns = database.available_buns()

assert buns

def test_available_buns_returns_bun_objects(self):
database = Database()
buns = database.available_buns()

assert all(isinstance(bun, Bun) for bun in buns)

def test_available_ingredients_returns_non_empty_list(self):
database = Database()
ingredients = database.available_ingredients()

assert ingredients

def test_available_ingredients_returns_ingredient_objects(self):
database = Database()
ingredients = database.available_ingredients()

assert all(isinstance(item, Ingredient) for item in ingredients)

def test_first_bun_name_is_black_bun(self):
database = Database()
buns = database.available_buns()

assert buns[0].get_name() == 'black bun'

def test_first_bun_price_is_100(self):
database = Database()
buns = database.available_buns()

assert buns[0].get_price() == 100

def test_second_bun_name_is_white_bun(self):
database = Database()
buns = database.available_buns()

assert buns[1].get_name() == 'white bun'

def test_second_bun_price_is_200(self):
database = Database()
buns = database.available_buns()

assert buns[1].get_price() == 200

def test_first_ingredient_type_is_sauce(self):
database = Database()
ingredients = database.available_ingredients()

assert ingredients[0].get_type() == 'SAUCE'

def test_first_ingredient_name_is_hot_sauce(self):
database = Database()
ingredients = database.available_ingredients()

assert ingredients[0].get_name() == 'hot sauce'

def test_first_ingredient_price_is_100(self):
database = Database()
ingredients = database.available_ingredients()

assert ingredients[0].get_price() == 100

def test_last_ingredient_type_is_filling(self):
database = Database()
ingredients = database.available_ingredients()

assert ingredients[-1].get_type() == 'FILLING'

def test_last_ingredient_name_is_sausage(self):
database = Database()
ingredients = database.available_ingredients()

assert ingredients[-1].get_name() == 'sausage'

Loading