Skip to content

Commit afd9d31

Browse files
Merge pull request #485 from NeoCoderMatrix86/461-add-end-2-end-tests-for-mobile-devices
Add end 2 end tests for mobile devices
2 parents bd6ada7 + 8aa4736 commit afd9d31

19 files changed

Lines changed: 9011 additions & 369 deletions
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Microsoft.Playwright;
2+
3+
namespace AudioCuesheetEditor.End2EndTests.Models
4+
{
5+
internal class About(IPage page)
6+
{
7+
internal const string BaseUrl = "http://localhost:5132/about";
8+
9+
private readonly IPage _page = page;
10+
11+
internal ILocator AboutHeading => _page.GetByRole(AriaRole.Heading, new() { Name = "About AudioCuesheetEditor" });
12+
13+
internal async Task GotoAsync()
14+
{
15+
await _page.GotoAsync(BaseUrl);
16+
await _page.WaitForURLAsync(BaseUrl);
17+
await _page.WaitForLoadStateAsync(LoadState.NetworkIdle);
18+
}
19+
}
20+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using Microsoft.Playwright;
2+
using System.Text.RegularExpressions;
3+
4+
namespace AudioCuesheetEditor.End2EndTests.Models
5+
{
6+
internal class AppBar
7+
{
8+
internal const string BaseUrl = "http://localhost:5132/";
9+
10+
private readonly IPage _page;
11+
private readonly ILocator _menuButton;
12+
13+
internal ILocator UndoButton => _page.GetByRole(AriaRole.Button, new() { Name = "undo" });
14+
15+
internal ILocator RedoButton => _page.GetByRole(AriaRole.Button, new() { Name = "redo" });
16+
17+
internal ILocator HomeButton => _page.Locator(".mud-button-root").First;
18+
19+
internal AppBar(IPage page)
20+
{
21+
_page = page;
22+
_menuButton = _page.GetByRole(AriaRole.Toolbar)
23+
.GetByRole(AriaRole.Button)
24+
.Filter(new() { HasTextRegex = new Regex("^$") })
25+
.Nth(3);
26+
}
27+
28+
internal async Task GotoAsync()
29+
{
30+
await _page.GotoAsync(BaseUrl);
31+
await _page.WaitForURLAsync(BaseUrl);
32+
await _page.WaitForLoadStateAsync(LoadState.NetworkIdle);
33+
}
34+
35+
internal async Task OpenSettingsAsync()
36+
{
37+
await _menuButton.ClickAsync();
38+
await _page.GetByText("Settings").ClickAsync();
39+
}
40+
41+
internal async Task ChangeLanguageAsync(string language)
42+
{
43+
await _page.GetByRole(AriaRole.Button, new() { Name = "Change language" }).ClickAsync();
44+
await _page.GetByText(language).ClickAsync();
45+
}
46+
47+
internal async Task UndoAsync()
48+
{
49+
await UndoButton.ClickAsync();
50+
}
51+
52+
internal async Task RedoAsync()
53+
{
54+
await RedoButton.ClickAsync();
55+
}
56+
57+
internal async Task OpenFileAsync(string file)
58+
{
59+
await _page.GetByRole(AriaRole.Button, new() { Name = "File", Exact = true }).ClickAsync();
60+
await _page.Locator("div").Filter(new() { HasTextRegex = new Regex("^Open$") }).ClickAsync();
61+
await _page.Locator("#dropFileInputId_SelectFileDialog").GetByRole(AriaRole.Button, new() { Name = "Choose File" }).ClickAsync();
62+
await _page.Locator("#dropFileInputId_SelectFileDialog").GetByRole(AriaRole.Button, new() { Name = "Choose File" }).SetInputFilesAsync(file);
63+
}
64+
}
65+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
using Microsoft.Playwright;
2+
3+
namespace AudioCuesheetEditor.End2EndTests.Models
4+
{
5+
internal class DetailView(IPage page, bool mobile)
6+
{
7+
internal const string BaseUrl = "http://localhost:5132/";
8+
9+
private readonly IPage _page = page;
10+
private readonly bool _isMobile = mobile;
11+
12+
internal ILocator AudiofileInput => _page.GetByRole(AriaRole.Group).Filter(new() { HasText = "AudiofileAudiofile" }).Locator("input[type=\"file\"]");
13+
14+
internal ILocator CuesheetArtistInput => _page.GetByRole(AriaRole.Textbox, new() { Name = "Cuesheet artist" });
15+
16+
internal ILocator CuesheetTitleInput => _page.GetByRole(AriaRole.Textbox, new() { Name = "Cuesheet title" });
17+
18+
internal async Task GotoAsync()
19+
{
20+
await _page.GotoAsync(BaseUrl);
21+
await _page.WaitForURLAsync(BaseUrl);
22+
await _page.WaitForLoadStateAsync(LoadState.NetworkIdle);
23+
}
24+
25+
internal async Task AddTrackAsync()
26+
{
27+
await _page.GetByRole(AriaRole.Button, new() { Name = "Add new track" }).ClickAsync();
28+
}
29+
30+
internal async Task EditTrackAsync(string? artist = null, string? title = null)
31+
{
32+
if (artist != null)
33+
{
34+
await _page.Locator("td:nth-child(3)").ClickAsync();
35+
await _page.Locator("td:nth-child(3)").Last.GetByRole(AriaRole.Textbox).FillAsync(artist);
36+
await _page.Keyboard.PressAsync("Escape");
37+
if (await _page.IsVisibleAsync(".mud-overlay"))
38+
{
39+
await _page.Locator(".mud-overlay").ClickAsync();
40+
}
41+
await _page.GetByRole(AriaRole.Heading, new() { Name = "Playback" }).ClickAsync();
42+
await _page.WaitForTimeoutAsync(200);
43+
}
44+
if (title != null)
45+
{
46+
await _page.Locator("td:nth-child(4)").ClickAsync();
47+
await _page.Locator("td:nth-child(4)").Last.GetByRole(AriaRole.Textbox).FillAsync(title);
48+
await _page.Keyboard.PressAsync("Escape");
49+
if (await _page.IsVisibleAsync(".mud-overlay"))
50+
{
51+
await _page.Locator(".mud-overlay").ClickAsync();
52+
}
53+
await _page.GetByRole(AriaRole.Heading, new() { Name = "Playback" }).ClickAsync();
54+
await _page.WaitForTimeoutAsync(200);
55+
}
56+
}
57+
58+
internal async Task SelectTracksAsync(IEnumerable<int> trackTablePositions, Boolean uncheck = false)
59+
{
60+
foreach (var trackTablePosition in trackTablePositions)
61+
{
62+
if (uncheck)
63+
{
64+
await _page.Locator($"tr:nth-child({trackTablePosition + 1}) > td").First.GetByRole(AriaRole.Checkbox).UncheckAsync();
65+
}
66+
else
67+
{
68+
await _page.Locator($"tr:nth-child({trackTablePosition + 1}) > td").First.GetByRole(AriaRole.Checkbox).CheckAsync();
69+
}
70+
}
71+
}
72+
73+
internal async Task EditTracksModalAsync(string artist, string title, string end, IEnumerable<string> flagsToSelect)
74+
{
75+
await _page.GetByRole(AriaRole.Button, new() { Name = "Edit selected tracks" }).ClickAsync();
76+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Artist", Exact = true }).FillAsync(artist);
77+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Artist", Exact = true }).PressAsync("Tab");
78+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Title", Exact = true }).FillAsync(title);
79+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Title", Exact = true }).PressAsync("Tab");
80+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "End" }).FillAsync(end);
81+
foreach (var flag in flagsToSelect)
82+
{
83+
await _page.GetByRole(AriaRole.Button, new() { Name = flag }).ClickAsync();
84+
}
85+
await _page.GetByRole(AriaRole.Button, new() { Name = "Save changes" }).ClickAsync();
86+
}
87+
88+
internal async Task RenameAudiofileAsync(string filename)
89+
{
90+
int buttonIndex = _isMobile ? 2 : 3;
91+
await _page.GetByRole(AriaRole.Group).Filter(new() { HasText = "AudiofileAudiofile" }).GetByRole(AriaRole.Button).Nth(buttonIndex).ClickAsync();
92+
await _page.GetByText("Rename file").ClickAsync();
93+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "New file name" }).FillAsync(filename);
94+
await _page.GetByRole(AriaRole.Button, new() { Name = "Ok" }).ClickAsync();
95+
}
96+
}
97+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using Microsoft.Playwright;
2+
using System.Text.RegularExpressions;
3+
4+
namespace AudioCuesheetEditor.End2EndTests.Models
5+
{
6+
internal class ImportView(IPage page)
7+
{
8+
internal const string BaseUrl = "http://localhost:5132/";
9+
10+
private readonly IPage _page = page;
11+
12+
internal ILocator CuesheetArtistInput => _page.GetByRole(AriaRole.Textbox, new() { Name = "Cuesheet artist" });
13+
14+
internal ILocator CuesheetTitleInput => _page.GetByRole(AriaRole.Textbox, new() { Name = "Cuesheet title" });
15+
16+
internal ILocator CatalogueNumberInput => _page.GetByRole(AriaRole.Textbox, new() { Name = "Cataloguenumber" });
17+
18+
internal async Task GotoAsync()
19+
{
20+
await _page.GotoAsync(BaseUrl);
21+
await _page.WaitForURLAsync(BaseUrl);
22+
await _page.WaitForLoadStateAsync(LoadState.NetworkIdle);
23+
await _page.GetByText("Import view").ClickAsync();
24+
}
25+
26+
internal async Task ImportFileAsync(string filepath)
27+
{
28+
await _page.GetByRole(AriaRole.Button, new() { Name = "Choose File" }).SetInputFilesAsync(filepath);
29+
}
30+
31+
internal async Task CompleteImportAsync()
32+
{
33+
await _page.GetByRole(AriaRole.Button, new() { Name = "Complete" }).ClickAsync();
34+
}
35+
36+
internal async Task SelectTracksAsync(IEnumerable<int> trackTablePositions, Boolean uncheck = false)
37+
{
38+
foreach (var trackTablePosition in trackTablePositions)
39+
{
40+
if (uncheck)
41+
{
42+
await _page.Locator($"tr:nth-child({trackTablePosition + 1}) > td").First.GetByRole(AriaRole.Checkbox).UncheckAsync();
43+
}
44+
else
45+
{
46+
await _page.Locator($"tr:nth-child({trackTablePosition + 1}) > td").First.GetByRole(AriaRole.Checkbox).CheckAsync();
47+
}
48+
}
49+
}
50+
51+
internal async Task EditTracksModalAsync(string title)
52+
{
53+
await _page.GetByRole(AriaRole.Button, new() { Name = "Edit selected tracks" }).ClickAsync();
54+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Title", Exact = true }).FillAsync(title);
55+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Title", Exact = true }).PressAsync("Tab");
56+
await _page.GetByRole(AriaRole.Button, new() { Name = "Save changes" }).ClickAsync();
57+
}
58+
59+
internal async Task SwitchImportProfileAsync(string profile)
60+
{
61+
await _page.GetByText("Textfile (common data in").ClickAsync();
62+
await _page.GetByText(profile).ClickAsync();
63+
}
64+
65+
internal async Task ClearSchemeCommonDataAsync()
66+
{
67+
await _page.Locator("div").Filter(new() { HasTextRegex = new Regex("^Scheme common data$") }).GetByLabel("Clear").ClickAsync();
68+
}
69+
70+
internal async Task SetSchemeCommonDataAsync(string schemeCommonData)
71+
{
72+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Scheme common data" }).FillAsync(schemeCommonData);
73+
}
74+
75+
internal async Task SelectSchemeCommonDataPlaceholderAsync(string placeholder)
76+
{
77+
await _page.Locator("div").Filter(new() { HasTextRegex = new Regex("^Scheme common data$") }).GetByRole(AriaRole.Button).Nth(1).ClickAsync();
78+
await _page.GetByRole(AriaRole.Paragraph).Filter(new() { HasText = placeholder }).ClickAsync();
79+
}
80+
}
81+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Microsoft.Playwright;
2+
3+
namespace AudioCuesheetEditor.End2EndTests.Models
4+
{
5+
internal class RecordView(IPage page)
6+
{
7+
internal const string BaseUrl = "http://localhost:5132/";
8+
9+
private readonly IPage _page = page;
10+
11+
internal async Task GotoAsync()
12+
{
13+
await _page.GotoAsync(BaseUrl);
14+
await _page.WaitForURLAsync(BaseUrl);
15+
await _page.WaitForLoadStateAsync(LoadState.NetworkIdle);
16+
await _page.GetByText("Record view").ClickAsync();
17+
}
18+
19+
internal async Task StartRecordingAsync()
20+
{
21+
await _page.GetByRole(AriaRole.Button, new() { Name = "Start recording" }).ClickAsync();
22+
}
23+
24+
internal async Task StopRecordingAsync()
25+
{
26+
await _page.GetByRole(AriaRole.Button, new() { Name = "Stop recording" }).ClickAsync();
27+
}
28+
29+
internal async Task AddRecordingTrackAsync(string artist, string title)
30+
{
31+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Artist", Exact = true }).ClickAsync();
32+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Artist", Exact = true }).FillAsync(artist);
33+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Artist", Exact = true }).PressAsync("Tab");
34+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Title", Exact = true }).FillAsync(title);
35+
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Title", Exact = true }).PressAsync("Tab");
36+
await _page.GetByRole(AriaRole.Button, new() { Name = "Add track" }).ClickAsync();
37+
await _page.Locator(".mud-overlay").ClickAsync();
38+
}
39+
}
40+
}

AudioCuesheetEditor.End2EndTests/Pages/AboutTest.cs

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)