Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .github/workflows/maa-lab3.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: SAE Lab3 Tests

on:
pull_request:
paths:
- 'students_folder/melnikova/**'
- 'tests/Melnikova/**'
- 'tests/src/Melnikova/**'
workflow_dispatch:

jobs:
maa-lab3-tests:
name: Run MAA Lab3 Tests
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.13"

- name: Cache pip packages
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('/pyproject.toml', '**/tox.ini') }}
restore-keys: |
${{ runner.os }}-pip-

- name: Install tox
run: |
python -m pip install --upgrade pip
pip install tox

- name: Run MAA Lab3 Tests
run: tox -e maa_lab3

- name: Show tox environments
if: failure()
run: tox list

- name: Show test files found
if: failure()
run: |
echo "=== Test files with maa_lab3 marker ==="
find tests/ -name "*.py" -exec grep -l "maa_lab3" {} \; || true
echo "=== All test files ==="
find tests/ -name "test_*.py" || true
Empty file.
32 changes: 32 additions & 0 deletions tests/Melnikova/lab_3/test_OrderLineSpec.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import pytest
import logging
from pydantic import ValidationError
from students_folder.melnikova.lab2 import OrdersSpec

logger = logging.getLogger(__name__)


@pytest.mark.maa_lab3
def test_class_orders_spec(yaml_test_data):
"""Тест OrdersSpec с данными из YAML"""
test_cases = yaml_test_data("Melnikova/lab3/OrdersSpec.yaml")

for test_desc, value, expected_answer in test_cases:
logger = logging.getLogger("test_OrdersSpec")
logger.info(f"Testing: {test_desc}")

try:
# Пытаемся создать объект OrdersSpec
orders = OrdersSpec.model_validate(value)
actual_answer = True
logger.info(f" Validation succeeded for: {test_desc}")
except ValidationError as e:
actual_answer = False
logger.info(f" Validation failed for: {test_desc} - {e}")

# Проверяем, что результат соответствует ожидаемому
assert actual_answer == expected_answer, (
f"Test '{test_desc}' failed: expected {expected_answer}, got {actual_answer}\n"
f"Value: {value}"
)
logger.info(f" Test '{test_desc}' passed")
29 changes: 29 additions & 0 deletions tests/Melnikova/lab_3/test_ProfileSpec.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import logging

import pytest
from pydantic import ValidationError

from students_folder.melnikova.lab2 import ProfileSpec

@pytest.mark.maa_lab3
def test_class_orders_spec(yaml_test_data):
test_cases = yaml_test_data("Melnikova/lab3/ProfileSpec.yaml")
for test_desc, value, answer in test_cases:
logger = logging.getLogger("test_ProfileSpec")
logger.info(f"Testing: {test_desc}")
try:
test_class = ProfileSpec.model_validate(value)
# Ожидаем answer = True
test_answer = True
assert (
answer == test_answer
), f"Expected validation to fail for {test_desc}, but it passed"
logger.info(f"{test_desc} PASSED - validation succeeded as expected")
except ValidationError as e:
# Ожидаем answer = False
test_answer = False
assert (
answer == test_answer
), f"Expected validation to pass for {test_desc}, but got error: {e}"
logger.info(f"{test_desc} PASSED - validation failed as expected: {e}")
logger.error(f"Validation error for {test_desc}: {e}")
29 changes: 29 additions & 0 deletions tests/Melnikova/lab_3/test_ServiceSpec.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import logging

import pytest
from pydantic import ValidationError

from students_folder.melnikova.lab2 import ServiceSpec


@pytest.mark.maa_lab3
def test_class_service_spec(yaml_test_data):
test_cases = yaml_test_data("Melnikova/lab3/ServiceSpec.yaml")
for test_desc, value, answer in test_cases:
logger = logging.getLogger("test_ServiceSpec")
logger.info(f"Testing: {test_desc}")
try:
test_class = ServiceSpec.model_validate(value)
# Ожидаем answer = True
test_answer = True
assert (
answer == test_answer
), f"Expected validation to fail for {test_desc}, but it passed"
logger.info(f"{test_desc} PASSED - validation succeeded as expected")
except ValidationError as e:
# Ожидаем answer = False
test_answer = False
assert (
answer == test_answer
), f"Expected validation to pass for {test_desc}, but got error: {e}"
logger.info(f"{test_desc} PASSED - validation failed as expected: {e}")
28 changes: 28 additions & 0 deletions tests/Melnikova/lab_3/test_UserSpec.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import logging

import pytest
from pydantic import ValidationError

from students_folder.melnikova.lab2 import UserSpec

@pytest.mark.maa_lab3
def test_class_user_spec(yaml_test_data):
test_cases = yaml_test_data("Melnikova/lab3/UserSpec.yaml")
for test_desc, value, answer in test_cases:
logger = logging.getLogger("test_UserSpec")
logger.info(f"Testing: {test_desc}")
try:
test_class = UserSpec.model_validate(value)
# Ожидаем answer = True
test_answer = True
assert (
answer == test_answer
), f"Expected validation to fail for {test_desc}, but it passed"
logger.info(f"{test_desc} PASSED - validation succeeded as expected")
except ValidationError as e:
# Ожидаем answer = False
test_answer = False
assert (
answer == test_answer
), f"Expected validation to pass for {test_desc}, but got error: {e}"
logger.info(f"{test_desc} PASSED - validation failed as expected: {e}")
29 changes: 29 additions & 0 deletions tests/Melnikova/lab_3/test_item_spec.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

import logging

import pytest
from pydantic import ValidationError

from students_folder.melnikova.lab2 import ItemSpec

