Skip to content

Commit 6fb9494

Browse files
Merge pull request #489 from NeoCoderMatrix86/455-export-to-text-is-not-responsive
Export to text is not responsive
2 parents a19111d + caa1461 commit 6fb9494

9 files changed

Lines changed: 211 additions & 23 deletions

File tree

AudioCuesheetEditor.End2EndTests/Models/AppBar.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ namespace AudioCuesheetEditor.End2EndTests.Models
55
{
66
internal class AppBar
77
{
8-
internal const string BaseUrl = "http://localhost:5132/";
9-
108
private readonly IPage _page;
119
private readonly ILocator _menuButton;
1210

@@ -25,13 +23,6 @@ internal AppBar(IPage page)
2523
.Nth(3);
2624
}
2725

28-
internal async Task GotoAsync()
29-
{
30-
await _page.GotoAsync(BaseUrl);
31-
await _page.WaitForURLAsync(BaseUrl);
32-
await _page.WaitForLoadStateAsync(LoadState.NetworkIdle);
33-
}
34-
3526
internal async Task OpenSettingsAsync()
3627
{
3728
await _menuButton.ClickAsync();
@@ -61,5 +52,12 @@ internal async Task OpenFileAsync(string file)
6152
await _page.Locator("#dropFileInputId_SelectFileDialog").GetByRole(AriaRole.Button, new() { Name = "Choose File" }).ClickAsync();
6253
await _page.Locator("#dropFileInputId_SelectFileDialog").GetByRole(AriaRole.Button, new() { Name = "Choose File" }).SetInputFilesAsync(file);
6354
}
55+
56+
internal async Task OpenExportDialogAsync(string exportType)
57+
{
58+
await _page.GetByRole(AriaRole.Button, new() { Name = "File", Exact = true }).ClickAsync();
59+
await _page.GetByText("Export", new() { Exact = true }).HoverAsync();
60+
await _page.GetByText(exportType, new() { Exact = true }).ClickAsync();
61+
}
6462
}
6563
}

