Skip to content

Commit f6e035b

Browse files
authored
Use ActivatorUtilities to create instance with Dependency Injection support (#44)
1 parent bcc1816 commit f6e035b

File tree

10 files changed

+71
-72
lines changed

10 files changed

+71
-72
lines changed

src/Controllers/TestSetupController.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@ public TestSetupController(ITestSetup testSetup, ILogger<TestSetupController> lo
2323
/// </summary>
2424
/// <returns>A list of test data for IFTTT to use.</returns>
2525
[HttpPost]
26-
[Consumes("application/x-www-form-urlencoded", "application/json")]
27-
[Produces("application/json")]
28-
public async Task<IActionResult> SetupTest()
26+
[ProducesResponseType(StatusCodes.Status200OK),
27+
ProducesResponseType(StatusCodes.Status400BadRequest)]
28+
[Consumes("application/x-www-form-urlencoded")]
29+
public async Task<IActionResult> SetupTest(CancellationToken cancellationToken)
2930
{
3031
try
3132
{
32-
var processors = await testSetup.PrepareSetupListing();
33+
var processors = await testSetup.PrepareSetupListing(cancellationToken);
3334

3435
var samples = new SamplesPayload(processors);
3536
samples.SkimEmptyProcessors();
@@ -44,7 +45,7 @@ public async Task<IActionResult> SetupTest()
4445

4546
var errorMessages = TopLevelErrorModel.Serialize(new[] { new ErrorMessage($"Error while setting up test: {ex.Message}") });
4647

47-
return Problem(errorMessages);
48+
return BadRequest(errorMessages);
4849
}
4950
}
5051
}

src/Controllers/TriggerController.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ public class TriggerController([FromKeyedServices(ProcessorKind.Trigger)] IProce
1515
/// <param name="triggerSlug">The trigger slug that is executed.</param>
1616
/// <param name="triggerRequest">The request parameters.</param>
1717
[HttpPost("{triggerSlug}")]
18-
[ProducesResponseType(StatusCodes.Status200OK)]
19-
[ProducesResponseType(StatusCodes.Status404NotFound)]
20-
[Consumes("application/json")]
21-
[Produces("application/json")]
18+
[ProducesResponseType(StatusCodes.Status200OK),
19+
ProducesResponseType(StatusCodes.Status404NotFound)]
20+
[Consumes("application/json"), Produces("application/json")]
2221
public async Task<IActionResult> ExecuteTrigger(string triggerSlug, TriggerRequest triggerRequest)
2322
{
2423
if (await triggerService.GetProcessorInstance<ITrigger>(triggerSlug) is not { } trigger)
@@ -28,6 +27,6 @@ public async Task<IActionResult> ExecuteTrigger(string triggerSlug, TriggerReque
2827

2928
var result = await trigger.ExecuteAsync(triggerRequest);
3029

31-
return Ok(result.Serialize());
30+
return Ok(result);
3231
}
3332
}

src/InvvardDev.Ifttt.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<PackageId>$(AssemblyName)</PackageId>
2727

2828
<AssemblyName>InvvardDev.Ifttt</AssemblyName>
29-
<VersionPrefix>0.1.13</VersionPrefix>
29+
<VersionPrefix>0.1.14</VersionPrefix>
3030
<PackageVersion>$(Version)</PackageVersion>
3131

3232
<Title>IFTTT.NET package</Title>

src/Services/ProcessorService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace InvvardDev.Ifttt.Services;
66

7-
internal abstract class ProcessorService(IProcessorRepository processorRepository) : IProcessorService
7+
internal abstract class ProcessorService(IProcessorRepository processorRepository, IServiceProvider serviceProvider) : IProcessorService
88
{
99
protected abstract ProcessorKind Kind { get; }
1010

@@ -16,7 +16,7 @@ public async Task AddOrUpdateProcessor(ProcessorTree processorTree)
1616
{ } existingProcessorTree when existingProcessorTree.ProcessorType == processorTree.ProcessorType
1717
=> processorRepository.UpdateProcessor(processorTree),
1818
{ } pt when pt.ProcessorType != processorTree.ProcessorType
19-
=> throw new InvalidOperationException($"Conflict: '{pt.Kind}' processor with slug '{pt.ProcessorSlug}' already exists (Type is '{pt.ProcessorType}')."),
19+
=> throw new InvalidOperationException($"Conflict: '{pt.Kind}' processor with slug '{pt.ProcessorSlug}' already exists with '{pt.ProcessorType}' type."),
2020
_ => throw new ArgumentOutOfRangeException(nameof(processorTree))
2121
});
2222
}
@@ -60,11 +60,11 @@ public Task<bool> Exists(string processorSlug)
6060
public async Task<TInterface?> GetProcessorInstance<TInterface>(string processorSlug)
6161
{
6262
if (await GetProcessor(processorSlug) is { } processorTree
63-
&& Activator.CreateInstance(processorTree.ProcessorType) is TInterface processor)
63+
&& ActivatorUtilities.CreateInstance(serviceProvider, processorTree.ProcessorType) is TInterface processor)
6464
{
6565
return processor;
6666
}
6767

