diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..85bd9dfec --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..a742b72f0 --- /dev/null +++ b/conftest.py @@ -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 \ No newline at end of file diff --git a/data.py b/data.py new file mode 100644 index 000000000..0d33d845f --- /dev/null +++ b/data.py @@ -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 +} \ No newline at end of file diff --git a/README.md b/praktikum/README.md similarity index 100% rename from README.md rename to praktikum/README.md diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..d4308e6db --- /dev/null +++ b/praktikum/__init__.py @@ -0,0 +1 @@ +# tests package \ 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..679568e49 Binary files /dev/null and b/requirements.txt differ diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..d4308e6db --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +# tests package \ No newline at end of file diff --git a/tests/bun_test.py b/tests/bun_test.py new file mode 100644 index 000000000..538bf1e61 --- /dev/null +++ b/tests/bun_test.py @@ -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'] \ No newline at end of file diff --git a/tests/burger_test.py b/tests/burger_test.py new file mode 100644 index 000000000..85deb3fbb --- /dev/null +++ b/tests/burger_test.py @@ -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 \ No newline at end of file diff --git a/tests/database_test.py b/tests/database_test.py new file mode 100644 index 000000000..32e716542 --- /dev/null +++ b/tests/database_test.py @@ -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] \ No newline at end of file diff --git a/tests/ingredient_test.py b/tests/ingredient_test.py new file mode 100644 index 000000000..b6905138c --- /dev/null +++ b/tests/ingredient_test.py @@ -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']