public void ShouldNotOverrideSubscriptionAckEtag() { using (EmbeddableDocumentStore store = NewDocumentStore()) { var subscriptionId = store.Subscriptions.Create(new SubscriptionCriteria()); var subscription = store.Subscriptions.Open(subscriptionId, new SubscriptionConnectionOptions()); var subscriptionActions = new SubscriptionActions(store.DocumentDatabase, null); var names = new BlockingCollection <string>(); var etagFirst = new Etag("01000000-0000-0001-0000-000000000001"); var etagBigger = new Etag("01000000-0000-0001-0000-000000000003"); store.Changes().WaitForAllPendingSubscriptions(); subscription.Subscribe(x => { names.Add(x.Value <string>("Name")); }); using (var session = store.OpenSession()) { session.Store(new User { Name = "James" }, "users/1"); session.SaveChanges(); } SpinWait.SpinUntil(() => { var updatedEtag = subscriptionActions.GetAcknowledgeEtag(subscriptionId); return(updatedEtag != null && etagFirst.CompareTo(updatedEtag) == 0); }, TimeSpan.FromSeconds(5)); subscriptionActions.SetAcknowledgeEtag(subscriptionId, etagBigger); SpinWait.SpinUntil(() => { var updatedEtag = subscriptionActions.GetAcknowledgeEtag(subscriptionId); return(updatedEtag != null && etagBigger.CompareTo(updatedEtag) == 0); }, TimeSpan.FromSeconds(5)); store.Changes().WaitForAllPendingSubscriptions(); using (var session = store.OpenSession()) { session.Store(new User { Name = "Adam" }, "users/12"); session.SaveChanges(); } string name; SpinWait.SpinUntil(() => { names.TryTake(out name, TimeSpan.FromSeconds(1)); return(name?.Equals("Adam") ?? false); }, TimeSpan.FromSeconds(5)); var afterAnotherUpdateEtag = subscriptionActions.GetAcknowledgeEtag(subscriptionId); Assert.True(etagBigger.CompareTo(afterAnotherUpdateEtag) == 0); } }
public IDisposable DocumentChange(Type documentType, Action <DocumentChangeNotification> action) { return(_documentStore.Changes().ForDocumentsStartingWith(GetId(documentType, "")) .Subscribe(new RepositoryObserver <DocumentChangeNotification>(action))); }