test(techdemo): shorten generated resource paths

Import scoped generated handles and slots in techdemo tests so assertions read as local resources instead of fully-qualified generated paths.

req: component/003

req: dx/006
This commit is contained in:
slhx agent
2026-06-01 23:03:34 +02:00
parent ef3323831f
commit a8d4604da8
2 changed files with 23 additions and 20 deletions
+12 -11
View File
@@ -1,4 +1,5 @@
use slhx_techdemo::ui; use slhx_techdemo::ui::control_center::{handles, slots};
use slhx_techdemo::ui::issue_card::handles as card_handles;
use std::process::{Child, Command, Stdio}; use std::process::{Child, Command, Stdio};
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use thirtyfour::prelude::*; use thirtyfour::prelude::*;
@@ -56,11 +57,11 @@ async fn browser_drives_typed_product_end_to_end() -> WebDriverResult<()> {
wait_for_text(&driver, "#probe-island [data-island-readout]", "probe live").await?; wait_for_text(&driver, "#probe-island [data-island-readout]", "probe live").await?;
driver driver
.find(By::Css(&handle_selector(ui::control_center::handles::simulate_push))) .find(By::Css(&handle_selector(handles::simulate_push)))
.await? .await?
.click() .click()
.await?; .await?;
wait_for_text(&driver, &slot_selector(ui::control_center::slots::notice), "Push simulated").await?; wait_for_text(&driver, &slot_selector(slots::notice), "Push simulated").await?;
wait_for_text(&driver, "[data-island-readout]", "activity rows").await?; wait_for_text(&driver, "[data-island-readout]", "activity rows").await?;
driver.find(By::Css("button.primary-action")).await?.click().await?; driver.find(By::Css("button.primary-action")).await?.click().await?;
@@ -69,41 +70,41 @@ async fn browser_drives_typed_product_end_to_end() -> WebDriverResult<()> {
drag_card_to_lane(&driver, 2, "product").await?; drag_card_to_lane(&driver, 2, "product").await?;
wait_for_text(&driver, ".lane[data-lane='product'] .work-card[data-key='2']", "Shipped").await?; wait_for_text(&driver, ".lane[data-lane='product'] .work-card[data-key='2']", "Shipped").await?;
wait_for_text(&driver, &slot_selector(ui::control_center::slots::notice), "Drag-and-drop move persisted").await?; wait_for_text(&driver, &slot_selector(slots::notice), "Drag-and-drop move persisted").await?;
driver driver
.find(By::Css(&card_button_selector(ui::issue_card::handles::spotlight_work, 2))) .find(By::Css(&card_button_selector(card_handles::spotlight_work, 2)))
.await? .await?
.click() .click()
.await?; .await?;
wait_for_text( wait_for_text(
&driver, &driver,
&slot_selector(ui::control_center::slots::inspector), &slot_selector(slots::inspector),
"Stream typed presence · lane=Product · stage=Shipped · impact=7", "Stream typed presence · lane=Product · stage=Shipped · impact=7",
) )
.await?; .await?;
driver driver
.find(By::Css(&card_button_selector(ui::issue_card::handles::advance_work, 3))) .find(By::Css(&card_button_selector(card_handles::advance_work, 3)))
.await? .await?
.click() .click()
.await?; .await?;
wait_for_text(&driver, ".lane[data-lane='product'] .work-card[data-key='3']", "Active").await?; wait_for_text(&driver, ".lane[data-lane='product'] .work-card[data-key='3']", "Active").await?;
driver driver
.find(By::Css(&handle_selector(ui::control_center::handles::simulate_push))) .find(By::Css(&handle_selector(handles::simulate_push)))
.await? .await?
.click() .click()
.await?; .await?;
wait_for_text(&driver, &slot_selector(ui::control_center::slots::live_feed), "SSE tick").await?; wait_for_text(&driver, &slot_selector(slots::live_feed), "SSE tick").await?;
driver.find(By::Css("a[href='/architecture']")).await?.click().await?; driver.find(By::Css("a[href='/architecture']")).await?.click().await?;
wait_for_text(&driver, &slot_selector(ui::control_center::slots::inspector), "Page swap").await?; wait_for_text(&driver, &slot_selector(slots::inspector), "Page swap").await?;
wait_for_text(&driver, "[data-island-readout]", "activity rows").await?; wait_for_text(&driver, "[data-island-readout]", "activity rows").await?;
assert!(driver.current_url().await?.as_str().ends_with("/architecture")); assert!(driver.current_url().await?.as_str().ends_with("/architecture"));
driver.goto(&format!("http://{APP_ADDR}/")).await?; driver.goto(&format!("http://{APP_ADDR}/")).await?;
wait_for_text(&driver, &slot_selector(ui::control_center::slots::live_feed), "SSE tick").await?; wait_for_text(&driver, &slot_selector(slots::live_feed), "SSE tick").await?;
Ok::<(), WebDriverError>(()) Ok::<(), WebDriverError>(())
} }
+11 -9
View File
@@ -1,6 +1,8 @@
use scraper::{Html, Selector}; use scraper::{Html, Selector};
use slhx::{Effect, EffectBatch, Payload, EFFECT_BATCH_ABI_VERSION}; use slhx::{Effect, EffectBatch, Payload, EFFECT_BATCH_ABI_VERSION};
use slhx_techdemo::ui; use slhx_techdemo::ui::BUILD_FINGERPRINT;
use slhx_techdemo::ui::issue_card::handles as card_handles;
use slhx_techdemo::ui::issue_lane::handles as lane_handles;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::net::TcpStream; use std::net::TcpStream;
use std::process::{Child, Command, Stdio}; use std::process::{Child, Command, Stdio};
@@ -116,32 +118,32 @@ fn product_is_e2e_working_over_http() {
let move_to_lane = post( let move_to_lane = post(
"/", "/",
&format!("__h={}&work_id=4&lane=runtime", ui::issue_lane::handles::move_to_lane), &format!("__h={}&work_id=4&lane=runtime", lane_handles::move_to_lane),
); );
assert_effect_response(&move_to_lane); assert_effect_response(&move_to_lane);
let move_to_lane_batch = move_to_lane.batch(); let move_to_lane_batch = move_to_lane.batch();
assert_card(&move_to_lane_batch, "Design hero moment", "Runtime", "Active", "width:99%"); assert_card(&move_to_lane_batch, "Design hero moment", "Runtime", "Active", "width:99%");
assert_payload_contains(&move_to_lane_batch, "Drag-and-drop move persisted"); assert_payload_contains(&move_to_lane_batch, "Drag-and-drop move persisted");
let inspect = post("/", &format!("__h={}&work_id=4", ui::issue_card::handles::spotlight_work)); let inspect = post("/", &format!("__h={}&work_id=4", card_handles::spotlight_work));
assert_effect_response(&inspect); assert_effect_response(&inspect);
let inspect_batch = inspect.batch(); let inspect_batch = inspect.batch();
assert_payload_contains(&inspect_batch, "Design hero moment · lane=Runtime"); assert_payload_contains(&inspect_batch, "Design hero moment · lane=Runtime");
assert_payload_contains(&inspect_batch, "Inspector focused"); assert_payload_contains(&inspect_batch, "Inspector focused");
let advance = post("/", &format!("__h={}&work_id=4", ui::issue_card::handles::advance_work)); let advance = post("/", &format!("__h={}&work_id=4", card_handles::advance_work));
assert_effect_response(&advance); assert_effect_response(&advance);
let advance_batch = advance.batch(); let advance_batch = advance.batch();
assert_payload_contains(&advance_batch, "Pipeline advanced"); assert_payload_contains(&advance_batch, "Pipeline advanced");
assert_payload_contains(&advance_batch, "<span class=\"pill\">Active</span>"); assert_payload_contains(&advance_batch, "<span class=\"pill\">Active</span>");
let advance_default = post("/", &format!("__h={}&work_id=5", ui::issue_card::handles::advance_work)); let advance_default = post("/", &format!("__h={}&work_id=5", card_handles::advance_work));
assert_effect_response(&advance_default); assert_effect_response(&advance_default);
let advance_default_batch = advance_default.batch(); let advance_default_batch = advance_default.batch();
assert_payload_contains(&advance_default_batch, "Default impact"); assert_payload_contains(&advance_default_batch, "Default impact");
assert_card(&advance_default_batch, "Default impact", "Compiler", "Active", "width:55%"); assert_card(&advance_default_batch, "Default impact", "Compiler", "Active", "width:55%");
let ship_default = post("/", &format!("__h={}&work_id=5", ui::issue_card::handles::advance_work)); let ship_default = post("/", &format!("__h={}&work_id=5", card_handles::advance_work));
assert_effect_response(&ship_default); assert_effect_response(&ship_default);
let ship_default_batch = ship_default.batch(); let ship_default_batch = ship_default.batch();
assert_card(&ship_default_batch, "Default impact", "Product", "Shipped", "width:55%"); assert_card(&ship_default_batch, "Default impact", "Product", "Shipped", "width:55%");
@@ -154,12 +156,12 @@ fn product_is_e2e_working_over_http() {
assert_payload_contains(&push_batch, "Simulated push event produced the same EffectBatch shape"); assert_payload_contains(&push_batch, "Simulated push event produced the same EffectBatch shape");
assert_emit(&push_batch, "slhx:island-orbit", "activity rows"); assert_emit(&push_batch, "slhx:island-orbit", "activity rows");
let delete_missing = post("/", &format!("__h={}&work_id=999", ui::issue_card::handles::delete_work)); let delete_missing = post("/", &format!("__h={}&work_id=999", card_handles::delete_work));
assert_effect_response(&delete_missing); assert_effect_response(&delete_missing);
let delete_missing_batch = delete_missing.batch(); let delete_missing_batch = delete_missing.batch();
assert_payload_not_contains(&delete_missing_batch, "Deleted card #999"); assert_payload_not_contains(&delete_missing_batch, "Deleted card #999");
let delete = post("/", &format!("__h={}&work_id=4", ui::issue_card::handles::delete_work)); let delete = post("/", &format!("__h={}&work_id=4", card_handles::delete_work));
assert_effect_response(&delete); assert_effect_response(&delete);
let delete_batch = delete.batch(); let delete_batch = delete.batch();
assert_payload_contains(&delete_batch, "Card removed"); assert_payload_contains(&delete_batch, "Card removed");
@@ -187,7 +189,7 @@ fn product_is_e2e_working_over_http() {
fn assert_effect_response(response: &Response) { fn assert_effect_response(response: &Response) {
assert_eq!(response.status, 200); assert_eq!(response.status, 200);
assert!(response.header("content-type").contains("application/slhx")); assert!(response.header("content-type").contains("application/slhx"));
assert_eq!(response.header("x-slhx-fingerprint"), ui::BUILD_FINGERPRINT.0.to_string()); assert_eq!(response.header("x-slhx-fingerprint"), BUILD_FINGERPRINT.0.to_string());
let batch = response.batch(); let batch = response.batch();
assert_eq!(batch.abi_version, EFFECT_BATCH_ABI_VERSION); assert_eq!(batch.abi_version, EFFECT_BATCH_ABI_VERSION);
assert!(!batch.ops.is_empty()); assert!(!batch.ops.is_empty());