from io import BytesIO from openpyxl import load_workbook from sqlalchemy import select from src.core.database import async_session_maker from src.core.models import User from src.core.import_services import import_users from src.core.services import UserService from src.utils.spreadsheets import export_users, read_users_xlsx async def test_excel_formulas_remain_literal_text(): async with async_session_maker() as session: user = await UserService.get_or_create_user(session, 501, first_name='=HYPERLINK("https://invalid.example")') data = export_users([user]) workbook = load_workbook(BytesIO(data), data_only=False) assert workbook.active.cell(2, 3).data_type == "s" assert read_users_xlsx(data)[0]["first_name"] == user.first_name workbook.close() async def test_import_duplicate_card_does_not_break_following_rows_or_elevate_roles(): added, updated, errors = await import_users([ dict(telegram_id=502, club_card_number="5678", is_registered=True, is_admin=True, is_cashier=True), dict(telegram_id=503, club_card_number="5678"), dict(telegram_id=504, club_card_number="6789"), ]) assert (added, updated, errors) == (2, 0, 1) async with async_session_maker() as session: user = await session.scalar(select(User).where(User.telegram_id == 502)) assert not user.is_admin and not user.is_cashier and user.verification_code assert await session.scalar(select(User.id).where(User.telegram_id == 504))