Skip to content

Commit 075a6b0

Browse files
committed
Prioritize recording settings tab (#44)
1 parent b12cf9e commit 075a6b0

2 files changed

Lines changed: 62 additions & 1 deletion

File tree

src/PrompterOne.Shared/Settings/Pages/SettingsPage.Navigation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ public partial class SettingsPage
1313
[
1414
new(SettingsSection.Cloud, UiIconKind.Cloud, UiTextKey.SettingsNavCloud, UiTestIds.Settings.NavCloud),
1515
new(SettingsSection.Files, UiIconKind.Folder, UiTextKey.SettingsNavFiles, UiTestIds.Settings.NavFiles),
16+
new(SettingsSection.Recording, UiIconKind.RecordTarget, UiTextKey.SettingsNavRecording, UiTestIds.Settings.NavRecording),
1617
new(SettingsSection.Cameras, UiIconKind.Camera, UiTextKey.SettingsNavCameras, UiTestIds.Settings.NavCameras),
1718
new(SettingsSection.Mics, UiIconKind.Microphone, UiTextKey.SettingsNavMicrophones, UiTestIds.Settings.NavMics),
1819
new(SettingsSection.Streaming, UiIconKind.ArrowRight, UiTextKey.SettingsNavStreaming, UiTestIds.Settings.NavStreaming),
19-
new(SettingsSection.Recording, UiIconKind.RecordTarget, UiTextKey.SettingsNavRecording, UiTestIds.Settings.NavRecording),
2020
new(SettingsSection.Ai, UiIconKind.Spark, UiTextKey.SettingsNavAi, UiTestIds.Settings.NavAi),
2121
new(SettingsSection.Appearance, UiIconKind.Theme, UiTextKey.SettingsNavAppearance, UiTestIds.Settings.NavAppearance),
2222
new(SettingsSection.Language, UiIconKind.Message, UiTextKey.SettingsNavLanguage, UiTestIds.Settings.NavLanguage),

tests/PrompterOne.Web.UITests.Shell/Settings/SettingsLayoutFlowTests.cs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ namespace PrompterOne.Web.UITests;
77
[ClassDataSource<StandaloneAppFixture>(Shared = SharedType.PerClass)]
88
public 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

Comments
 (0)