Promote anal hardcore action routing

This commit is contained in:
2026-06-27 19:11:44 +02:00
parent 08627be954
commit 658743d876
8 changed files with 32 additions and 14 deletions
+1 -1
View File
@@ -295,7 +295,7 @@ HARDCORE_ROUTE_CASES = (
"subcategory": "Anal and double penetration",
"focus": "anal_only",
"family": "anal",
"expected_route": {"position_family": "anal"},
"expected_route": {"action_family": "anal", "position_family": "anal"},
"expected_terms": {
"krea": ("anal",),
"sdxl": ("anal sex",),
+7
View File
@@ -4909,6 +4909,10 @@ def smoke_hardcore_position_config_policy() -> None:
category_template_metadata.template_action_family({"action_family": "manual stimulation"}) == "manual",
"Template action-family normalizer should accept subcategory-style aliases",
)
_expect(
category_template_metadata.template_action_family({"action_family": "anal sex"}) == "anal",
"Template action-family normalizer should accept anal aliases",
)
_expect(
category_template_metadata.template_position_family({"position_family": "penetration"}) == "penetrative",
"Template position-family normalizer should accept action-style aliases",
@@ -5520,6 +5524,7 @@ def smoke_hardcore_category_routes() -> None:
("hardcore_penetration", "Penetrative sex", "penetration_only", "penetrative", {"penetration", "default"}, "penetrative sex", "penetrative action"),
("hardcore_oral", "Oral sex", "oral_only", "oral", {"oral"}, "oral sex", "oral action"),
("hardcore_manual", "Manual stimulation", "manual_only", "manual", {"manual"}, "manual stimulation", "manual action"),
("hardcore_anal", "Anal and double penetration", "anal_only", "anal", {"anal", "toy_double"}, "anal sex", "anal action"),
("hardcore_outercourse", "Outercourse and genital teasing", "outercourse_only", "outercourse", {"outercourse"}, "outercourse", "non-penetrative action"),
("hardcore_foreplay", "Foreplay and teasing", "foreplay_only", "foreplay", {"foreplay"}, "foreplay", "foreplay action"),
("hardcore_aftercare", "Aftercare and cleanup", "interaction_only", "interaction", {"foreplay"}, "interaction", "interaction beat"),
@@ -6708,6 +6713,7 @@ def smoke_pov_anal_position_routes() -> None:
_expect_pair(pair, name)
hard_row = pair.get("hardcore_row") or {}
_expect(hard_row.get("position_family") == "anal", f"{name} position_family should be anal")
_expect(hard_row.get("action_family") == "anal", f"{name} action_family should be anal")
_expect(position_key in (hard_row.get("position_keys") or []), f"{name} lost position key {position_key!r}")
role_graph = _expect_text(f"{name}.source_role_graph", hard_row.get("source_role_graph"), 40).lower()
for term in role_terms:
@@ -6752,6 +6758,7 @@ def smoke_double_front_back_route() -> None:
_expect_pair(pair, "double_front_back_route")
hard_row = pair.get("hardcore_row") or {}
_expect(hard_row.get("position_family") == "anal", "double route position_family should be anal")
_expect(hard_row.get("action_family") == "toy_double", "double route action_family should stay toy_double")
_expect("front_back" in (hard_row.get("position_keys") or []), "double route lost front_back key")
role_graph = _expect_text("double_front_back_route.source_role_graph", hard_row.get("source_role_graph"), 40).lower()
_expect("second penetration point from the front" in role_graph, f"double route role graph lost front/back placement: {role_graph}")