merge: incorporate main's safearea/auto-order/vacaciones fixes

This commit is contained in:
2026-08-01 12:54:53 +02:00
9 changed files with 542 additions and 64 deletions
@@ -614,4 +614,144 @@ void main() {
},
);
});
group('fix vacaciones-delete: el editor ofrece una accion de eliminar solo '
'al editar un rango existente, reusando _confirmarEliminarRango y '
'eliminarRangoVacaciones exactamente como el swipe', () {
testWidgets(
'creando un rango NUEVO (CTA "Anadir rango"), el editor NO muestra '
'una accion de eliminar -- no hay nada que borrar todavia',
(tester) async {
final estado = await _crearEstado();
addTearDown(estado.dispose);
await tester.pumpWidget(_buildScreen(estado));
await _pumpEstable(tester);
final l10n = AppLocalizations.of(
tester.element(find.byType(PantallaVacaciones)),
);
await tester.tap(find.text(l10n.addVacationRangeCta));
await _pumpEstable(tester);
expect(find.text(l10n.newVacationRangeTitle), findsOneWidget);
expect(
find.byKey(const ValueKey('vacation-delete-button')),
findsNothing,
);
},
);
testWidgets('editando un rango EXISTENTE (tap en su tarjeta), el editor SI '
'muestra una accion de eliminar junto al boton de guardar', (
tester,
) async {
final estado = await _crearEstado(
vacaciones: [
RangoVacaciones(
id: 'f2',
nombre: 'Verano',
inicio: _hoyDia.add(const Duration(days: 20)),
fin: _hoyDia.add(const Duration(days: 25)),
),
],
);
addTearDown(estado.dispose);
await tester.pumpWidget(_buildScreen(estado));
await _pumpEstable(tester);
await tester.tap(find.byKey(const ValueKey('vacaciones-tarjeta-f2')));
await _pumpEstable(tester);
final l10n = AppLocalizations.of(
tester.element(find.byType(PantallaVacaciones)),
);
expect(find.text(l10n.editVacationRangeTitle), findsOneWidget);
expect(
find.byKey(const ValueKey('vacation-delete-button')),
findsOneWidget,
);
});
testWidgets(
'tocar eliminar en el editor pide confirmacion (misma que el swipe); '
'cancelar conserva el rango y el editor sigue abierto',
(tester) async {
final estado = await _crearEstado(
vacaciones: [
RangoVacaciones(
id: 'f2',
nombre: 'Verano',
inicio: _hoyDia.add(const Duration(days: 20)),
fin: _hoyDia.add(const Duration(days: 25)),
),
],
);
addTearDown(estado.dispose);
await tester.pumpWidget(_buildScreen(estado));
await _pumpEstable(tester);
final l10n = AppLocalizations.of(
tester.element(find.byType(PantallaVacaciones)),
);
await tester.tap(find.byKey(const ValueKey('vacaciones-tarjeta-f2')));
await _pumpEstable(tester);
await tester.tap(find.byKey(const ValueKey('vacation-delete-button')));
await _pumpEstable(tester);
expect(find.text(l10n.vacationDeleteConfirmTitle), findsOneWidget);
await tester.tap(find.text(l10n.cancelAction));
await _pumpEstable(tester);
expect(estado.vacaciones, hasLength(1));
expect(find.text(l10n.editVacationRangeTitle), findsOneWidget);
},
);
testWidgets('tocar eliminar en el editor y confirmar llama a '
'eliminarRangoVacaciones y cierra el editor (mismo efecto que el '
'swipe, sin pasar por _guardar)', (tester) async {
final estado = await _crearEstado(
vacaciones: [
RangoVacaciones(
id: 'f2',
nombre: 'Verano',
inicio: _hoyDia.add(const Duration(days: 20)),
fin: _hoyDia.add(const Duration(days: 25)),
),
],
);
addTearDown(estado.dispose);
await tester.pumpWidget(_buildScreen(estado));
await _pumpEstable(tester);
final l10n = AppLocalizations.of(
tester.element(find.byType(PantallaVacaciones)),
);
await tester.tap(find.byKey(const ValueKey('vacaciones-tarjeta-f2')));
await _pumpEstable(tester);
await tester.tap(find.byKey(const ValueKey('vacation-delete-button')));
await _pumpEstable(tester);
expect(find.text(l10n.vacationDeleteConfirmTitle), findsOneWidget);
// `find.widgetWithText(FilledButton, ...)`, not a bare
// `find.text(...)`: the sheet's own OutlinedButton delete action
// (same "Eliminar" label) is still in the tree behind the dialog,
// so a bare text finder would ambiguously match both.
await tester.tap(find.widgetWithText(FilledButton, l10n.deleteAction));
await _pumpEstable(tester);
expect(estado.vacaciones, isEmpty);
expect(
find.text(l10n.editVacationRangeTitle),
findsNothing,
reason: 'the sheet must pop, exactly like a successful _guardar',
);
});
});
}