6868
return default;
6969
}
70-
}
70+
}

src/Services/TriggerService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace InvvardDev.Ifttt.Services;
55

6-
internal class TriggerService(IProcessorRepository processorRepository) : ProcessorService(processorRepository)
6+
internal class TriggerService(IProcessorRepository processorRepository, IServiceProvider serviceProvider) : ProcessorService(processorRepository, serviceProvider)
77
{
88
protected override ProcessorKind Kind => ProcessorKind.Trigger;
9-
}
9+
}

src/Toolkit/Contracts/ITestSetup.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public interface ITestSetup
88
/// <summary>
99
/// Prepares the setup listing for IFTTT to use for testing.
1010
/// </summary>
11+
/// <param name="cancellationToken"></param>
1112
/// <returns>The list of processors to be tested.</returns>
12-
Task<ProcessorPayload> PrepareSetupListing();
13+
Task<ProcessorPayload> PrepareSetupListing(CancellationToken cancellationToken);
1314
}

tests/InvvardDev.Ifttt.TestFactories/Triggers/ProcessorTreeFactory.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@ public class ProcessorTreeFactory : EntityFactoryBase<ProcessorTree>
99
{
1010
protected override Faker<ProcessorTree> Configure()
1111
=> new Faker<ProcessorTree>()
12-
.CustomInstantiator(f => new ProcessorTree(f.Random.Words(2), default!, f.PickRandom<ProcessorKind>()));
12+
.CustomInstantiator(f => new ProcessorTree(f.Random.Words(2),
13+
TriggerClassFactory.MatchingClass(),
14+
f.PickRandom<ProcessorKind>()));
1315
}

tests/InvvardDev.Ifttt.Tests/Controllers/TestSetupControllerTests.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public async Task SetupTest_WhenThereIsNoProcessor_ShouldReturn200OKWithEmptySam
3030
// Arrange
3131
var testSetup = Mock.Of<ITestSetup>();
3232
Mock.Get(testSetup)
33-
.Setup(x => x.PrepareSetupListing())
33+
.Setup(x => x.PrepareSetupListing(It.IsAny<CancellationToken>()))
3434
.ReturnsAsync(new ProcessorPayload());
3535

3636
var logger = Mock.Of<ILogger<TestSetupController>>();
@@ -41,7 +41,7 @@ public async Task SetupTest_WhenThereIsNoProcessor_ShouldReturn200OKWithEmptySam
4141
expectedBody.Data.SkimEmptyProcessors();
4242

4343
// Act
44-
var result = await sut.SetupTest();
44+
var result = await sut.SetupTest(CancellationToken.None);
4545

4646
// Assert
4747
result.Should().NotBeNull()
@@ -55,7 +55,7 @@ public async Task SetupTest_WhenProcessorHasNoDataField_ShouldReturn200OKWithEmp
5555
// Arrange
5656
var testSetup = Mock.Of<ITestSetup>();
5757
Mock.Get(testSetup)
58-
.Setup(x => x.PrepareSetupListing())
58+
.Setup(x => x.PrepareSetupListing(It.IsAny<CancellationToken>()))
5959
.ReturnsAsync(new ProcessorPayload() { Triggers = new Processors().AddProcessor("test") });
6060

