Skip to content

Commit 43e3720

Browse files
authored
test(transform): cover hydrate trigger validation with Angular's cases (#502)
- Each test uses the template and expected error of the matching `hydrate` case in Angular's `r3_template_transform_spec.ts`, which the conformance fixture extracts without assertions.
1 parent d0d3fae commit 43e3720

1 file changed

Lines changed: 96 additions & 0 deletions

File tree

‎crates/oxc_angular_compiler/tests/r3_template_transform_test.rs‎

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,6 +1582,102 @@ mod viewport_arity_validation {
15821582
}
15831583
}
15841584

1585+
// ============================================================================
1586+
// Tests: hydrate trigger validation
1587+
// Mirrors the `hydrate` error cases in Angular's r3_template_transform_spec.ts.
1588+
// ============================================================================
1589+
1590+
mod hydrate_trigger_validation {
1591+
use super::*;
1592+
1593+
#[test]
1594+
fn should_report_parameter_passed_to_hydrate_trigger_with_reference_based_equivalent() {
1595+
let errors = get_transform_errors(
1596+
"@defer (on interaction(button); hydrate on interaction(button)) {hello}",
1597+
);
1598+
assert!(
1599+
errors
1600+
.iter()
1601+
.any(|e| e.contains("Hydration trigger \"interaction\" cannot have parameters")),
1602+
"Expected a hydrate interaction parameter error, got: {errors:?}"
1603+
);
1604+
}
1605+
1606+
#[test]
1607+
fn should_not_report_missing_reference_on_hydrate_trigger() {
1608+
let errors = get_transform_errors("@defer (on immediate; hydrate on viewport) {hello}");
1609+
assert!(errors.is_empty(), "Expected no errors, got: {errors:?}");
1610+
}
1611+
1612+
#[test]
1613+
fn should_report_never_trigger_used_without_hydrate() {
1614+
for template in [
1615+
"@defer (on immediate; never) {hello}",
1616+
"@defer (on immediate; prefetch never) {hello}",
1617+
] {
1618+
let errors = get_transform_errors(template);
1619+
assert!(
1620+
errors.iter().any(|e| e.contains("Unrecognized trigger")),
1621+
"Expected an unrecognized trigger error for {template}, got: {errors:?}"
1622+
);
1623+
}
1624+
}
1625+
1626+
#[test]
1627+
fn should_report_hydrate_never_used_with_additional_characters() {
1628+
let errors = get_transform_errors("@defer (hydrate never, and thank you) {hello}");
1629+
assert!(
1630+
errors.iter().any(|e| e.contains("Unrecognized trigger")),
1631+
"Expected an unrecognized trigger error, got: {errors:?}"
1632+
);
1633+
}
1634+
1635+
#[test]
1636+
fn should_not_report_an_error_when_hydrate_never_is_used_with_additional_blocks() {
1637+
let errors = get_transform_errors("@defer (hydrate never; on idle;) {hello}");
1638+
assert!(
1639+
!errors.iter().any(|e| e.contains("Unrecognized trigger")),
1640+
"Expected no unrecognized trigger error, got: {errors:?}"
1641+
);
1642+
}
1643+
1644+
#[test]
1645+
fn should_not_report_an_error_when_hydrate_never_is_used_with_spaces() {
1646+
let errors = get_transform_errors("@defer(hydrate never ; on idle ;) {hello}");
1647+
assert!(
1648+
!errors.iter().any(|e| e.contains("Unrecognized trigger")),
1649+
"Expected no unrecognized trigger error, got: {errors:?}"
1650+
);
1651+
}
1652+
1653+
#[test]
1654+
fn should_not_report_an_error_when_hydrate_never_is_used_after_another_block() {
1655+
let errors =
1656+
get_transform_errors("@defer(\n on idle;\n hydrate never) {hello}");
1657+
assert!(
1658+
!errors.iter().any(|e| e.contains("Unrecognized trigger")),
1659+
"Expected no unrecognized trigger error, got: {errors:?}"
1660+
);
1661+
}
1662+
1663+
#[test]
1664+
fn should_report_when_hydrate_never_is_used_together_with_another_hydrate_trigger() {
1665+
// Extra trigger after and before `hydrate never`.
1666+
for template in [
1667+
"@defer (hydrate never; hydrate when shouldHydrate()) {hello}",
1668+
"@defer (hydrate when shouldHydrate(); hydrate never) {hello}",
1669+
] {
1670+
let errors = get_transform_errors(template);
1671+
assert!(
1672+
errors.iter().any(|e| e.contains(
1673+
"Cannot specify additional `hydrate` triggers if `hydrate never` is present"
1674+
)),
1675+
"Expected a hydrate never conflict error for {template}, got: {errors:?}"
1676+
);
1677+
}
1678+
}
1679+
}
1680+
15851681
// ============================================================================
15861682
// Tests: @for error cascade (Finding #4)
15871683
// Angular only reports the parse-expression error for `@for (x of ) {}`,

0 commit comments

Comments
 (0)