diff --git a/.coverage b/.coverage new file mode 100644 index 000000000..f4a323e36 Binary files /dev/null and b/.coverage differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..489f9e2ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +__pycache__/ +.pytest_cache/ +.venv/ \ No newline at end of file diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..213744e2c --- /dev/null +++ b/conftest.py @@ -0,0 +1,47 @@ +import pytest +from praktikum.bun import Bun +from praktikum.database import Database +from praktikum.ingredient import Ingredient +from praktikum.burger import Burger +from unittest.mock import Mock, patch +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING +from data import SPICY_SAUCE, TEST_FILLING, TEST_SAUCE, STONE_BUN, BLACK_BUN + +# Фикстуры для моков + +@pytest.fixture +def bun_mock(): + mock_bun = Mock(spec=Bun) + mock_bun.get_name.return_value = STONE_BUN['name'] + mock_bun.get_price.return_value = STONE_BUN['price'] + return mock_bun + +@pytest.fixture +def ingredient_mock(): + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.get_name.return_value = TEST_SAUCE['name'] + mock_ingredient.get_price.return_value = TEST_SAUCE['price'] + mock_ingredient.get_type.return_value = INGREDIENT_TYPE_SAUCE + return mock_ingredient + +@pytest.fixture +def ingredient_mock_filling(): + mock_ingredient = Mock(spec=Ingredient) + mock_ingredient.get_name.return_value = TEST_FILLING['name'] + mock_ingredient.get_price.return_value = TEST_FILLING['price'] + mock_ingredient.get_type.return_value = INGREDIENT_TYPE_FILLING + return mock_ingredient + +@pytest.fixture +def database(): + return Database() + +@pytest.fixture +def ingredient(): + return Ingredient(INGREDIENT_TYPE_SAUCE, SPICY_SAUCE['name'], SPICY_SAUCE['price']) + +@pytest.fixture +def burger(): + return Burger() + + diff --git a/coverage.json b/coverage.json new file mode 100644 index 000000000..63d8a164f --- /dev/null +++ b/coverage.json @@ -0,0 +1 @@ +{"meta": {"format": 3, "version": "7.12.0", "timestamp": "2026-03-18T22:17:59.129571", "branch_coverage": false, "show_contexts": false}, "files": {"conftest.py": {"executed_lines": [1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40, 43, 44, 45], "summary": {"covered_lines": 36, "num_statements": 37, "percent_covered": 97.29729729729729, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.29729729729729, "percent_statements_covered_display": "97"}, "missing_lines": [41], "excluded_lines": [], "functions": {"bun_mock": {"executed_lines": [14, 15, 16, 17], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "ingredient_mock": {"executed_lines": [21, 22, 23, 24, 25], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "ingredient_mock_filling": {"executed_lines": [29, 30, 31, 32, 33], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "database": {"executed_lines": [37], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "ingredient": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [41], "excluded_lines": []}, "burger": {"executed_lines": [45], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 19, 20, 27, 28, 35, 36, 39, 40, 43, 44], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40, 43, 44, 45], "summary": {"covered_lines": 36, "num_statements": 37, "percent_covered": 97.29729729729729, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.29729729729729, "percent_statements_covered_display": "97"}, "missing_lines": [41], "excluded_lines": []}}}, "data.py": {"executed_lines": [1, 5, 10, 15, 20, 26, 32, 36, 40, 46, 52], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 5, 10, 15, 20, 26, 32, 36, 40, 46, 52], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 5, 10, 15, 20, 26, 32, 36, 40, 46, 52], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}}, "praktikum.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 20, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 20, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [1, 3, 4, 5, 6, 9, 11, 14, 17, 20, 23, 25, 26, 27, 28, 31, 34, 37, 40, 41], "excluded_lines": [], "functions": {"main": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 12, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 12, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [11, 14, 17, 20, 23, 25, 26, 27, 28, 31, 34, 37], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [1, 3, 4, 5, 6, 9, 40, 41], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 20, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 20, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [1, 3, 4, 5, 6, 9, 11, 14, 17, 20, 23, 25, 26, 27, 28, 31, 34, 37, 40, 41], "excluded_lines": []}}}, "praktikum/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}}, "praktikum/bun.py": {"executed_lines": [1, 2, 7, 8, 9, 11, 12, 14, 15], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"Bun.__init__": {"executed_lines": [8, 9], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Bun.get_name": {"executed_lines": [12], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Bun.get_price": {"executed_lines": [15], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 7, 11, 14], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"Bun": {"executed_lines": [8, 9, 12, 15], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 7, 11, 14], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}}, "praktikum/burger.py": {"executed_lines": [1, 2, 3, 6, 7, 14, 15, 16, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34, 36, 38, 39, 41, 42, 44, 45, 47], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"Burger.__init__": {"executed_lines": [15, 16], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Burger.set_buns": {"executed_lines": [19], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Burger.add_ingredient": {"executed_lines": [22], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Burger.remove_ingredient": {"executed_lines": [25], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Burger.move_ingredient": {"executed_lines": [28], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Burger.get_price": {"executed_lines": [31, 33, 34, 36], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Burger.get_receipt": {"executed_lines": [39, 41, 42, 44, 45, 47], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 6, 7, 14, 18, 21, 24, 27, 30, 38], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"Burger": {"executed_lines": [15, 16, 19, 22, 25, 28, 31, 33, 34, 36, 39, 41, 42, 44, 45, 47], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 6, 7, 14, 18, 21, 24, 27, 30, 38], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}}, "praktikum/database.py": {"executed_lines": [1, 3, 4, 5, 8, 9, 13, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 32, 33], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"Database.__init__": {"executed_lines": [14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Database.available_buns": {"executed_lines": [30], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Database.available_ingredients": {"executed_lines": [33], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 8, 9, 13, 29, 32], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"Database": {"executed_lines": [14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27, 30, 33], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 8, 9, 13, 29, 32], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}}, "praktikum/ingredient.py": {"executed_lines": [1, 2, 8, 9, 10, 11, 13, 14, 16, 17, 19, 20], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"Ingredient.__init__": {"executed_lines": [9, 10, 11], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Ingredient.get_price": {"executed_lines": [14], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Ingredient.get_name": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "Ingredient.get_type": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 8, 13, 16, 19], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"Ingredient": {"executed_lines": [9, 10, 11, 14, 17, 20], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 8, 13, 16, 19], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}}, "praktikum/ingredient_types.py": {"executed_lines": [1, 6, 7], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 6, 7], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 6, 7], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}}, "tests.py": {"executed_lines": [1, 2, 3, 4, 5, 6, 7, 8, 21, 24, 29, 30, 31, 34, 39, 40, 41, 45, 48, 49, 50, 53, 54, 55, 58, 63, 64, 65, 66, 69, 70, 71, 72, 76, 79, 80, 81, 84, 86, 87, 88, 91, 93, 94, 95, 98, 100, 101, 103, 104, 106, 107, 108, 111, 113, 114, 115, 117, 120, 121, 123, 125, 126, 127, 129, 130, 131, 135, 138, 142, 144, 145, 148, 152, 154, 155, 158, 162, 164, 165], "summary": {"covered_lines": 80, "num_statements": 80, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"TestBun.test_bun_get_name": {"executed_lines": [30, 31], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestBun.test_bun_get_price": {"executed_lines": [40, 41], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestDatabase.test_available_buns_returns_list_of_buns": {"executed_lines": [49, 50], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestDatabase.test_available_buns_returns_list_of_ingredients": {"executed_lines": [54, 55], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestDatabase.test_available_buns_returns_correct_bun_by_index": {"executed_lines": [64, 65, 66], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestDatabase.test_available_ingredients": {"executed_lines": [70, 71, 72], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestBurger.test_set_buns": {"executed_lines": [80, 81], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestBurger.test_add_ingredient": {"executed_lines": [86, 87, 88], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestBurger.test_remove_ingredient": {"executed_lines": [93, 94, 95], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestBurger.test_move_ingredient": {"executed_lines": [100, 101, 103, 104, 106, 107, 108], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestBurger.test_get_burger_price": {"executed_lines": [113, 114, 115, 117], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestBurger.test_get_receipt": {"executed_lines": [123, 125, 126, 127, 129, 130, 131], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestIngredient.test_ingredient_get_type": {"executed_lines": [144, 145], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestIngredient.test_ingredient_get_price": {"executed_lines": [154, 155], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestIngredient.test_ingredient_get_name": {"executed_lines": [164, 165], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 4, 5, 6, 7, 8, 21, 24, 29, 34, 39, 45, 48, 53, 58, 63, 69, 76, 79, 84, 91, 98, 111, 120, 121, 135, 138, 142, 148, 152, 158, 162], "summary": {"covered_lines": 34, "num_statements": 34, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}, "classes": {"TestBun": {"executed_lines": [30, 31, 40, 41], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestDatabase": {"executed_lines": [49, 50, 54, 55, 64, 65, 66, 70, 71, 72], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestBurger": {"executed_lines": [80, 81, 86, 87, 88, 93, 94, 95, 100, 101, 103, 104, 106, 107, 108, 113, 114, 115, 117, 123, 125, 126, 127, 129, 130, 131], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "TestIngredient": {"executed_lines": [144, 145, 154, 155, 164, 165], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 4, 5, 6, 7, 8, 21, 24, 29, 34, 39, 45, 48, 53, 58, 63, 69, 76, 79, 84, 91, 98, 111, 120, 121, 135, 138, 142, 148, 152, 158, 162], "summary": {"covered_lines": 34, "num_statements": 34, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 196, "num_statements": 217, "percent_covered": 90.3225806451613, "percent_covered_display": "90", "missing_lines": 21, "excluded_lines": 0, "percent_statements_covered": 90.3225806451613, "percent_statements_covered_display": "90"}} \ No newline at end of file diff --git a/data.py b/data.py new file mode 100644 index 000000000..b14b51f0a --- /dev/null +++ b/data.py @@ -0,0 +1,56 @@ +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + + + +STONE_BUN = { + "name": "Каменная булка", + "price": 1000 + } + +TEST_SAUCE = { + "name": "Тестовый соус", + "price": 50 + } + +TEST_FILLING = { + "name": "Тестовая начинка", + "price": 750 + } + +SPICY_SAUCE = { + "name": "Острый соус", + "price": 99 + } + + +BLACK_BUN = { + "name": "Черная булка", + "price": 99 + } + +# данные булок для параметризации +TEST_BUN_1 = { + "name": "Булка с кунжутом", + "price": 850 +} +TEST_BUN_2 = { + "name": "Бриошь", + "price": 930 +} +TEST_BUN_3 = { + "name": "Цельнозерновая", + "price": 750 +} + +# данные ингредиетов для параметризации +TEST_INGREDIENT_1 = { + "type": INGREDIENT_TYPE_SAUCE, + "name": "Кетчунез", + "price": 70 +} + +TEST_INGREDIENT_2 = { + "type": INGREDIENT_TYPE_FILLING, + "name": "Карамелизованный лук", + "price": 50 +} \ No newline at end of file diff --git a/__init__.py b/praktikum/__init__.py similarity index 100% rename from __init__.py rename to praktikum/__init__.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 99% rename from burger.py rename to praktikum/burger.py index 2b3b6a88b..b0de7a301 100644 --- a/burger.py +++ b/praktikum/burger.py @@ -1,5 +1,4 @@ from typing import List - from praktikum.bun import Bun from praktikum.ingredient import 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/requirements.txt b/requirements.txt new file mode 100644 index 000000000..083c3ff5f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +coverage==7.13.4 +pytest==9.0.2 +pytest-cov==7.0.0 \ No newline at end of file diff --git a/tests.py b/tests.py new file mode 100644 index 000000000..f7530bc3d --- /dev/null +++ b/tests.py @@ -0,0 +1,167 @@ +import pytest +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from unittest.mock import Mock, patch +from data import ( + TEST_FILLING, + TEST_SAUCE, + STONE_BUN, + TEST_BUN_1, + TEST_BUN_2, + TEST_BUN_3, + TEST_INGREDIENT_1, + TEST_INGREDIENT_2 +) + +class TestBun: + + # Получение названия булки + @pytest.mark.parametrize("name, price", [ + (TEST_BUN_1['name'], TEST_BUN_1['price']), + (TEST_BUN_2['name'], TEST_BUN_2['price']), + (TEST_BUN_3['name'], TEST_BUN_3['price']) + ]) + def test_bun_get_name(self, name, price): + bun = Bun(name, price) + assert bun.get_name() == name + + # Получение цены булки + @pytest.mark.parametrize("name, price", [ + (TEST_BUN_1['name'], TEST_BUN_1['price']), + (TEST_BUN_2['name'], TEST_BUN_2['price']), + (TEST_BUN_3['name'], TEST_BUN_3['price']) + ]) + def test_bun_get_price(self, name, price): + bun = Bun(name, price) + assert bun.get_price() == price + + + +class TestDatabase: + + # Проверка получения списка булок + def test_available_buns_returns_list_of_buns(self, database): + buns = database.available_buns() + assert isinstance(buns, list) + + # Проверка получения списка ингредиентов + def test_available_buns_returns_list_of_ingredients(self, database): + ingredients = database.available_ingredients() + assert isinstance(ingredients, list) + + # Проверка того, что метод возвращает ожидаемые булки + def test_available_buns_returns_expected_buns(self, database): + buns = database.available_buns() + bun_names = [bun.get_name() for bun in buns] + assert "black bun" in bun_names + assert "white bun" in bun_names + assert "red bun" in bun_names + + # Проверка того, что метод возвращает ожидаемые ингредиенты + def test_available_ingredients_returns_expected_ingredients(self, database): + ingredients = database.available_ingredients() + ingredient_names = [ingredient.get_name() for ingredient in ingredients] + expected_names = [ + "hot sauce", "sour cream", "chili sauce", "cutlet", "dinosaur", "sausage" + ] + for expected_name in expected_names: + assert expected_name in ingredient_names + + + +class TestBurger: + + # Выбор булок + def test_set_buns(self, burger, bun_mock): + burger.set_buns(bun_mock) + assert burger.bun == bun_mock + + # Добавление ингредиента + def test_add_ingredient(self, burger, ingredient_mock): + + burger.add_ingredient(ingredient_mock) + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] == ingredient_mock + + # Удаление ингредиента + def test_remove_ingredient(self, burger, ingredient_mock): + + burger.add_ingredient(ingredient_mock) + burger.remove_ingredient(0) + assert len(burger.ingredients) == 0 + + # Перемещение ингредиента + def test_move_ingredient(self, burger): + + ingredient1 = Mock(spec=Ingredient) + ingredient2 = Mock(spec=Ingredient) + + burger.add_ingredient(ingredient1) + burger.add_ingredient(ingredient2) + + burger.move_ingredient(0, 1) + assert burger.ingredients[0] == ingredient2 + assert burger.ingredients[1] == ingredient1 + + # Получение цены бургера + def test_get_burger_price(self, burger, bun_mock, ingredient_mock, ingredient_mock_filling): + + burger.set_buns(bun_mock) + burger.add_ingredient(ingredient_mock) + burger.add_ingredient(ingredient_mock_filling) + # рассчитываем цену через переменные + expected_price = (STONE_BUN['price'] * 2) + TEST_SAUCE['price'] + TEST_FILLING['price'] + assert burger.get_price() == expected_price + + # Получение чека + @patch('praktikum.burger.Burger.get_price') + def test_get_receipt(self, mock_get_price, burger, bun_mock, ingredient_mock): + # рассчитываем цену через переменные + expected_price = (STONE_BUN['price'] * 2) + TEST_SAUCE['price'] + mock_get_price.return_value = expected_price + # Сборка бургера + burger.set_buns(bun_mock) + burger.add_ingredient(ingredient_mock) + receipt = burger.get_receipt() + # Проверка содержимого чека + assert f'(==== {STONE_BUN['name']} ====)' in receipt + assert f'= sauce {TEST_SAUCE['name']} =' in receipt + assert f'Price: {expected_price}' in receipt + + + +class TestIngredient: + + # Получение типа ингредиента + @pytest.mark.parametrize("ingredient_type, name, price", [ + (TEST_INGREDIENT_1['type'], TEST_INGREDIENT_1['name'], TEST_INGREDIENT_1['price']), + (TEST_INGREDIENT_2['type'], TEST_INGREDIENT_2['name'], TEST_INGREDIENT_2['price']), + ]) + def test_ingredient_get_type(self, ingredient_type, name, price): + + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.get_type() == ingredient_type + + # Получение цены ингредиента + @pytest.mark.parametrize("ingredient_type, name, price", [ + (TEST_INGREDIENT_1['type'], TEST_INGREDIENT_1['name'], TEST_INGREDIENT_1['price']), + (TEST_INGREDIENT_2['type'], TEST_INGREDIENT_2['name'], TEST_INGREDIENT_2['price']), + ]) + def test_ingredient_get_price(self, ingredient_type, name, price): + + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.get_price() == price + + # Получение названия ингредиента + @pytest.mark.parametrize("ingredient_type, name, price", [ + (TEST_INGREDIENT_1['type'], TEST_INGREDIENT_1['name'], TEST_INGREDIENT_1['price']), + (TEST_INGREDIENT_2['type'], TEST_INGREDIENT_2['name'], TEST_INGREDIENT_2['price']), + ]) + def test_ingredient_get_name(self, ingredient_type, name, price): + + ingredient = Ingredient(ingredient_type, name, price) + assert ingredient.get_name() == name + + + +