AudioCuesheetEditor.End2EndTests/Tests/Desktop/BasicTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public async Task Audiofile_ShouldBeRenamed_WhenEditingFilename()
3939
public async Task OpenSettings_ShouldDisplaySettings_WhenSelectingSettings()
4040
{
4141
var bar = new AppBar(TestPage);
42-
await bar.GotoAsync();
42+
var detailView = new DetailView(TestPage, DeviceName != null);
43+
await detailView.GotoAsync();
4344
await bar.OpenSettingsAsync();
4445
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Settings" })).ToBeVisibleAsync();
4546
}
@@ -48,7 +49,8 @@ public async Task OpenSettings_ShouldDisplaySettings_WhenSelectingSettings()
4849
public async Task ChangeLanguage_ShouldShowGermanHeadings_WhenGermanIsSelected()
4950
{
5051
var bar = new AppBar(TestPage);
51-
await bar.GotoAsync();
52+
var detailView = new DetailView(TestPage, DeviceName != null);
53+
await detailView.GotoAsync();
5254
await bar.ChangeLanguageAsync("German (Germany)");
5355
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Abschnitte" })).ToBeVisibleAsync();
5456
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Allgemeine Informationen" })).ToBeVisibleAsync();
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
using AudioCuesheetEditor.End2EndTests.Models;
2+
using Microsoft.Playwright;
3+
4+
namespace AudioCuesheetEditor.End2EndTests.Tests.Desktop
5+
{
6+
[TestClass]
7+
public class ExportTest : PlaywrightTestBase
8+
{
9+
[TestMethod]
10+
public async Task DownloadCuesheet_GeneratesCuesheetFile_WhenCuesheetIsValid()
11+
{
12+
var bar = new AppBar(TestPage);
13+
var detailView = new DetailView(TestPage, DeviceName != null);
14+
await detailView.GotoAsync();
15+
await detailView.AddTrackAsync();
16+
await detailView.CuesheetArtistInput.FillAsync("Cuesheet Artist 1");
17+
await detailView.CuesheetTitleInput.FillAsync("Cuesheet Title 1");
18+
await detailView.AudiofileInput.SetInputFilesAsync("Kalimba.mp3");
19+
await detailView.EditTrackAsync("Track Artist 1", "Track Title 1");
20+
await bar.OpenExportDialogAsync("Cuesheet");
21+
var downloadTask = TestPage.WaitForDownloadAsync();
22+
await TestPage.GetByRole(AriaRole.Button, new() { Name = "Download-Cuesheet.cue" }).ClickAsync();
23+
var download = await downloadTask;
24+
using var stream = await download.CreateReadStreamAsync();
25+
using var reader = new StreamReader(stream);
26+
var content = await reader.ReadToEndAsync(TestContext.CancellationTokenSource.Token);
27+
content = content.Replace("\n", Environment.NewLine);
28+
Assert.AreEqual(@"TITLE ""Cuesheet Title 1""
29+
PERFORMER ""Cuesheet Artist 1""
30+
FILE ""Kalimba.mp3"" MP3
31+
TRACK 01 AUDIO
32+
TITLE ""Track Title 1""
33+
PERFORMER ""Track Artist 1""
34+
INDEX 01 00:00:00
35+
", content);
36+
}
37+
38+
[TestMethod]
39+
public async Task DownloadProject_GeneratesProjectFile_WhenCuesheetIsValidAsync()
40+
{
41+
var bar = new AppBar(TestPage);
42+
var detailView = new DetailView(TestPage, DeviceName != null);
43+
await detailView.GotoAsync();
44+
await detailView.AddTrackAsync();
45+
await detailView.CuesheetArtistInput.FillAsync("Cuesheet Artist 1");
46+
await detailView.CuesheetTitleInput.FillAsync("Cuesheet Title 1");
47+
await detailView.AudiofileInput.SetInputFilesAsync("Kalimba.mp3");
48+
await detailView.EditTrackAsync("Track Artist 1", "Track Title 1");
49+
await bar.OpenExportDialogAsync("Projectfile");
50+
var downloadTask = TestPage.WaitForDownloadAsync();
51+
await TestPage.GetByRole(AriaRole.Button, new() { Name = "Download project" }).ClickAsync();
52+
var download = await downloadTask;
53+
using var stream = await download.CreateReadStreamAsync();
54+
using var reader = new StreamReader(stream);
55+
var content = await reader.ReadToEndAsync(TestContext.CancellationTokenSource.Token);
56+
Assert.AreEqual("{\"Tracks\":[{\"Position\":1,\"Artist\":\"Track Artist 1\",\"Title\":\"Track Title 1\",\"Begin\":\"00:00:00\",\"End\":\"00:05:48\",\"Flags\":[],\"IsLinkedToPreviousTrack\":true}],\"Artist\":\"Cuesheet Artist 1\",\"Title\":\"Cuesheet Title 1\",\"Audiofile\":{\"Name\":\"Kalimba.mp3\",\"Duration\":\"00:05:48\",\"AudioCodec\":{\"MimeType\":\"audio/mpeg\",\"FileExtension\":\".mp3\",\"Name\":\"AudioCodec MP3\"}},\"Sections\":[]}", content);
57+
}
58+
59+
[TestMethod]
60+
public async Task DownloadText_GeneratesTextFile_WhenCuesheetIsValidAsync()
61+
{
62+
var bar = new AppBar(TestPage);
63+
var detailView = new DetailView(TestPage, DeviceName != null);
64+
await detailView.GotoAsync();
65+
await detailView.AddTrackAsync();
66+
await detailView.CuesheetArtistInput.FillAsync("Cuesheet Artist 1");
67+
await detailView.CuesheetTitleInput.FillAsync("Cuesheet Title 1");
68+
await detailView.AudiofileInput.SetInputFilesAsync("Kalimba.mp3");
69+
await detailView.EditTrackAsync("Track Artist 1", "Track Title 1");
70+
await bar.OpenExportDialogAsync("Textfile");
71+
await TestPage.GetByRole(AriaRole.Button, new() { Name = "Next" }).ClickAsync();
72+
var downloadTask = TestPage.WaitForDownloadAsync();
73+
await TestPage.GetByRole(AriaRole.Button, new() { Name = "Download-YouTube.txt" }).ClickAsync();
74+
var download = await downloadTask;
75+
using var stream = await download.CreateReadStreamAsync();
76+
using var reader = new StreamReader(stream);
77+
var content = await reader.ReadToEndAsync(TestContext.CancellationTokenSource.Token);
78+
content = content.Replace("\n", Environment.NewLine);
79+
Assert.AreEqual(@"Cuesheet Artist 1 - Cuesheet Title 1
80+
Track Artist 1 - Track Title 1 00:00:00
81+
82+
", content);
83+
}
84+
}
85+
}

AudioCuesheetEditor.End2EndTests/Tests/Desktop/TracingTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ public class TracingTest : PlaywrightTestBase
1010
public async Task UndoRedo_ShouldRestoreTrackState_WhenUndoAndRedoAreUsed()
1111
{
1212
var bar = new AppBar(TestPage);
13-
await bar.GotoAsync();
1413
var detailView = new DetailView(TestPage, DeviceName != null);
14+
await detailView.GotoAsync();
1515
await detailView.AddTrackAsync();
1616
await detailView.EditTrackAsync("Test Artist 1");
1717
await Expect(bar.UndoButton).ToBeEnabledAsync();
@@ -232,8 +232,8 @@ await Expect(TestPage.GetByRole(AriaRole.Table)).ToMatchAriaSnapshotAsync(@"- ta
232232
public async Task UndoRedo_ShouldRestoreTrackState_WhenModalEdit()
233233
{
234234
var bar = new AppBar(TestPage);
235-
await bar.GotoAsync();
236-
var detailView = new DetailView(TestPage, DeviceName != null);
235+
var detailView = new DetailView(TestPage, DeviceName != null);
236+
await detailView.GotoAsync();
237237
await detailView.AddTrackAsync();
238238
await detailView.SelectTracksAsync([1]);
239239
await detailView.EditTracksModalAsync("Test Track Artist 1", "Test Track Title 1", "00:02:23", ["channel audio (4CH)", "Serial copy management system"]);

AudioCuesheetEditor.End2EndTests/Tests/Smartphone/BasicTestSmartphone.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public async Task Audiofile_ShouldBeRenamed_WhenEditingFilename()
4141
public async Task OpenSettings_ShouldDisplaySettings_WhenSelectingSettings()
4242
{
4343
var bar = new AppBar(TestPage);
44-
await bar.GotoAsync();
44+
var detailView = new DetailView(TestPage, DeviceName != null);
45+
await detailView.GotoAsync();
4546
await bar.OpenSettingsAsync();
4647
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Settings" })).ToBeVisibleAsync();
4748
}
@@ -50,7 +51,8 @@ public async Task OpenSettings_ShouldDisplaySettings_WhenSelectingSettings()
5051
public async Task ChangeLanguage_ShouldShowGermanHeadings_WhenGermanIsSelected()
5152
{
5253
var bar = new AppBar(TestPage);
53-
await bar.GotoAsync();
54+
var detailView = new DetailView(TestPage, DeviceName != null);
55+
await detailView.GotoAsync();
5456
await bar.ChangeLanguageAsync("German (Germany)");
5557
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Abschnitte" })).ToBeVisibleAsync();
5658
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Allgemeine Informationen" })).ToBeVisibleAsync();
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
using AudioCuesheetEditor.End2EndTests.Models;
2+
using Microsoft.Playwright;
3+
4+
namespace AudioCuesheetEditor.End2EndTests.Tests.Smartphone
5+
{
6+
[TestClass]
7+
public class ExportTestSmartphone : PlaywrightTestBase
8+
{
9+
[TestMethod]
10+
public async Task DownloadCuesheet_GeneratesCuesheetFile_WhenCuesheetIsValid()
11+
{
12+
var bar = new AppBar(TestPage);
13+
var detailView = new DetailView(TestPage, DeviceName != null);
14+
await detailView.GotoAsync();
15+
await detailView.AddTrackAsync();
16+
await detailView.CuesheetArtistInput.FillAsync("Cuesheet Artist 1");
17+
await detailView.CuesheetTitleInput.FillAsync("Cuesheet Title 1");
18+
await detailView.AudiofileInput.SetInputFilesAsync("Kalimba.mp3");
19+
await detailView.EditTrackAsync("Track Artist 1", "Track Title 1");
20+
await bar.OpenExportDialogAsync("Cuesheet");
21+
var downloadTask = TestPage.WaitForDownloadAsync();
22+
await TestPage.GetByRole(AriaRole.Button, new() { Name = "Download-Cuesheet.cue" }).ClickAsync();
23+
var download = await downloadTask;
24+
using var stream = await download.CreateReadStreamAsync();
25+
using var reader = new StreamReader(stream);
26+
var content = await reader.ReadToEndAsync(TestContext.CancellationTokenSource.Token);
27+
content = content.Replace("\n", Environment.NewLine);
28+
Assert.AreEqual(@"TITLE ""Cuesheet Title 1""
29+
PERFORMER ""Cuesheet Artist 1""
30+
FILE ""Kalimba.mp3"" MP3
31+
TRACK 01 AUDIO
32+
TITLE ""Track Title 1""
33+
PERFORMER ""Track Artist 1""
34+
INDEX 01 00:00:00
35+
", content);
36+
}
37+
38+
[TestMethod]
39+
public async Task DownloadProject_GeneratesProjectFile_WhenCuesheetIsValidAsync()
40+
{
41+
var bar = new AppBar(TestPage);
42+
var detailView = new DetailView(TestPage, DeviceName != null);
43+
await detailView.GotoAsync();
44+
await detailView.AddTrackAsync();
45+
await detailView.CuesheetArtistInput.FillAsync("Cuesheet Artist 1");
46+
await detailView.CuesheetTitleInput.FillAsync("Cuesheet Title 1");
47+
await detailView.AudiofileInput.SetInputFilesAsync("Kalimba.mp3");
48+
await detailView.EditTrackAsync("Track Artist 1", "Track Title 1");
49+
await bar.OpenExportDialogAsync("Projectfile");
50+
var downloadTask = TestPage.WaitForDownloadAsync();
51+
await TestPage.GetByRole(AriaRole.Button, new() { Name = "Download project" }).ClickAsync();
52+
var download = await downloadTask;
53+
using var stream = await download.CreateReadStreamAsync();
54+
using var reader = new StreamReader(stream);
55+
var content = await reader.ReadToEndAsync(TestContext.CancellationTokenSource.Token);
56+
Assert.AreEqual("{\"Tracks\":[{\"Position\":1,\"Artist\":\"Track Artist 1\",\"Title\":\"Track Title 1\",\"Begin\":\"00:00:00\",\"End\":\"00:05:48\",\"Flags\":[],\"IsLinkedToPreviousTrack\":true}],\"Artist\":\"Cuesheet Artist 1\",\"Title\":\"Cuesheet Title 1\",\"Audiofile\":{\"Name\":\"Kalimba.mp3\",\"Duration\":\"00:05:48\",\"AudioCodec\":{\"MimeType\":\"audio/mpeg\",\"FileExtension\":\".mp3\",\"Name\":\"AudioCodec MP3\"}},\"Sections\":[]}", content);
57+
}
58+
59+
[TestMethod]
60+
public async Task DownloadText_GeneratesTextFile_WhenCuesheetIsValidAsync()
61+
{
62+
var bar = new AppBar(TestPage);
63+
var detailView = new DetailView(TestPage, DeviceName != null);
64+
await detailView.GotoAsync();
65+
await detailView.AddTrackAsync();
66+
await detailView.CuesheetArtistInput.FillAsync("Cuesheet Artist 1");
67+
await detailView.CuesheetTitleInput.FillAsync("Cuesheet Title 1");
68+
await detailView.AudiofileInput.SetInputFilesAsync("Kalimba.mp3");
69+
await detailView.EditTrackAsync("Track Artist 1", "Track Title 1");
70+
await bar.OpenExportDialogAsync("Textfile");
71+
await TestPage.GetByRole(AriaRole.Button, new() { Name = "Next" }).ClickAsync();
72+
var downloadTask = TestPage.WaitForDownloadAsync();
73+
await TestPage.GetByRole(AriaRole.Button, new() { Name = "Download-YouTube.txt" }).ClickAsync();
74+
var download = await downloadTask;
75+
using var stream = await download.CreateReadStreamAsync();
76+
using var reader = new StreamReader(stream);
77+
var content = await reader.ReadToEndAsync(TestContext.CancellationTokenSource.Token);
78+
content = content.Replace("\n", Environment.NewLine);
79+
Assert.AreEqual(@"Cuesheet Artist 1 - Cuesheet Title 1
80+
Track Artist 1 - Track Title 1 00:00:00
81+
82+
", content);
83+
}
84+
}
85+
}

AudioCuesheetEditor.End2EndTests/Tests/Smartphone/TracingTestSmartphone.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public class TracingTestSmartphone : PlaywrightTestBase
1212
public async Task UndoRedo_ShouldRestoreTrackState_WhenUndoAndRedoAreUsed()
1313
{
1414
var bar = new AppBar(TestPage);
15-
await bar.GotoAsync();
1615
var detailView = new DetailView(TestPage, DeviceName != null);
16+
await detailView.GotoAsync();
1717
await detailView.AddTrackAsync();
1818
await detailView.EditTrackAsync("Test Artist 1");
1919
await Expect(bar.UndoButton).ToBeEnabledAsync();
@@ -128,8 +128,8 @@ await Expect(TestPage.GetByRole(AriaRole.Table)).ToMatchAriaSnapshotAsync(@"- ta
128128
public async Task UndoRedo_ShouldRestoreTrackState_WhenModalEdit()
129129
{
130130
var bar = new AppBar(TestPage);
131-
await bar.GotoAsync();
132-
var detailView = new DetailView(TestPage, DeviceName != null);
131+
var detailView = new DetailView(TestPage, DeviceName != null);
132+
await detailView.GotoAsync();
133133
await detailView.AddTrackAsync();
134134
await detailView.SelectTracksAsync([1]);
135135
await detailView.EditTracksModalAsync("Test Track Artist 1", "Test Track Title 1", "00:02:23", ["channel audio (4CH)", "Serial copy management system"]);

AudioCuesheetEditor/Shared/Dialogs/GenerateCuesheetDialog.razor

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ along with Foobar. If not, see
4747
<MudTd DataLabel="@_localizer["Name"]">@context.Name</MudTd>
4848
<MudTd DataLabel="@_localizer["Begin"]">@context.Begin</MudTd>
4949
<MudTd DataLabel="@_localizer["End"]">@context.End</MudTd>
50-
<MudTd DataLabel="@_localizer["Content"]"><MudIconButton Color="Color.Success" Variant="Variant.Outlined" Icon="@Icons.Material.Outlined.FileDownload" OnClick='() => _blazorDownloadFileService.DownloadFile(context.Name, context.Content, "text/plain")' /></MudTd>
50+
@{
51+
var ariaLabel = $"Download-{context.Name}";
52+
<MudTd DataLabel="@_localizer["Content"]"><MudIconButton Color="Color.Success" Variant="Variant.Outlined" Icon="@Icons.Material.Outlined.FileDownload" OnClick='() => _blazorDownloadFileService.DownloadFile(context.Name, context.Content, "text/plain")' aria-label="@ariaLabel" /></MudTd>
53+
}
5154
</RowTemplate>
5255
</MudTable>
5356
<br />

0 commit comments

Comments
 (0)