-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStreamSubscriberTests.fs
90 lines (65 loc) · 3.69 KB
/
StreamSubscriberTests.fs
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
module Melman.EventStore.AspNetCore.Tests
open System
open System.Text.Json
open System.Threading
open System.Threading.Tasks
open Melman.EventStore.Common
open Microsoft.Extensions.Hosting
open NUnit.Framework
open Moq
open EventStore.Client
open Microsoft.Extensions.Logging.Abstractions
open Microsoft.Extensions.Logging
[<SetUp>]
let Setup () =
()
type TestableStreamSubscriber(logger: ILogger<StreamSubscriber>, eventStoreFactory: IEventStoreFactory, called: unit -> unit) =
inherit StreamSubscriber(logger, eventStoreFactory)
override this.HandleNewEvent resolvedEvent cancellationToken =
called()
Task.CompletedTask
override this.HandleSubscriptionDropped reason error = ()
override this.StoreLatestEventPosition latestEventPosition = Task.CompletedTask
override this.Stream = "Test Stream"
type FakeEventStoreFactory(mock: Mock<EventStoreClient>) =
interface IEventStoreFactory with
member this.CreateClient() = mock.Object
let releasingTask (trigger: SemaphoreSlim) =
Task.CompletedTask.ContinueWith<StreamSubscription> (fun t ->
trigger.Release() |> ignore
null :> StreamSubscription)
type TempData = { Name: string }
let createDummyRecord (data: EventData) =
let meta = dict ["type", "Jeff"; "content-type", "application/json"; "created", DateTime.UtcNow.Ticks.ToString()]
let record = EventRecord("", Uuid.NewUuid(), StreamPosition.FromInt64(0L), Position.Start, meta, data.Data, ReadOnlyMemory([||]))
ResolvedEvent(record, record, 0UL)
let ``Given a stream it should be subscribed against and then cancelled... or something`` () =
let nullLogger = NullLogger<StreamSubscriber>.Instance
let mockClient = Mock<EventStoreClient>()
let fakeFactory = FakeEventStoreFactory(mockClient)
let cts = new CancellationTokenSource()
let called () = cts.Cancel()
let sut = new TestableStreamSubscriber(nullLogger, fakeFactory, called) : IHostedService
let releaseTrigger = new SemaphoreSlim(0, 1)
let opts = JsonSerializerOptions()
let reco = createDummyRecord (Helpers.createJsonEvent opts "" { Name = "jeff" })
// Get error here... bugger
// Non-overridable members (here: EventStoreClient.SubscribeToStreamAsync) may not be used in setup / verification expr
mockClient.Setup(fun x -> x.SubscribeToStreamAsync(
"Test Stream",
It.IsAny<Func<StreamSubscription, ResolvedEvent, CancellationToken, Task>>(),
resolveLinkTos = false,
subscriptionDropped = It.IsAny<Action<StreamSubscription, SubscriptionDroppedReason, exn>>(),
configureOperationOptions = It.IsAny<Action<EventStoreClientOperationOptions>>(),
userCredentials = It.IsAny<UserCredentials>(),
cancellationToken = It.IsAny<CancellationToken>()))
.Callback<string, Func<StreamSubscription, ResolvedEvent, CancellationToken, Task>>((fun n evAppeared ->
let toFire = task {
do! releaseTrigger.WaitAsync() // this will wait for the subscription to be created below
evAppeared.Invoke(null, reco, cts.Token) |> ignore
}
()))
.Returns(releasingTask releaseTrigger) |> ignore
let _ = sut.StartAsync(cts.Token) // kicks off the background service
mockClient.VerifyAll()
Assert.Pass()