Skip to content

Commit

Permalink
Fixing problem with not storing Event metadata #1
Browse files Browse the repository at this point in the history
  • Loading branch information
Dzoukr committed Oct 26, 2018
1 parent 8c6e59b commit 92dbc34
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 18 deletions.
3 changes: 3 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
### 1.1.2 - October 26 2018
* Fixing problem with not storing Event metadata #1

### 1.1.1 - October 23 2018
* Package description update

Expand Down
15 changes: 10 additions & 5 deletions src/CosmoStore/TableStorage/Conversion.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module CosmoStore.TableStorage.Conversion
open System
open Microsoft.WindowsAzure.Storage.Table
open CosmoStore
open System.Collections.Generic

let internal streamRowKey = "Stream"

Expand All @@ -28,10 +29,14 @@ let eventWriteToEntity streamId position (x:EventWrite) : DynamicTableEntity =
| None -> ()
entity

let private nullToNone = function
| null -> None
| v -> Some v

let private tryStringValue key (dict:IDictionary<string, EntityProperty>) =
match dict.TryGetValue(key) with
| true, v ->
match v with
| null -> None
| x -> x.StringValue |> Some
| false, _ -> None

let isEvent (x:DynamicTableEntity) = x.RowKey <> streamRowKey

let newStreamEntity streamId = DynamicTableEntity(streamId, "Stream")
Expand All @@ -44,6 +49,6 @@ let entityToEventRead (x:DynamicTableEntity) : EventRead =
Position = x.Properties.["Position"].Int64Value.Value
Name = x.Properties.["Name"].StringValue
Data = x.Properties.["Data"].StringValue |> Serialization.stringToJToken
Metadata = x.Properties.["Metadata"].StringValue |> nullToNone |> Option.map Serialization.stringToJToken
Metadata = x.Properties |> tryStringValue "Metadata" |> Option.map Serialization.stringToJToken
CreatedUtc = x.Timestamp.UtcDateTime
}
31 changes: 18 additions & 13 deletions tests/CosmoStore.Tests/BasicTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ open NUnit.Framework
open CosmoStore
open Newtonsoft.Json.Linq
open Microsoft.Azure.Documents.Client
open CosmoStore.TableStorage

module CosmosDb =
open CosmoStore.CosmosDb

let private smallSize = 1000
let private bigSize = 100000
let smallSize = 1000
let bigSize = 100000


let private getConfig throughput =
Expand All @@ -22,40 +23,38 @@ module CosmosDb =
let n = sprintf "EventStore_%i" throughput
{ c with DatabaseName = n }

let private cleanup throughput =
let getCleanEventStore throughput =
let conf = getConfig throughput
let client = new DocumentClient(conf.ServiceEndpoint, conf.AuthKey)
try
client.DeleteDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri(conf.DatabaseName, "Events"))
do client.DeleteDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri(conf.DatabaseName, "Events"))
|> Async.AwaitTask
|> Async.RunSynchronously
|> ignore
with _ -> ()
with ex -> ()
conf |> EventStore.getEventStore

let eventStoreSmall =
smallSize |> cleanup
smallSize |> getConfig |> EventStore.getEventStore
smallSize |> getCleanEventStore
let eventStoreBig =
bigSize |> cleanup
bigSize |> getConfig |> EventStore.getEventStore
bigSize |> getCleanEventStore

module TableStorage =
open CosmoStore.TableStorage
open Microsoft.WindowsAzure.Storage

let private conf = Configuration.CreateDefaultForLocalEmulator()

let private cleanup() =
let getCleanEventStore() =
let account = CloudStorageAccount.DevelopmentStorageAccount
let client = account.CreateCloudTableClient()
let table = client.GetTableReference("Events")
try
table.DeleteIfExistsAsync() |> Async.AwaitTask |> Async.RunSynchronously |> ignore
with _ -> ()

let eventStore =
cleanup()
conf |> EventStore.getEventStore

let eventStore = getCleanEventStore()

let getStreamId () = sprintf "TestStream_%A" (Guid.NewGuid())

Expand Down Expand Up @@ -88,6 +87,12 @@ let getEventStore = function
| StoreType.CosmosBig -> CosmosDb.eventStoreBig
| StoreType.TableStorage -> TableStorage.eventStore

let getCleanEventStore = function
| StoreType.CosmosSmall -> CosmosDb.getCleanEventStore CosmosDb.smallSize
| StoreType.CosmosBig -> CosmosDb.getCleanEventStore CosmosDb.bigSize
| StoreType.TableStorage -> TableStorage.getCleanEventStore()


[<Test>]
let ``Appends event`` ([<Values(StoreType.CosmosSmall, StoreType.CosmosBig, StoreType.TableStorage)>] (typ:StoreType)) =
let store = typ |> getEventStore
Expand Down
1 change: 1 addition & 0 deletions tests/CosmoStore.Tests/CosmoStore.Tests.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="BasicTests.fs" />
<Compile Include="Issues.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\CosmoStore\CosmoStore.fsproj" />
Expand Down
19 changes: 19 additions & 0 deletions tests/CosmoStore.Tests/Issues.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module CosmoStore.Tests.Issues

open NUnit.Framework
open CosmoStore
open CosmoStore.Tests.BasicTests

[<Test>]
let ``Can read back Events stored without metadata`` ([<Values(StoreType.CosmosSmall, StoreType.CosmosBig, StoreType.TableStorage)>] (typ:StoreType)) =
let store = typ |> getCleanEventStore
let streamId = getStreamId()
let event =
1 |> getEvent |> fun e -> { e with Metadata = None }
event
|> store.AppendEvent streamId ExpectedPosition.Any
|> Async.AwaitTask
|> Async.RunSynchronously
|> fun e ->
Assert.AreEqual(None, e.Metadata)
|> ignore

0 comments on commit 92dbc34

Please sign in to comment.