public async Task GetSkillResponse_ShouldReturnSkillResponse_WhenInputIsValid()
        {
            TokenUser tokenUser = new TokenUser()
            {
                Id      = "existingTokenUser",
                Players = new List <Player>()
            };

            SkillResponse expectedSkillResponse = new SkillResponse();

            Mock <ISkillRequestValidator> mockSkillRequestValidator = new Mock <ISkillRequestValidator>();

            mockSkillRequestValidator.Setup(x => x.IsValid(It.IsAny <SkillRequest>())).Returns(true);

            Mock <SkillProductsClient> mockInSkillProductsClient = new Mock <SkillProductsClient>(MockBehavior.Loose);

            mockInSkillProductsClient.Setup(x => x.GetProducts()).ReturnsAsync(new InSkillProductsResponse()
            {
                Products = new InSkillProduct[0]
            });

            Mock <ISkillProductsClientAdapter> mockSkillProductsAdapter = new Mock <ISkillProductsClientAdapter>(MockBehavior.Loose);

            mockSkillProductsAdapter.Setup(x => x.GetClient(It.IsAny <SkillRequest>())).Returns(mockInSkillProductsClient.Object);

            Mock <ILogger <RequestBusinessLogic> > mockLogger = new Mock <ILogger <RequestBusinessLogic> >();

            Mock <IRequestRouter> mockIntentRequestRouter = new Mock <IRequestRouter>();

            mockIntentRequestRouter.Setup(x => x.GetSkillResponse(It.IsAny <SkillRequest>(), It.IsAny <TokenUser>())).ReturnsAsync(expectedSkillResponse);
            mockIntentRequestRouter.Setup(x => x.RequestType).Returns(RequestType.IntentRequest);

            Mock <IRequestMapper> mockRequestMapper = new Mock <IRequestMapper>();

            mockRequestMapper.Setup(x => x.GetRequestHandler(It.IsAny <SkillRequest>())).Returns(mockIntentRequestRouter.Object);

            Mock <ITokenUserData> mockTokenUserData = new Mock <ITokenUserData>();

            mockTokenUserData.Setup(x => x.Get(It.IsAny <string>())).ReturnsAsync(tokenUser);

            Mock <IUserProfileClient> mockUserProfileClient = new Mock <IUserProfileClient>();

            mockUserProfileClient.Setup(x => x.GetUserId(It.IsAny <string>())).ReturnsAsync("TestProfileUserId");

            RequestBusinessLogic sut = new RequestBusinessLogic(mockUserProfileClient.Object, mockSkillRequestValidator.Object, mockSkillProductsAdapter.Object, mockLogger.Object, mockRequestMapper.Object, mockTokenUserData.Object);

            SkillResponse skillResponse = await sut.GetSkillResponse(ValidSkillRequest, tokenUser);

            Assert.IsType <SkillResponse>(skillResponse);
        }
        public async Task GetSkillResponse_ShouldThrowArgumentNullException_WhenTokenUserIsNull()
        {
            SkillResponse expectedSkillResponse = new SkillResponse();

            Mock <ISkillRequestValidator> mockSkillRequestValidator = new Mock <ISkillRequestValidator>();

            mockSkillRequestValidator.Setup(x => x.IsValid(It.IsAny <SkillRequest>())).Returns(true);

            Mock <SkillProductsClient> mockInSkillProductsClient = new Mock <SkillProductsClient>(MockBehavior.Loose);

            mockInSkillProductsClient.Setup(x => x.GetProducts()).ReturnsAsync(new InSkillProductsResponse()
            {
                Products = new InSkillProduct[0]
            });

            Mock <ISkillProductsClientAdapter> mockSkillProductsAdapter = new Mock <ISkillProductsClientAdapter>(MockBehavior.Loose);

            mockSkillProductsAdapter.Setup(x => x.GetClient(It.IsAny <SkillRequest>())).Returns(mockInSkillProductsClient.Object);

            Mock <ILogger <RequestBusinessLogic> > mockLogger = new Mock <ILogger <RequestBusinessLogic> >();

            Mock <IRequestRouter> mockIntentRequestRouter = new Mock <IRequestRouter>();

            mockIntentRequestRouter.Setup(x => x.GetSkillResponse(It.IsAny <SkillRequest>(), It.IsAny <TokenUser>())).ReturnsAsync(expectedSkillResponse);
            mockIntentRequestRouter.Setup(x => x.RequestType).Returns(RequestType.IntentRequest);

            Mock <IRequestMapper> mockRequestMapper = new Mock <IRequestMapper>();

            mockRequestMapper.Setup(x => x.GetRequestHandler(It.IsAny <SkillRequest>())).Returns(mockIntentRequestRouter.Object);

            Mock <ITokenUserData> mockTokenUserData = new Mock <ITokenUserData>();

            Mock <IUserProfileClient> mockUserProfileClient = new Mock <IUserProfileClient>();

            mockUserProfileClient.Setup(x => x.GetUserId(It.IsAny <string>())).ReturnsAsync("TestProfileUserId");

            RequestBusinessLogic sut = new RequestBusinessLogic(mockUserProfileClient.Object, mockSkillRequestValidator.Object, mockSkillProductsAdapter.Object, mockLogger.Object, mockRequestMapper.Object, mockTokenUserData.Object);

            await Assert.ThrowsAsync <ArgumentNullException>(() => sut.GetSkillResponse(ValidSkillRequest, null));
        }