public async Task DoesNotSaveIfEventIsMissing()
            {
                var entity = new AddStatusMessageManualChangeEntity("path", new DateTime(2018, 8, 21), "message", false)
                {
                    Timestamp = new DateTimeOffset(2018, 8, 21, 0, 0, 0, TimeSpan.Zero)
                };

                var time        = entity.Timestamp.UtcDateTime;
                var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);

                _table
                .Setup(x => x.RetrieveAsync <EventEntity>(eventRowKey))
                .Returns(Task.FromResult <EventEntity>(null));

                _table
                .Setup(x => x.InsertAsync(It.IsAny <MessageEntity>()))
                .Returns(Task.CompletedTask);

                _table
                .Setup(x => x.InsertAsync(It.IsAny <EventEntity>()))
                .Returns(Task.CompletedTask);

                await Assert.ThrowsAsync <ArgumentException>(() => _handler.Handle(entity));

                _table.Verify(x => x.InsertAsync(It.IsAny <MessageEntity>()), Times.Never());
                _table.Verify(x => x.InsertAsync(It.IsAny <EventEntity>()), Times.Never());
            }
            public async Task ThrowsArgumentExceptionIfMissingEvent()
            {
                var entity = new EditStatusMessageManualChangeEntity("path", new DateTime(2018, 8, 20), new DateTime(2018, 8, 21), "message");

                var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);

                _table
                .Setup(x => x.RetrieveAsync <EventEntity>(eventRowKey))
                .Returns(Task.FromResult <EventEntity>(null));

                await Assert.ThrowsAsync <ArgumentException>(() => _handler.Handle(entity));
            }
コード例 #3
0
        public async Task Handle(EditStatusEventManualChangeEntity entity)
        {
            var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);
            var eventEntity = await _table.RetrieveAsync <EventEntity>(eventRowKey);

            if (eventEntity == null)
            {
                throw new ArgumentException("Cannot edit an event that does not exist.");
            }

            eventEntity.AffectedComponentStatus = entity.EventAffectedComponentStatus;
            ManualStatusChangeUtility.UpdateEventIsActive(eventEntity, entity.EventIsActive, entity.Timestamp.UtcDateTime);

            await _table.ReplaceAsync(eventEntity);
        }
        public async Task Handle(DeleteStatusMessageManualChangeEntity entity)
        {
            var eventRowKey   = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);
            var messageEntity = await _table.RetrieveAsync <MessageEntity>(MessageEntity.GetRowKey(eventRowKey, entity.MessageTimestamp));

            if (messageEntity == null)
            {
                throw new ArgumentException("Cannot delete a message that does not exist.");
            }

            messageEntity.Contents = "";
            messageEntity.Type     = (int)MessageType.Manual;

            await _table.ReplaceAsync(messageEntity);
        }
            public async Task DeletesEvent()
            {
                var entity = new DeleteStatusEventManualChangeEntity("path", new DateTime(2018, 8, 21));

                var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);

                _table
                .Setup(x => x.DeleteAsync(EventEntity.DefaultPartitionKey, eventRowKey))
                .Returns(Task.CompletedTask)
                .Verifiable();

                await _handler.Handle(entity);

                _table.Verify();
            }
コード例 #6
0
            public async Task ThrowsArgumentExceptionIfMissingEvent()
            {
                var entity = new EditStatusEventManualChangeEntity("path", ComponentStatus.Degraded, new DateTime(2018, 8, 20), false)
                {
                    Timestamp = new DateTimeOffset(2018, 8, 21, 0, 0, 0, TimeSpan.Zero)
                };

                var time        = entity.Timestamp.UtcDateTime;
                var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);

                _table
                .Setup(x => x.RetrieveAsync <EventEntity>(eventRowKey))
                .Returns(Task.FromResult <EventEntity>(null));

                await Assert.ThrowsAsync <ArgumentException>(() => _handler.Handle(entity));
            }
            public async Task EditsMessage(MessageType type)
            {
                var entity = new EditStatusMessageManualChangeEntity("path", new DateTime(2018, 8, 20), new DateTime(2018, 8, 21), "message");

                var eventRowKey   = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);
                var messageRowKey = MessageEntity.GetRowKey(eventRowKey, entity.MessageTimestamp);

                var existingEntity =
                    new EventEntity(
                        entity.EventAffectedComponentPath,
                        entity.EventStartTime,
                        ComponentStatus.Up,
                        null);

                _table
                .Setup(x => x.RetrieveAsync <EventEntity>(eventRowKey))
                .Returns(Task.FromResult(existingEntity));

                var existingMessage = new MessageEntity(
                    existingEntity,
                    entity.MessageTimestamp,
                    "old message",
                    type);

                _table
                .Setup(x => x.RetrieveAsync <MessageEntity>(messageRowKey))
                .Returns(Task.FromResult(existingMessage));

                _table
                .Setup(x => x.ReplaceAsync(
                           It.Is <MessageEntity>(messageEntity =>
                                                 messageEntity.PartitionKey == MessageEntity.DefaultPartitionKey &&
                                                 messageEntity.RowKey == messageRowKey &&
                                                 messageEntity.ParentRowKey == eventRowKey &&
                                                 messageEntity.Time == existingMessage.Time &&
                                                 messageEntity.Contents == entity.MessageContents &&
                                                 messageEntity.Type == (int)MessageType.Manual
                                                 )))
                .Returns(Task.CompletedTask)
                .Verifiable();

                await _handler.Handle(entity);

                _table.Verify();
            }
