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(("add_tab", 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)