diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..26114a413 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Virtual environment +venv/ +.env +.env.* + +# Python cache +__pycache__/ +*.py[cod] +*$py.class + +# Pytest cache +.pytest_cache/ +.coverage +htmlcov/ +pytest_cov/ + +# IDE +.idea/ +.vscode/ +*.iml + +# Logs +*.log + +# System files +.DS_Store +Thumbs.db diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..aeeb79452 --- /dev/null +++ b/conftest.py @@ -0,0 +1,19 @@ +import pytest +from unittest.mock import Mock + + +@pytest.fixture +def bun_mock(): + bun = Mock() + bun.get_name.return_value = 'black bun' + bun.get_price.return_value = 100 + return bun + + +@pytest.fixture +def ingredient_mock(): + ingredient = Mock() + ingredient.get_type.return_value = 'SAUCE' + ingredient.get_name.return_value = 'hot sauce' + ingredient.get_price.return_value = 50 + return ingredient diff --git a/coverage.xml b/coverage.xml new file mode 100644 index 000000000..ab4a36937 --- /dev/null +++ b/coverage.xml @@ -0,0 +1,108 @@ + + + + + + C:\Users\masha\Documents\Education Practice\dev\Project\Task_1\praktikum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/praktikum.py b/main.py similarity index 100% rename from praktikum.py rename to main.py 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/pytest.ini b/pytest.ini new file mode 100644 index 000000000..c7b23ecb1 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +pythonpath = . +testpaths = tests diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..14ba20905 Binary files /dev/null and b/requirements.txt differ diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..c1c8fab7e --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,24 @@ +import pytest +from praktikum.bun import Bun + + +class TestBun: + @pytest.mark.parametrize('name,price', [ + ('black bun', 100), + ('white bun', 200), + ('red bun', 300), + ]) + def test_bun_get_name(self, name, price): + bun = Bun(name, price) + + assert bun.get_name() == name + + @pytest.mark.parametrize('name,price', [ + ('black bun', 100), + ('white bun', 200), + ('red bun', 300), + ]) + def test_bun_get_price(self, name, price): + 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..0a58500de --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,98 @@ +from unittest.mock import Mock +import pytest +from praktikum.burger import Burger + + +class TestBurger: + def test_set_buns(self, bun_mock): + burger = Burger() + burger.set_buns(bun_mock) + + assert burger.bun == bun_mock + + def test_add_ingredient(self, ingredient_mock): + burger = Burger() + burger.add_ingredient(ingredient_mock) + + assert burger.ingredients == [ingredient_mock] + + def test_remove_ingredient(self): + burger = Burger() + + i1 = Mock() + i2 = Mock() + + burger.add_ingredient(i1) + burger.add_ingredient(i2) + + burger.remove_ingredient(0) + + assert burger.ingredients == [i2] + + def test_move_ingredient(self): + burger = Burger() + + i1 = Mock() + i2 = Mock() + i3 = Mock() + + burger.ingredients = [i1, i2, i3] + + burger.move_ingredient(0, 2) + + assert burger.ingredients == [i2, i3, i1] + + @pytest.mark.parametrize('bun_price, ing_prices, expected', [ + (100, [], 200), + (100, [50], 250), + (200, [10, 20], 430), + ]) + def test_get_price(self, bun_price, ing_prices, expected): + burger = Burger() + + bun = Mock() + bun.get_price.return_value = bun_price + burger.set_buns(bun) + + for price in ing_prices: + ingredient = Mock() + ingredient.get_price.return_value = price + + burger.add_ingredient(ingredient) + + assert burger.get_price() == expected + + def test_get_receipt_without_ingredients(self, bun_mock): + burger = Burger() + burger.set_buns(bun_mock) + + expected = '(==== black bun ====)\n(==== black bun ====)\n\nPrice: 200' + + assert burger.get_receipt() == expected + + def test_get_receipt_with_ingredients(self, bun_mock): + burger = Burger() + burger.set_buns(bun_mock) + + sauce = Mock() + sauce.get_type.return_value = 'SAUCE' + sauce.get_name.return_value = 'hot sauce' + sauce.get_price.return_value = 50 + + filling = Mock() + filling.get_type.return_value = 'FILLING' + filling.get_name.return_value = 'cutlet' + filling.get_price.return_value = 100 + + burger.add_ingredient(sauce) + burger.add_ingredient(filling) + + expected = ( + '(==== black bun ====)\n' + '= sauce hot sauce =\n' + '= filling cutlet =\n' + '(==== black bun ====)\n\n' + 'Price: 350' + ) + + assert burger.get_receipt() == expected diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..d19508ddd --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,39 @@ +from praktikum.database import Database +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + + +class TestDatabase: + def test_available_buns(self): + db = Database() + buns = db.available_buns() + + assert len(buns) == 3 + + names = [] + for bun in buns: + names.append(bun.get_name()) + + assert names == ['black bun', 'white bun', 'red bun'] + + def test_available_ingredients(self): + db = Database() + ingredients = db.available_ingredients() + + assert len(ingredients) == 6 + + def test_ingredient_types_count(self): + db = Database() + ingredients = db.available_ingredients() + + sauce_count = 0 + filling_count = 0 + + for ing in ingredients: + if ing.get_type() == INGREDIENT_TYPE_SAUCE: + sauce_count += 1 + + if ing.get_type() == INGREDIENT_TYPE_FILLING: + filling_count += 1 + + assert sauce_count == 3 + assert filling_count == 3 diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..a6ba2c895 --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,32 @@ +import pytest +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + + +class TestIngredient: + @pytest.mark.parametrize('ingredient_type, name, price', [ + (INGREDIENT_TYPE_SAUCE, 'hot sauce', 100), + (INGREDIENT_TYPE_FILLING, 'cutlet', 200), + ]) + def test_ingredient_get_type(self, ingredient_type, name, price): + ing = Ingredient(ingredient_type, name, price) + + assert ing.get_type() == ingredient_type + + @pytest.mark.parametrize('ingredient_type, name, price', [ + (INGREDIENT_TYPE_SAUCE, 'hot sauce', 100), + (INGREDIENT_TYPE_FILLING, 'cutlet', 200), + ]) + def test_ingredient_get_name(self, ingredient_type, name, price): + ing = Ingredient(ingredient_type, name, price) + + assert ing.get_name() == name + + @pytest.mark.parametrize('ingredient_type, name, price', [ + (INGREDIENT_TYPE_SAUCE, 'hot sauce', 100), + (INGREDIENT_TYPE_FILLING, 'cutlet', 200), + ]) + def test_ingredient_get_price(self, ingredient_type, name, price): + ing = Ingredient(ingredient_type, name, price) + + assert ing.get_price() == price