feat: доменный нейминг изменен

This commit is contained in:
Artem Tsyrulnikov
2025-11-13 01:18:04 +03:00
parent a48d5e67cb
commit bba37fbb21
51 changed files with 1144 additions and 1154 deletions

View File

@@ -42,7 +42,7 @@ async def test_fetch_views_no_ad_post_url(usecases: usecase.Usecase, mock_databa
)
await mock_database.create_creative(creative)
purchase = domain.Purchase(
placement = domain.Placement(
target_channel_id=target_channel.id,
external_channel_id=external_channel.id,
creative_id=creative.id,
@@ -50,13 +50,13 @@ async def test_fetch_views_no_ad_post_url(usecases: usecase.Usecase, mock_databa
placement_date=datetime.datetime.now(datetime.UTC),
invite_link='https://t.me/+link1',
invite_link_type=domain.InviteLinkType.PUBLIC,
status=domain.PurchaseStatus.ACTIVE,
status=domain.PlacementStatus.ACTIVE,
ad_post_url=None, # Нет ссылки на пост
)
await mock_database.create_purchase(purchase)
await mock_database.create_placement(placement)
input_data = dto.FetchViewsInputManually(
purchase_id=purchase.id,
placement_id=placement.id,
user_id=user.id,
)
@@ -101,7 +101,7 @@ async def test_fetch_views_api_unavailable(usecases: usecase.Usecase, mock_datab
)
await mock_database.create_creative(creative)
purchase = domain.Purchase(
placement = domain.Placement(
target_channel_id=target_channel.id,
external_channel_id=external_channel.id,
creative_id=creative.id,
@@ -109,13 +109,13 @@ async def test_fetch_views_api_unavailable(usecases: usecase.Usecase, mock_datab
placement_date=datetime.datetime.now(datetime.UTC),
invite_link='https://t.me/+link2',
invite_link_type=domain.InviteLinkType.PUBLIC,
status=domain.PurchaseStatus.ACTIVE,
status=domain.PlacementStatus.ACTIVE,
ad_post_url='https://t.me/externalchannel/123',
)
await mock_database.create_purchase(purchase)
await mock_database.create_placement(placement)
input_data = dto.FetchViewsInputManually(
purchase_id=purchase.id,
placement_id=placement.id,
user_id=user.id,
)
@@ -126,11 +126,11 @@ async def test_fetch_views_api_unavailable(usecases: usecase.Usecase, mock_datab
assert result.views_availability == domain.PostViewsAvailability.UNAVAILABLE
assert 'Failed to fetch views' in result.error_message
# Проверяем, что purchase обновлён
updated_purchase = await mock_database.get_purchase(user.id, purchase.id)
assert updated_purchase is not None
assert updated_purchase.views_availability == domain.PostViewsAvailability.UNAVAILABLE
assert updated_purchase.last_views_fetch_at is not None
# Проверяем, что placement обновлён
updated_placement = await mock_database.get_placement(user.id, placement.id)
assert updated_placement is not None
assert updated_placement.views_availability == domain.PostViewsAvailability.UNAVAILABLE
assert updated_placement.last_views_fetch_at is not None
@pytest.mark.asyncio
@@ -167,7 +167,7 @@ async def test_update_views_manually(usecases: usecase.Usecase, mock_database: M
)
await mock_database.create_creative(creative)
purchase = domain.Purchase(
placement = domain.Placement(
target_channel_id=target_channel.id,
external_channel_id=external_channel.id,
creative_id=creative.id,
@@ -175,13 +175,13 @@ async def test_update_views_manually(usecases: usecase.Usecase, mock_database: M
placement_date=datetime.datetime.now(datetime.UTC),
invite_link='https://t.me/+link3',
invite_link_type=domain.InviteLinkType.PUBLIC,
status=domain.PurchaseStatus.ACTIVE,
status=domain.PlacementStatus.ACTIVE,
ad_post_url='https://t.me/externalchannel/456',
)
await mock_database.create_purchase(purchase)
await mock_database.create_placement(placement)
input_data = dto.UpdateViewsManuallyInput(
purchase_id=purchase.id,
placement_id=placement.id,
user_id=user.id,
views_count=15000,
)
@@ -193,16 +193,16 @@ async def test_update_views_manually(usecases: usecase.Usecase, mock_database: M
assert result.views_availability == domain.PostViewsAvailability.MANUAL
assert result.last_views_fetch_at is not None
# Проверяем, что создан снимок
snapshots = [s for s in mock_database.views_snapshots.values() if s.purchase_id == purchase.id]
assert len(snapshots) == 1
assert snapshots[0].views_count == 15000
# Проверяем, что создана история просмотров
histories = [h for h in mock_database.placement_views_histories.values() if h.placement_id == placement.id]
assert len(histories) == 1
assert histories[0].views_count == 15000
# Проверяем, что закуп обновлён
updated_purchase = await mock_database.get_purchase(user.id, purchase.id)
assert updated_purchase is not None
assert updated_purchase.views_count == 15000
assert updated_purchase.views_availability == domain.PostViewsAvailability.MANUAL
updated_placement = await mock_database.get_placement(user.id, placement.id)
assert updated_placement is not None
assert updated_placement.views_count == 15000
assert updated_placement.views_availability == domain.PostViewsAvailability.MANUAL
@pytest.mark.asyncio
@@ -239,7 +239,7 @@ async def test_get_views_history_empty(usecases: usecase.Usecase, mock_database:
)
await mock_database.create_creative(creative)
purchase = domain.Purchase(
placement = domain.Placement(
target_channel_id=target_channel.id,
external_channel_id=external_channel.id,
creative_id=creative.id,
@@ -247,23 +247,23 @@ async def test_get_views_history_empty(usecases: usecase.Usecase, mock_database:
placement_date=datetime.datetime.now(datetime.UTC),
invite_link='https://t.me/+link4',
invite_link_type=domain.InviteLinkType.PUBLIC,
status=domain.PurchaseStatus.ACTIVE,
status=domain.PlacementStatus.ACTIVE,
)
await mock_database.create_purchase(purchase)
await mock_database.create_placement(placement)
input_data = dto.GetViewsHistoryInput(
purchase_id=purchase.id,
placement_id=placement.id,
user_id=user.id,
)
result = await usecases.get_views_history(input=input_data)
assert len(result.snapshots) == 0
assert len(result.histories) == 0
@pytest.mark.asyncio
async def test_get_views_history_with_snapshots(usecases: usecase.Usecase, mock_database: MockDatabase) -> None:
"""Получение истории просмотров возвращает снимки в хронологическом порядке."""
"""Получение истории просмотров возвращает записи в хронологическом порядке."""
user = domain.User(telegram_id=123456, username='testuser')
await mock_database.create_user(user)
@@ -295,7 +295,7 @@ async def test_get_views_history_with_snapshots(usecases: usecase.Usecase, mock_
)
await mock_database.create_creative(creative)
purchase = domain.Purchase(
placement = domain.Placement(
target_channel_id=target_channel.id,
external_channel_id=external_channel.id,
creative_id=creative.id,
@@ -303,43 +303,43 @@ async def test_get_views_history_with_snapshots(usecases: usecase.Usecase, mock_
placement_date=datetime.datetime.now(datetime.UTC),
invite_link='https://t.me/+link5',
invite_link_type=domain.InviteLinkType.PUBLIC,
status=domain.PurchaseStatus.ACTIVE,
status=domain.PlacementStatus.ACTIVE,
)
await mock_database.create_purchase(purchase)
await mock_database.create_placement(placement)
# Создаём несколько снимков
# Создаём несколько записей истории
now = datetime.datetime.now(datetime.UTC)
snapshot1 = domain.ViewsSnapshot(
purchase_id=purchase.id,
history1 = domain.PlacementViewsHistory(
placement_id=placement.id,
views_count=1000,
fetched_at=now - datetime.timedelta(hours=2),
)
snapshot2 = domain.ViewsSnapshot(
purchase_id=purchase.id,
history2 = domain.PlacementViewsHistory(
placement_id=placement.id,
views_count=1500,
fetched_at=now - datetime.timedelta(hours=1),
)
snapshot3 = domain.ViewsSnapshot(
purchase_id=purchase.id,
history3 = domain.PlacementViewsHistory(
placement_id=placement.id,
views_count=2000,
fetched_at=now,
)
await mock_database.create_views_snapshot(snapshot1)
await mock_database.create_views_snapshot(snapshot2)
await mock_database.create_views_snapshot(snapshot3)
await mock_database.create_placement_views_history(history1)
await mock_database.create_placement_views_history(history2)
await mock_database.create_placement_views_history(history3)
input_data = dto.GetViewsHistoryInput(
purchase_id=purchase.id,
placement_id=placement.id,
user_id=user.id,
)
result = await usecases.get_views_history(input=input_data)
assert len(result.snapshots) == 3
assert len(result.histories) == 3
# Проверяем сортировку по времени (старые первые)
assert result.snapshots[0].views_count == 1000
assert result.snapshots[1].views_count == 1500
assert result.snapshots[2].views_count == 2000
assert result.histories[0].views_count == 1000
assert result.histories[1].views_count == 1500
assert result.histories[2].views_count == 2000
@pytest.mark.asyncio
@@ -376,7 +376,7 @@ async def test_get_views_history_with_date_filter(usecases: usecase.Usecase, moc
)
await mock_database.create_creative(creative)
purchase = domain.Purchase(
placement = domain.Placement(
target_channel_id=target_channel.id,
external_channel_id=external_channel.id,
creative_id=creative.id,
@@ -384,41 +384,41 @@ async def test_get_views_history_with_date_filter(usecases: usecase.Usecase, moc
placement_date=datetime.datetime.now(datetime.UTC),
invite_link='https://t.me/+link6',
invite_link_type=domain.InviteLinkType.PUBLIC,
status=domain.PurchaseStatus.ACTIVE,
status=domain.PlacementStatus.ACTIVE,
)
await mock_database.create_purchase(purchase)
await mock_database.create_placement(placement)
# Создаём снимки с разными датами
# Создаём записи с разными датами
now = datetime.datetime.now(datetime.UTC)
snapshot1 = domain.ViewsSnapshot(
purchase_id=purchase.id,
history1 = domain.PlacementViewsHistory(
placement_id=placement.id,
views_count=1000,
fetched_at=now - datetime.timedelta(days=3),
)
snapshot2 = domain.ViewsSnapshot(
purchase_id=purchase.id,
history2 = domain.PlacementViewsHistory(
placement_id=placement.id,
views_count=1500,
fetched_at=now - datetime.timedelta(days=1),
)
snapshot3 = domain.ViewsSnapshot(
purchase_id=purchase.id,
history3 = domain.PlacementViewsHistory(
placement_id=placement.id,
views_count=2000,
fetched_at=now,
)
await mock_database.create_views_snapshot(snapshot1)
await mock_database.create_views_snapshot(snapshot2)
await mock_database.create_views_snapshot(snapshot3)
await mock_database.create_placement_views_history(history1)
await mock_database.create_placement_views_history(history2)
await mock_database.create_placement_views_history(history3)
# Запрашиваем историю за последние 2 дня
input_data = dto.GetViewsHistoryInput(
purchase_id=purchase.id,
placement_id=placement.id,
user_id=user.id,
from_date=now - datetime.timedelta(days=2),
)
result = await usecases.get_views_history(input=input_data)
# Должны вернуться только snapshot2 и snapshot3
assert len(result.snapshots) == 2
assert result.snapshots[0].views_count == 1500
assert result.snapshots[1].views_count == 2000
# Должны вернуться только history2 и history3
assert len(result.histories) == 2
assert result.histories[0].views_count == 1500
assert result.histories[1].views_count == 2000