"""Unit tests for Law service.""" import pytest from datetime import date from unittest.mock import AsyncMock, patch, MagicMock from sqlalchemy.ext.asyncio import AsyncSession from app.models.law import Law, LawArticle, LawType, LawStatus from app.services.law_service import LawService class TestLawService: """Test cases for Law service.""" @pytest.mark.asyncio async def test_create_law(self, db_session: AsyncSession): """Test creating a law.""" service = LawService(db_session) law = await service.create_law( title="测试法律", law_type=LawType.LAW, promulgation_date=date(2024, 1, 1), effective_date=date(2024, 2, 1), issuing_authority="测试机关", content="测试内容", ) assert law.id is not None assert law.title == "测试法律" assert law.law_type == LawType.LAW @pytest.mark.asyncio async def test_get_law_by_id(self, db_session: AsyncSession): """Test getting a law by ID.""" service = LawService(db_session) # Create a law first created = await service.create_law( title="测试法律", law_type=LawType.LAW, promulgation_date=date(2024, 1, 1), effective_date=date(2024, 2, 1), issuing_authority="测试机关", content="测试内容", ) # Get the law law = await service.get_law_by_id(created.id) assert law is not None assert law.title == "测试法律" @pytest.mark.asyncio async def test_get_laws_list(self, db_session: AsyncSession): """Test getting list of laws.""" service = LawService(db_session) # Create multiple laws for i in range(3): await service.create_law( title=f"测试法律{i}", law_type=LawType.LAW, promulgation_date=date(2024, 1, 1), effective_date=date(2024, 2, 1), issuing_authority="测试机关", content=f"测试内容{i}", ) laws = await service.get_laws_list(skip=0, limit=10) assert len(laws) == 3 @pytest.mark.asyncio async def test_update_law(self, db_session: AsyncSession): """Test updating a law.""" service = LawService(db_session) # Create a law law = await service.create_law( title="原标题", law_type=LawType.LAW, promulgation_date=date(2024, 1, 1), effective_date=date(2024, 2, 1), issuing_authority="测试机关", content="原内容", ) # Update the law updated = await service.update_law(law.id, title="新标题") assert updated.title == "新标题" @pytest.mark.asyncio async def test_delete_law(self, db_session: AsyncSession): """Test deleting a law.""" service = LawService(db_session) # Create a law law = await service.create_law( title="待删除法律", law_type=LawType.LAW, promulgation_date=date(2024, 1, 1), effective_date=date(2024, 2, 1), issuing_authority="测试机关", content="测试内容", ) # Delete the law result = await service.delete_law(law.id) assert result is True # Verify it's deleted deleted = await service.get_law_by_id(law.id) assert deleted is None @pytest.mark.asyncio async def test_search_laws_by_keyword(self, db_session: AsyncSession): """Test searching laws by keyword.""" service = LawService(db_session) # Create laws with different content await service.create_law( title="民法典", law_type=LawType.LAW, promulgation_date=date(2024, 1, 1), effective_date=date(2024, 2, 1), issuing_authority="全国人大", content="民法典全文内容", ) await service.create_law( title="刑法", law_type=LawType.LAW, promulgation_date=date(2024, 1, 1), effective_date=date(2024, 2, 1), issuing_authority="全国人大", content="刑法全文内容", ) results = await service.search_laws_by_keyword("民法") assert len(results) >= 1 assert any("民法典" in law.title for law in results)