/// <summary> /// Executes the HTTP POST method. /// </summary> public async Task <HttpResponseMessage> Post(CourseScheduleResource resource) { // Make sure the resource is valid. bool resourceIsNull = resource == null; bool resourceIsInvalid = this.ModelState.IsValid == false; if (resourceIsNull || resourceIsInvalid) { HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); HttpResponseException httpResponseException = new HttpResponseException(httpResponseMessage); throw httpResponseException; } // Open a database connection and begin a database transaction. using (IDatabaseConnection databaseConnection = await this.databaseConnectionProvider.OpenDatabaseConnection()) using (IDatabaseTransaction databaseTransaction = databaseConnection.BeginDatabaseTransaction()) { // Invoke the NewCourseSchedule business operation. NewCourseScheduleBusinessResponse newCourseScheduleBusinessResponse = await this.InvokeNewCourseSchedule(databaseConnection, resource); // Update the CourseSchedule resource element. if (resource.CourseSchedule != null) { resource.CourseSchedule.CourseScheduleCode = newCourseScheduleBusinessResponse.CourseSchedule.CourseScheduleCode; } // Commit the database transaction. databaseTransaction.Commit(); // Build the HTTP response message. HttpResponseMessage httpResponseMessage = this.Request.CreateResponse(HttpStatusCode.Created, resource); return(httpResponseMessage); } }
/// <summary> /// Invokes the NewCourseSchedule business operation. /// </summary> private async Task <NewCourseScheduleBusinessResponse> InvokeNewCourseSchedule(IDatabaseConnection databaseConnection, CourseScheduleResource resource) { try { // Build the NewCourseSchedule business request. NewCourseScheduleBusinessRequest newCourseScheduleBusinessRequest = new NewCourseScheduleBusinessRequest(); // Build the Session business request element. if (resource.Session != null) { NewCourseScheduleBusinessRequest.SessionBusinessRequestElement sessionBusinessRequestElement = new NewCourseScheduleBusinessRequest.SessionBusinessRequestElement(); sessionBusinessRequestElement.SessionCode = resource.Session.SessionCode; newCourseScheduleBusinessRequest.Session = sessionBusinessRequestElement; } // Build the CourseSchedule business request element. if (resource.CourseSchedule != null) { NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement courseScheduleBusinessRequestElement = new NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement(); courseScheduleBusinessRequestElement.DayOfWeek = resource.CourseSchedule.DayOfWeek; courseScheduleBusinessRequestElement.Time = resource.CourseSchedule.Time; newCourseScheduleBusinessRequest.CourseSchedule = courseScheduleBusinessRequestElement; } // Invoke the NewCourseSchedule business operation. NewCourseScheduleBusinessResponse newCourseScheduleBusinessResponse = await this.schedulingBusinessLogicComponent.NewCourseSchedule(databaseConnection, newCourseScheduleBusinessRequest); // The business operation succeeded. return(newCourseScheduleBusinessResponse); } catch (NewCourseScheduleBusinessException newCourseScheduleBusinessException) { // Wrap the NewCourseSchedule business exception into a service exception. ServiceException serviceException = ServiceExceptionBuilder.BuildServiceException( "SchedulingServiceComponent.CourseSchedulesController.Post()", newCourseScheduleBusinessException, newCourseScheduleBusinessException.Errors.Select(error => error.ErrorCode.ToString()).ToArray(), newCourseScheduleBusinessException.Errors.Select(error => error.ErroneousValue).ToArray()); // Throw the service exception. throw serviceException; } }
/// <summary> /// Executes the NewCourseSchedule business operation. /// </summary> public async virtual Task <NewCourseScheduleBusinessResponse> NewCourseSchedule(IDatabaseConnection databaseConnection, NewCourseScheduleBusinessRequest businessRequest) { // Validate the business request. this.ValidateNewCourseScheduleRequest(businessRequest); // Initialize the operation data. NewCourseScheduleOperationData operationData = new NewCourseScheduleOperationData(); // Validate the business operation. await this.ValidateNewCourseScheduleOperation(databaseConnection, businessRequest, operationData); // Generate a unique CourseSchedule code. string courseScheduleCode = this.uniqueTokenGenerator.GenerateUniqueToken(); // Create the CourseSchedule data row. operationData.CourseScheduleDataRow = new CourseScheduleDataRow(); operationData.CourseScheduleDataRow.CourseScheduleCode = courseScheduleCode; operationData.CourseScheduleDataRow.SessionID = operationData.SessionDataRow.SessionID; operationData.CourseScheduleDataRow.DayOfWeek = (int)businessRequest.CourseSchedule.DayOfWeek; operationData.CourseScheduleDataRow.Time = businessRequest.CourseSchedule.Time; await this.courseScheduleDataAccessComponent.Create(databaseConnection, operationData.CourseScheduleDataRow); // Generate the unique CourseGroup codes. operationData.CourseGroupCodes = new string[businessRequest.CourseSchedule.CourseGroups.Length]; for (int courseGroupIndex = 0; courseGroupIndex < businessRequest.CourseSchedule.CourseGroups.Length; courseGroupIndex++) { string courseGroupCode = this.uniqueTokenGenerator.GenerateUniqueToken(); operationData.CourseGroupCodes[courseGroupIndex] = courseGroupCode; } // Create the CourseGroup data rows. for (int courseGroupIndex = 0; courseGroupIndex < businessRequest.CourseSchedule.CourseGroups.Length; courseGroupIndex++) { CourseGroupDataRow courseGroupDataRow = new CourseGroupDataRow(); courseGroupDataRow = new CourseGroupDataRow(); courseGroupDataRow.CourseGroupCode = operationData.CourseGroupCodes[courseGroupIndex]; courseGroupDataRow.CourseScheduleID = operationData.CourseScheduleDataRow.CourseScheduleID; courseGroupDataRow.PlacesCount = businessRequest.CourseSchedule.CourseGroups[courseGroupIndex].PlacesCount; await this.courseGroupDataAccessComponent.Create(databaseConnection, courseGroupDataRow); } // Build the business response. NewCourseScheduleBusinessResponse businessResponse = new NewCourseScheduleBusinessResponse(); // Build the CourseSchedule business response element. NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement courseScheduleBusinessResponseElement = new NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement(); courseScheduleBusinessResponseElement.CourseScheduleCode = operationData.CourseScheduleDataRow.CourseScheduleCode; businessResponse.CourseSchedule = courseScheduleBusinessResponseElement; // Build the CourseGroup business response elements. List <NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement.CourseGroupBusinessResponseElement> courseGroupBusinessResponseElements = new List <NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement.CourseGroupBusinessResponseElement>(); for (int courseGroupIndex = 0; courseGroupIndex < businessRequest.CourseSchedule.CourseGroups.Length; courseGroupIndex++) { NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement.CourseGroupBusinessResponseElement courseGroupBusinessResponseElement = new NewCourseScheduleBusinessResponse.CourseScheduleBusinessResponseElement.CourseGroupBusinessResponseElement(); courseGroupBusinessResponseElement.CourseGroupCode = operationData.CourseGroupCodes[courseGroupIndex]; courseGroupBusinessResponseElements.Add(courseGroupBusinessResponseElement); } // Set the CourseGroup business response elements. courseScheduleBusinessResponseElement.CourseGroups = courseGroupBusinessResponseElements.ToArray(); // Return the business response. return(businessResponse); }
public void ShouldReturnMultipleCourseGroupsResponseElements() { // Build the test harness. SchedulingBusinessLogicComponentTestHarness testHarness = new SchedulingBusinessLogicComponentTestHarness(); // Mock the reading of the Session data row. testHarness.MockedSessionDataAccessComponent .Setup(mock => mock.ReadBySessionCode(It.IsAny <IDatabaseConnection>(), "6dk61ufcuzp3f7vs")) .Returns(Task.FromResult(new SessionDataRow() { SessionID = 10001, SessionCode = "6dk61ufcuzp3f7vs", Name = "Session Alpha", StartDate = new DateTime(2001, 1, 1) })) .Verifiable(); // Mock the generation of the unique tokens. Queue <string> uniqueTokens = new Queue <string>(new string[] { "zzcj32kpd6huzp1n", "5s1cgndj6e5x0uvz", "78zcn25ynkaz50ef", "q5692qwy70qde9uv" }); testHarness.MockedUniqueTokenGenerator .Setup(mock => mock.GenerateUniqueToken()) .Returns(() => uniqueTokens.Dequeue()) .Verifiable(); // Mock the creation of the CourseSchedule data row. testHarness.MockedCourseScheduleDataAccessComponent .Setup(mock => mock.Create( It.IsAny <IDatabaseConnection>(), It.Is <CourseScheduleDataRow>(courseScheduleDataRow => ( courseScheduleDataRow.CourseScheduleCode == "zzcj32kpd6huzp1n" && courseScheduleDataRow.SessionID == 10001 && courseScheduleDataRow.DayOfWeek == (int)DayOfWeek.Monday && courseScheduleDataRow.Time == new TimeSpan(9, 15, 0) )))) .Returns(Task.FromResult <object>(null)) .Callback((IDatabaseConnection databaseConnection, CourseScheduleDataRow courseScheduleDataRow) => { courseScheduleDataRow.CourseScheduleID = 20001; }) .Verifiable(); // Mock the creation of the first CourseGroup data row. testHarness.MockedCourseGroupDataAccessComponent .Setup(mock => mock.Create( It.IsAny <IDatabaseConnection>(), It.Is <CourseGroupDataRow>(courseGroupDataRow => ( courseGroupDataRow.CourseGroupCode == "5s1cgndj6e5x0uvz" && courseGroupDataRow.CourseScheduleID == 20001 && courseGroupDataRow.PlacesCount == 1 )))) .Returns(Task.FromResult <object>(null)) .Callback((IDatabaseConnection databaseConnection, CourseGroupDataRow courseGroupDataRow) => { courseGroupDataRow.CourseGroupID = 30001; }) .Verifiable(); // Mock the creation of the second CourseGroup data row. testHarness.MockedCourseGroupDataAccessComponent .Setup(mock => mock.Create( It.IsAny <IDatabaseConnection>(), It.Is <CourseGroupDataRow>(courseGroupDataRow => ( courseGroupDataRow.CourseGroupCode == "78zcn25ynkaz50ef" && courseGroupDataRow.CourseScheduleID == 20001 && courseGroupDataRow.PlacesCount == 2 )))) .Returns(Task.FromResult <object>(null)) .Callback((IDatabaseConnection databaseConnection, CourseGroupDataRow courseGroupDataRow) => { courseGroupDataRow.CourseGroupID = 30002; }) .Verifiable(); // Mock the creation of the third CourseGroup data row. testHarness.MockedCourseGroupDataAccessComponent .Setup(mock => mock.Create( It.IsAny <IDatabaseConnection>(), It.Is <CourseGroupDataRow>(courseGroupDataRow => ( courseGroupDataRow.CourseGroupCode == "q5692qwy70qde9uv" && courseGroupDataRow.CourseScheduleID == 20001 && courseGroupDataRow.PlacesCount == 3 )))) .Returns(Task.FromResult <object>(null)) .Callback((IDatabaseConnection databaseConnection, CourseGroupDataRow courseGroupDataRow) => { courseGroupDataRow.CourseGroupID = 30003; }) .Verifiable(); // Build the NewCourseSchedule business request. NewCourseScheduleBusinessRequest newCourseScheduleBusinessRequest = new NewCourseScheduleBusinessRequest(); // Build the Session business request element. NewCourseScheduleBusinessRequest.SessionBusinessRequestElement sessionBusinessRequestElement = new NewCourseScheduleBusinessRequest.SessionBusinessRequestElement(); sessionBusinessRequestElement.SessionCode = "6dk61ufcuzp3f7vs"; newCourseScheduleBusinessRequest.Session = sessionBusinessRequestElement; // Build the CourseSchedule business request element. NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement courseScheduleBusinessRequestElement = new NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement(); courseScheduleBusinessRequestElement.DayOfWeek = DayOfWeek.Monday; courseScheduleBusinessRequestElement.Time = new TimeSpan(9, 15, 0); newCourseScheduleBusinessRequest.CourseSchedule = courseScheduleBusinessRequestElement; // Build the CourseGroup business request elements. List <NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement> courseGroupBusinessRequestElements = new List <NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement>(); // Build the first CourseGroup business request element. NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement firstCourseGroupBusinessRequestElement = new NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement(); firstCourseGroupBusinessRequestElement.PlacesCount = 1; courseGroupBusinessRequestElements.Add(firstCourseGroupBusinessRequestElement); // Build the second CourseGroup business request element. NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement secondCourseGroupBusinessRequestElement = new NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement(); secondCourseGroupBusinessRequestElement.PlacesCount = 2; courseGroupBusinessRequestElements.Add(secondCourseGroupBusinessRequestElement); // Build the third CourseGroup business request element. NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement thirdCourseGroupBusinessRequestElement = new NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement(); thirdCourseGroupBusinessRequestElement.PlacesCount = 3; courseGroupBusinessRequestElements.Add(thirdCourseGroupBusinessRequestElement); // Set the CourseGroup business request elements. courseScheduleBusinessRequestElement.CourseGroups = courseGroupBusinessRequestElements.ToArray(); // Invoke the NewCourseSchedule business operation. NewCourseScheduleBusinessResponse newCourseScheduleBusinessResponse = testHarness.SchedulingBusinessLogicComponent.NewCourseSchedule(testHarness.MockedDatabaseConnection, newCourseScheduleBusinessRequest).Result; // Verify the mocked components. testHarness.VerifyMockedComponents(); // Validate the CourseGroup business response elements count. Assert.IsNotNull(newCourseScheduleBusinessResponse); Assert.IsNotNull(newCourseScheduleBusinessResponse.CourseSchedule.CourseGroups); Assert.AreEqual(3, newCourseScheduleBusinessResponse.CourseSchedule.CourseGroups.Length); // Validate the first CourseGroup business response element. Assert.IsNotNull(newCourseScheduleBusinessResponse.CourseSchedule.CourseGroups[0]); Assert.AreEqual("5s1cgndj6e5x0uvz", newCourseScheduleBusinessResponse.CourseSchedule.CourseGroups[0].CourseGroupCode); // Validate the second CourseGroup business response element. Assert.IsNotNull(newCourseScheduleBusinessResponse.CourseSchedule.CourseGroups[1]); Assert.AreEqual("78zcn25ynkaz50ef", newCourseScheduleBusinessResponse.CourseSchedule.CourseGroups[1].CourseGroupCode); // Validate the third CourseGroup business response element. Assert.IsNotNull(newCourseScheduleBusinessResponse.CourseSchedule.CourseGroups[2]); Assert.AreEqual("q5692qwy70qde9uv", newCourseScheduleBusinessResponse.CourseSchedule.CourseGroups[2].CourseGroupCode); }
public void ShouldReturnCourseScheduleResponseElement() { // Build the test harness. SchedulingBusinessLogicComponentTestHarness testHarness = new SchedulingBusinessLogicComponentTestHarness(); // Mock the reading of the Session data row. testHarness.MockedSessionDataAccessComponent .Setup(mock => mock.ReadBySessionCode(It.IsAny <IDatabaseConnection>(), "6dk61ufcuzp3f7vs")) .Returns(Task.FromResult(new SessionDataRow() { SessionID = 10001, SessionCode = "6dk61ufcuzp3f7vs", Name = "Session Alpha", StartDate = new DateTime(2001, 1, 1) })) .Verifiable(); // Mock the generation of the unique token. testHarness.MockedUniqueTokenGenerator .Setup(mock => mock.GenerateUniqueToken()) .Returns("zzcj32kpd6huzp1n") .Verifiable(); // Mock the creation of the CourseSchedule data row. testHarness.MockedCourseScheduleDataAccessComponent .Setup(mock => mock.Create( It.IsAny <IDatabaseConnection>(), It.Is <CourseScheduleDataRow>(courseScheduleDataRow => ( courseScheduleDataRow.CourseScheduleCode == "zzcj32kpd6huzp1n" && courseScheduleDataRow.SessionID == 10001 && courseScheduleDataRow.DayOfWeek == (int)DayOfWeek.Monday && courseScheduleDataRow.Time == new TimeSpan(9, 15, 0) )))) .Returns(Task.FromResult <object>(null)) .Callback((IDatabaseConnection databaseConnection, CourseScheduleDataRow courseScheduleDataRow) => { courseScheduleDataRow.CourseScheduleID = 20001; }) .Verifiable(); // Build the NewCourseSchedule business request. NewCourseScheduleBusinessRequest newCourseScheduleBusinessRequest = new NewCourseScheduleBusinessRequest(); // Build the Session business request element. NewCourseScheduleBusinessRequest.SessionBusinessRequestElement sessionBusinessRequestElement = new NewCourseScheduleBusinessRequest.SessionBusinessRequestElement(); sessionBusinessRequestElement.SessionCode = "6dk61ufcuzp3f7vs"; newCourseScheduleBusinessRequest.Session = sessionBusinessRequestElement; // Build the CourseSchedule business request element. NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement courseScheduleBusinessRequestElement = new NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement(); courseScheduleBusinessRequestElement.DayOfWeek = DayOfWeek.Monday; courseScheduleBusinessRequestElement.Time = new TimeSpan(9, 15, 0); newCourseScheduleBusinessRequest.CourseSchedule = courseScheduleBusinessRequestElement; // Build the CourseGroup business request elements. courseScheduleBusinessRequestElement.CourseGroups = new NewCourseScheduleBusinessRequest.CourseScheduleBusinessRequestElement.CourseGroupBusinessRequestElement[0]; // Invoke the NewCourseSchedule business operation. NewCourseScheduleBusinessResponse newCourseScheduleBusinessResponse = testHarness.SchedulingBusinessLogicComponent.NewCourseSchedule(testHarness.MockedDatabaseConnection, newCourseScheduleBusinessRequest).Result; // Verify the mocked components. testHarness.VerifyMockedComponents(); // Validate the CourseSchedule business response element. Assert.IsNotNull(newCourseScheduleBusinessResponse); Assert.IsNotNull(newCourseScheduleBusinessResponse.CourseSchedule); Assert.AreEqual("zzcj32kpd6huzp1n", newCourseScheduleBusinessResponse.CourseSchedule.CourseScheduleCode); }