import pytest from fasthtml.components import * from components.addstuff.constants import ROUTE_ROOT, Routes from components.addstuff.settings import Repository, RepositoriesSettings from core.settings_management import SettingsManager, MemoryDbEngine from helpers import matches, StartsWith, div_icon, find_first_match, search_elements_by_path from src.components.addstuff.components.Repositories import Repositories USER_EMAIL = "test@mail.com" USER_ID = "test_user" TEST_REPOSITORIES_ID = "testing_grid_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 db_engine(): return MemoryDbEngine() @pytest.fixture def repositories(session, tabs_manager, db_engine): return Repositories(session=session, _id=TEST_REPOSITORIES_ID, settings_manager=SettingsManager(engine=db_engine), tabs_manager=tabs_manager) def test_render_no_repository(repositories): actual = repositories.__ft__() expected = ( Div( Div(id=f"tt_{repositories.get_id()}"), Div(cls="divider"), Div("Repositories"), Div(id=repositories.get_id()), Script() ) ) assert matches(actual, expected) def test_render_when_repo_and_tables(db_engine, repositories): db_engine.init_db(USER_ID, 'AddStuffSettings', RepositoriesSettings([ Repository("repo 1", [MyTable("table 1"), MyTable("table 2")]), Repository("repo 2", [MyTable("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" res = repositories.add_new_repository(tab_id, form_id, repository_name, table_name) 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(db_engine, repositories): db_engine.init_db(USER_ID, 'AddStuffSettings', RepositoriesSettings([ 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(db_engine, repositories, tabs_manager): db_engine.init_db(USER_ID, 'AddStuffSettings', RepositoriesSettings([ Repository("repo 1", [MyTable("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'{{"_id": "{repositories.get_id()}", "repository": "repo 1", "table": "table 1"}}', cls="flex") to_compare = find_first_match(actual, "div.div.div.div.div[name='repo-table']") assert matches(to_compare, expected)