public void ShouldStartAndStopListening()
        {
            var fixtureSnapshot = new Fixture { Id = "TestId", MatchStatus = "30", Sequence = 1 };
            var plugin = new Mock<IAdapterPlugin>();

            var resource = new Mock<IResourceFacade>();
            var connector = new Mock<IAdapterPlugin>();
            var eventState = new Mock<IEventState>();
            
            var marketFilterObjectStore = new StateManager(_settings.Object,plugin.Object);
            
            resource.Setup(r => r.Sport).Returns("Football");
            resource.Setup(r => r.Content).Returns(new Summary());
            resource.Setup(r => r.StartStreaming()).Raises(r => r.StreamConnected += null, EventArgs.Empty);
            resource.Setup(r => r.StopStreaming()).Raises(r => r.StreamDisconnected += null, EventArgs.Empty);
            resource.Setup(r => r.GetSnapshot()).Returns(FixtureJsonHelper.ToJson(fixtureSnapshot));
            resource.Setup(r => r.Id).Returns("TestId");
            eventState.Setup(e => e.GetCurrentSequence(It.IsAny<string>(), It.IsAny<string>())).Returns(-1);

            var listener = new StreamListener(resource.Object, connector.Object, eventState.Object, marketFilterObjectStore,_settings.Object);
            
            listener.MonitorEvents();
            
            listener.Start();

            listener.Stop();

            listener.ShouldRaise("OnConnected");
            listener.ShouldNotRaise("OnError");
            listener.ShouldRaise("OnStop");
            listener.ShouldNotRaise("OnDisconnected","The disconnection is triggered by the user");

            connector.Verify(c => c.ProcessSnapshot(It.IsAny<Fixture>(), false), Times.Once());
        }
        public void StreamListenerEvents()
        {
            // STEP 1: prepare the stub data
            Mock<IResourceFacade> resource = new Mock<IResourceFacade>();
            Mock<IAdapterPlugin> connector = new Mock<IAdapterPlugin>();
            Mock<IEventState> state = new Mock<IEventState>();

            _settings.Setup(x => x.MarketFiltersDirectory).Returns(".");

            var provider = new StateManager(_settings.Object, connector.Object);

            var suspensionManager = new SuspensionManager(provider, connector.Object);

            var fixtureSnapshot = new Fixture { Id = "ABC", Epoch = 0, MatchStatus = "30", Sequence = 1 };
            var settledSnapshot = new Fixture { Id = "ABC", Epoch = 3, MatchStatus = "50", Sequence = 5 };

            resource.Setup(x => x.Id).Returns("ABC");
            resource.Setup(x => x.Content).Returns(new Summary());
            resource.Setup(x => x.MatchStatus).Returns(MatchStatus.InRunning);
            resource.Setup(r => r.StartStreaming()).Raises(r => r.StreamConnected += null, EventArgs.Empty);
            resource.Setup(r => r.StopStreaming()).Raises(r => r.StreamDisconnected += (e, o) => { }, EventArgs.Empty);

            //sequence of 3 snapshots middle one should raise an exception
            resource.SetupSequence(r => r.GetSnapshot())
                .Returns(FixtureJsonHelper.ToJson(fixtureSnapshot))
                .Returns(String.Empty)
                .Returns(FixtureJsonHelper.ToJson(settledSnapshot));


            // STEP 2: start the listener
            StreamListener listener = new StreamListener(resource.Object, connector.Object, state.Object, provider, _settings.Object);

            listener.MonitorEvents();

            listener.Start();

            listener.ShouldRaise("OnConnected");
            listener.ShouldRaise("OnBeginSnapshotProcessing");
            listener.ShouldRaise("OnFinishedSnapshotProcessing");

            //stream event
            var update = new Fixture
            {
                Id = "ABC",
                Sequence = 2,
                MatchStatus = ((int)MatchStatus.MatchOver).ToString(),
                Epoch = 2,
                LastEpochChangeReason = new[] { (int)EpochChangeReason.MatchStatus }
            };

            var message = new StreamMessage { Content = update };
            listener.ResourceOnStreamEvent(this, new StreamEventArgs(JsonConvert.SerializeObject(message)));
            listener.ShouldRaise("OnBeginStreamUpdateProcessing");
            listener.ShouldRaise("OnFinishedStreamUpdateProcessing");

            //as a result of match status change it will get a second snapshot which is String.Empty
            listener.ShouldRaise("OnError")
                .WithArgs<StreamListenerEventArgs>(e => e.Exception != null);

            listener.ShouldRaise("OnSuspend");

            //when recovered the IsErrored should clear
            listener.IsErrored.Should().BeFalse();
            listener.ShouldRaise("OnFlagsChanged")
                .WithArgs<StreamListenerEventArgs>(e => ((StreamListener)e.Listener).IsErrored == false);

            //simulate stream disconnection 
            listener.ResourceOnStreamDisconnected(null, null);

            listener.ShouldRaise("OnDisconnected");

            listener.Stop();

            listener.ShouldRaise("OnStop");

            resource.Verify(x => x.GetSnapshot(), Times.Exactly(3), "The StreamListener was supposed to acquire 3 snasphots");
            connector.Verify(x => x.ProcessSnapshot(It.IsAny<Fixture>(), It.IsAny<bool>()), Times.Exactly(2));
        }