import pytest
from fasthtml.components import *
from components.repositories.components.Repositories import Repositories
from components.repositories.constants import ROUTE_ROOT, Routes
from core.settings_management import SettingsManager, MemoryDbEngine
from helpers import matches, StartsWith, div_icon, find_first_match, search_elements_by_path
USER_EMAIL = "test@mail.com"
USER_ID = "test_user"
TEST_REPOSITORIES_ID = "testing_repositories_id"
@pytest.fixture
def session():
return {"user_id": USER_ID, "user_email": USER_EMAIL}
@pytest.fixture
def tabs_manager():
class MockTabsManager:
def __init__(self):
self.tabs = []
self.mock_content = Div("No tabs yet")
self._called_methods: list[tuple] = []
def add_tab(self, *args, **kwargs):
self._called_methods.append(("set_tab_content", args, kwargs))
table_name, content, key = args
self.tabs.append({"table_name": table_name, "content": content, "key": key})
def get_id(self):
return "tabs_id"
def set_tab_content(self, *args, **kwargs):
self._called_methods.append(("set_tab_content", args, kwargs))
title = kwargs.get("title", None)
key = kwargs.get("key", None)
self.mock_content = Div(f"{title=}, {key=}")
def refresh(self):
return self.mock_content
return MockTabsManager()
@pytest.fixture
def repositories(session, tabs_manager):
return Repositories(session=session, _id=TEST_REPOSITORIES_ID,
settings_manager=SettingsManager(engine=MemoryDbEngine()),
tabs_manager=tabs_manager)
def test_render_no_repository(repositories):
actual = repositories.__ft__()
expected = (
Div(
Div(cls="divider"),
Div("Repositories"),
Div(id=repositories.get_id()),
)
)
assert matches(actual, expected)
def test_render_when_repo_and_tables(repositories):
repositories.db.add_repository("repo 1", ["table 1", "table 2"])
repositories.db.add_repository("repo 2", ["table 3"])
actual = repositories.__ft__()
to_compare = search_elements_by_path(actual, "div", {"id": repositories.get_id()})[0]
expected = Div(
Div(
Input(type="radio"),
Div(div_icon("database"), Div("repo 1"), cls=StartsWith("collapse-title")),
Div(
Div(div_icon("table"), Div("table 1")),
Div(div_icon("table"), Div("table 2")),
cls=StartsWith("collapse-content")
),
),
Div(
Input(type="radio"),
Div(div_icon("database"), Div("repo 2"), cls=StartsWith("collapse-title")),
Div(
Div(div_icon("table"), Div("table 3")),
cls=StartsWith("collapse-content")
),
),
id=repositories.get_id())
assert matches(to_compare, expected)
def test_i_can_add_new_repository(repositories):
tab_id = "tab_id"
form_id = "form_id"
repository_name = "repository_name"
table_name = "table_name"
boundaries = {"height": 600, "width": 800}
res = repositories.add_new_repository(tab_id, form_id, repository_name, table_name, boundaries)
expected = (
Div(
Input(type="radio"),
Div(div_icon("database"), Div(repository_name)),
Div(
Div(div_icon("table"), Div(table_name)),
cls=StartsWith("collapse-content")
),
),
Div(f"title='{table_name}', key={(repository_name, table_name)}")
)
assert matches(res, expected)
def test_i_can_click_on_repo(repositories):
repositories.db.add_repository("repo 1", [])
actual = repositories.__ft__()
expected = Input(
hx_put=f"{ROUTE_ROOT}{Routes.SelectRepository}",
hx_vals=f'{{"_id": "{repositories.get_id()}", "repository": "repo 1"}}',
)
to_compare = find_first_match(actual, "div.div.div.input")
assert matches(to_compare, expected)
def test_render_i_can_click_on_table(repositories, tabs_manager):
repositories.db.add_repository("repo 1", ["table 1"])
actual = repositories.__ft__()
expected = Div(name="repo-table",
hx_get=f"{ROUTE_ROOT}{Routes.ShowTable}",
hx_target=f"#{repositories.tabs_manager.get_id()}",
hx_swap="outerHTML",
hx_vals=f'js:{{"_id": "{repositories.get_id()}", "repository": "repo 1", "table": "table 1", "tab_boundaries": getTabContentBoundaries("tabs_id")}}',
cls="flex")
to_compare = find_first_match(actual, "div.div.div.div.div[name='repo-table']")
assert matches(to_compare, expected)