From 139ab88fe5049615bac5e9c7d4f420686a57ad37 Mon Sep 17 00:00:00 2001 From: Tomas Lycken Date: Thu, 5 Oct 2017 13:47:57 +0200 Subject: [PATCH] Improve extensibility (#22) Fixes #21 --- .../NonDefaultImplementationsTests.cs | 84 +++++++++++++++++++ .../Infrastructure/EventStoreFixture.cs | 8 +- .../EntityFrameworkEventStore.cs | 2 +- 3 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 src/RdbmsEventStore.EntityFramework.Tests/ExtensibilityTests/NonDefaultImplementationsTests.cs diff --git a/src/RdbmsEventStore.EntityFramework.Tests/ExtensibilityTests/NonDefaultImplementationsTests.cs b/src/RdbmsEventStore.EntityFramework.Tests/ExtensibilityTests/NonDefaultImplementationsTests.cs new file mode 100644 index 0000000..61d2974 --- /dev/null +++ b/src/RdbmsEventStore.EntityFramework.Tests/ExtensibilityTests/NonDefaultImplementationsTests.cs @@ -0,0 +1,84 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Data.Entity; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using RdbmsEventStore.EntityFramework.Tests.Infrastructure; +using RdbmsEventStore.EntityFramework.Tests.TestData; +using Xunit; + +namespace RdbmsEventStore.EntityFramework.Tests.ExtensibilityTests +{ + public class NonDefaultEvent : IMutableEvent + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long EventId { get; set; } + [Required] + public long StreamId { get; set; } + [Required] + public DateTimeOffset Timestamp { get; set; } + [Required] + public long Version { get; set; } + [Required] + public string Type { get; set; } + [Required] + public byte[] Payload { get; set; } + } + + public class NonDefaultContext : DbContext, IEventDbContext + { + public DbSet Events { get; set; } + } + + [Collection(nameof(InMemoryDatabaseCollection))] + public class NonDefaultImplementationsTests : IClassFixture>, IDisposable + { + private readonly EventStoreFixture _fixture; + private readonly NonDefaultContext _dbContext; + + public NonDefaultImplementationsTests(EventStoreFixture fixture) + { + EffortProviderFactory.ResetDb(); + _fixture = fixture; + _dbContext = new NonDefaultContext(); + } + + [Fact] + public async Task CanCommitEventsToStoreWithDefaultImplementations() + { + var store = _fixture.BuildEventStore(_dbContext); + + await store.Commit(1, 0, new FooEvent { Foo = "Bar" }); + } + + [Fact] + public async Task CanReadEventsFromStoreWithNonDefaultImplementations() + { + _dbContext.Events.AddRange(new[] + { + new NonDefaultEvent + { + StreamId = 1, + Timestamp = DateTimeOffset.UtcNow, + Version = 1, + Type = "FooEvent", + Payload =Encoding.UTF8.GetBytes(@"{""Foo"":""Bar""}") + } + }); + await _dbContext.SaveChangesAsync(); + + var store = _fixture.BuildEventStore(_dbContext); + + var events = await store.Events(1); + + Assert.Equal(1, events.Count()); + } + public void Dispose() + { + _dbContext?.Dispose(); + } + } +} \ No newline at end of file diff --git a/src/RdbmsEventStore.EntityFramework.Tests/Infrastructure/EventStoreFixture.cs b/src/RdbmsEventStore.EntityFramework.Tests/Infrastructure/EventStoreFixture.cs index 916d78a..8fec0ca 100644 --- a/src/RdbmsEventStore.EntityFramework.Tests/Infrastructure/EventStoreFixture.cs +++ b/src/RdbmsEventStore.EntityFramework.Tests/Infrastructure/EventStoreFixture.cs @@ -1,4 +1,5 @@ using System; +using System.Data.Entity; using RdbmsEventStore.EventRegistry; namespace RdbmsEventStore.EntityFramework.Tests.Infrastructure @@ -6,7 +7,7 @@ namespace RdbmsEventStore.EntityFramework.Tests.Infrastructure public class EventStoreFixture where TId : IEquatable where TStreamId : IEquatable - where TEvent : Event, new() + where TEvent : class, IMutableEvent, new() { public EventStoreFixture() { @@ -21,7 +22,8 @@ public EventStoreFixture() public DefaultEventFactory EventFactory { get; } public IWriteLock WriteLock { get; } - public EntityFrameworkEventStore, TEvent> BuildEventStore(EventStoreContext dbContext) - => new EntityFrameworkEventStore, TEvent>(dbContext, EventFactory, WriteLock); + public EntityFrameworkEventStore BuildEventStore(TEventStoreContext dbContext) + where TEventStoreContext : DbContext, IEventDbContext + => new EntityFrameworkEventStore(dbContext, EventFactory, WriteLock); } } \ No newline at end of file diff --git a/src/RdbmsEventStore.EntityFramework/EntityFrameworkEventStore.cs b/src/RdbmsEventStore.EntityFramework/EntityFrameworkEventStore.cs index 107b77f..ff7d601 100644 --- a/src/RdbmsEventStore.EntityFramework/EntityFrameworkEventStore.cs +++ b/src/RdbmsEventStore.EntityFramework/EntityFrameworkEventStore.cs @@ -10,7 +10,7 @@ public class EntityFrameworkEventStore : IEven where TId : IEquatable where TStreamId : IEquatable where TContext : DbContext, IEventDbContext - where TEvent : Event, IEvent, new() + where TEvent : class, IEvent, new() { private readonly TContext context; private readonly IEventFactory _eventFactory;