Skip to content

Commit cf4ea47

Browse files
authored
Merge pull request #39 from phmatray/codex/add-test-for-custom-field-renderer-usage
test: ensure custom renderer bypasses standard renderers
2 parents 77d3440 + 5ce54ce commit cf4ea47

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

FormCraft.UnitTests/Rendering/FieldRendererServiceTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,40 @@ public void RenderField_Should_Try_Multiple_Renderers_Until_Compatible_Found()
161161
.MustHaveHappenedOnceExactly();
162162
}
163163

164+
[Fact]
165+
public void RenderField_Should_Use_Custom_Renderer_And_Bypass_Standard_Renderers()
166+
{
167+
// Arrange
168+
var model = new TestModel { Name = "Test" };
169+
var field = new FieldConfiguration<TestModel, string?>(x => x.Name);
170+
171+
var customRenderer = new FakeCustomRenderer();
172+
var services = new ServiceCollection();
173+
services.AddSingleton(customRenderer.GetType(), customRenderer);
174+
var serviceProvider = services.BuildServiceProvider();
175+
176+
field.CustomRendererType = customRenderer.GetType();
177+
178+
var standardRenderer = A.Fake<IFieldRenderer>();
179+
A.CallTo(() => standardRenderer.CanRender(A<Type>._, A<IFieldConfiguration<object, object>>._)).Returns(true);
180+
181+
var service = new FieldRendererService(new[] { standardRenderer }, serviceProvider);
182+
var onValueChanged = EventCallback.Factory.Create<object?>(this, _ => { });
183+
var onDependencyChanged = EventCallback.Factory.Create(this, () => { });
184+
185+
// Act
186+
var result = service.RenderField(model,
187+
new FieldConfigurationWrapper<TestModel, string?>(field),
188+
onValueChanged,
189+
onDependencyChanged);
190+
191+
// Assert
192+
result.ShouldNotBeNull();
193+
customRenderer.WasCalled.ShouldBeTrue();
194+
A.CallTo(() => standardRenderer.CanRender(A<Type>._, A<IFieldConfiguration<object, object>>._)).MustNotHaveHappened();
195+
A.CallTo(() => standardRenderer.Render(A<IFieldRenderContext<TestModel>>._)).MustNotHaveHappened();
196+
}
197+
164198
[Fact]
165199
public void RenderField_Should_Handle_Null_Current_Value()
166200
{
@@ -394,4 +428,15 @@ public class TestModel
394428
public List<string> Tags { get; set; } = new();
395429
public NestedModel NestedModel { get; set; } = new();
396430
}
431+
432+
private class FakeCustomRenderer : ICustomFieldRenderer<string>
433+
{
434+
public bool WasCalled { get; private set; }
435+
public Type ValueType => typeof(string);
436+
public RenderFragment Render(IFieldRenderContext context)
437+
{
438+
WasCalled = true;
439+
return builder => builder.AddContent(0, "Custom");
440+
}
441+
}
397442
}

0 commit comments

Comments
 (0)