public void While_trying_to_unlock_a_DSLAM_user_receives_error_message_when_a_FaultException_is_raised()
        {
            using (ShimsContext.Create())
            {
                // ARRANGE
                const DslamPortEnable newLockState = DslamPortEnable.PortStateUnknown;
                var servicesControllerForTest = ServicesControllerForTests;
                var testContext = new SIMPLTestContext();

                // fake local current subscriber object
                var fakeCurrentSubscriber = new FakeCurrentSubscriber();

                // fake SubscriberDto
                var fakeSubscriberData = TestContext.DataRow["MapToSubscriberDtoAsJSON"];
                Assert.IsNotNull(fakeSubscriberData);
                var fakeSubscriberDtoAsJson = fakeSubscriberData.ToString().Replace("\r\n", "");
                var fakeSubscriberDto = JsonConvert.DeserializeObject<SubscriberDto>(fakeSubscriberDtoAsJson, new JsonSerializerSettings
                {
                    MissingMemberHandling = MissingMemberHandling.Ignore
                });

                // Create copy of minimal DSL provisioned services list for use as expected services reference.
                var expectedServicesList = fakeSubscriberDto.Accounts.First().Services.ToList();
                // Add DSLOFF to expected as this is the only additional service expected.
                expectedServicesList.Add(new ServiceDto
                {
                    ClassName = "OVERRIDE",
                    Name = "DSLOFF",
                    Description = "SUSPEND DSL PORT"
                });

                // fake CurrentSubscriber and Rosettian method calls
                ShimCurrentSubscriber.GetInstance = () => new ShimCurrentSubscriber();
                ShimSubscriberExtension.MapToSubscriberCurrentSubscriber = delegate { return fakeSubscriberDto; };
                ShimCurrentUser.AsUserDto = testContext.GetFakeUserDtoObject;

                const string expectedErrorMessage = "This is a fault exception message";
                var faultDetail = new ValidationDetailDto()
                {
                    Message = expectedErrorMessage
                };

                var faultDetails = new List<ValidationDetailDto>();
                faultDetails.Add(faultDetail);

                var validationFault = new ValidationFaultDto()
                {
                    Details = faultDetails
                };

                var fault = new FaultException<ValidationFaultDto>(validationFault);
                ShimRosettianClient.AllInstances.UpdateSubscriberSubscriberDtoBooleanUserDto = delegate { throw fault; };
                ShimCurrentSubscriber.UpdateSubscriberDto = delegate(SubscriberDto subscriber)
                {
                    fakeCurrentSubscriber.SubIpType = subscriber.GetIPType();
                    fakeCurrentSubscriber.ProvisionedServicesList = subscriber.Accounts.First().Services;
                };
                ShimSubscriberExtension.MapToSubDetailsModelCurrentSubscriber = delegate
                {
                    return new SubscriberDetailsModel
                    {
                        IPType = fakeCurrentSubscriber.SubIpType
                    };
                };

                var wasLoggingCalled = false;
                ShimErrorLoggingService.AllInstances.LogErrorException = (myClient, myException) =>
                {
                    wasLoggingCalled = true;
                };

                // ACT
                var actualResult = servicesControllerForTest.UpdateDslamPortGate(newLockState);

                // ASSERT
                Assert.IsNotNull(actualResult);
                var actualJsonResult = actualResult as JsonResult;
                Assert.IsNotNull(actualJsonResult);
                Assert.IsTrue(wasLoggingCalled, "An Exception was expected and the logger was expected to have been called");
                // verify the returned Json
                dynamic actualJson = actualJsonResult.Data;
                var actualStatus = actualJson.status as string;
                var actualErrorMessage = actualJson.errorMessage as string;
                Assert.AreEqual("error", actualStatus, "UpdateDslamPortGate() returned Json has unexpected failing result status");
                Assert.AreEqual(expectedErrorMessage, actualErrorMessage, "UpdateDslamPortGate() returned errorMessage that doesn't have the expected value");
            }
        }
        public void User_receives_an_error_when_trying_to_load_an_unknown_location()
        {
            //Setup
            var myContext = new SIMPLTestContext();
            const string locationId = "9999999";

            using (ShimsContext.Create())
            {
                // Given a user
                var fakeUserDto = myContext.GetFakeUserDtoObject();
                ShimCurrentUser.AsUserDto = () => fakeUserDto;

                // And an unknown location
                var fakeSubscriberDto = new List<SubscriberDto>();
                ShimRosettianClient.AllInstances.SearchSubscribersSearchFieldsDtoUserDto = (myRosettianClient, mySearchFields, myUserDto) => fakeSubscriberDto;
                var fakeLocationDto = myContext.GetFakeLocationDtoObject(locationId);

                var fakeValidationFault = new ValidationFaultDto()
                {
                    Details = new List<ValidationDetailDto>()
                    {
                        new ValidationDetailDto()
                        {
                            Key = "NA",
                            Message = "Error Message",
                            Tag = "NA"
                        }
                    }
                };

                ShimRosettianClient.AllInstances.LoadLocationStringUserDto =
                    (myRosettianClient, myLocationId, myUserDto) => { throw new FaultException<ValidationFaultDto>(fakeValidationFault); };

                // When loading that location
                var actionResult = SubscriberControllerForTests.LoadLocation(locationId) as PartialViewResult;

                // Then the user receives a response
                Assert.IsNotNull(actionResult, "SubscriberController LoadLocation method returned null");

                // And the response is an error
                Assert.AreEqual("Error Message", actionResult.ViewData["error"], string.Format("The response should have been Error Message, but was {0}", actionResult.ViewData["error"]));
            }
        }
        public void PerformOperation_SadPath()
        {
            using (ShimsContext.Create())
            {
                //Arrange
                var myContext = new SIMPLTestContext();

                //Build FakeDto
                var fakeUserDto = myContext.GetFakeUserDtoObject();

                //Fake call to CurrentUser.AsUserDto()
                SIMPL.Session.Fakes.ShimCurrentUser.AsUserDto = () => fakeUserDto;

                // Fake the HttpContext
                var context = new ShimHttpContext();
                ShimHttpContext.CurrentGet = () => context;

                // Fake the session state for HttpContext
                var session = new System.Web.SessionState.Fakes.ShimHttpSessionState
                {
                    ItemGetString = s =>
                    {
                        if (s == "")
                            return null;
                        return null;
                    }
                };

                var fakeValidationFault = new ValidationFaultDto()
                {
                    Details = new List<ValidationDetailDto>()
                    {
                        new ValidationDetailDto()
                        {
                            Key = "NA",
                            Message = "Error Message",
                            Tag = "NA"
                        }
                    }
                };

                ShimRosettianClient.AllInstances.PerformEquipmentOperationListOfEquipmentOperationDtoUserDto  =
                    (myTestClient, myEquipOpsList, myUserDto) => { throw new FaultException<ValidationFaultDto>(fakeValidationFault); };

                // TestingShim is a class that is inside the EquipmentController.cs file
                ShimTestingShim.HandleExceptionByEnvironmentException = (myException) => { throw new FaultException<ValidationFaultDto>(fakeValidationFault); };

                JavaScriptSerializer serializer = new JavaScriptSerializer();
                var deviceIDs = new List<string>
                {
                    "deviceID"
                };
                var deviceIDsAsJSON = serializer.Serialize(deviceIDs);

                ShimErrorLoggingService.AllInstances.LogErrorException = (myClient, myException) => { };

                // First Act
                var operationsController = DependencyResolver.Current.GetService<OperationsController>();
                var result = operationsController.PerformOperation(deviceIDsAsJSON, "Reboot");

                // First Assert
                Assert.IsNotNull(result, "Partial view result returned is null.");
                Assert.IsTrue(result is PartialViewResult, "result is not a PartialViewResult");

                // Second Act
                var resultPartialResult = result as PartialViewResult;

                // Second Assert
                Assert.AreEqual("LoadQueryResults_Partial", resultPartialResult.ViewName, "ViewName doesn't match expected value");
                Assert.IsTrue(resultPartialResult.Model is DeviceQueryResultsViewModel, "partialViewResult is not EquipmentOperationsModel");

                // Third Act
                var operationModel = resultPartialResult.Model as DeviceQueryResultsViewModel;

                // Third Assert
                Assert.AreEqual("500", operationModel.QueryResponse.Code, "Response Code doesn't match expected value");
                Assert.AreEqual("Error Message", operationModel.QueryResponse.Message, "Response Message doesn't match expected value");
            }
        }