Skip to content

Commit 9940333

Browse files
committed
Added tests for UploadFile
1 parent 0d37bf8 commit 9940333

File tree

5 files changed

+90
-5
lines changed

5 files changed

+90
-5
lines changed

src/LinkDotNet.Blog.Web/ServiceExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ public static void RegisterServices(this IServiceCollection services)
1515
services.AddScoped<IDashboardService, DashboardService>();
1616
services.AddScoped<ISitemapService, SitemapService>();
1717
services.AddScoped<IXmlFileWriter, XmlFileWriter>();
18+
services.AddScoped<IFileProcessor, FileProcessor>();
1819
}
19-
}
20+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System.IO;
2+
using System.Threading.Tasks;
3+
using Microsoft.AspNetCore.Components.Forms;
4+
5+
namespace LinkDotNet.Blog.Web.Shared.Services;
6+
7+
public class FileProcessor : IFileProcessor
8+
{
9+
public async Task<string> GetContent(IBrowserFile file)
10+
{
11+
await using var stream = file.OpenReadStream();
12+
var reader = new StreamReader(stream);
13+
return await reader.ReadToEndAsync();
14+
}
15+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.AspNetCore.Components.Forms;
3+
4+
namespace LinkDotNet.Blog.Web.Shared.Services;
5+
6+
public interface IFileProcessor
7+
{
8+
Task<string> GetContent(IBrowserFile file);
9+
}

src/LinkDotNet.Blog.Web/Shared/UploadFile.razor

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
@using System.IO
2-
@inject IJSRuntime jsRuntime
2+
@using LinkDotNet.Blog.Web.Shared.Services
3+
@inject IFileProcessor fileProcessor
34

45
<div>
56
<InputFile
@@ -37,9 +38,7 @@
3738

3839
private async Task HandleFileUpload(InputFileChangeEventArgs args)
3940
{
40-
await using var stream = args.File.OpenReadStream();
41-
var reader = new StreamReader(stream);
42-
var content = await reader.ReadToEndAsync();
41+
var content = await fileProcessor.GetContent(args.File);
4342
await OnFileUploaded.InvokeAsync(content);
4443
}
4544
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
using Bunit;
4+
using FluentAssertions;
5+
using LinkDotNet.Blog.Web.Shared;
6+
using LinkDotNet.Blog.Web.Shared.Services;
7+
using Microsoft.AspNetCore.Components.Forms;
8+
using Microsoft.Extensions.DependencyInjection;
9+
using Microsoft.Extensions.Options;
10+
using Moq;
11+
using Xunit;
12+
13+
namespace LinkDotNet.Blog.UnitTests.Web.Shared;
14+
15+
public class UploadFileTests : TestContext
16+
{
17+
public UploadFileTests()
18+
{
19+
Services.AddSingleton(Options.Create(new RemoteBrowserFileStreamOptions()));
20+
JSInterop.SetupVoid(invocation => invocation.Identifier == "Blazor._internal.InputFile.init")
21+
.SetVoidResult();
22+
}
23+
24+
[Fact]
25+
public async Task ShouldCallProcessorWhenFilesUploaded()
26+
{
27+
const string content = "Test";
28+
var invokedContent = string.Empty;
29+
var file = new Mock<IBrowserFile>();
30+
var fileProcessor = new Mock<IFileProcessor>();
31+
fileProcessor.Setup(f => f.GetContent(file.Object)).ReturnsAsync(content);
32+
var args = new InputFileChangeEventArgs(new[]
33+
{
34+
file.Object,
35+
});
36+
Services.AddScoped(_ => fileProcessor.Object);
37+
var cut = RenderComponent<UploadFile>(
38+
s => s.Add(p => p.OnFileUploaded, f => invokedContent = f));
39+
var inputComponent = cut.FindComponent<InputFile>().Instance;
40+
41+
await cut.InvokeAsync(() => inputComponent.OnChange.InvokeAsync(args));
42+
43+
invokedContent.Should().Be(content);
44+
}
45+
46+
[Fact]
47+
public void ShouldPutIdAndClassOnItems()
48+
{
49+
Services.AddScoped(_ => new Mock<IFileProcessor>().Object);
50+
var attributes = new Dictionary<string, object>
51+
{
52+
{ "class", "some-class" },
53+
{ "id", "some-id" },
54+
};
55+
56+
var cut = RenderComponent<UploadFile>(p => p.Add(s => s.AdditionalAttributes, attributes));
57+
58+
cut.FindAll(".some-class").Should().NotBeEmpty();
59+
cut.FindAll("#some-id").Should().NotBeEmpty();
60+
}
61+
}

0 commit comments

Comments
 (0)