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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.idea/
.venv/
.vscode/
__pycache__/
.coverage
24 changes: 17 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,34 @@
## Задание 1: Юнит-тесты
# Задание 1: Юнит-тесты

### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers
---

### Реализованные сценарии
## Описание:

Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers

---

## Реализованные сценарии

Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database`

Процент покрытия 100% (отчет: `htmlcov/index.html`)

### Структура проекта
---

## Структура проекта

- `praktikum` - пакет, содержащий код программы
- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д.

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

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

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

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

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

> `$ pytest --cov=praktikum --cov-report=html`
> `pytest --cov=praktikum --cov-report=html`
Empty file added core/__init__.py
Empty file.
4 changes: 4 additions & 0 deletions core/utils/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from .create_fake_bun import get_bun_mock
from .create_fake_ingredient import get_ingredient_mock

__all__ = ["get_ingredient_mock", "get_bun_mock"]
16 changes: 16 additions & 0 deletions core/utils/create_fake_bun.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import uuid
from unittest.mock import Mock


def get_bun_mock() -> Mock:
mock = Mock()

mock.get_name.return_value = f"fake_bun_{uuid.uuid4()}"
mock.get_price.return_value = 1
mock.get_type.return_value = "fake_bun_type"

return mock


if __name__ == "__main__":
print(uuid.uuid4())
12 changes: 12 additions & 0 deletions core/utils/create_fake_ingredient.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import uuid
from unittest.mock import Mock


def get_ingredient_mock() -> Mock:
mock = Mock()

mock.get_name.return_value = f"fake_ingredient_{uuid.uuid4()}"
mock.get_price.return_value = 1
mock.get_type.return_value = "fake_ingredient_type"

return mock
41 changes: 0 additions & 41 deletions praktikum.py

This file was deleted.

Empty file added praktikum/__init__.py
Empty file.
File renamed without changes.
4 changes: 2 additions & 2 deletions burger.py → praktikum/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
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 .bun import Bun
from .ingredient import Ingredient
from .ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING


class Database:
Expand Down
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 @@
allure-pytest==2.15.0
pytest==8.4.2
pytest-cov==7.0.0
Empty file added tests/__init__.py
Empty file.
46 changes: 46 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from typing import Callable
from unittest.mock import Mock

import pytest

from praktikum.bun import Bun
from praktikum.ingredient import Ingredient
from praktikum.ingredient_types import *
from core.utils import get_bun_mock, get_ingredient_mock


@pytest.fixture
def get_fake_bun() -> Callable:
def _inner(count: int = 1) -> list[Mock]:
return [get_bun_mock() for _ in range(count)]

return _inner


@pytest.fixture
def get_fake_ingredient() -> Callable:
def _inner(count: int = 1) -> list[Mock]:
return [get_ingredient_mock() for _ in range(count)]

return _inner


@pytest.fixture
def get_buns_from_db() -> list[Bun]:
return [
Bun("black bun", 100),
Bun("white bun", 200),
Bun("red bun", 300),
]


@pytest.fixture
def get_ingredients_from_db() -> list[Ingredient]:
return [
Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100),
Ingredient(INGREDIENT_TYPE_SAUCE, "sour cream", 200),
Ingredient(INGREDIENT_TYPE_SAUCE, "chili sauce", 300),
Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 100),
Ingredient(INGREDIENT_TYPE_FILLING, "dinosaur", 200),
Ingredient(INGREDIENT_TYPE_FILLING, "sausage", 300),
]
20 changes: 20 additions & 0 deletions tests/test_bun.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import pytest

from praktikum.bun import Bun


class TestBun:

@pytest.mark.parametrize("name", ["Бриошь", "Рисовая", " ", ""])
def test_return_correct_name_when_bun_is_created(self, name):
bun = Bun(name, 1.5)

assert bun.get_name() == name
assert bun.name == name

@pytest.mark.parametrize("price", [5, -5, 0.0, 1.5])
def test_return_correct_price_when_bun_is_created(self, price):
bun = Bun("fake_bun", price)

assert bun.get_price() == price
assert bun.price == price
87 changes: 87 additions & 0 deletions tests/test_burger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
from praktikum.burger import Burger


class TestBurger:

def test_set_correct_bun_when_burger_is_created(self, get_fake_bun):
burger = Burger()
fake_bun, *_ = get_fake_bun()

burger.set_buns(fake_bun)
assert burger.bun.get_name() == fake_bun.get_name()

def test_add_ingredient_to_burger(self, get_fake_ingredient):
burger = Burger()
ingredient, *_ = get_fake_ingredient()

burger.add_ingredient(ingredient)
assert burger.ingredients[0] == ingredient

def test_add_multiple_ingredients_to_burger(self, get_fake_ingredient):
burger = Burger()
ingredient, *_ = get_fake_ingredient()
n = 5

for _ in range(n):
burger.add_ingredient(ingredient)

assert len(burger.ingredients) == n

def test_remove_ingredient_from_burger(self, get_fake_ingredient):
burger = Burger()
ingredient, *_ = get_fake_ingredient()

burger.add_ingredient(ingredient)
burger.remove_ingredient(0)

assert len(burger.ingredients) == 0

def test_swap_ingredient_in_burger(self, get_fake_ingredient):
burger = Burger()
n = 3

first, second, third = get_fake_ingredient(n)

burger.add_ingredient(first)
burger.add_ingredient(second)
burger.add_ingredient(third)

burger.move_ingredient(1, 2)

assert burger.ingredients == [first, third, second]

def test_return_correct_price_when_burger_is_created(self, get_fake_bun, get_fake_ingredient):
burger = Burger()
n = 3
price = 5
fake_bun, *_ = get_fake_bun()

burger.set_buns(fake_bun)
first, second, third = get_fake_ingredient(n)

burger.add_ingredient(first)
burger.add_ingredient(second)
burger.add_ingredient(third)

assert burger.get_price() == price

def test_return_correct_receipt_when_burger_is_created(self, get_fake_bun, get_fake_ingredient):
burger = Burger()
n = 3
fake_bun, *_ = get_fake_bun()

burger.set_buns(fake_bun)
first, second, third = get_fake_ingredient(n)

burger.add_ingredient(first)
burger.add_ingredient(second)
burger.add_ingredient(third)

assert burger.get_receipt() == (
f"(==== {fake_bun.get_name()} ====)\n"
f"= {first.get_type()} {first.get_name()} =\n"
f"= {second.get_type()} {second.get_name()} =\n"
f"= {third.get_type()} {third.get_name()} =\n"
f"(==== {fake_bun.get_name()} ====)\n\n"
"Price: 5"
)
24 changes: 24 additions & 0 deletions tests/test_database.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from praktikum.database import Database


class TestDatabase:

def test_return_correct_buns_from_db(self, get_buns_from_db):
db = Database()
available_buns = db.available_buns()
n = 3

assert len(available_buns) == n

for available_bun, bun_from_db in zip(available_buns, get_buns_from_db):
assert available_bun.get_name() == bun_from_db.get_name()

def test_return_correct_ingredients_from_db(self, get_ingredients_from_db):
db = Database()
available_ingredients = db.available_ingredients()
n = 6

assert len(available_ingredients) == n

for available_ingredient, ingredient_from_db in zip(available_ingredients, get_ingredients_from_db):
assert available_ingredient.get_name() == ingredient_from_db.get_name()
27 changes: 27 additions & 0 deletions tests/test_ingredients.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import pytest

from praktikum.ingredient import Ingredient


class TestIngredient:

@pytest.mark.parametrize("name", ["чесночный", "кетчуп", ""])
def test_return_correct_name_when_ingredient_is_created(self, name):
ingredient = Ingredient("соус", name, 1.0)

assert ingredient.get_name() == name
assert ingredient.name == name

@pytest.mark.parametrize("curr_type", ["соус", "начинка", ""])
def test_return_correct_type_when_ingredient_is_created(self, curr_type):
ingredient = Ingredient(curr_type, "fake_ingredient", 1.5)

assert ingredient.get_type() == curr_type
assert ingredient.type == curr_type

@pytest.mark.parametrize("price", [5, -5, 0.0, 1.5])
def test_return_correct_price_when_ingredient_is_created(self, price):
ingredient = Ingredient("fake_type", "fake_ingredient", price)

assert ingredient.get_price() == price
assert ingredient.price == price