DatagridsManager : I can see the opened folders in the Treeview
This commit is contained in:
@@ -710,7 +710,8 @@ class TestTabsManagerRender:
|
||||
hx_on__after_settle=f'updateTabs("{tabs_manager.get_id()}-controller");',
|
||||
hx_swap_oob="true"), # the controller is correctly updated
|
||||
Div(
|
||||
id=f'{tabs_manager.get_id()}-header-wrapper'
|
||||
id=f'{tabs_manager.get_id()}-header-wrapper',
|
||||
hx_swap_oob="true"
|
||||
), # content of the header
|
||||
Div(
|
||||
Div(Div("My Content")),
|
||||
@@ -750,7 +751,7 @@ class TestTabsManagerRender:
|
||||
|
||||
expected = (
|
||||
Div(data_active_tab=tab_id, hx_swap_oob="true"),
|
||||
Div(id=f'{tabs_manager.get_id()}-header-wrapper'),
|
||||
Div(id=f'{tabs_manager.get_id()}-header-wrapper', hx_swap_oob="true"),
|
||||
Div(
|
||||
Div("New Content"),
|
||||
id=f'{tabs_manager.get_id()}-{tab_id}-content',
|
||||
|
||||
@@ -391,6 +391,184 @@ class TestTreeviewBehaviour:
|
||||
assert tree_view._state.items[node1.id].type == "folder"
|
||||
assert tree_view._state.items[node2.id].label == "Node 2"
|
||||
assert tree_view._state.items[node2.id].type == "file"
|
||||
|
||||
def test_i_can_ensure_simple_path(self, root_instance):
|
||||
"""Test that ensure_path creates a simple hierarchical path."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
tree_view.ensure_path("folder1.folder2.file")
|
||||
|
||||
# Should have 3 nodes
|
||||
assert len(tree_view._state.items) == 3
|
||||
|
||||
# Find nodes by label
|
||||
nodes = list(tree_view._state.items.values())
|
||||
folder1 = [n for n in nodes if n.label == "folder1"][0]
|
||||
folder2 = [n for n in nodes if n.label == "folder2"][0]
|
||||
file_node = [n for n in nodes if n.label == "file"][0]
|
||||
|
||||
# Verify hierarchy
|
||||
assert folder1.parent is None
|
||||
assert folder2.parent == folder1.id
|
||||
assert file_node.parent == folder2.id
|
||||
|
||||
# Verify children relationships
|
||||
assert folder2.id in folder1.children
|
||||
assert file_node.id in folder2.children
|
||||
|
||||
# Verify all nodes have folder type
|
||||
assert folder1.type == "folder"
|
||||
assert folder2.type == "folder"
|
||||
assert file_node.type == "folder"
|
||||
|
||||
def test_i_can_ensure_path_with_existing_nodes(self, root_instance):
|
||||
"""Test that ensure_path reuses existing nodes in the path."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
# Create initial path
|
||||
tree_view.ensure_path("folder1.folder2.file1")
|
||||
initial_count = len(tree_view._state.items)
|
||||
|
||||
# Ensure same path again
|
||||
tree_view.ensure_path("folder1.folder2.file1")
|
||||
|
||||
# Should not create any new nodes
|
||||
assert len(tree_view._state.items) == initial_count
|
||||
assert len(tree_view._state.items) == 3
|
||||
|
||||
def test_i_can_ensure_path_partially_existing(self, root_instance):
|
||||
"""Test that ensure_path creates only missing nodes when path partially exists."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
# Create initial path
|
||||
tree_view.ensure_path("folder1.folder2")
|
||||
assert len(tree_view._state.items) == 2
|
||||
|
||||
# Extend the path
|
||||
tree_view.ensure_path("folder1.folder2.subfolder.file")
|
||||
|
||||
# Should have 4 nodes total (folder1, folder2, subfolder, file)
|
||||
assert len(tree_view._state.items) == 4
|
||||
|
||||
# Find all nodes
|
||||
nodes = list(tree_view._state.items.values())
|
||||
folder1 = [n for n in nodes if n.label == "folder1"][0]
|
||||
folder2 = [n for n in nodes if n.label == "folder2"][0]
|
||||
subfolder = [n for n in nodes if n.label == "subfolder"][0]
|
||||
file_node = [n for n in nodes if n.label == "file"][0]
|
||||
|
||||
# Verify new nodes are children of existing path
|
||||
assert subfolder.parent == folder2.id
|
||||
assert file_node.parent == subfolder.id
|
||||
|
||||
def test_i_cannot_ensure_path_with_none(self, root_instance):
|
||||
"""Test that ensure_path raises ValueError when path is None."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
with pytest.raises(ValueError, match="Invalid path.*None"):
|
||||
tree_view.ensure_path(None)
|
||||
|
||||
def test_i_cannot_ensure_path_with_empty_string(self, root_instance):
|
||||
"""Test that ensure_path raises ValueError for empty strings after stripping."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
with pytest.raises(ValueError, match="Invalid path.*empty"):
|
||||
tree_view.ensure_path(" ")
|
||||
|
||||
with pytest.raises(ValueError, match="Invalid path.*empty"):
|
||||
tree_view.ensure_path("")
|
||||
|
||||
with pytest.raises(ValueError, match="Invalid path.*empty"):
|
||||
tree_view.ensure_path("...")
|
||||
|
||||
def test_i_can_ensure_path_strips_leading_trailing_dots(self, root_instance):
|
||||
"""Test that ensure_path strips leading and trailing dots."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
tree_view.ensure_path(".folder1.folder2.")
|
||||
|
||||
# Should only create 2 nodes (folder1, folder2)
|
||||
assert len(tree_view._state.items) == 2
|
||||
|
||||
nodes = list(tree_view._state.items.values())
|
||||
labels = [n.label for n in nodes]
|
||||
|
||||
assert "folder1" in labels
|
||||
assert "folder2" in labels
|
||||
|
||||
def test_i_can_ensure_path_strips_spaces_in_parts(self, root_instance):
|
||||
"""Test that ensure_path strips spaces from each path part."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
tree_view.ensure_path("folder1. folder2 . folder3 ")
|
||||
|
||||
# Should create 3 nodes with trimmed labels
|
||||
assert len(tree_view._state.items) == 3
|
||||
|
||||
nodes = list(tree_view._state.items.values())
|
||||
labels = [n.label for n in nodes]
|
||||
|
||||
assert "folder1" in labels
|
||||
assert "folder2" in labels
|
||||
assert "folder3" in labels
|
||||
|
||||
def test_ensure_path_creates_folder_type_nodes(self, root_instance):
|
||||
"""Test that ensure_path creates nodes with type='folder'."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
tree_view.ensure_path("folder1.folder2")
|
||||
|
||||
for node in tree_view._state.items.values():
|
||||
assert node.type == "folder"
|
||||
|
||||
def test_i_cannot_ensure_path_with_empty_parts(self, root_instance):
|
||||
"""Test that ensure_path raises ValueError for paths with empty parts."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
with pytest.raises(ValueError, match="Invalid path"):
|
||||
tree_view.ensure_path("folder1..folder2")
|
||||
|
||||
def test_i_cannot_ensure_path_with_only_spaces_parts(self, root_instance):
|
||||
"""Test that ensure_path raises ValueError for path parts with only spaces."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
with pytest.raises(ValueError, match="Invalid path"):
|
||||
tree_view.ensure_path("folder1. .folder2")
|
||||
|
||||
def test_ensure_path_returns_last_node_id(self, root_instance):
|
||||
"""Test that ensure_path returns the ID of the last node in the path."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
# Create a path and get the returned ID
|
||||
returned_id = tree_view.ensure_path("folder1.folder2.folder3")
|
||||
|
||||
# Verify the returned ID is not None
|
||||
assert returned_id is not None
|
||||
|
||||
# Verify the returned ID corresponds to folder3
|
||||
assert returned_id in tree_view._state.items
|
||||
assert tree_view._state.items[returned_id].label == "folder3"
|
||||
|
||||
# Verify we can use this ID to add a child
|
||||
leaf = TreeNode(label="file.txt", type="file")
|
||||
tree_view.add_node(leaf, parent_id=returned_id)
|
||||
|
||||
assert leaf.parent == returned_id
|
||||
assert leaf.id in tree_view._state.items[returned_id].children
|
||||
|
||||
def test_ensure_path_returns_existing_node_id(self, root_instance):
|
||||
"""Test that ensure_path returns ID even when path already exists."""
|
||||
tree_view = TreeView(root_instance)
|
||||
|
||||
# Create initial path
|
||||
first_id = tree_view.ensure_path("folder1.folder2")
|
||||
|
||||
# Ensure same path again
|
||||
second_id = tree_view.ensure_path("folder1.folder2")
|
||||
|
||||
# Should return the same ID
|
||||
assert first_id == second_id
|
||||
assert tree_view._state.items[first_id].label == "folder2"
|
||||
|
||||
|
||||
class TestTreeViewRender:
|
||||
@@ -810,7 +988,6 @@ class TestTreeViewRender:
|
||||
|
||||
# Step 3: Compare
|
||||
assert matches(keyboard, expected)
|
||||
|
||||
|
||||
def test_multiple_root_nodes_are_rendered(self, tree_view):
|
||||
"""Test that multiple root nodes are rendered at the same level.
|
||||
@@ -822,18 +999,18 @@ class TestTreeViewRender:
|
||||
"""
|
||||
root1 = TreeNode(label="Root 1", type="folder")
|
||||
root2 = TreeNode(label="Root 2", type="folder")
|
||||
|
||||
|
||||
tree_view.add_node(root1)
|
||||
tree_view.add_node(root2)
|
||||
|
||||
|
||||
rendered = tree_view.render()
|
||||
root_containers = find(rendered, Div(cls=Contains("mf-treenode-container")))
|
||||
|
||||
|
||||
assert len(root_containers) == 2, "Should have two root-level containers"
|
||||
|
||||
|
||||
root1_container = find_one(rendered, Div(data_node_id=root1.id))
|
||||
root2_container = find_one(rendered, Div(data_node_id=root2.id))
|
||||
|
||||
|
||||
expected_root1 = Div(
|
||||
Div(
|
||||
Div(None), # No icon, leaf node
|
||||
@@ -844,7 +1021,7 @@ class TestTreeViewRender:
|
||||
cls="mf-treenode-container",
|
||||
data_node_id=root1.id
|
||||
)
|
||||
|
||||
|
||||
expected_root2 = Div(
|
||||
Div(
|
||||
Div(None), # No icon, leaf node
|
||||
@@ -855,6 +1032,6 @@ class TestTreeViewRender:
|
||||
cls="mf-treenode-container",
|
||||
data_node_id=root2.id
|
||||
)
|
||||
|
||||
|
||||
assert matches(root1_container, expected_root1)
|
||||
assert matches(root2_container, expected_root2)
|
||||
|
||||
Reference in New Issue
Block a user