diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a009b147b --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +env/ +__pycache__/ +.pytest_cache/ +.coverage + diff --git a/README.md b/README.md index 272081708..08780cb8f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +# Task_1 ## Задание 1: Юнит-тесты ### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers @@ -21,4 +22,4 @@ **Запуск автотестов и создание HTML-отчета о покрытии** -> `$ pytest --cov=praktikum --cov-report=html` +> `$ pytest --cov=praktikum --cov-report=html` \ No newline at end of file diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..6b0a5862c --- /dev/null +++ b/conftest.py @@ -0,0 +1,38 @@ +import pytest +import random + +from unittest.mock import Mock +from praktikum.burger import Burger +from praktikum.database import Database + + +@pytest.fixture(scope='function') +def create_bun_mock(): + db = Database() + bun = db.buns[random.randint(0,2)] + mock_bun = Mock() + mock_bun.name = bun.name + mock_bun.price = bun.price + return mock_bun + +@pytest.fixture(scope='function') +def create_ingredient_mock(): + db = Database() + ingredient = db.ingredients[random.randint(0,5)] + mock_ingredient = Mock() + mock_ingredient.name = ingredient.name + mock_ingredient.price = ingredient.price + mock_ingredient.type = ingredient.type + return mock_ingredient + +@pytest.fixture(scope='function') +def create_test_burger(): + db = Database() + bun = db.buns[random.randint(0,2)] + ingredient_1 = db.ingredients[random.randint(0,2)] + ingredient_2 = db.ingredients[random.randint(3,5)] + burger = Burger() + burger.set_buns(bun=bun) + burger.add_ingredient(ingredient_1) + burger.add_ingredient(ingredient_2) + return burger, bun, ingredient_1, ingredient_2 \ No newline at end of file diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..e69de29bb 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 99% rename from burger.py rename to praktikum/burger.py index 2b3b6a88b..89f5e3b43 100644 --- a/burger.py +++ b/praktikum/burger.py @@ -18,6 +18,7 @@ def __init__(self): def set_buns(self, bun: Bun): self.bun = bun + pass def add_ingredient(self, ingredient: Ingredient): self.ingredients.append(ingredient) 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..9955deccd --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest +pytest-cov diff --git a/test_data/__init__.py b/test_data/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test_data/test_data.py b/test_data/test_data.py new file mode 100644 index 000000000..5bcba71b7 --- /dev/null +++ b/test_data/test_data.py @@ -0,0 +1,28 @@ +# buns +BLACK_BUN_NAME = "black bun" +BLACK_BUN_PRICE = 100 + +WHITE_BUN_NAME = "white bun" +WHITE_BUN_PRICE = 200 + +RED_BUN_NAME = "red bun" +RED_BUN_PRICE = 300 + +# ingredients +HOT_SAUCE_NAME = "hot sauce" +HOT_SAUCE_PRICE = 50 + +CUTLET_NAME = "cutlet" +CUTLET_PRICE = 200 + +SAUSAGE_NAME = "sausage" +SAUSAGE_PRICE = 300 + +# receipt +EXPECTED_RECEIPT_SINGLE_SAUCE = ( + "(==== black bun ====)\n" + "= sauce hot sauce =\n" + "(==== black bun ====)\n" + "\n" + "Price: 250" +) diff --git a/tests/__init__py b/tests/__init__py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..1b4ca8b9d --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,22 @@ +from praktikum.bun import Bun +from test_data.test_data import BLACK_BUN_NAME, BLACK_BUN_PRICE + + +class TestBun: + def test_bun_init_name(self): + bun = Bun(BLACK_BUN_NAME, BLACK_BUN_PRICE) + assert bun.name + + def test_bun_init_price(self): + bun = Bun(BLACK_BUN_NAME, BLACK_BUN_PRICE) + assert bun.price + + def test_bun_get_name_correct(self): + bun = Bun(BLACK_BUN_NAME, BLACK_BUN_PRICE) + bun_name = BLACK_BUN_NAME + assert bun.get_name() == bun_name + + def test_bun_get_price_correct(self): + bun = Bun(BLACK_BUN_NAME, BLACK_BUN_PRICE) + bun_price = BLACK_BUN_PRICE + assert bun.get_price() == bun_price diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..40579039e --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,49 @@ +from praktikum.burger import Burger + + +class TestBurger: + def test_burger_init_bun_is_none(self): + burger = Burger() + assert burger.bun is None + + def test_burger_init_ingredients_is_empty_list(self): + burger = Burger() + assert burger.ingredients == [] + + def test_burger_set_buns_bun_is_set(self, create_bun_mock): + burger = Burger() + bun = create_bun_mock + burger.set_buns(bun) + assert burger.bun == bun + + def test_burger_add_ingredient_ingredient_is_added(self, create_bun_mock, create_ingredient_mock): + burger = Burger() + bun = create_bun_mock + ingredient = create_ingredient_mock + burger.set_buns(bun) + burger.add_ingredient(ingredient) + assert burger.ingredients == [ingredient] + + def test_burger_remove_ingredient_ingredient_is_removed(self, create_test_burger): + burger = create_test_burger[0] + burger.remove_ingredient(0) + assert len(burger.ingredients) == 1 + + def test_burger_move_ingredient_ingredient_is_moved(self, create_test_burger): + burger, bun, ingredient_1, ingredient_2 = create_test_burger + burger.move_ingredient(0, 1) + assert burger.ingredients == [ingredient_2, ingredient_1] + + def test_burger_get_price_price_is_correct(self, create_test_burger): + burger = create_test_burger[0] + price = (burger.bun.price * 2) + burger.ingredients[0].price + burger.ingredients[1].price + assert burger.get_price() == price + + def test_burger_receipt_is_correct(self, create_test_burger): + burger = create_test_burger[0] + expected_receipt = (f'(==== {burger.bun.name} ====)\n' + f'= sauce {burger.ingredients[0].name} =\n' + f'= filling {burger.ingredients[1].name} =\n' + f'(==== {burger.bun.name} ====)\n\n' + f'Price: {burger.get_price()}') + assert expected_receipt == burger.get_receipt() diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..eb5150d99 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,36 @@ +import pytest +import praktikum.ingredient_types as ingredient_types + +from praktikum.database import Database + + +class TestDatabase: + def test_database_init_buns_is_set(self): + db = Database() + assert len(db.buns) == 3 + + def test_database_init_ingredients_is_set(self): + db = Database() + assert len(db.ingredients) == 6 + + @pytest.mark.parametrize('ingredient_index', [0, 1, 2]) + def test_database_init_sauces_in_ingredients(self, ingredient_index): + db = Database() + expected_ingredient_type = ingredient_types.INGREDIENT_TYPE_SAUCE + actual_ingredient_type = db.ingredients[ingredient_index].type + assert actual_ingredient_type == expected_ingredient_type + + @pytest.mark.parametrize('ingredient_index', [3, 4, 5]) + def test_database_init_fillings_in_ingredients(self, ingredient_index): + db = Database() + expected_ingredient_type = ingredient_types.INGREDIENT_TYPE_FILLING + actual_ingredient_type = db.ingredients[ingredient_index].type + assert actual_ingredient_type == expected_ingredient_type + + def test_database_available_buns_list_is_correct(self): + db = Database() + assert db.available_buns() == db.buns + + def test_database_available_ingredients_list_is_correct(self): + db = Database() + assert db.available_ingredients() == db.ingredients diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..eb12179b2 --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,36 @@ +import pytest +from praktikum.database import Database + + +class TestIngredient: + @pytest.mark.parametrize('ingredient_type_by_index', [0, 3]) + def test_ingredient_init_is_type(self, ingredient_type_by_index): + db = Database() + ingredient = db.ingredients[ingredient_type_by_index] + assert ingredient.type + + def test_ingredient_init_is_name(self): + db = Database() + ingredient = db.ingredients[0] + assert ingredient.name + + def test_ingredient_init_is_price(self): + db = Database() + ingredient = db.ingredients[0] + assert ingredient.price + + @pytest.mark.parametrize('ingredient_type_by_index', [0, 3]) + def test_ingredient_get_type_correct(self, ingredient_type_by_index): + db = Database() + ingredient = db.ingredients[ingredient_type_by_index] + assert ingredient.get_type() == ingredient.type + + def test_ingredient_get_name_correct(self): + db = Database() + ingredient = db.ingredients[0] + assert ingredient.get_name() == ingredient.name + + def test_ingredient_get_price_correct(self): + db = Database() + ingredient = db.ingredients[0] + assert ingredient.get_price() == ingredient.price