public async Task Not_Add_IntegrityCheck_Status_To_User_Properties_When_IntegrationCheckKey_Is_Missing_And_ThrowExeption_Flag_Is_False()
        {
            //Arrange
            Message serviceBusMessage = new Message(Encoding.UTF8.GetBytes("MESSAGE_PAYLOAD"));

            var plugin = new MessagePayloadEncryptionPlugin(fakeCryptographyProvider);

            //Act
            var result = await plugin.AfterMessageReceive(serviceBusMessage);

            result.UserProperties.ContainsKey(integrityCheckStatusProperty).Should().BeFalse();
        }
        public async Task Throw_NullReferenceException_When_IntegrationCheckKey_Is_Missing_And_ThrowExeption_Flag_Is_True()
        {
            //Arrange
            Message serviceBusMessage = new Message(Encoding.UTF8.GetBytes("MESSAGE_PAYLOAD"));

            var plugin = new MessagePayloadEncryptionPlugin(fakeCryptographyProvider, throwExceptionWhenMissingProperties: true);

            //Act

            Func <Task <Message> > func = async() => await plugin.AfterMessageReceive(serviceBusMessage);

            await func.Should().ThrowExactlyAsync <NullReferenceException>();
        }
        public async Task Add_IntegrityCheck_Key_To_User_Properties_Before_Sending_The_Message()
        {
            //Arrange
            var     messagePayloadBytes = Encoding.UTF8.GetBytes("MESSAGE_PAYLOAD");
            Message serviceBusMessage   = new Message(messagePayloadBytes);

            var plugin = new MessagePayloadEncryptionPlugin(fakeCryptographyProvider);

            //Act
            var result = await plugin.BeforeMessageSend(serviceBusMessage);

            //Assert
            result.UserProperties.ContainsKey(integrityCheckKeyProperty).Should().BeTrue();
            result.UserProperties[integrityCheckKeyProperty].ToString().Should().Be(GetMd5Hash(messagePayloadBytes));
        }
        public async Task Allow_Overriding_User_Property_Name_For_Integrity_Check_Key()
        {
            //Arrange
            Message serviceBusMessage = new Message(Encoding.UTF8.GetBytes("MESSAGE_PAYLOAD"));

            const string keyName = "intcheckkey";

            var plugin = new MessagePayloadEncryptionPlugin(fakeCryptographyProvider, intCheckKeyPropertyName: keyName);

            //Act
            var result = await plugin.BeforeMessageSend(serviceBusMessage);

            //Assert
            result.UserProperties.ContainsKey(integrityCheckKeyProperty).Should().BeFalse();
            result.UserProperties.ContainsKey(keyName).Should().BeTrue();
        }
        public async Task Add_IntegrityCheck_Status_To_User_Properties_After_Receiving_The_Message()
        {
            //Arrange
            Message serviceBusMessage = new Message(Encoding.UTF8.GetBytes("MESSAGE_PAYLOAD"));

            var plugin = new MessagePayloadEncryptionPlugin(fakeCryptographyProvider);

            //Act
            var result = await plugin.BeforeMessageSend(serviceBusMessage);

            result = await plugin.AfterMessageReceive(result);

            //Assert
            result.UserProperties.ContainsKey(integrityCheckStatusProperty).Should().BeTrue();
            result.UserProperties[integrityCheckStatusProperty].ToString().Should().Be("True");
        }
        public async Task Decrypt_Message_Payload_After_Receiving_The_Message()
        {
            //Arrange
            const string inputMessagePayload = "MESSAGE_PAYLOAD-ENCRYPTED";
            Message      serviceBusMessage   = new Message(Encoding.UTF8.GetBytes(inputMessagePayload));

            var plugin = new MessagePayloadEncryptionPlugin(fakeCryptographyProvider);

            //Act
            var result = await plugin.AfterMessageReceive(serviceBusMessage);

            //Assert
            var actualMessagePayload = Encoding.UTF8.GetString(result.Body);

            actualMessagePayload.Should().Be("MESSAGE_PAYLOAD");
        }