public void GetHandler_WhenNoTypeFound_ShouldReturnNull()
        {
            // Arrange
            Mock<IResponseHandler> responseHandlerMock = new Mock<IResponseHandler>();

            // Act
            ResponseHandlerFactory target = new ResponseHandlerFactory(responseHandlerMock.Object);
            var actual = target.GetHandler(typeof(Mock));

            // Assert
            actual.Should().Be.Null();
        }
        public void GetHandler_WhenCalled_ShouldReturnHandler()
        {
            // Arrange
            Mock<IResponseHandler> responseHandlerMock = new Mock<IResponseHandler>();

            // Act
            ResponseHandlerFactory target = new ResponseHandlerFactory(responseHandlerMock.Object);
            var actual = target.GetHandler(responseHandlerMock.Object.GetType());

            // Assert
            actual.Should().Equal(responseHandlerMock.Object);
        }
        public void Execute_WhenCalledWithNoParameters_ShouldReturnTrue()
        {
            // Arrange
            const string response = "Test Response";
            Mock<IParameters> parameters = new Mock<IParameters>();

            // Act
            ResponseHandlerFactory target = new ResponseHandlerFactory();
            var actual = target.Execute(parameters.Object, response);

            // Assert
            actual.Should().Be.True();
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="advisoryDelayHandler">
        /// Class which handles the apprioriate delay before the request is called.
        /// It is required that this class be passed into the method because the same instance of the <see cref="AdvisoryDelayHandler"/> must be passed in on every request.
        /// </param>
        /// <param name="randomService"><see cref="IRandomService"/> to use to get random values.  Defaults to <see cref="RandomOrgApiService"/></param>
        public StringSignedMethod(AdvisoryDelayHandler advisoryDelayHandler, IRandomService randomService = null) : base(advisoryDelayHandler, randomService)
        {
            var verifySignatureHandler = new VerifySignatureHandler(RandomService);

            BeforeRequestCommandFactory = new BeforeRequestCommandFactory(advisoryDelayHandler, verifySignatureHandler);

            ResponseHandlerFactory = new ResponseHandlerFactory(
                new ErrorHandlerThrowException(new ErrorParser()),
                verifySignatureHandler,
                advisoryDelayHandler,
                new VerifyIdResponseHandler(),
                ResponseParser
            );
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="advisoryDelayHandler">
        /// Class which handles the apprioriate delay before the request is called.
        /// It is required that this class be passed into the method because the same instance of the <see cref="AdvisoryDelayHandler"/> must be passed in on every request.
        /// </param>
        /// <param name="randomService"><see cref="IRandomService"/> to use to get random values.  Defaults to <see cref="RandomOrgApiService"/></param>
        public BlobSignedMethod(AdvisoryDelayHandler advisoryDelayHandler, IRandomService randomService = null) : base(advisoryDelayHandler, randomService)
        {
            // We just need to setup the Verification Signature class, other than that everything else is the same.
            var verifySignatureHandler = new VerifySignatureHandler(RandomService);

            BeforeRequestCommandFactory = new BeforeRequestCommandFactory(advisoryDelayHandler, verifySignatureHandler);

            ResponseHandlerFactory = new ResponseHandlerFactory(
                new ErrorHandlerThrowException(new ErrorParser()),
                verifySignatureHandler,
                advisoryDelayHandler,
                new VerifyIdResponseHandler(),
                ResponseParser
            );
        }
        public void Execute_WhenCalledWithResponseHandlerThatReturnsFalse_ShouldReturnFalse()
        {
            // Arrange
            const string response = "Test Response";
            Mock<IParameters> parameters = new Mock<IParameters>();
            Mock<IResponseHandler> responseHandlerMock = new Mock<IResponseHandler>();
            responseHandlerMock.Setup(m => m.Handle(parameters.Object, response)).Returns(false);

            // Act
            ResponseHandlerFactory target = new ResponseHandlerFactory(responseHandlerMock.Object);
            var actual = target.Execute(parameters.Object, response);

            // Assert
            actual.Should().Be.False();
        }
        public async Task GenerateAsync_WhenCalledWithResponseHandlerThatReturnsFalse_ShouldReturnFalse()
        {

            // Arrange
            const string request = "SomeRequest";

            Mock<IParameters> parameters = new Mock<IParameters>();
            Mock<IRequestBuilder> requestBuilderMock = new Mock<IRequestBuilder>();
            requestBuilderMock.Setup(m => m.Build(parameters.Object)).Returns(request);

            Mock<IRandomService> randomServiceMock = new Mock<IRandomService>();
            randomServiceMock.Setup(m => m.SendRequest(request));

            Mock<IBeforeRequestCommandFactory> requestCommandMock = new Mock<IBeforeRequestCommandFactory>();
            requestCommandMock.Setup(m => m.Execute(parameters.Object));

            Mock<IResponseHandler> responseHandlerMock = new Mock<IResponseHandler>();
            responseHandlerMock.Setup(m => m.CanHandle(parameters.Object)).Returns(true);
            responseHandlerMock.Setup(m => m.Handle(parameters.Object, It.IsAny<string>())).Returns(false);

            ResponseHandlerFactory responseHandlerFactory = new ResponseHandlerFactory(responseHandlerMock.Object);

            // Act
            MethodCallBroker target = new MethodCallBroker(requestBuilderMock.Object, randomServiceMock.Object, requestCommandMock.Object, responseHandlerFactory);
            var actual = await target.GenerateAsync(parameters.Object);

            // Assert
            actual.Should().Be.False();
        }