コード例 #8
0
        public async Task Handle(AddStatusMessageManualChangeEntity entity)
        {
            var time = entity.Timestamp.UtcDateTime;

            var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);
            var eventEntity = await _table.RetrieveAsync <EventEntity>(eventRowKey);

            if (eventEntity == null)
            {
                throw new ArgumentException("Cannot create a message for an event that does not exist.");
            }

            var messageEntity = new MessageEntity(eventEntity, time, entity.MessageContents, MessageType.Manual);

            await _table.InsertAsync(messageEntity);

            if (ManualStatusChangeUtility.UpdateEventIsActive(eventEntity, entity.EventIsActive, time))
            {
                await _table.ReplaceAsync(eventEntity);
            }
        }
コード例 #9
0
            public async Task EditsEvent(bool eventIsActive, bool shouldEventBeActive)
            {
                var entity = new EditStatusEventManualChangeEntity("path", ComponentStatus.Degraded, new DateTime(2018, 8, 20), shouldEventBeActive)
                {
                    Timestamp = new DateTimeOffset(2018, 8, 21, 0, 0, 0, TimeSpan.Zero)
                };

                var time        = entity.Timestamp.UtcDateTime;
                var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);

                var existingEntity =
                    new EventEntity(
                        entity.EventAffectedComponentPath,
                        entity.EventStartTime,
                        ComponentStatus.Up,
                        eventIsActive ? (DateTime?)null : new DateTime(2018, 8, 19));

                _table
                .Setup(x => x.RetrieveAsync <EventEntity>(eventRowKey))
                .Returns(Task.FromResult(existingEntity));

                var shouldUpdateEndTime = ManualStatusChangeUtility.ShouldEventBeActive(existingEntity, shouldEventBeActive, time);

                _table
                .Setup(x => x.ReplaceAsync(
                           It.Is <EventEntity>(eventEntity =>
                                               eventEntity.PartitionKey == EventEntity.DefaultPartitionKey &&
                                               eventEntity.RowKey == eventRowKey &&
                                               eventEntity.AffectedComponentPath == existingEntity.AffectedComponentPath &&
                                               eventEntity.AffectedComponentStatus == entity.EventAffectedComponentStatus &&
                                               eventEntity.StartTime == existingEntity.StartTime &&
                                               eventEntity.EndTime == (shouldUpdateEndTime ? time : existingEntity.EndTime)
                                               )))
                .Returns(Task.CompletedTask)
                .Verifiable();

                await _handler.Handle(entity);

                _table.Verify();
            }
コード例 #10
0
            public async Task SavesMessageAndEvent(bool eventIsActive)
            {
                var entity = new AddStatusEventManualChangeEntity("path", ComponentStatus.Up, "message", eventIsActive)
                {
                    Timestamp = new DateTimeOffset(2018, 8, 21, 0, 0, 0, TimeSpan.Zero)
                };

                var time        = entity.Timestamp.UtcDateTime;
                var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, time);

                _table.Setup(x => x.InsertAsync(
                                 It.Is <MessageEntity>(messageEntity =>
                                                       messageEntity.PartitionKey == MessageEntity.DefaultPartitionKey &&
                                                       messageEntity.RowKey == MessageEntity.GetRowKey(eventRowKey, time) &&
                                                       messageEntity.ParentRowKey == eventRowKey &&
                                                       messageEntity.Time == time &&
                                                       messageEntity.Contents == entity.MessageContents
                                                       )))
                .Returns(Task.CompletedTask)
                .Verifiable();

                _table.Setup(x => x.InsertAsync(
                                 It.Is <EventEntity>(eventEntity =>
                                                     eventEntity.PartitionKey == EventEntity.DefaultPartitionKey &&
                                                     eventEntity.RowKey == eventRowKey &&
                                                     eventEntity.AffectedComponentPath == entity.EventAffectedComponentPath &&
                                                     eventEntity.AffectedComponentStatus == entity.EventAffectedComponentStatus &&
                                                     eventEntity.StartTime == time &&
                                                     eventEntity.EndTime == (entity.EventIsActive ? (DateTime?)null : time)
                                                     )))
                .Returns(Task.CompletedTask)
                .Verifiable();

                await _handler.Handle(entity);

                _table.Verify();
            }
コード例 #11
0
        public Task Handle(DeleteStatusEventManualChangeEntity entity)
        {
            var eventRowKey = EventEntity.GetRowKey(entity.EventAffectedComponentPath, entity.EventStartTime);

            return(_table.DeleteAsync(EventEntity.DefaultPartitionKey, eventRowKey));
        }