@@ -49,7 +49,7 @@ def _seg(
4949 index = index ,
5050 timestamp = BASE_TIME + timedelta (seconds = ts_offset_seconds ),
5151 content = TextContent (text = text ),
52- properties = properties ,
52+ properties = properties or {} ,
5353 )
5454
5555
@@ -161,6 +161,36 @@ async def test_register_empty_links_still_validates_active(
161161 await linker .register_segments (PARTITION_KEY , {}, active = [unknown ])
162162
163163
164+ @pytest .mark .asyncio
165+ async def test_register_rejects_existing_derivative_not_declared_active (
166+ linker : SQLAlchemySegmentLinker ,
167+ ) -> None :
168+ """Linking to an existing derivative without declaring it active is an error."""
169+ seg1 = _seg (ts_offset_seconds = 0 )
170+ deriv = uuid4 ()
171+ await linker .register_segments (PARTITION_KEY , {seg1 : [deriv ]})
172+
173+ seg2 = _seg (ts_offset_seconds = 1 )
174+ with pytest .raises (DerivativeNotActiveError ):
175+ await linker .register_segments (PARTITION_KEY , {seg2 : [deriv ]})
176+
177+
178+ @pytest .mark .asyncio
179+ async def test_register_allows_existing_derivative_declared_active (
180+ linker : SQLAlchemySegmentLinker ,
181+ ) -> None :
182+ """Linking to an existing derivative works when declared active."""
183+ seg1 = _seg (ts_offset_seconds = 0 )
184+ deriv = uuid4 ()
185+ await linker .register_segments (PARTITION_KEY , {seg1 : [deriv ]})
186+
187+ seg2 = _seg (ts_offset_seconds = 1 )
188+ await linker .register_segments (PARTITION_KEY , {seg2 : [deriv ]}, active = [deriv ])
189+
190+ result = await linker .get_segments_by_derivatives (PARTITION_KEY , [deriv ])
191+ assert len (list (result [deriv ])) == 2
192+
193+
164194# ===================================================================
165195# get_segments_by_derivatives
166196# ===================================================================
@@ -369,7 +399,9 @@ async def test_contexts_with_properties(linker: SQLAlchemySegmentLinker) -> None
369399 s1 = _seg (episode_uuid = ep , index = 1 , ts_offset_seconds = 1 , properties = {"k" : "v1" })
370400 s2 = _seg (episode_uuid = ep , index = 2 , ts_offset_seconds = 2 , properties = {"k" : "v2" })
371401 deriv = uuid4 ()
372- await linker .register_segments (PARTITION_KEY , {s0 : [deriv ], s1 : [deriv ], s2 : [deriv ]})
402+ await linker .register_segments (
403+ PARTITION_KEY , {s0 : [deriv ], s1 : [deriv ], s2 : [deriv ]}
404+ )
373405
374406 result = await linker .get_segment_contexts (
375407 PARTITION_KEY , [s1 .uuid ], max_backward_segments = 1 , max_forward_segments = 1
@@ -417,7 +449,9 @@ async def test_contexts_session_isolation(linker: SQLAlchemySegmentLinker) -> No
417449 s_after = _seg (episode_uuid = ep , index = 2 , ts_offset_seconds = 2 )
418450 deriv = uuid4 ()
419451 await linker .register_segments ("other-session" , {s_other : [deriv ]})
420- await linker .register_segments (PARTITION_KEY , {s_seed : [deriv ], s_after : [deriv ]})
452+ await linker .register_segments (
453+ PARTITION_KEY , {s_seed : [deriv ], s_after : [deriv ]}, active = [deriv ]
454+ )
421455
422456 result = await linker .get_segment_contexts (
423457 PARTITION_KEY ,
@@ -469,7 +503,7 @@ async def test_delete_by_episodes(linker: SQLAlchemySegmentLinker) -> None:
469503
470504
471505@pytest .mark .asyncio
472- async def test_delete_by_episodes_decrements_refcount (
506+ async def test_delete_by_episodes_decrements_ref_count (
473507 linker : SQLAlchemySegmentLinker ,
474508) -> None :
475509 ep = uuid4 ()
0 commit comments