@@ -1523,6 +1523,102 @@ def test_create_segment_with_optional_metadata_returns_201(
15231523 assert response .json ()["metadata" ][0 ]["field_value" ] == str (field_value )
15241524
15251525
1526+ def test_create_multiple_segments_with_metadata_keeps_metadata_isolated (
1527+ project : Project ,
1528+ admin_client_new : APIClient ,
1529+ optional_b_segment_metadata_field : MetadataModelField ,
1530+ ) -> None :
1531+ """
1532+ Test that creating multiple segments with metadata keeps metadata properly isolated.
1533+ This is a regression test for the bug where creating a second segment would remove
1534+ metadata from the first segment if the user sent the first segment's metadata ID.
1535+ """
1536+ # Given
1537+ url = reverse ("api-v1:projects:project-segments-list" , args = [project .id ])
1538+
1539+ # Create first segment with metadata
1540+ first_segment_data = {
1541+ "name" : "First Segment" ,
1542+ "description" : "First segment description" ,
1543+ "project" : project .id ,
1544+ "rules" : [{"type" : "ALL" , "rules" : [], "conditions" : []}],
1545+ "metadata" : [
1546+ {
1547+ "model_field" : optional_b_segment_metadata_field .id ,
1548+ "field_value" : "100" ,
1549+ },
1550+ ],
1551+ }
1552+
1553+ # When - Create first segment
1554+ first_response = admin_client_new .post (
1555+ url , data = json .dumps (first_segment_data ), content_type = "application/json"
1556+ )
1557+
1558+ # Then - First segment should be created successfully
1559+ assert first_response .status_code == status .HTTP_201_CREATED
1560+ first_segment_id = first_response .json ()["id" ]
1561+ first_metadata = first_response .json ()["metadata" ]
1562+ assert len (first_metadata ) == 1
1563+ assert first_metadata [0 ]["field_value" ] == "100"
1564+ first_metadata_id = first_metadata [0 ]["id" ]
1565+
1566+ # Given - Create second segment
1567+ second_segment_data = {
1568+ "name" : "Second Segment" ,
1569+ "description" : "Second segment description" ,
1570+ "project" : project .id ,
1571+ "rules" : [{"type" : "ALL" , "rules" : [], "conditions" : []}],
1572+ "metadata" : [
1573+ {
1574+ "id" : first_metadata_id , # user mistakenly sends existing metadata ID
1575+ "model_field" : optional_b_segment_metadata_field .id ,
1576+ "field_value" : "200" ,
1577+ },
1578+ ],
1579+ }
1580+
1581+ # When - Create second segment
1582+ second_response = admin_client_new .post (
1583+ url , data = json .dumps (second_segment_data ), content_type = "application/json"
1584+ )
1585+
1586+ # Then - Second segment should be created successfully
1587+ assert second_response .status_code == status .HTTP_201_CREATED
1588+ second_segment_id = second_response .json ()["id" ]
1589+ second_metadata = second_response .json ()["metadata" ]
1590+ assert len (second_metadata ) == 1
1591+ assert second_metadata [0 ]["field_value" ] == "200"
1592+ # The metadata ID should be different (new metadata instance created)
1593+ assert second_metadata [0 ]["id" ] != first_metadata_id
1594+
1595+ # When - Retrieve first segment to verify metadata is still there
1596+ first_segment_url = reverse (
1597+ "api-v1:projects:project-segments-detail" , args = [project .id , first_segment_id ]
1598+ )
1599+ first_segment_check = admin_client_new .get (first_segment_url )
1600+
1601+ # Then - First segment should still have its metadata
1602+ assert first_segment_check .status_code == status .HTTP_200_OK
1603+ first_segment_metadata_after = first_segment_check .json ()["metadata" ]
1604+ assert len (first_segment_metadata_after ) == 1
1605+ assert first_segment_metadata_after [0 ]["field_value" ] == "100"
1606+ assert first_segment_metadata_after [0 ]["id" ] == first_metadata_id
1607+
1608+ # When - Retrieve second segment to verify metadata
1609+ second_segment_url = reverse (
1610+ "api-v1:projects:project-segments-detail" , args = [project .id , second_segment_id ]
1611+ )
1612+ second_segment_check = admin_client_new .get (second_segment_url )
1613+
1614+ # Then - Second segment should have its own metadata
1615+ assert second_segment_check .status_code == status .HTTP_200_OK
1616+ second_segment_metadata_after = second_segment_check .json ()["metadata" ]
1617+ assert len (second_segment_metadata_after ) == 1
1618+ assert second_segment_metadata_after [0 ]["field_value" ] == "200"
1619+ assert second_segment_metadata_after [0 ]["id" ] != first_metadata_id
1620+
1621+
15261622def test_update_segment_evades_max_conditions_when_whitelisted (
15271623 project : Project ,
15281624 admin_client : APIClient ,
0 commit comments