Skip to content

Commit 12f19bc

Browse files
committed
Trigger lifetime test and fixes
1 parent a9262ae commit 12f19bc

File tree

11 files changed

+163
-13
lines changed

11 files changed

+163
-13
lines changed

src/EntityFrameworkCore.Triggered/Internal/TriggerDiscoveryService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public IEnumerable<TriggerDescriptor> DiscoverTriggers(Type openTriggerType, Typ
4444
{
4545
if (triggerDescriptors == null)
4646
{
47-
triggerDescriptors = new List<TriggerDescriptor>(triggers.Count());
47+
triggerDescriptors = new List<TriggerDescriptor>();
4848
}
4949

5050
if (trigger != null)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using Microsoft.EntityFrameworkCore;
7+
8+
namespace EntityFrameworkCore.Triggered.IntegrationTests.LifetimeTests
9+
{
10+
public class ApplicationDbContext
11+
#if EFCORETRIGGERED1
12+
: TriggeredDbContext
13+
#else
14+
: DbContext
15+
#endif
16+
{
17+
public ApplicationDbContext(DbContextOptions options) : base(options)
18+
{
19+
}
20+
21+
public DbSet<User> Users { get; set; }
22+
}
23+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using EntityFrameworkCore.Triggered.Extensions;
7+
using Microsoft.EntityFrameworkCore;
8+
using Microsoft.Extensions.DependencyInjection;
9+
using ScenarioTests;
10+
using Xunit;
11+
12+
namespace EntityFrameworkCore.Triggered.IntegrationTests.LifetimeTests
13+
{
14+
public partial class TriggerLifetimeTestScenario
15+
{
16+
public int SingletonTriggerInstances { get; set; }
17+
public int ScopedTriggerInstances { get; set; }
18+
public int TransientTriggerInstances { get; set; }
19+
20+
[Scenario(NamingPolicy = ScenarioTestMethodNamingPolicy.Test)]
21+
public void Scenario(ScenarioContext scenario)
22+
{
23+
const int iterations = 5;
24+
const int usersPerIteration = 5;
25+
26+
using var serviceProvider = new ServiceCollection()
27+
.AddDbContext<ApplicationDbContext>(options => {
28+
options.UseInMemoryDatabase(scenario.TargetName);
29+
options.UseTriggers(triggerOptions => {
30+
triggerOptions.AddTrigger<Triggers.Users.SingletonTrigger>(ServiceLifetime.Singleton);
31+
triggerOptions.AddTrigger<Triggers.Users.ScopedTrigger>(ServiceLifetime.Scoped);
32+
triggerOptions.AddTrigger<Triggers.Users.TransientTrigger>();
33+
});
34+
})
35+
.AddSingleton(this)
36+
.BuildServiceProvider();
37+
38+
for (var iteration = 0; iteration < iterations; iteration++)
39+
{
40+
using var serviceScope = serviceProvider.CreateScope();
41+
42+
var dbContext = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
43+
44+
for (var i = 0; i < usersPerIteration; i++)
45+
{
46+
dbContext.Users.Add(new User { });
47+
}
48+
49+
dbContext.SaveChanges();
50+
}
51+
52+
scenario.Fact("1: There is only 1 singleton trigger instance", () => {
53+
Assert.Equal(1, SingletonTriggerInstances);
54+
});
55+
56+
scenario.Fact("2: There are 5 scoped trigger instances", () => {
57+
Assert.Equal(5, ScopedTriggerInstances);
58+
});
59+
60+
scenario.Fact("3: There are 25 transient trigger instances", () => {
61+
Assert.Equal(25, TransientTriggerInstances);
62+
});
63+
}
64+
}
65+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
using EntityFrameworkCore.Triggered.Extensions;
4+
5+
namespace EntityFrameworkCore.Triggered.IntegrationTests.LifetimeTests.Triggers.Users
6+
{
7+
class ScopedTrigger : IBeforeSaveTrigger<object>
8+
{
9+
public ScopedTrigger(TriggerLifetimeTestScenario triggerLifetimeTestScenario)
10+
{
11+
triggerLifetimeTestScenario.ScopedTriggerInstances++;
12+
}
13+
14+
public Task BeforeSave(ITriggerContext<object> context, CancellationToken cancellationToken) => Task.CompletedTask;
15+
}
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using EntityFrameworkCore.Triggered.Extensions;
8+
9+
namespace EntityFrameworkCore.Triggered.IntegrationTests.LifetimeTests.Triggers.Users
10+
{
11+
12+
class SingletonTrigger : IBeforeSaveTrigger<object>
13+
{
14+
public SingletonTrigger(TriggerLifetimeTestScenario triggerLifetimeTestScenario)
15+
{
16+
triggerLifetimeTestScenario.SingletonTriggerInstances++;
17+
}
18+
19+
public Task BeforeSave(ITriggerContext<object> context, CancellationToken cancellationToken) => Task.CompletedTask;
20+
}
21+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
using EntityFrameworkCore.Triggered.Extensions;
4+
5+
namespace EntityFrameworkCore.Triggered.IntegrationTests.LifetimeTests.Triggers.Users
6+
{
7+
class TransientTrigger : IBeforeSaveTrigger<object>
8+
{
9+
public TransientTrigger(TriggerLifetimeTestScenario triggerLifetimeTestScenario)
10+
{
11+
triggerLifetimeTestScenario.TransientTriggerInstances++;
12+
}
13+
14+
public Task BeforeSave(ITriggerContext<object> context, CancellationToken cancellationToken) => Task.CompletedTask;
15+
}
16+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace EntityFrameworkCore.Triggered.IntegrationTests.LifetimeTests
8+
{
9+
public class User
10+
{
11+
public int Id { get; set; }
12+
}
13+
}

test/EntityFrameworkCore.Triggered.IntegrationTests/ApplicationDbContext.cs renamed to test/EntityFrameworkCore.Triggered.IntegrationTests/SampleStore/ApplicationDbContext.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
using System.Linq;
44
using System.Text;
55
using System.Threading.Tasks;
6-
using EntityFrameworkCore.Triggered.IntegrationTests.Models;
6+
using EntityFrameworkCore.Triggered.IntegrationTests.SampleStore.Models;
77
using Microsoft.EntityFrameworkCore;
88

9-
namespace EntityFrameworkCore.Triggered.IntegrationTests
9+
namespace EntityFrameworkCore.Triggered.IntegrationTests.SampleStore
1010
{
1111
public class ApplicationDbContext
1212
#if EFCORETRIGGERED1
@@ -26,14 +26,10 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
2626
{
2727
optionsBuilder.UseInMemoryDatabase(_databaseName);
2828
optionsBuilder.UseTriggers(triggerOptions => {
29-
triggerOptions.AddAssemblyTriggers();
29+
triggerOptions.AddTrigger<Triggers.Users.SoftDeleteUsers>();
3030
});
3131
}
3232

3333
public DbSet<User> Users { get; set; }
34-
35-
protected override void OnModelCreating(ModelBuilder modelBuilder)
36-
{
37-
}
3834
}
3935
}

test/EntityFrameworkCore.Triggered.IntegrationTests/Models/User.cs renamed to test/EntityFrameworkCore.Triggered.IntegrationTests/SampleStore/Models/User.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using System.Text;
55
using System.Threading.Tasks;
66

7-
namespace EntityFrameworkCore.Triggered.IntegrationTests.Models
7+
namespace EntityFrameworkCore.Triggered.IntegrationTests.SampleStore.Models
88
{
99
public class User
1010
{

test/EntityFrameworkCore.Triggered.IntegrationTests/TestScenario.cs renamed to test/EntityFrameworkCore.Triggered.IntegrationTests/SampleStore/TestScenario.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
using System.Linq;
44
using System.Text;
55
using System.Threading.Tasks;
6-
using EntityFrameworkCore.Triggered.IntegrationTests.Models;
6+
using EntityFrameworkCore.Triggered.IntegrationTests.SampleStore.Models;
77
using ScenarioTests;
88
using Microsoft.EntityFrameworkCore;
99
using Microsoft.Extensions.DependencyInjection;
1010
using Xunit;
1111

12-
namespace EntityFrameworkCore.Triggered.IntegrationTests
12+
namespace EntityFrameworkCore.Triggered.IntegrationTests.SampleStore
1313
{
1414
public partial class TestScenario
1515
{

0 commit comments

Comments
 (0)