Skip to content

Commit 76793a1

Browse files
authored
Merge pull request #1583 from bUnit-dev/release/v1.33
Release of new minor version v1.33
2 parents e095b07 + 932c8ac commit 76793a1

File tree

13 files changed

+130
-35
lines changed

13 files changed

+130
-35
lines changed

.config/dotnet-tools.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
"rollForward": false
1818
},
1919
"dotnet-dump": {
20-
"version": "8.0.532401",
20+
"version": "8.0.547301",
2121
"commands": [
2222
"dotnet-dump"
2323
],
2424
"rollForward": false
2525
}
2626
}
27-
}
27+
}

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ All notable changes to **bUnit** will be documented in this file. The project ad
66

77
## [Unreleased]
88

9+
### Added
10+
11+
- `bunit.generators` respect parameters from the base class.
12+
- Supports components using constructor injection in `net9.0`.
13+
14+
### Fixed
15+
16+
- Use latest `System.Text.Json` due to CVE in `8.0.4`.
17+
918
## [1.32.7] - 2024-10-04
1019

1120
### Fixed

Directory.Packages.props

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
<ItemGroup Condition="!$(MSBuildProjectName.EndsWith('samples'))">
88
<GlobalPackageReference Include="AsyncFixer" Version="1.6.0" PrivateAssets="All" IncludeAssets="Runtime;Build;Native;contentFiles;Analyzers"/>
99
<GlobalPackageReference Include="SonarAnalyzer.CSharp" Version="9.32.0.97167" PrivateAssets="All" IncludeAssets="Runtime;Build;Native;contentFiles;Analyzers"/>
10-
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
11-
<PackageVersion Include="Meziantou.Polyfill" Version="1.0.39" />
10+
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0" />
11+
<PackageVersion Include="Meziantou.Polyfill" Version="1.0.40" />
1212
</ItemGroup>
1313

1414
<ItemGroup Label="Shared">
@@ -20,14 +20,19 @@
2020
<PackageVersion Include="AngleSharp.Diffing" Version="0.18.2"/>
2121

2222
<PackageVersion Include="AngleSharp" Version="1.1.2"/>
23-
<PackageVersion Include="AngleSharp.Css" Version="1.0.0-beta.139"/>
23+
<PackageVersion Include="AngleSharp.Css" Version="1.0.0-beta.144"/>
2424
</ItemGroup>
2525

2626
<ItemGroup Label="Package Versioning">
2727
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
2828
<PackageVersion Include="Nerdbank.GitVersioning" Version="3.6.143" />
2929
</ItemGroup>
3030

31+
<ItemGroup Label="System.Text.Json Vulnerability">
32+
<!-- Due to a CVE in System.Text.Json we explicitly reference the latest version of System.Text.Json -->
33+
<PackageVersion Include="System.Text.Json" Version="8.0.5"/>
34+
</ItemGroup>
35+
3136
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.1'">
3237
<PackageVersion Include="Microsoft.Extensions.Logging" Version="3.1.32"/>
3338
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.32"/>
@@ -40,9 +45,6 @@
4045
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="3.1.32"/>
4146
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.1"/>
4247
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="3.2.1"/>
43-
44-
<!-- Due to a CVE in System.Text.Json we explicitly reference the latest version of System.Text.Json -->
45-
<PackageVersion Include="System.Text.Json" Version="6.0.9"/>
4648
</ItemGroup>
4749

4850
<ItemGroup Condition="'$(TargetFramework)' == 'net5.0'">
@@ -57,9 +59,6 @@
5759
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0"/>
5860
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="5.0.17"/>
5961
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="5.0.17"/>
60-
61-
<!-- Due to a CVE in System.Text.Json we explicitly reference the latest version of System.Text.Json -->
62-
<PackageVersion Include="System.Text.Json" Version="6.0.9"/>
6362
</ItemGroup>
6463

6564
<ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">
@@ -73,9 +72,6 @@
7372
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="6.0.33"/>
7473
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.33"/>
7574
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="6.0.33"/>
76-
77-
<!-- Due to a CVE in System.Text.Json we explicitly reference the latest version of System.Text.Json -->
78-
<PackageVersion Include="System.Text.Json" Version="6.0.9"/>
7975
</ItemGroup>
8076

8177
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
@@ -89,9 +85,6 @@
8985
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="7.0.20"/>
9086
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.20"/>
9187
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="7.0.20"/>
92-
93-
<!-- Due to a CVE in System.Text.Json we explicitly reference the latest version of System.Text.Json -->
94-
<PackageVersion Include="System.Text.Json" Version="8.0.4"/>
9588
</ItemGroup>
9689

