diff --git a/.coverage b/.coverage new file mode 100644 index 000000000..ff8bcc87e Binary files /dev/null and b/.coverage differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..61c1f7914 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +__pycache__/ \ No newline at end of file diff --git a/helpers/helpers.py b/helpers/helpers.py new file mode 100644 index 000000000..43cd91d27 --- /dev/null +++ b/helpers/helpers.py @@ -0,0 +1,8 @@ +import string +import random + + +def generate_random_string(length): + letters = string.ascii_lowercase + random_string = ''.join(random.choice(letters) for i in range(length)) + return random_string diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..2cf97cf64 --- /dev/null +++ b/praktikum/__init__.py @@ -0,0 +1,5 @@ +from .bun import Bun +from .burger import Burger +from .database import Database +from .ingredient import Ingredient +from .ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING \ No newline at end of file diff --git a/bun.py b/praktikum/bun.py similarity index 100% rename from bun.py rename to praktikum/bun.py diff --git a/burger.py b/praktikum/burger.py similarity index 100% rename from burger.py rename to praktikum/burger.py diff --git a/database.py b/praktikum/database.py similarity index 100% rename from database.py rename to praktikum/database.py diff --git a/ingredient.py b/praktikum/ingredient.py similarity index 100% rename from ingredient.py rename to praktikum/ingredient.py diff --git a/ingredient_types.py b/praktikum/ingredient_types.py similarity index 100% rename from ingredient_types.py rename to praktikum/ingredient_types.py diff --git a/praktikum.py b/praktikum/praktikum.py similarity index 100% rename from praktikum.py rename to praktikum/praktikum.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..47749087c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +allure-pytest==2.15.2 +allure-python-commons==2.15.2 +coverage==7.12.0 +pytest==9.0.1 +pytest-cov==7.0.0 diff --git a/__init__.py b/tests/__init__.py similarity index 100% rename from __init__.py rename to tests/__init__.py diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..af5c973e5 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,56 @@ +import random +from unittest.mock import Mock +import pytest + +from helpers.helpers import generate_random_string +from praktikum import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + + +@pytest.fixture(scope='function') +def bun_mock(): + bun_mock = Mock() + bun_mock.name = generate_random_string(10) + bun_mock.price = float(random.randint(1, 1000)) + bun_mock.get_price.return_value = bun_mock.price + bun_mock.get_name.return_value = bun_mock.name + + return bun_mock + + +@pytest.fixture(scope='function') +def ingredient_mock(): + ingredient_mock = Mock() + ingredient_mock.name = generate_random_string(10) + ingredient_mock.price = float(random.randint(1, 1000)) + ingredient_mock.get_price.return_value = ingredient_mock.price + ingredient_mock.get_type.return_value = ingredient_mock.type + ingredient_mock.get_name.return_value = ingredient_mock.name + + return ingredient_mock + + +@pytest.fixture(scope='function') +def sauce_mock(): + sauce_mock = Mock() + sauce_mock.type = INGREDIENT_TYPE_SAUCE + sauce_mock.name = generate_random_string(10) + sauce_mock.price = float(random.randint(1, 1000)) + sauce_mock.get_price.return_value = sauce_mock.price + sauce_mock.get_type.return_value = sauce_mock.type + sauce_mock.get_name.return_value = sauce_mock.name + + return sauce_mock + + +@pytest.fixture(scope='function') +def filling_mock(): + filling_mock = Mock() + filling_mock.type = INGREDIENT_TYPE_FILLING + filling_mock.name = generate_random_string(10) + filling_mock.price = float(random.randint(1, 1000)) + filling_mock.get_price.return_value = filling_mock.price + filling_mock.get_type.return_value = filling_mock.type + filling_mock.get_name.return_value = filling_mock.name + + return filling_mock + diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..8bb882a3d --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,22 @@ +import allure + +from praktikum import Bun +from helpers.helpers import * + + +class TestBun: + @allure.title("Проверка получения названия булочки") + def test_get_name(self): + name = generate_random_string(10) + price = float(random.randint(1, 1000)) + bun = Bun(name, price) + assert bun.get_name() == name + + @allure.title("Проверка получения цены булочки") + def test_get_price(self): + name = generate_random_string(10) + price = float(random.randint(1, 1000)) + bun = Bun(name, price) + assert bun.get_price() == price + + diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..f0e237a5d --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,83 @@ +import pytest +import allure + +from praktikum import Burger, INGREDIENT_TYPE_FILLING, INGREDIENT_TYPE_SAUCE + + +class TestBurger: + @allure.title('Проверка присвоения булочки бургеру') + def test_set_buns(self, bun_mock): + burger = Burger() + burger.set_buns(bun_mock) + assert burger.bun.name == bun_mock.name and burger.bun.price == bun_mock.price + + @allure.title('Проверка добавления ингредиента в бургер') + @pytest.mark.parametrize('ingredient_type', (INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING)) + def test_add_ingredient(self, ingredient_mock, ingredient_type): + ingredient_mock.type = ingredient_type + burger = Burger() + burger.add_ingredient(ingredient_mock) + assert burger.ingredients[-1].type == ingredient_mock.type and \ + burger.ingredients[-1].name == ingredient_mock.name and \ + burger.ingredients[-1].price == ingredient_mock.price + + @allure.title('Проверка удаления ингредиента из бургерв') + @pytest.mark.parametrize('ingredient_type', (INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING)) + def test_remove_ingredient(self, ingredient_mock, ingredient_type): + ingredient_mock.type = ingredient_type + burger = Burger() + burger.add_ingredient(ingredient_mock) + burger.remove_ingredient(-1) + assert len(burger.ingredients) == 0 + + @allure.title('Проверка перемешивания ингредиентов в бургере') + def test_move_ingredient(self, sauce_mock, filling_mock): + burger = Burger() + burger.add_ingredient(sauce_mock) + burger.add_ingredient(filling_mock) + burger.move_ingredient(-1, 0) + assert burger.ingredients[0] is filling_mock and burger.ingredients[1] is sauce_mock + + @pytest.mark.parametrize('ingredient_type', (INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING)) + @allure.title('Проверка получения цены бургера c одним ингредиентом') + def test_get_price_one_ingredient(self, bun_mock, ingredient_mock, ingredient_type): + ingredient_mock.type = ingredient_type + burger = Burger() + burger.set_buns(bun_mock) + burger.add_ingredient(ingredient_mock) + assert burger.get_price() == bun_mock.price * 2 + ingredient_mock.price + + @allure.title('Проверка получения цены бургера c несколькими ингредиентами') + def test_get_price(self, bun_mock, sauce_mock, filling_mock): + burger = Burger() + burger.set_buns(bun_mock) + burger.add_ingredient(sauce_mock) + burger.add_ingredient(filling_mock) + assert burger.get_price() == bun_mock.price * 2 + sauce_mock.price + filling_mock.price + + @pytest.mark.parametrize('ingredient_type', (INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING)) + @allure.title('Проверка распечатки чека с информацией о бургере с одним ингредиентом') + def test_get_receipt(self, bun_mock, ingredient_mock, ingredient_type): + ingredient_mock.type = ingredient_type + burger = Burger() + burger.set_buns(bun_mock) + burger.add_ingredient(ingredient_mock) + receipt = burger.get_receipt() + assert bun_mock.name in receipt \ + and ingredient_mock.name in receipt \ + and ingredient_type.lower() in receipt \ + and f'Price: {bun_mock.price * 2 + ingredient_mock.price}' in receipt + + @allure.title('Проверка распечатки чека с информацией о бургере с несколькими ингредиентами') + def test_get_receipt(self, bun_mock, sauce_mock, filling_mock): + burger = Burger() + burger.set_buns(bun_mock) + burger.add_ingredient(sauce_mock) + burger.add_ingredient(filling_mock) + receipt = burger.get_receipt() + assert bun_mock.name in receipt \ + and sauce_mock.name in receipt \ + and filling_mock.name in receipt \ + and sauce_mock.type.lower() in receipt \ + and filling_mock.type.lower() in receipt \ + and f'Price: {bun_mock.price * 2 + sauce_mock.price + filling_mock.price}' in receipt diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..dbd6ca680 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,39 @@ +import allure + +from praktikum import Database + + +class TestDatabase: + @allure.title('Проверка, что в базе данных есть булочки') + def test_available_buns(self): + database = Database() + buns = database.available_buns() + assert buns[0].name == "black bun" and buns[0].price == 100 \ + and buns[1].name == "white bun" and buns[1].price == 200 \ + and buns[2].name == "red bun" and buns[2].price == 300 + + @allure.title('Проверка, что в базе данных есть соусы') + def test_available_ingredients_sauce(self): + database = Database() + ingredients = database.available_ingredients() + sauces = [] + for ingredient in ingredients: + if ingredient.type == 'SAUCE': + sauces.append(ingredient) + assert sauces[0].name == 'hot sauce' and sauces[0].price == 100 \ + and sauces[1].name == 'sour cream' and sauces[1].price == 200 \ + and sauces[2].name == 'chili sauce' and sauces[2].price == 300 + + @allure.title('Проверка, что в базе данных есть начинки') + def test_available_ingredients_filling(self): + database = Database() + ingredients = database.available_ingredients() + fillings = [] + for ingredient in ingredients: + if ingredient.type == 'FILLING': + fillings.append(ingredient) + assert fillings[0].name == "cutlet" and fillings[0].price == 100 \ + and fillings[1].name == "dinosaur" and fillings[1].price == 200 \ + and fillings[2].name == "sausage" and fillings[2].price == 300 + + diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..5e32e9e9d --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,36 @@ +import pytest +import allure + +from praktikum import Ingredient, INGREDIENT_TYPE_FILLING, INGREDIENT_TYPE_SAUCE +from helpers.helpers import * + + +class TestIngredient: + + @pytest.mark.parametrize('ingredient_type', (INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING)) + @allure.title(f'Проверка получения цены ингредиента') + def test_get_price(self, ingredient_type): + ingredient_type = ingredient_type + name = generate_random_string(10) + price = float(random.randint(1, 1000)) + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.get_price() == price + + @pytest.mark.parametrize('ingredient_type', (INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING)) + @allure.title('Проверка получения названия ингредиента') + def test_get_name(self, ingredient_type): + ingredient_type = ingredient_type + name = generate_random_string(10) + price = float(random.randint(1, 1000)) + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.get_name() == name + + @pytest.mark.parametrize('ingredient_type', (INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING)) + @allure.title('Проверка получения типа ингредиента') + def test_get_type(self, ingredient_type): + ingredient_type = ingredient_type + name = generate_random_string(10) + price = float(random.randint(1, 1000)) + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.get_type() == ingredient_type +