-
-
Notifications
You must be signed in to change notification settings - Fork 545
Expand file tree
/
Copy pathEntityFrameworkProjectionTests.cs
More file actions
124 lines (95 loc) · 4.49 KB
/
EntityFrameworkProjectionTests.cs
File metadata and controls
124 lines (95 loc) · 4.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using Core.EntityFramework.Projections;
using Core.EntityFramework.Tests.Fixtures;
using Core.Events;
using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using Xunit;
namespace Core.EntityFramework.Tests;
public record Opened(Guid ShoppingCartId, Guid ClientId);
public record ProductItemAdded(Guid ShoppingCartId, int Count);
public record Cancelled(Guid ShoppingCartId);
public class ShoppingCartProjection: EntityFrameworkProjection<ShoppingCart, Guid, TestDbContext>
{
public ShoppingCartProjection()
{
ViewId(c => c.Id);
Creates<Opened>(Create);
Projects<ProductItemAdded>(e => e.ShoppingCartId, Apply);
Deletes<Cancelled>(e => e.ShoppingCartId);
}
private ShoppingCart Create(Opened opened) =>
new() { Id = opened.ShoppingCartId, ClientId = opened.ClientId, ProductCount = 0 };
private ShoppingCart Apply(ShoppingCart cart, ProductItemAdded added)
{
cart.ProductCount += added.Count;
return cart;
}
}
public class EntityFrameworkProjectionTests(EfCorePostgresContainerFixture<TestDbContext> fixture)
: IClassFixture<EfCorePostgresContainerFixture<TestDbContext>>
{
private readonly TestDbContext context = fixture.DbContext;
[Fact]
public async Task Applies_Works_Separately()
{
var projection = new ShoppingCartProjection { DbContext = context };
var cartId = Guid.CreateVersion7();
var clientId = Guid.CreateVersion7();
await projection.Handle([EventEnvelope.From(new Opened(cartId, clientId))], CancellationToken.None);
await context.SaveChangesAsync();
var savedEntity = await context.ShoppingCarts.Where(e => e.Id == cartId).FirstOrDefaultAsync();
savedEntity.Should().NotBeNull();
savedEntity.Should().BeEquivalentTo(new ShoppingCart { Id = cartId, ClientId = clientId, ProductCount = 0 });
await projection.Handle([EventEnvelope.From(new ProductItemAdded(cartId, 2))], CancellationToken.None);
await context.SaveChangesAsync();
savedEntity = await context.ShoppingCarts.Where(e => e.Id == cartId).FirstOrDefaultAsync();
savedEntity.Should().NotBeNull();
savedEntity.Should().BeEquivalentTo(new ShoppingCart { Id = cartId, ClientId = clientId, ProductCount = 2 });
await projection.Handle([EventEnvelope.From(new Cancelled(cartId))], CancellationToken.None);
await context.SaveChangesAsync();
savedEntity = await context.ShoppingCarts.Where(e => e.Id == cartId).FirstOrDefaultAsync();
savedEntity.Should().BeNull();
}
[Fact]
public async Task Applies_Works_In_Batch()
{
var projection = new ShoppingCartProjection { DbContext = context };
var cartId = Guid.CreateVersion7();
var clientId = Guid.CreateVersion7();
await projection.Handle([
EventEnvelope.From(new Opened(cartId, clientId)),
EventEnvelope.From(new ProductItemAdded(cartId, 2)),
EventEnvelope.From(new ProductItemAdded(cartId, 3)),
EventEnvelope.From(new ProductItemAdded(cartId, 5))
], CancellationToken.None);
await context.SaveChangesAsync();
var savedEntity = await context.ShoppingCarts.Where(e => e.Id == cartId).FirstOrDefaultAsync();
savedEntity.Should().NotBeNull();
savedEntity.Should().BeEquivalentTo(new ShoppingCart { Id = cartId, ClientId = clientId, ProductCount = 10 });
}
[Fact]
public async Task Applies_Works_In_Batch_With_AddAndDeleteOnTheSameRecord()
{
var projection = new ShoppingCartProjection { DbContext = context };
var cartId = Guid.CreateVersion7();
var clientId = Guid.CreateVersion7();
await projection.Handle([
EventEnvelope.From(new Opened(cartId, clientId)),
EventEnvelope.From(new Cancelled(cartId))
], CancellationToken.None);
await context.SaveChangesAsync();
var savedEntity = await context.ShoppingCarts.Where(e => e.Id == cartId).FirstOrDefaultAsync();
savedEntity.Should().BeNull();
}
[Fact]
public async Task SmokeTest()
{
var entity = new ShoppingCart { Id = Guid.CreateVersion7(), ProductCount = 2, ClientId = Guid.CreateVersion7() };
context.ShoppingCarts.Add(entity);
await context.SaveChangesAsync();
var savedEntity = await context.ShoppingCarts.FindAsync(entity.Id);
Assert.NotNull(savedEntity);
savedEntity.Should().NotBeNull();
savedEntity.Should().BeEquivalentTo(entity);
}
}