9790
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
@@ -105,9 +98,6 @@
10598
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="8.0.8"/>
10699
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.8"/>
107100
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="8.0.8"/>
108-
109-
<!-- Due to a CVE in System.Text.Json we explicitly reference the latest version of System.Text.Json -->
110-
<PackageVersion Include="System.Text.Json" Version="8.0.4"/>
111101
</ItemGroup>
112102

113103
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
@@ -121,8 +111,6 @@
121111
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="9.0.0-rc.1.24452.1"/>
122112
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.0-rc.1.24452.1"/>
123113
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="9.0.0-rc.1.24452.1"/>
124-
125-
<PackageVersion Include="System.Text.Json" Version="8.0.4" />
126114
</ItemGroup>
127115

128116
<ItemGroup Label="Test Dependencies">

src/bunit.core/Rendering/BunitComponentActivator.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ internal class BunitComponentActivator : IComponentActivator
77
private readonly ComponentFactoryCollection factories;
88
private readonly IComponentActivator componentActivator;
99

10-
public BunitComponentActivator(ComponentFactoryCollection factories, IComponentActivator? externalComponentActivator)
10+
public BunitComponentActivator(
11+
IServiceProvider serviceProvider,
12+
ComponentFactoryCollection factories,
13+
IComponentActivator? externalComponentActivator)
1114
{
1215
this.factories = factories ?? throw new ArgumentNullException(nameof(factories));
13-
this.componentActivator = externalComponentActivator ?? DefaultComponentActivator.Instance;
16+
this.componentActivator = externalComponentActivator ?? new DefaultComponentActivator(serviceProvider);
1417
}
1518

1619
public IComponent CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type componentType)
@@ -43,12 +46,17 @@ public IComponent CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessed
4346

4447
private sealed class DefaultComponentActivator : IComponentActivator
4548
{
46-
public static IComponentActivator Instance { get; } = new DefaultComponentActivator();
49+
private readonly IServiceProvider serviceProvider;
50+
51+
public DefaultComponentActivator(IServiceProvider serviceProvider)
52+
{
53+
this.serviceProvider = serviceProvider;
54+
}
4755

4856
/// <inheritdoc />
4957
public IComponent CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type componentType)
50-
{
51-
return (IComponent)Activator.CreateInstance(componentType)!;
58+
{
59+
return (IComponent)ActivatorUtilities.CreateInstance(serviceProvider, componentType);
5260
}
5361
}
5462
}

