From c7886614cd7f1da522bb6942e6b0b8c98445e524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Poizat?= Date: Thu, 11 Dec 2025 13:53:39 +0100 Subject: [PATCH] Add tests to AI scribe calculcateModalPosition --- .../ai/presentation/widgets/ai_scribe.dart | 6 +- .../presentation/widgets/ai_scribe_test.dart | 143 ++++++++++++++++++ 2 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 scribe/test/scribe/ai/presentation/widgets/ai_scribe_test.dart diff --git a/scribe/lib/scribe/ai/presentation/widgets/ai_scribe.dart b/scribe/lib/scribe/ai/presentation/widgets/ai_scribe.dart index f517d568f..31c6ba778 100644 --- a/scribe/lib/scribe/ai/presentation/widgets/ai_scribe.dart +++ b/scribe/lib/scribe/ai/presentation/widgets/ai_scribe.dart @@ -67,7 +67,7 @@ Future showAIScribeDialog({ ); if (buttonPosition != null) { - final position = _calculateModalPosition( + final position = calculateModalPosition( context: context, buttonPosition: buttonPosition, modalWidth: AIScribeSizes.barWidth, @@ -127,7 +127,7 @@ Future showAIScribeDialog({ ? screenSize.width * AIScribeSizes.mobileWidthPercentage : AIScribeSizes.modalMaxWidthLargeScreen; - final position = _calculateModalPosition( + final position = calculateModalPosition( context: context, buttonPosition: buttonPosition, modalWidth: modalWidth, @@ -158,7 +158,7 @@ Future showAIScribeDialog({ ); } -({double left, double bottom}) _calculateModalPosition({ +({double left, double bottom}) calculateModalPosition({ required BuildContext context, required Offset buttonPosition, required double modalWidth, diff --git a/scribe/test/scribe/ai/presentation/widgets/ai_scribe_test.dart b/scribe/test/scribe/ai/presentation/widgets/ai_scribe_test.dart new file mode 100644 index 000000000..1a2cf7acb --- /dev/null +++ b/scribe/test/scribe/ai/presentation/widgets/ai_scribe_test.dart @@ -0,0 +1,143 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:scribe/scribe/ai/presentation/styles/ai_scribe_styles.dart'; +import 'package:scribe/scribe/ai/presentation/widgets/ai_scribe.dart'; + +void main() { + group('calculateModalPosition::', () { + testWidgets('should adjust left position when modal would go off-screen to the right', (tester) async { + // Arrange + const screenSize = Size(800, 600); + const buttonPosition = Offset(700, 300); // Close to right edge + const modalWidth = 440.0; + BuildContext? capturedContext; + + await tester.pumpWidget( + MaterialApp( + home: MediaQuery( + data: const MediaQueryData(size: screenSize), + child: Builder( + builder: (context) { + capturedContext = context; + return Container(); + }, + ), + ), + ), + ); + + // Act + final position = calculateModalPosition( + context: capturedContext!, + buttonPosition: buttonPosition, + modalWidth: modalWidth, + ); + + // Assert + final expectedLeft = screenSize.width - modalWidth - AIScribeSizes.screenEdgePadding; + expect(position.left, expectedLeft); + }); + + testWidgets('should adjust left position to screenEdgePadding when modal would go off-screen to the left', (tester) async { + // Arrange + const screenSize = Size(800, 600); + const buttonPosition = Offset(5, 300); // Very close to left edge + const modalWidth = 440.0; + BuildContext? capturedContext; + + await tester.pumpWidget( + MaterialApp( + home: MediaQuery( + data: const MediaQueryData(size: screenSize), + child: Builder( + builder: (context) { + capturedContext = context; + return Container(); + }, + ), + ), + ), + ); + + // Act + final position = calculateModalPosition( + context: capturedContext!, + buttonPosition: buttonPosition, + modalWidth: modalWidth, + ); + + // Assert + expect(position.left, AIScribeSizes.screenEdgePadding); + }); + + testWidgets('should adjust bottom position when modal height is provided and would go off-screen to the top', (tester) async { + // Arrange + const screenSize = Size(800, 600); + const buttonPosition = Offset(100, 50); // Close to top + const modalWidth = 440.0; + const modalHeight = 400.0; + BuildContext? capturedContext; + + await tester.pumpWidget( + MaterialApp( + home: MediaQuery( + data: const MediaQueryData(size: screenSize), + child: Builder( + builder: (context) { + capturedContext = context; + return Container(); + }, + ), + ), + ), + ); + + // Act + final position = calculateModalPosition( + context: capturedContext!, + buttonPosition: buttonPosition, + modalWidth: modalWidth, + modalHeight: modalHeight, + ); + + // Assert + final expectedBottom = screenSize.height - modalHeight - AIScribeSizes.screenEdgePadding; + expect(position.bottom, expectedBottom); + }); + + testWidgets('should adjust bottom position to screenEdgePadding when calculated bottom is too small', (tester) async { + // Arrange + const screenSize = Size(800, 600); + const buttonPosition = Offset(100, 595); // Very close to bottom edge + const modalWidth = 440.0; + const modalHeight = 400.0; + BuildContext? capturedContext; + + await tester.pumpWidget( + MaterialApp( + home: MediaQuery( + data: const MediaQueryData(size: screenSize), + child: Builder( + builder: (context) { + capturedContext = context; + return Container(); + }, + ), + ), + ), + ); + + // Act + final position = calculateModalPosition( + context: capturedContext!, + buttonPosition: buttonPosition, + modalWidth: modalWidth, + modalHeight: modalHeight, + ); + + // Assert + // bottom = 600 - 595 + 8 = 13, which is < 16, so it should be adjusted to 16 + expect(position.bottom, AIScribeSizes.screenEdgePadding); + }); + }); +}