public async Task ReturnsBadRequestWhenSessionIsNotValid()
        {
            // Arrange
            var dfcUserSession = CreateDfcUserSession();
            var ms             = new MemoryStream();

            using var sw = new StreamWriter(ms);

            sw.Write(JsonConvert.SerializeObject(dfcUserSession));
            sw.Flush();
            ms.Position = 0;

            A.CallTo(() => httpRequest.Body).Returns(ms);
            A.CallTo(() => sessionClient.ValidateUserSession(A <DfcUserSession> .Ignored)).Returns(false);

            // Act
            var result = await functionApp.CreateNewSkillsAssessment(httpRequest).ConfigureAwait(false);

            var statusCodeResult = Assert.IsType <StatusCodeResult>(result);

            // Assert
            Assert.Equal((int)HttpStatusCode.BadRequest, statusCodeResult.StatusCode);
        }
        public async Task <IActionResult> CreateNewSkillsAssessment([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "assessment/skills")] HttpRequest request)
        {
            request.LogRequestHeaders(logService);

            var correlationId = Guid.Parse(correlationIdProvider.CorrelationId);

            logService.LogMessage($"CorrelationId: {correlationId} - Creating a new assessment", SeverityLevel.Information);

            using var streamReader = new StreamReader(request.Body);
            var requestBody    = streamReader.ReadToEnd();
            var dfcUserSession = JsonConvert.DeserializeObject <DfcUserSession>(requestBody);

            if (dfcUserSession is null)
            {
                logService.LogMessage($"CorrelationId: {correlationId} - Request Body is empty", SeverityLevel.Warning);
                return(responseWithCorrelation.ResponseWithCorrelationId(HttpStatusCode.BadRequest, correlationId));
            }

            var isValid = sessionClient.ValidateUserSession(dfcUserSession);

            if (!isValid)
            {
                logService.LogMessage($"CorrelationId: {correlationId} - Session with Id {dfcUserSession.SessionId} is not valid", SeverityLevel.Warning);
                return(responseWithCorrelation.ResponseWithCorrelationId(HttpStatusCode.BadRequest, correlationId));
            }

            var currentQuestionSetInfo = await questionSetRepository.GetCurrentQuestionSet(ShortAssessmentType).ConfigureAwait(false);

            if (currentQuestionSetInfo == null)
            {
                logService.LogMessage($"CorrelationId: {correlationId} - Unable to load latest question set {ShortAssessmentType}", SeverityLevel.Warning);
                return(responseWithCorrelation.ResponseWithCorrelationId(HttpStatusCode.NoContent, correlationId));
            }

            var partitionKey        = sessionClient.GeneratePartitionKey(dfcUserSession.SessionId);
            var existingUserSession = await userSessionRepository.GetByIdAsync(dfcUserSession.SessionId, partitionKey).ConfigureAwait(false);

            if (existingUserSession != null)
            {
                logService.LogMessage($"Unable to create User Session with id {dfcUserSession.SessionId}. This record already exists", SeverityLevel.Information);
                return(responseWithCorrelation.ResponseWithCorrelationId(HttpStatusCode.AlreadyReported, correlationId));
            }

            await CreateUserSession(currentQuestionSetInfo, dfcUserSession, partitionKey).ConfigureAwait(false);

            return(responseWithCorrelation.ResponseWithCorrelationId(HttpStatusCode.Created, correlationId));
        }
        public void ValidateUserSessionWhenCalledThenReturnsWhetherUserSessionIsValid(bool sessionIsValid)
        {
            // Arrange
            var dfcUserSession = new DfcUserSession
            {
                CreatedDate  = DateTime.UtcNow,
                PartitionKey = "partitionKey",
                Salt         = "salt",
                SessionId    = "sessionId",
            };

            A.CallTo(() => sessionIdGenerator.ValidateSessionId(dfcUserSession)).Returns(sessionIsValid);

            // Act
            var result = sessionClient.ValidateUserSession(dfcUserSession);

            // Assert
            Assert.Equal(sessionIsValid, result);
            A.CallTo(() => sessionIdGenerator.ValidateSessionId(dfcUserSession)).MustHaveHappenedOnceExactly();
        }