src/bunit.core/Rendering/TestRenderer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public TestRenderer(IRenderedComponentActivator renderedComponentActivator, Test
7979
/// Initializes a new instance of the <see cref="TestRenderer"/> class.
8080
/// </summary>
8181
public TestRenderer(IRenderedComponentActivator renderedComponentActivator, TestServiceProvider services, ILoggerFactory loggerFactory)
82-
: base(services, loggerFactory, new BunitComponentActivator(services.GetRequiredService<ComponentFactoryCollection>(), null))
82+
: base(services, loggerFactory, new BunitComponentActivator(services, services.GetRequiredService<ComponentFactoryCollection>(), null))
8383
{
8484
logger = loggerFactory.CreateLogger<TestRenderer>();
8585
this.activator = renderedComponentActivator;
@@ -89,7 +89,7 @@ public TestRenderer(IRenderedComponentActivator renderedComponentActivator, Test
8989
/// Initializes a new instance of the <see cref="TestRenderer"/> class.
9090
/// </summary>
9191
public TestRenderer(IRenderedComponentActivator renderedComponentActivator, TestServiceProvider services, ILoggerFactory loggerFactory, IComponentActivator componentActivator)
92-
: base(services, loggerFactory, new BunitComponentActivator(services.GetRequiredService<ComponentFactoryCollection>(), componentActivator))
92+
: base(services, loggerFactory, new BunitComponentActivator(services, services.GetRequiredService<ComponentFactoryCollection>(), componentActivator))
9393
{
9494
logger = loggerFactory.CreateLogger<TestRenderer>();
9595
this.activator = renderedComponentActivator;

src/bunit.generators/Web.Stubs/AddStubMethodStubGenerator/AddStubGenerator.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
3131

3232
private static AddStubClassInfo? GetStubClassInfo(GeneratorSyntaxContext context)
3333
{
34-
var invocation = context.Node as InvocationExpressionSyntax;
35-
if (invocation is null || !IsComponentFactoryStubMethod(invocation, context.SemanticModel))
34+
if (context.Node is not InvocationExpressionSyntax invocation || !IsComponentFactoryStubMethod(invocation, context.SemanticModel))
3635
{
3736
return null;
3837
}
@@ -56,7 +55,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
5655
var line = lineSpan.StartLinePosition.Line + 1;
5756
var column = lineSpan.Span.Start.Character + context.Node.ToString().IndexOf("AddStub", StringComparison.Ordinal) + 1;
5857

59-
var properties = symbol.GetMembers()
58+
var properties = symbol.GetAllMembersRecursively()
6059
.OfType<IPropertySymbol>()
6160
.Where(IsParameterOrCascadingParameter)
6261
.Select(CreateFromProperty)

src/bunit.generators/Web.Stubs/AttributeStubGenerator/ComponentStubAttributeGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ private static bool IsClassWithComponentStubAttribute(SyntaxNode s) =>
6262
}
6363

6464
var parameter = attribute.AttributeClass!.TypeArguments
65-
.SelectMany(s => s.GetMembers())
65+
.SelectMany(s => s.GetAllMembersRecursively())
6666
.OfType<IPropertySymbol>()
6767
.Where(IsParameterOrCascadingParameter)
6868
.Select(CreateFromProperty)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Microsoft.CodeAnalysis;
2+
3+
namespace Bunit.Web.Stubs;
4+
5+
internal static class MemberRetriever
6+
{
7+
public static IEnumerable<ISymbol> GetAllMembersRecursively(this ITypeSymbol type)
8+
{
9+
var currentType = type;
10+
while (currentType is not null)
11+
{
12+
foreach (var member in currentType.GetMembers())
13+
{
14+
yield return member;
15+
}
16+
currentType = currentType.BaseType;
17+
}
18+
}
19+
}

tests/bunit.generators.tests/Web.Stub/AddStubGeneratorTests.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,42 @@ public void Generated_stub_via_attribute_has_same_parameters()
6161
var stub = cut.FindComponent<ButtonComponentStub>();
6262
Assert.Equal("test", stub.Instance.Text);
6363
}
64+
65+
[Fact]
66+
public void Generated_Stub_respects_base_class_parameters()
67+
{
68+
ComponentFactories.AddStub<DerivedComponent>();
69+
70+
var cut = RenderComponent<ContainerComponent>(c => c.AddChildContent<DerivedComponent>());
71+
72+
var stub = cut.FindComponent<DerivedComponentStub>();
73+
Assert.Equal(0, stub.Instance.BaseCount);
74+
}
75+
76+
[Fact]
77+
public void Generated_stub_via_attribute_respects_base_class_parameters()
78+
{
79+
ComponentFactories.Add<DerivedComponent, DerivedComponentStubViaAttributeAnnotation>();
80+
81+
var cut = RenderComponent<ContainerComponent>(c => c.AddChildContent<DerivedComponent>());
82+
83+
var stub = cut.FindComponent<DerivedComponentStubViaAttributeAnnotation>();
84+
Assert.Equal(0, stub.Instance.BaseCount);
85+
}
6486
}
6587

6688
[ComponentStub<ButtonComponent>]
67-
public partial class ButtonComponentStub;
89+
public partial class ButtonComponentStub;
90+
91+
public abstract class BaseComponent : ComponentBase
92+
{
93+
[Parameter] public int BaseCount { get; set; }
94+
}
95+
96+
public class DerivedComponent : BaseComponent
97+
{
98+
[Parameter] public int DerivedCount { get; set; }
99+
}
100+
101+
[ComponentStub<DerivedComponent>]
102+
public partial class DerivedComponentStubViaAttributeAnnotation;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Bunit.Web.Stub.Components;
2+
3+
public class ContainerComponent : ComponentBase
4+
{
5+
[Parameter]
6+
public RenderFragment ChildContent { get; set; }
7+
8+
protected override void BuildRenderTree(RenderTreeBuilder builder)
9+
{
10+
builder.OpenElement(0, "div");
11+
builder.AddContent(1, ChildContent);
12+
builder.CloseElement();
13+
}
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Microsoft.JSInterop;
2+
3+
namespace Bunit.TestAssets.SampleComponents;
4+
5+
public class ConstructorInjectionComponent : ComponentBase
6+
{
7+
public IJSRuntime JSRuntime { get; }
8+
9+
public ConstructorInjectionComponent(IJSRuntime jsRuntime)
10+
{
11+
JSRuntime = jsRuntime;
12+
}
13+
}

tests/bunit.web.tests/Rendering/RenderedComponentTest.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,14 @@ public void Test020()
5757

5858
Should.Throw<ComponentDisposedException>(() => target.Instance);
5959
}
60+
#if NET9_0_OR_GREATER
61+
62+
[Fact(DisplayName = "Component with constructor dependencies is resolved when rendered")]
63+
public void Test021()
64+
{
65+
var cut = RenderComponent<ConstructorInjectionComponent>();
66+
67+
cut.Instance.JSRuntime.ShouldNotBeNull();
68+
}
69+
#endif
6070
}

version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json",
3-
"version": "1.32",
3+
"version": "1.33",
44
"assemblyVersion": {
55
"precision": "revision"
66
},

0 commit comments

Comments
 (0)