@pytest.mark.maa_lab3
def test_class_profile_spec(yaml_test_data):
test_cases = yaml_test_data("Melnikova/lab3/ItemSpec.yaml")
for test_desc, value, answer in test_cases:
logger = logging.getLogger("test_item_spec")
logger.info(f"Testing: {test_desc}")
try:
test_class = ItemSpec.model_validate(value)
# Ожидаем answer = True
test_answer = True
assert (
answer == test_answer
), f"Expected validation to fail for {test_desc}, but it passed"
logger.info(f"{test_desc} PASSED - validation succeeded as expected")
except ValidationError as e:
# Ожидаем answer = False
test_answer = False
assert (
answer == test_answer
), f"Expected validation to pass for {test_desc}, but got error: {e}"
logger.info(f"{test_desc} PASSED - validation failed as expected: {e}")
1 change: 1 addition & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ def pytest_configure(config):
config.addinivalue_line("markers", "zhukova_lab3: mark test as part of zhukova's test")
config.addinivalue_line("markers", "nze_lab3: mark test as part of nze's test")
config.addinivalue_line("markers", "sae_lab3: mark test as part of sae's test")
config.addinivalue_line("markers", "maa_lab3: mark test as part of maa's test")


@pytest.fixture()
Expand Down
64 changes: 64 additions & 0 deletions tests/src/Melnikova/lab3/ItemSpec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
testName: Melnikova/ItemSpec
answerList:
- test_desc: 'Get correct Item'
value:
item_id: 456
name: "Виджет"
desc: "Полезный виджет"
price: 19.99
answer: true
- test_desc: 'Get incorrect Item model, missing attributes'
value:
item_id: 456
name: "Виджет"
desc: "Полезный виджет"
answer: false
- test_desc: 'Get incorrect Item model, wrong type for price'
value:
item_id: 456
name: "Виджет"
desc: "Полезный виджет"
price: "hi"
answer: false
- test_desc: 'Get incorrect Item model, missing item_id'
value:
name: "Виджет"
desc: "Полезный виджет"
price: 19.99
answer: false
- test_desc: 'Get incorrect Item model, English name'
value:
item_id: 456
name: "Widget"
desc: "Полезный виджет"
price: 19.99
answer: false
- test_desc: 'Get correct Item with additional attributes'
value:
item_id: 456
name: "Виджет"
desc: "Полезный виджет"
price: 19.99
category: "Гаджеты"
answer: false
- test_desc: 'Get incorrect Item model, English desc'
value:
item_id: 456
name: "Виджет"
desc: "Useful widget"
price: 19.99
answer: false
- test_desc: 'Get incorrect Item model, negative price'
value:
item_id: 456
name: "Виджет"
desc: "Полезный виджет"
price: -10.0
answer: false
- test_desc: 'Get incorrect Item model, zero price'
value:
item_id: 456
name: "Виджет"
desc: "Полезный виджет"
price: 0.0
answer: false
25 changes: 25 additions & 0 deletions tests/src/Melnikova/lab3/OrdersSpec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
testName: Melnikova/OrdersSpec
answerList:
- test_desc: 'Get correct OrderLine with valid item'
value:
order_id: 1
order_line_id: 1
quantity: 2.0
answer: false
- test_desc: 'Get incorrect OrderLine, invalid order_line_id'
value:
order_id: 1
order_line_id: 2
quantity: 1.0
answer: false
- test_desc: 'Get incorrect OrderLine, invalid quantity'
value:
order_id: 1
order_line_id: 1
quantity: 0.0
answer: false
- test_desc: 'Get incorrect OrderLine, missing order_id'
value:
order_line_id: 1
quantity: 1.0
answer: false
42 changes: 42 additions & 0 deletions tests/src/Melnikova/lab3/ProfileSpec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
testName: Melnikova/ProfileSpec
answerList:
- test_desc: 'Get correct Profile'
value:
user_id: 1
username: "Алиса"
surname: "Мельникова"
second_name: "Анатольевна"
email: "alisa@example.com"
status: "active"
bio: "Программист и разработчик"
url: "https://example.com/profile"
answer: true
- test_desc: 'Get incorrect Profile, Latin bio'
value:
user_id: 2
username: "Иван"
surname: "Иванов"
email: "ivan@example.com"
status: "active"
bio: "English text here"
url: "https://example.com"
answer: false
- test_desc: 'Get incorrect Profile, invalid URL'
value:
user_id: 3
username: "Петр"
surname: "Петров"
email: "petr@example.com"
status: "active"
bio: "Тестовый профиль"
url: "invalid-url"
answer: false
- test_desc: 'Get incorrect Profile, missing bio'
value:
user_id: 4
username: "Анна"
surname: "Иванова"
email: "anna@example.com"
status: "active"
url: "https://example.com"
answer: false
29 changes: 29 additions & 0 deletions tests/src/Melnikova/lab3/ServiceSpec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
testName: Melnikova/ServiceSpec
answerList:
- test_desc: 'Get correct Service'
value:
service_id: 1
name: "Тестовая услуга"
desc: "Описание тестовой услуги"
price: 200.0
answer: false
- test_desc: 'Get incorrect Service, negative price'
value:
service_id: 2
name: "Услуга 2"
desc: "Описание услуги 2"
price: -50.0
answer: false
- test_desc: 'Get incorrect Service, Latin name'
value:
service_id: 3
name: "Service 1"
desc: "Описание услуги"
price: 100.0
answer: false
- test_desc: 'Get incorrect Service, missing service_id'
value:
name: "Услуга"
desc: "Описание услуги"
price: 150.0
answer: false
Loading