public void When_searching_by_location_can_load_a_subscriber()
        {
            //Setup
            var myContext = new SIMPLTestContext();
            const string subscriberID = "999999999999";
            const string subscriberContactPhone = "9999999999";
            const string firstName = "Test";
            const string lastName = "Account";
            const string locationId = "9999999";

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

                // And a known location
                var fakeAccountDto = myContext.GetFakeAccountDtoObject();
                fakeAccountDto.Location = myContext.GetFakeLocationDtoObject(locationId);

                // And the location is associated to a subscriber
                var fakeCustomFieldDto = myContext.GetFakeCustomFieldDto();
                var fakeSubscriberDto = new List<SubscriberDto>();
                fakeSubscriberDto.Add(myContext.GetFakeSubscriberDto(subscriberID, firstName, lastName, subscriberContactPhone, fakeCustomFieldDto, fakeAccountDto));

                ShimRosettianClient.AllInstances.SearchSubscribersSearchFieldsDtoUserDto = (myRosettianClient, mySearchFields, myUserDto) => fakeSubscriberDto;

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

                // Then the user receives a response
                Assert.IsNotNull(actionResult, "SubscriberController LoadLocation method returned null");
                Assert.IsNotNull(actionResult.RouteValues, "actionResult.RouteValues is null");
                // And the response is successful
                // And the response redirects them to the subscriber index
                Assert.AreEqual(2, actionResult.RouteValues.Count, "actionResult.RouteValues.Count");
                Assert.AreEqual("Index", actionResult.RouteValues["action"], "actionResult.RouteValues[\"action\"]");

                // And the usi returned matches the billing usi
                Assert.AreEqual(subscriberID, actionResult.RouteValues["subID"], "actionResult.RouteValues[\"subID\"]");
            }
        }
        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 Can_load_a_device_that_is_at_a_provisioned_location_with_no_subscriber()
        {
            //Setup
            var myContext = new SIMPLTestContext();
            const string locationId = "123345";
            const string deviceId = "MRCC12341234D01";

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

                // And a known device
                var fakeEquipmentDto = new List<EquipmentDto>()
                {
                    new EquipmentDto(){LocationId = "123345", SerialNumber = "MRCC12341234D01", Type = new EquipmentTypeDto(){ONTModel = new ONTModelDto()}}

                };

                // And the device is associated to a provisioned location
                var fakeLocationDto = myContext.GetFakeLocationDtoObject(locationId);
                var fakeLocationDtoList = new LocationCollectionDto()
                {
                    fakeLocationDto
                };

                // And the provisioned location is not associated to a subscriber

                ShimRosettianClient.AllInstances.SearchLocationsSearchFieldsDtoUserDto =
                    (myRosettianClient, mySearchCriteria, myUserDto) => fakeLocationDtoList;
                ShimRosettianClient.AllInstances.LoadLocationStringUserDto = delegate { return fakeLocationDto; };

                // And the location has no devices
                ShimRosettianClient.AllInstances.SearchEquipmentSearchFieldsDtoUserDto =
                    (myRosettianClient, mySearchFields, myUser) => fakeEquipmentDto;

                // And the location is not associated to a subscriber
                var fakeSubscriberDto = new List<SubscriberDto>();
                ShimRosettianClient.AllInstances.SearchSubscribersSearchFieldsDtoUserDto =
                    (myRosettianClient, mySearchFields, myUserDto) => fakeSubscriberDto;

                ShimDBCache.LocationsGet = delegate { return new List<Location>(); };

                // When loading that device
                var actionResult = SubscriberControllerForTests.LoadEquipment(deviceId) as ViewResult;

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

                // And the response is successful
                Assert.IsNotNull(actionResult.Model, "Model was null");
                var actualModel = actionResult.Model as SubscriberModel;

                Assert.IsNotNull(actualModel, "Model was null");
                Assert.IsNotNull(actualModel.ActionResponse, "actualModel.ActionResponse was null");
                Assert.AreNotEqual("500", actualModel.ActionResponse.Code, "We received a 500 code as the actionresponse.");
                Assert.AreEqual("Index2", actionResult.ViewName, "actionResult.RouteValues[\"action\"]");

                // And the selected tab is the OSP/CPE tab
                Assert.AreEqual(3, actualModel.SelectedTabIndex, "The default tab was not the notes tab");
            }
        }
        public void User_can_load_a_location_that_is_not_associated_to_a_subscriber_with_no_devices()
        {
            //Setup
            var myContext = new SIMPLTestContext();
            const string locationId = "9999999";

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

                // Fake the session state for HttpContext
                // http://blog.christopheargento.net/2013/02/02/testing-untestable-code-thanks-to-ms-fakes/
                var session = new ShimHttpSessionState();
                session.ItemGetString = (key) => { if (key == "LoadedLocation") return null; return null; };

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

                // When the Fake HttpContext is called, provide the fake session state
                ShimHttpContext.AllInstances.SessionGet = (o) => session;

                ShimCurrentSubscriber.UpdateSubscriberLocationModel = delegate { };

                // And a known location
                var fakeLocationDto = myContext.GetFakeLocationDtoObject(locationId);

                ShimRosettianClient.AllInstances.LoadLocationStringUserDto = (myRosettianClient, myLocationId, myUserDto) => fakeLocationDto;

                // And the location has no devices
                ShimRosettianClient.AllInstances.SearchEquipmentSearchFieldsDtoUserDto = (myRosettianClient, mySearchFields, myUser) => new List<EquipmentDto>();

                // And the location is not associated to a subscriber
                var fakeSubscriberDto = new List<SubscriberDto>();
                ShimRosettianClient.AllInstances.SearchSubscribersSearchFieldsDtoUserDto = (myRosettianClient, mySearchFields, myUserDto) => fakeSubscriberDto;

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

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

                // And the response is successful
                Assert.AreEqual("Index2", actionResult.ViewName, "actionResult.RouteValues[\"action\"]");

                // And the response returns the location information
                var expectedModel = fakeLocationDto.MapToSubscriberModel();
                var actualModel = actionResult.Model as SubscriberModel;
                Assert.IsNotNull(actualModel, "The model returned was empty");
                Assert.IsNotNull(actualModel.SubLocationModel, "The sub location model returned was empty");
                Assert.IsTrue(expectedModel.SubLocationModel.Address1.Equals(actualModel.SubLocationModel.Address1), "The Address was different");

                // And the location matches the requested location
                Assert.AreEqual(locationId, actualModel.SubLocationModel.LocationID, "Location Id did not match the one that was searched for.");

                // And the notes tab is the selected tab
                Assert.AreEqual(5, actualModel.SelectedTabIndex, "The default tab was not the notes tab");
            }
        }
        public void Can_load_a_device_that_is_at_a_inventory_location()
        {
            //Setup
            var myContext = new SIMPLTestContext();
            const string locationId = "HEADEND";
            const string deviceId = "MRCC12341234D01";

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

                // And a known device
                var fakeEquipmentDto = new List<EquipmentDto>()
                {
                    new EquipmentDto(){LocationId = locationId, SerialNumber = deviceId, Type = new EquipmentTypeDto(){ONTModel = new ONTModelDto()}}

                };

                // And the device is associated to a provisioned location
                var fakeLocationDto = myContext.GetFakeLocationDtoObject(locationId);
                var fakeLocationDtoList = new LocationCollectionDto()
                {
                    fakeLocationDto
                };

                // And the provisioned location is not associated to a subscriber
                fakeLocationDtoList[0].HasSubscriber = false;
                ShimRosettianClient.AllInstances.SearchLocationsSearchFieldsDtoUserDto =
                    (myRosettianClient, mySearchCriteria, myUserDto) => fakeLocationDtoList;

                // And the location has no devices
                ShimRosettianClient.AllInstances.SearchEquipmentSearchFieldsDtoUserDto =
                    (myRosettianClient, mySearchFields, myUser) => fakeEquipmentDto;

                // And the location has no devices
                ShimRosettianClient.AllInstances.LoadLocationStringUserDto =
                    (myRosettianClient, myLocId, myUser) => fakeLocationDto;

                // And the location is not associated to a subscriber
                var fakeSubscriberDto = new List<SubscriberDto>();
                ShimRosettianClient.AllInstances.SearchSubscribersSearchFieldsDtoUserDto =
                    (myRosettianClient, mySearchFields, myUserDto) => fakeSubscriberDto;

                // When loading that device
                var actionResult = SubscriberControllerForTests.LoadEquipment(deviceId) as ViewResult;

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

                // And the response is successful
                Assert.IsNotNull(actionResult.Model, "Model was null");
                var actualModel = actionResult.Model as SubscriberModel;
                Assert.IsNotNull(actualModel, "Model was null");
                Assert.IsNotNull(actualModel.ActionResponse, "ActionResponse was null");
                Assert.IsNotNull(actualModel.ActionResponse.Code, "actualModelActionResponse.Code was null");
                Assert.AreNotEqual("500", actualModel.ActionResponse.Code, "We received a 500 code as the actionresponse.");
                Assert.AreEqual("Index2", actionResult.ViewName, "actionResult.RouteValues[\"action\"]");

                // And the selected tab is the OSP/CPE tab
                Assert.AreEqual(3, actualModel.SelectedTabIndex, "The default tab was not the notes tab");

                // And no equipment is returned
                Assert.IsTrue((actualModel.SubEquipmentModel.ONTList.Count == 0 && actualModel.SubEquipmentModel.VideoDeviceList.Count == 0), "Devices were returned in the model");

                //And the Loaded Device Id is the same as the searched for device
                Assert.AreEqual(deviceId, actualModel.SubLocationModel.LoadedDeviceID, "The returned loaded device ID was different then the one passed in");
            }
        }
        public void Search_Location_By_SubscriberID()
        {
            using (ShimsContext.Create())
            {
                //Arrange
                var myContext = new SIMPLTestContext();
                var fakeUserDto = myContext.GetFakeUserDtoObject();
                ShimCurrentUser.AsUserDto = () => fakeUserDto;

                //search criteria
                var locationSearchViewModel = new LocationSearchViewModel
                {
                    SubscriberID = "370001704986"
                };

                //expected search results
                var record = new[]
                    {
                        new
                        {
                            ID = "9999999",
                            AddressLine1 = "123 Fake St.",
                            AddressLine2 = "Apt 2",
                            CityName = "Fake City",
                            StateName = null as object,
                            ZipCode =null as object,
                            ZipPlusFourCode = null as object,
                            IsBillingAddress = false,
                            HeadendCode = "01",
                            HasSubscriber = true,
                            FacilityList = new Provisioning.FacilityDto[] {},
                            CustomFields = new CustomFieldDto[] {},
                            RateCenterName = "1234",
                            MaximumBandwidth =null as object,
                            NetworkLocationCode = null as object
                        }
                    };

                var expectedSearchResults = new
                {
                    status = "valid",
                    isModal = false,
                    searchResults = record

                }.ToJSON();

                var fakeLocationDto = myContext.GetFakeLocationDtoObject();
                var fakeLocationCollectionDto = new LocationCollectionDto()
                    {
                        fakeLocationDto
                    };

                ShimRosettianClient.AllInstances.SearchLocationsSearchFieldsDtoUserDto = delegate
                {
                    return fakeLocationCollectionDto;
                };

                var actionResult = SearchControllerForTests.SearchLocation(locationSearchViewModel) as JsonResult;
                Assert.IsNotNull(actionResult, "SearchSubscribers returned null");
                var actualJsonResult = actionResult.Data.ToJSON();
                Assert.AreEqual(expectedSearchResults, actualJsonResult);
            }
        }