Apptest в streamlit python

Кто может подсказать, почему не работает этот код, или поделиться ссылкой на статью с похожими примерами? Заранее спасибо!

users.py

import datetime
import os
import time
from dotenv import load_dotenv
import pandas as pd
import streamlit as st

from utils import check_access

load_dotenv()
DATABASE_URL = os.getenv("DATABASE_URL")

from sqlalchemy import create_engine

engine = create_engine(DATABASE_URL)

st.markdown(
    """
    <style>
    #MainMenu {visibility: hidden;}
    footer {visibility: hidden;}
    </style>
    """,
    unsafe_allow_html=True,
)

st.markdown(
    r"""
    <style>
    .stDeployButton {
            visibility: hidden;
        }
    </style>
    """,
    unsafe_allow_html=True,
)


if check_access():
    date_begin = st.date_input(
        "Дата с:", value=datetime.date(2024, 1, 1), format="DD.MM.YYYY"
    )
    date_end = st.date_input(
        "Дата по:", value=datetime.date(2024, 12, 31), format="DD.MM.YYYY"
    )

    user_filter = st.text_input("Фильтр по пользователю (email)")

    additional_filter = ""
    if user_filter:
        additional_filter = f"AND email = '{user_filter}'"

    query = f"""
    SELECT last_name, first_name, middle_name, birthday, created_at, phone, email, user_email FROM public.user
    WHERE created_at BETWEEN '{date_begin} 00:00:00' AND '{date_end} 23:59:59' {additional_filter}
    """

    data = pd.read_sql_query(query, con=engine)

    # Функция для форматирования номера телефона
    def format_phone(phone):
        if pd.notna(phone) and phone.strip():
            clean_phone = "".join(filter(str.isdigit, phone))
            if len(clean_phone) >= 11:
                return f"+7({clean_phone[1:4]}){clean_phone[4:7]}-{clean_phone[7:9]}-{clean_phone[9:11]}"
        return phone

    # Функция для преобразования строки даты в формат 'DD.MM.YYYY'
    from datetime import datetime

    def convert_date(date_str):
        try:
            # Преобразование строки в объект datetime
            date_obj = datetime.strptime(date_str, "%Y-%m-%d")
            # Возвращаем дату в формате 'DD.MM.YYYY'
            return date_obj.strftime("%d.%m.%Y")
        except ValueError:
            # В случае ошибки преобразования возвращаем None или оригинальную строку
            return None

    # Применение функции к каждому элементу столбца 'birthday'
    data["birthday"] = [convert_date(date) for date in data["birthday"]]

    def rename_columns(df):
        return df.rename(
            columns={
                "created_at": "Дата создания",
                "phone": "Телефон",
                "email": "Электронная почта",
                "user_email": "Email пользователя",
                "last_name": "Фамилия",
                "first_name": "Имя",
                "middle_name": "Отчество",
                "birthday": "Дата рождения",
            }
        )

    # Применяем функцию форматирования и переименовываем столбцы
    data["phone"] = data["phone"].apply(format_phone)
    data = rename_columns(data)

    st.dataframe(data, use_container_width=True)

test_users.py

import pytest
from streamlit.testing.v1 import AppTest


@pytest.fixture(scope="module")
def app_test():
    return AppTest.from_file(
        "../pages/users.py",
    )


def test_date_inputs(app_test):
    result = app_test.run()

    # Вывод всех доступных элементов для отладки
    date_inputs = result.get("date_input")
    print("Date inputs found:", date_inputs)
    assert any(
        "Дата с:" in date_input.label for date_input in date_inputs
    ), "Field 'Дата с:' not found"

    assert any(
        "Дата по:" in date_input.label for date_input in date_inputs
    ), "Field 'Дата по:' not found"


def test_text_input(app_test):
    result = app_test.run()

    # Вывод всех доступных элементов для отладки
    text_inputs = result.get("text_input")
    print("Text inputs found:", text_inputs)
    assert any(
        "Фильтр по пользователю (email)" in text_input.label
        for text_input in text_inputs
    ), "Text input 'Фильтр по пользователю (email)' not found"


def test_data_display(app_test):
    result = app_test.run()

    # Вывод всех доступных элементов для отладки
    dataframes = result.get("dataframe")
    print("Dataframes found:", dataframes)
    assert len(dataframes) > 0, "No dataframes found"

    dataframe = dataframes[0]
    expected_columns = [
        "Фамилия",
        "Имя",
        "Отчество",
        "Дата рождения",
        "Дата создания",
        "Телефон",
        "Электронная почта",
        "Email пользователя",
    ]
    for column in expected_columns:
        assert column in dataframe.columns, f"Column '{column}' not found in dataframe"

Ошибка:

2024-05-24 10:05:50.264 Uncaught app exception
Traceback (most recent call last):
  File "c:\Users\Nestor\git_quest\sb_report\.venv\Lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 584, in _run_script
    exec(code, module.__dict__)
  File "C:\Users\Nestor\git_quest\sb_report\src\pages\users.py", line 8, in <module>
    from utils import check_access
ImportError: cannot import name 'check_access' from 'utils' (C:\Users\Nestor\git_quest\sb_report\src\testcases\utils.py)
======================================================== short test summary info ========================================================= 
FAILED test_users.py::test_date_inputs - AssertionError: Field 'Дата с:' not found
FAILED test_users.py::test_text_input - AssertionError: Text input 'Фильтр по пользователю (email)' not found
FAILED test_users.py::test_data_display - AssertionError: No dataframes found

введите сюда описание изображения


Ответы (0 шт):