@@ -7,6 +7,12 @@ namespace PrompterOne.Web.UITests;
77[ ClassDataSource < StandaloneAppFixture > ( Shared = SharedType . PerClass ) ]
88public sealed class SettingsLayoutFlowTests ( StandaloneAppFixture fixture ) : AppUiTestBase ( fixture )
99{
10+ private static readonly ResponsiveViewport [ ] SettingsNavigationReachabilityViewports =
11+ [
12+ new ( "iphone-medium-portrait" , BrowserTestConstants . ResponsiveLayout . IphoneMediumWidth , BrowserTestConstants . ResponsiveLayout . IphoneMediumHeight ) ,
13+ new ( "ipad-mini-landscape" , BrowserTestConstants . ResponsiveLayout . IpadMiniHeight , BrowserTestConstants . ResponsiveLayout . IpadMiniWidth )
14+ ] ;
15+
1016 private sealed class ElementBounds
1117 {
1218 public double Left { get ; set ; }
@@ -58,6 +64,40 @@ await UiScenarioArtifacts.CapturePageAsync(
5864 BrowserTestConstants . SettingsFlow . DesktopLayoutStep ) ;
5965 } ) ;
6066
67+ [ Test ]
68+ public Task SettingsNavigation_PrioritizesRecordingBeforeCaptureAndStreamingControls ( ) =>
69+ RunPageAsync ( async page =>
70+ {
71+ await ShellRouteDriver . OpenSettingsAsync ( page ) ;
72+
73+ var navOrder = await ReadSettingsNavigationOrderAsync ( page ) ;
74+
75+ await Assert . That ( IndexOf ( navOrder , UiTestIds . Settings . NavRecording ) )
76+ . IsLessThan ( IndexOf ( navOrder , UiTestIds . Settings . NavCameras ) ) ;
77+ await Assert . That ( IndexOf ( navOrder , UiTestIds . Settings . NavRecording ) )
78+ . IsLessThan ( IndexOf ( navOrder , UiTestIds . Settings . NavMics ) ) ;
79+ await Assert . That ( IndexOf ( navOrder , UiTestIds . Settings . NavRecording ) )
80+ . IsLessThan ( IndexOf ( navOrder , UiTestIds . Settings . NavStreaming ) ) ;
81+ } ) ;
82+
83+ [ Test ]
84+ public Task SettingsNavigation_RecordingPanelRemainsReachableAcrossResponsiveLayouts ( ) =>
85+ RunPageAsync ( async page =>
86+ {
87+ foreach ( var viewport in SettingsNavigationReachabilityViewports )
88+ {
89+ await page . SetViewportSizeAsync ( viewport . Width , viewport . Height ) ;
90+ await ShellRouteDriver . OpenSettingsAsync ( page , viewport . Name ) ;
91+
92+ var recordingNav = page . GetByTestId ( UiTestIds . Settings . NavRecording ) ;
93+ await recordingNav . ScrollIntoViewIfNeededAsync ( ) ;
94+ await UiInteractionDriver . ClickAndContinueAsync ( recordingNav ) ;
95+
96+ await Expect ( page . GetByTestId ( UiTestIds . Settings . RecordingPanel ) ) . ToBeVisibleAsync (
97+ new ( ) { Timeout = BrowserTestConstants . Timing . ExtendedVisibleTimeoutMs } ) ;
98+ }
99+ } ) ;
100+
61101 private static Task < ElementBounds > ReadBoundsAsync ( ILocator locator ) =>
62102 locator . EvaluateAsync < ElementBounds > (
63103 """
@@ -70,4 +110,25 @@ private static Task<ElementBounds> ReadBoundsAsync(ILocator locator) =>
70110 };
71111 }
72112 """ ) ;
113+
114+ private static Task < string [ ] > ReadSettingsNavigationOrderAsync ( IPage page ) =>
115+ page . EvaluateAsync < string [ ] > (
116+ """
117+ () => Array.from(document.querySelectorAll('.set-nav [data-test]'))
118+ .map(element => element.getAttribute('data-test') ?? '')
119+ .filter(Boolean)
120+ """ ) ;
121+
122+ private static int IndexOf ( IReadOnlyList < string > values , string value )
123+ {
124+ for ( var index = 0 ; index < values . Count ; index ++ )
125+ {
126+ if ( string . Equals ( values [ index ] , value , StringComparison . Ordinal ) )
127+ {
128+ return index ;
129+ }
130+ }
131+
132+ throw new InvalidOperationException ( $ "Expected settings navigation item '{ value } ' to be present.") ;
133+ }
73134}
0 commit comments