public void EmitProximityDetectedEvent(ProximityDetectedEvent proximityDetectedEvent) { using (IConnection conn = connectionFactory.CreateConnection()) { using (IModel channel = conn.CreateModel()) { channel.QueueDeclare( queue: queueOptions.ProximityDetectedEventQueueName, durable: false, exclusive: false, autoDelete: false, arguments: null ); string jsonPayload = proximityDetectedEvent.toJson(); var body = Encoding.UTF8.GetBytes(jsonPayload); channel.BasicPublish( exchange: "", routingKey: queueOptions.ProximityDetectedEventQueueName, basicProperties: null, body: body ); logger.LogInformation($"Emitted proximity event of {jsonPayload.Length} bytes to queue."); } } }
public void AmqpEmitterUsesBasicPublish() { var logger = new Mock <ILogger <AMQPEventEmitter> >(); var queueOptions = new QueueOptions { ProximityDetectedEventQueueName = "proximitydetected", MemberLocationRecordedEventQueueName = "memberlocationrecorded" }; var queueOptionsWrapper = new Mock <IOptions <QueueOptions> >(); queueOptionsWrapper.Setup(o => o.Value).Returns(queueOptions); var factory = new Mock <IConnectionFactory>(); var connection = new Mock <IConnection>(); var model = new Mock <IModel>(); // Ensure that we call basic publish on the appropriate queue name (routing key) model.Setup(m => m.BasicPublish(It.IsAny <string>(), It.Is <string>(rk => rk == queueOptions.ProximityDetectedEventQueueName), It.IsAny <bool>(), It.IsAny <IBasicProperties>(), It.IsAny <byte[]>())); connection.Setup(c => c.CreateModel()).Returns(model.Object); factory.Setup(f => f.CreateConnection()).Returns(connection.Object); var emitter = new AMQPEventEmitter(logger.Object, queueOptionsWrapper.Object, factory.Object); var evt = new ProximityDetectedEvent { SourceMemberID = Guid.NewGuid(), TargetMemberID = Guid.NewGuid() }; emitter.EmitProximityDetectedEvent(evt); model.VerifyAll(); }
public void TestSimpleProximityStreamEmitsAProximityEvent() { var logger = new Mock <ILogger <MemberLocationEventProcessor> >(); var subscriber = new FakeSubscriber(); var emitter = new Mock <IEventEmitter>(); var cache = new FakeLocationCache(); ProximityDetectedEvent savedEvent = null; emitter.Setup(e => e.EmitProximityDetectedEvent(It.IsAny <ProximityDetectedEvent>())). Callback <ProximityDetectedEvent>((obj) => savedEvent = obj); var eventProcessor = new MemberLocationEventProcessor(logger.Object, subscriber, emitter.Object, cache); var evt1 = new MemberLocationRecordedEvent() { Origin = "Test", Latitude = GpsUtilityTest.QueensNY.Latitude, Longitude = GpsUtilityTest.QueensNY.Longitude, MemberID = memberId1, TeamID = teamID, RecordedTime = DateTime.UtcNow.Ticks, ReportID = Guid.NewGuid() }; var evt2 = new MemberLocationRecordedEvent() { Origin = "Test", Latitude = GpsUtilityTest.NewYorkCity.Latitude, Longitude = GpsUtilityTest.NewYorkCity.Longitude, MemberID = memberId2, TeamID = teamID, RecordedTime = DateTime.UtcNow.Ticks, ReportID = Guid.NewGuid() }; eventProcessor.Start(); subscriber.TriggerEvent(evt1); subscriber.TriggerEvent(evt2); eventProcessor.Stop(); // During a detection, the "source" member is the one on the event, and the "target" // is the one found in the member location collections that is within the distance threshold. emitter.Verify(e => e.EmitProximityDetectedEvent(It.IsAny <ProximityDetectedEvent>()), Times.Once); Assert.Equal(GpsUtilityTest.QueensNY.Latitude, savedEvent.TargetMemberLocation.Latitude); Assert.Equal(GpsUtilityTest.QueensNY.Longitude, savedEvent.TargetMemberLocation.Longitude); Assert.Equal(memberId2, savedEvent.SourceMemberID); Assert.Equal(memberId1, savedEvent.TargetMemberID); Assert.True(savedEvent.MemberDistance <= 30); // hard-coded threshold is 30 at the moment. }