6161
var logger = Mock.Of<ILogger<TestSetupController>>();
@@ -66,7 +66,7 @@ public async Task SetupTest_WhenProcessorHasNoDataField_ShouldReturn200OKWithEmp
6666
expectedBody.Data.SkimEmptyProcessors();
6767

6868
// Act
69-
var result = await sut.SetupTest();
69+
var result = await sut.SetupTest(CancellationToken.None);
7070

7171
// Assert
7272
result.Should().NotBeNull()
@@ -82,7 +82,7 @@ public async Task SetupTest_WhenThereIsAnException_ShouldReturn500InternalServer
8282
const string exceptionMessage = "exception message";
8383
var testSetup = Mock.Of<ITestSetup>();
8484
Mock.Get(testSetup)
85-
.Setup(x => x.PrepareSetupListing())
85+
.Setup(x => x.PrepareSetupListing(It.IsAny<CancellationToken>()))
8686
.ThrowsAsync(new Exception(exceptionMessage));
8787

8888
var logger = Mock.Of<ILogger<TestSetupController>>();
@@ -93,7 +93,7 @@ public async Task SetupTest_WhenThereIsAnException_ShouldReturn500InternalServer
9393
var expectedErrorJson = JsonSerializer.Serialize(expectedError, JsonSerializerOptions);
9494

9595
// Act
96-
var result = await sut.SetupTest();
96+
var result = await sut.SetupTest(CancellationToken.None);
9797

9898
// Assert
9999
Mock.Get(logger).VerifyLog(l => l.LogError(It.IsAny<Exception>(), expectedErrorMessage), Times.Once());
@@ -117,7 +117,7 @@ public async Task SetupTest_WhenProcessorHasDataFields_ShouldReturn200OKWithSamp
117117
var triggerProcessor = new Processors().AddProcessor("test").AddDataField("test", "data_field_slug", "testData");
118118
var expectedProcessorPayload = new ProcessorPayload() { Triggers = triggerProcessor };
119119
Mock.Get(testSetup)
120-
.Setup(x => x.PrepareSetupListing())
120+
.Setup(x => x.PrepareSetupListing(It.IsAny<CancellationToken>()))
121121
.ReturnsAsync(expectedProcessorPayload);
122122

123123
var logger = Mock.Of<ILogger<TestSetupController>>();
@@ -127,7 +127,7 @@ public async Task SetupTest_WhenProcessorHasDataFields_ShouldReturn200OKWithSamp
127127
var expectedBody = new TopLevelMessageModel<SamplesPayload>(new SamplesPayload(expectedProcessorPayload));
128128

129129
// Act
130-
var result = await sut.SetupTest();
130+
var result = await sut.SetupTest(CancellationToken.None);
131131

132132
// Assert
133133
result.Should().NotBeNull()

tests/InvvardDev.Ifttt.Tests/Services/ProcessorRepositoryTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@ public async Task AddProcessor_AddsProcessorSuccessfully()
2323
public async Task UpdateProcessor_WhenProcessorExists_UpdatesProcessorSuccessfully()
2424
{
2525
// Arrange
26-
var sut = new ProcessorRepository();
2726
var processorTree = Given.A<ProcessorTree>();
27+
28+
var sut = new ProcessorRepository();
2829
await sut.AddProcessor(processorTree);
2930

30-
var updatedProcessorTree = Given.A<ProcessorTree>()with { ProcessorSlug = processorTree.ProcessorSlug, Kind = processorTree.Kind };
31+
var updatedProcessorTree = Given.A<ProcessorTree>() with { ProcessorSlug = processorTree.ProcessorSlug, Kind = processorTree.Kind };
3132

3233
// Act
3334
await sut.UpdateProcessor(updatedProcessorTree);

0 commit comments

Comments
 (0)