|
3 | 3 | import pytest |
4 | 4 | from sqlalchemy.ext.asyncio import AsyncSession |
5 | 5 |
|
6 | | -from notora.v2.exceptions.common import NotFoundError |
| 6 | +from notora.v2.exceptions.common import AlreadyExistsError, NotFoundError |
7 | 7 | from notora.v2.repositories.params import PaginationParams, QueryParams |
8 | 8 | from notora.v2.schemas.base import PaginatedResponseSchema |
9 | 9 | from tests.v2.test_integration.mocks.model import V2User |
@@ -182,3 +182,68 @@ async def test_service_retrieve_create_or_skip_upsert_and_delete( |
182 | 182 |
|
183 | 183 | with pytest.raises(NotFoundError): |
184 | 184 | await user_service.retrieve(db_session, created.id) |
| 185 | + |
| 186 | + |
| 187 | +async def test_service_bulk_create( |
| 188 | + db_session: AsyncSession, |
| 189 | + user_service: V2UserService, |
| 190 | +) -> None: |
| 191 | + payloads = [ |
| 192 | + _create_user_payload('bulk1@ex.com', 'Bulk1'), |
| 193 | + _create_user_payload('bulk2@ex.com', 'Bulk2'), |
| 194 | + _create_user_payload('bulk3@ex.com', 'Bulk3'), |
| 195 | + ] |
| 196 | + created = await user_service.bulk_create(db_session, payloads) |
| 197 | + await db_session.commit() |
| 198 | + |
| 199 | + assert len(created) == len(payloads) |
| 200 | + assert all(isinstance(item, V2UserResponseSchema) for item in created) |
| 201 | + assert {item.email for item in created} == {'bulk1@ex.com', 'bulk2@ex.com', 'bulk3@ex.com'} |
| 202 | + |
| 203 | + |
| 204 | +async def test_service_bulk_create_raw( |
| 205 | + db_session: AsyncSession, |
| 206 | + user_service: V2UserService, |
| 207 | +) -> None: |
| 208 | + payloads = [ |
| 209 | + _create_user_payload('raw1@ex.com', 'Raw1'), |
| 210 | + _create_user_payload('raw2@ex.com', 'Raw2'), |
| 211 | + ] |
| 212 | + created = await user_service.bulk_create_raw(db_session, payloads) |
| 213 | + await db_session.commit() |
| 214 | + |
| 215 | + assert len(created) == len(payloads) |
| 216 | + assert all(isinstance(item, V2User) for item in created) |
| 217 | + |
| 218 | + |
| 219 | +async def test_service_bulk_create_with_actor_id( |
| 220 | + db_session: AsyncSession, |
| 221 | + user_service: V2UserService, |
| 222 | +) -> None: |
| 223 | + actor_id = uuid4() |
| 224 | + payloads = [ |
| 225 | + _create_user_payload('actor1@ex.com', 'Actor1'), |
| 226 | + _create_user_payload('actor2@ex.com', 'Actor2'), |
| 227 | + ] |
| 228 | + created = await user_service.bulk_create(db_session, payloads, actor_id=actor_id) |
| 229 | + await db_session.commit() |
| 230 | + |
| 231 | + assert len(created) == len(payloads) |
| 232 | + assert all(item.updated_by == actor_id for item in created) |
| 233 | + |
| 234 | + |
| 235 | +async def test_service_bulk_create_duplicate_raises( |
| 236 | + db_session: AsyncSession, |
| 237 | + user_service: V2UserService, |
| 238 | +) -> None: |
| 239 | + payload = _create_user_payload('dup@ex.com', 'Original') |
| 240 | + await user_service.create(db_session, payload) |
| 241 | + await db_session.commit() |
| 242 | + |
| 243 | + with pytest.raises(AlreadyExistsError): |
| 244 | + await user_service.bulk_create( |
| 245 | + db_session, |
| 246 | + [ |
| 247 | + _create_user_payload('dup@ex.com', 'Duplicate'), |
| 248 | + ], |
| 249 | + ) |
0 commit comments