public void GivenAValidUri_Validate_ShouldNotHaveAValidationError(string uri)
            {
                // Arrange.
                // NOTE: We don't want to check for an empty string here, because that
                //       is contained in the 'bad' checks below.
                var links = uri == null
                                ? null
                                : new ReadOnlyCollection <string>(new[]
                {
                    uri
                });

                // Act & Assert.

                // NOTE: ShouldNotHaveValidationErrorFor has a bug in it: https://github.com/JeremySkinner/FluentValidation/issues/238

                //_validator.ShouldNotHaveValidationErrorFor(x => x.Links,
                //    links,
                //    ResidentialListingValidator.NormalRuleSet);

                var listing = new ResidentialListing
                {
                    Links = links
                };

                var result = _validator.Validate(listing,
                                                 ruleSet: ResidentialListingValidator.NormalRuleSet);

                // Assert.
                result.Errors.ShouldNotContain(x =>
                                               x.ErrorMessage == $"Link '{uri}' must be a valid URI. eg: http://www.SomeWebSite.com.au");
            }
Esempio n. 2
0
        public override Listing ToOreListing()
        {
            var listing = new ResidentialListing();

            CopyOverListingData(listing);

            listing.CreatedOn    = SoldOn;
            listing.UpdatedOn    = SoldOn;
            listing.StatusType   = StatusType.Sold;
            listing.SourceStatus = StatusType.Sold.ToString();

            listing.PropertyType = PropertyTypeHelpers.ToPropertyType(PropertyType);

            listing.Pricing = new SalePricing
            {
                SoldOn    = SoldOn,
                SoldPrice = SoldPrice
            };

            var rentalPriceText = SoldPrice > 0
                                      ? $"${SoldPrice:N0}"
                                      : "price undisclosed";

            listing.Title = $"Sold: {rentalPriceText}.";

            return(listing);
        }
        private static Listing CreateListing(CategoryType categoryType)
        {
            Listing listing;

            switch (categoryType)
            {
            case CategoryType.Sale:
                listing = new ResidentialListing();
                break;

            case CategoryType.Rent:
                listing = new RentalListing();
                break;

            case CategoryType.Land:
                listing = new LandListing();
                break;

            case CategoryType.Rural:
                listing = new RuralListing();
                break;

            default:
                // Not sure if we should do some logging here?
                listing = null;
                break;
            }

            return(listing);
        }
        protected static ResidentialListing FakeResidentialListing(StatusType statusType, SalePricing salePricing = null)
        {
            var listing = new ResidentialListing();

            SetupListing(listing, statusType);
            listing.Pricing = salePricing;

            return(listing);
        }
Esempio n. 5
0
        public static ValidationResult Validate(ResidentialListing residentialListing,
                                                string ruleSet = ResidentialListingValidator.NormalRuleSet)
        {
            var validator = new ResidentialListingValidator();

            return(string.IsNullOrWhiteSpace(ruleSet)
                ? validator.Validate(residentialListing)
                : validator.Validate(residentialListing, ruleSet: ruleSet));
        }
        private static void ExtractResidentialData(ResidentialListing residentialListing, XElement xElement, CultureInfo cultureInfo)
        {
            residentialListing.ShouldNotBe(null);
            xElement.ShouldNotBe(null);

            residentialListing.PropertyType = ExtractResidentialAndRentalPropertyType(xElement);
            residentialListing.Pricing      = ExtractSalePricing(xElement, cultureInfo);
            residentialListing.AuctionOn    = ExtractAuction(xElement);
            residentialListing.Features     = ExtractFeatures(xElement);
        }
 private static void AssertResidentialListing(ParsedResult result,
                                              ResidentialListing expectedListing)
 {
     result.ShouldNotBeNull();
     result.Listings.Count.ShouldBe(1);
     result.Errors.Count.ShouldBe(0);
     result.UnhandledData.Count.ShouldBe(0);
     result.TransmorgrifierName.ShouldBe("REA");
     ResidentialListingAssertHelpers.AssertResidentialListing(result.Listings.First().Listing as ResidentialListing,
                                                              expectedListing);
 }
Esempio n. 8
0
        public static void AssertResidentialListing(ResidentialListing source,
                                                    ResidentialListing destination)
        {
            ListingAssertHelpers.AssertCommonData(source, destination);

            source.AuctionOn.ShouldBe(destination.AuctionOn);
            source.PropertyType.ShouldBe(destination.PropertyType);
            source.CouncilRates.ShouldBe(destination.CouncilRates);

            SalePricingAssertHelpers.AssertSalePrice(source.Pricing, destination.Pricing);
            BuildingDetailsAssertHelpers.AssertBuildingDetails(source.BuildingDetails, destination.BuildingDetails);
        }
Esempio n. 9
0
            private static void AssertResidentialSoldListing(ResidentialListing listing,
                                                             bool isSoldPriceVisibile = true)
            {
                listing.AgencyId.ShouldBe("XNWXNW");
                listing.Id.ShouldBe("Residential-Sold-ABCD1234");
                listing.StatusType.ShouldBe(StatusType.Sold);

                listing.Pricing.SoldPrice.ShouldBe(580000m);
                listing.Pricing.SoldPriceText.ShouldBe(isSoldPriceVisibile
                    ? null
                    : "Sold Price Witheld");
                listing.Pricing.SoldOn.ShouldBe(new DateTime(2009, 01, 10, 12, 30, 00));
            }
Esempio n. 10
0
        public static ResidentialListing ResidentialListing(bool isClearAllIsModified = true)
        {
            var listing = new ResidentialListing
            {
                AuctionOn = new DateTime(2015, 5, 23),
                Agents    = new List <ListingAgent>
                {
                    new ListingAgent
                    {
                        Name           = "Princess Leia",
                        Order          = 1,
                        Communications = new List <Communication>
                        {
                            new Communication
                            {
                                CommunicationType = CommunicationType.Email,
                                Details           = "[email protected]"
                            }
                        }
                    }
                },
                BuildingDetails = new BuildingDetails
                {
                    Area = new UnitOfMeasure
                    {
                        Type  = "Some type",
                        Value = 1.2345m
                    },
                    EnergyRating = 111.222m,
                },
                CouncilRates = "some council rates",
                PropertyType = PropertyType.Townhouse,
                Pricing      = new SalePricing
                {
                    IsUnderOffer  = true,
                    SalePrice     = 12345.66m,
                    SalePriceText = "house for sale",
                    SoldOn        = new DateTime(2015, 6, 1),
                    SoldPrice     = 45432.99m,
                    SoldPriceText = "just sold woot!"
                }
            };

            if (isClearAllIsModified)
            {
                listing.ClearAllIsModified();
            }

            return(listing);
        }
Esempio n. 11
0
        public static void AssertResidentialSoldListing(ResidentialListing listing,
                                                        bool isSoldPriceVisibile = true)
        {
            listing.AgencyId.ShouldBe("XNWXNW");
            listing.Id.ShouldBe("Residential-Sold-ABCD1234");
            listing.StatusType.ShouldBe(StatusType.Sold);

            int?soldPrice = 580000;

            listing.Pricing.SoldPrice.ShouldBe(soldPrice);
            listing.Pricing.SoldPriceText.ShouldBe(isSoldPriceVisibile
                                                       ? soldPrice.Value.ToString("C0")
                                                       : null);
            listing.Pricing.SoldOn.ShouldBe(new DateTime(2009, 01, 10, 12, 30, 00));
        }
Esempio n. 12
0
        public static ResidentialListing CreateAFakeResidentialListing(string id                 = "Residential-Current-ABCD1234",
                                                                       StatusType statusType     = StatusType.Available,
                                                                       PropertyType propertyType = PropertyType.House)
        {
            var listing = new ResidentialListing
            {
                Id = id
            };

            FakeCommonListingHelpers.SetCommonListingData(listing, statusType: statusType);
            FakeCommonListingHelpers.SetBuildingDetails(listing);
            FakeCommonListingHelpers.SetSalePrice(listing);

            listing.PropertyType = propertyType;
            listing.AuctionOn    = new DateTime(2009, 2, 4, 18, 30, 0, DateTimeKind.Utc);
            listing.CouncilRates = "$2000 per month";

            return(listing);
        }
        public void GivenAnExistingFileWithAMinimumDate_Parse_ReturnsAResidentialAvailableListingWithDatesRemoved(bool useAnExistingListing)
        {
            // Arrange.
            var file = FakeDataFolder + "REA-Residential-Current-WithAuctionDateTimePlaceholder.xml";
            var reaXmlTransmorgrifier          = new ReaXmlTransmorgrifier();
            ResidentialListing existingListing = null;

            if (useAnExistingListing)
            {
                var existingListingXml = File.ReadAllText(file);
                existingListingXml = existingListingXml.Replace("REPLACE-THIS-VALUE", DateTime.UtcNow.ToString("s"));
                existingListing    = reaXmlTransmorgrifier
                                     .Parse(existingListingXml)
                                     .Listings
                                     .First()
                                     .Listing as ResidentialListing;
            }

            var reaXml     = File.ReadAllText(file);
            var updatedXml = reaXml.Replace("REPLACE-THIS-VALUE", "0000-00-00");

            // Act.
            var result = reaXmlTransmorgrifier.Parse(updatedXml, existingListing);

            // Assert.
            result.Listings.ShouldNotBeEmpty();
            result.Listings.Count.ShouldBe(1);
            result.Errors.ShouldBeEmpty();

            var listing = result
                          .Listings
                          .First()
                          .Listing as ResidentialListing;

            listing.AuctionOn.ShouldBeNull();

            if (useAnExistingListing)
            {
                listing.AuctionOn.ShouldNotBe(existingListing.AuctionOn); // Existing had a value. Now it's been removed.
            }
        }
            private static void AssertResidentialCurrentListing(ResidentialListing listing,
                PropertyType expectedPropertyType = PropertyType.House,
                int expectedBedroomsCount = 4,
                IList<string> tags = null,
                string salePriceText = "Between $400,000 and $600,000",
                IList<string> imageUrls = null,
                IList<string> floorplanUrls = null,
                IList<string> videoUrls = null,
                string streetNumber = "2/39",
                bool isModified = true,
                Action<IList<ListingAgent>, bool> assertAgents = null)
            {
                listing.AgencyId.ShouldBe("XNWXNW");
                listing.IsAgencyIdModified.ShouldBe(isModified);
                listing.Id.ShouldBe("Residential-Current-ABCD1234");
                listing.IsIdModified.ShouldBe(isModified);
                listing.StatusType.ShouldBe(StatusType.Current);
                listing.IsStatusTypeModified.ShouldBe(isModified);
                listing.PropertyType.ShouldBe(expectedPropertyType);
                listing.IsPropertyTypeModified.ShouldBe(isModified);
                listing.CouncilRates.ShouldBe("$2000 per month");
                listing.IsCouncilRatesModified.ShouldBe(isModified);
                listing.Links[0].ShouldBe("http://www.au.open2view.com/properties/314244/tour#floorplan");
                listing.Links[1].ShouldBe("http://www.google.com/hello");
                listing.IsLinksModified.ShouldBe(isModified);

                AssertAddress(listing.Address, streetNumber, isModified);
                listing.IsAddressModified.ShouldBe(isModified);

                AssertSalePrice(listing.Pricing, salePriceText, isModified);
                listing.IsPricingModified.ShouldBe(isModified);

                AssertInspections(listing.Inspections, isModified);
                listing.IsInspectionsModified.ShouldBe(isModified);

                if (assertAgents != null)
                {
                    assertAgents(listing.Agents, isModified);
                }
                else
                {
                    AssertAgents(listing.Agents, isModified);    
                }
                listing.IsAgentsModified.ShouldBe(isModified);

                AssertFeatures(listing.Features, 
                    tags, 
                    isModified,
                    expectedBedroomsCount,
                    bathroomCount: 2,
                    ensuitesCount: 2);
                listing.IsFeaturesModified.ShouldBe(isModified);

                AssertImages(listing.Images, imageUrls, isModified);
                listing.IsImagesModified.ShouldBe(isModified);

                AssertFloorPlans(listing.FloorPlans, floorplanUrls, isModified);
                listing.IsFloorPlansModified.ShouldBe(isModified);

                if (videoUrls != null)
                {
                    AssertVideos(listing.Videos, videoUrls, isModified);
                    listing.IsVideosModified.ShouldBe(isModified);
                }
                
                listing.AuctionOn.ShouldBe(new DateTime(2009, 02, 04, 18, 30, 00));
                listing.IsAuctionOnModified.ShouldBe(isModified);

                AssertBuildingDetails(listing.BuildingDetails, isModified);
                listing.BuildingDetails.IsEnergyRatingModified.ShouldBe(isModified);

                AssertLandDetails(listing.LandDetails, isModified);
                listing.IsLandDetailsModified.ShouldBe(isModified);
            }
        private static void ExtractResidentialData(ResidentialListing residentialListing, 
            XElement document, 
            CultureInfo cultureInfo)
        {
            residentialListing.ShouldNotBe(null);
            document.ShouldNotBe(null);

            residentialListing.PropertyType = ExtractResidentialAndRentalPropertyType(document);
            residentialListing.Pricing = ExtractSalePricing(document, cultureInfo);
            residentialListing.AuctionOn = ExtractAuction(document);
            residentialListing.BuildingDetails = ExtractBuildingDetails(document);
            residentialListing.CouncilRates = document.ValueOrDefault("councilRates");
            ExtractHomeAndLandPackage(document, residentialListing);
            ExtractResidentialNewConstruction(document, residentialListing);
        }
        private static void ExtractHomeAndLandPackage(XElement document, ResidentialListing residentialListing)
        {
            document.ShouldNotBe(null);
            residentialListing.ShouldNotBe(null);

            var homeAndLandPackageElement = document.Element("isHomeLandPackage");
            if (homeAndLandPackageElement == null)
            {
                return;
            }

            if (homeAndLandPackageElement.AttributeBoolValueOrDefault("value"))
            {
                if (residentialListing.Features == null)
                {
                    residentialListing.Features = new Features();
                }

                if (residentialListing.Features.Tags == null)
                {
                    residentialListing.Features.Tags = new HashSet<string>();
                }

                residentialListing.Features.Tags.Add("houseAndLandPackage");
            };

        }
        private static void ExtractResidentialNewConstruction(XElement document, ResidentialListing listing)
        {
            document.ShouldNotBe(null);
            listing.ShouldNotBe(null);

            if (!document.BoolValueOrDefault("newConstruction"))
            {
                return;
            }

            if (listing.Features == null)
            {
                listing.Features= new Features();
            }

            if (listing.Features.Tags == null)
            {
                listing.Features.Tags = new HashSet<string>();
            }

            listing.Features.Tags.Add("isANewConstruction");
        }
Esempio n. 18
0
            private static void AssertResidentialCurrentListing(ResidentialListing listing,
                                                                PropertyType expectedPropertyType = PropertyType.House,
                                                                int expectedBedroomsCount         = 4)
            {
                listing.AgencyId.ShouldBe("XNWXNW");
                listing.Id.ShouldBe("Residential-Current-ABCD1234");
                listing.StatusType.ShouldBe(StatusType.Current);
                listing.PropertyType.ShouldBe(expectedPropertyType);

                listing.Address.IsStreetDisplayed.ShouldBe(true);
                listing.Address.StreetNumber.ShouldBe("2/39");
                listing.Address.Street.ShouldBe("Main Road");
                listing.Address.Suburb.ShouldBe("RICHMOND");
                listing.Address.State.ShouldBe("vic");
                listing.Address.CountryIsoCode.ShouldBe("AU");
                listing.Address.Postcode.ShouldBe("3121");

                listing.Pricing.SalePrice.ShouldBe(500000m);
                listing.Pricing.SalePriceText.ShouldBe("Between $400,000 and $600,000");
                listing.Pricing.IsUnderOffer.ShouldBe(false);

                listing.Inspections.Count.ShouldBe(2);
                listing.Inspections.First().OpensOn.ShouldBe(new DateTime(2009, 1, 21, 11, 00, 0));
                listing.Inspections.First().ClosesOn.ShouldBe(new DateTime(2009, 1, 21, 13, 00, 0));

                listing.Agents.Count.ShouldBe(1);
                var listingAgent = listing.Agents[0];

                listingAgent.Name.ShouldBe("Mr. John Doe");
                listingAgent.Order.ShouldBe(1);
                listingAgent.Communications[0].CommunicationType.ShouldBe(CommunicationType.Email);
                listingAgent.Communications[0].Details.ShouldBe("*****@*****.**");
                listingAgent.Communications[1].CommunicationType.ShouldBe(CommunicationType.Mobile);
                listingAgent.Communications[1].Details.ShouldBe("0418 123 456");
                listingAgent.Communications[2].CommunicationType.ShouldBe(CommunicationType.Landline);
                listingAgent.Communications[2].Details.ShouldBe("05 1234 5678");

                listing.Features.Bedrooms.ShouldBe(expectedBedroomsCount);
                listing.Features.Bathrooms.ShouldBe(2);
                listing.Features.CarSpaces.ShouldBe(2);

                listing.Images.Count.ShouldBe(2);
                listing.Images[0].Order.ShouldBe(1);
                listing.Images[0].Url.ShouldBe("http://www.realestate.com.au/tmp/imageM.jpg");

                listing.FloorPlans.Count.ShouldBe(2);
                listing.FloorPlans[0].Url.ShouldBe("http://www.realestate.com.au/tmp/floorplan1.gif");
                listing.FloorPlans[0].Order.ShouldBe(1);
                listing.FloorPlans[1].Url.ShouldBe("http://www.realestate.com.au/tmp/floorplan2.gif");
                listing.FloorPlans[0].Order.ShouldBe(1);

                listing.AuctionOn.ShouldBe(new DateTime(2009, 02, 04, 18, 30, 00));

                listing.LandDetails.Area.Value.ShouldBe(80M);
                listing.LandDetails.Area.Type.ShouldBe("square");
                listing.LandDetails.Frontage.Value.ShouldBe(20M);
                listing.LandDetails.Frontage.Type.ShouldBe("meter");
                listing.LandDetails.Depth.Value.ShouldBe(40M);
                listing.LandDetails.Depth.Type.ShouldBe("meter");
                listing.LandDetails.Depth.Side.ShouldBe("rear");
            }
        private static Listing CreateListing(CategoryType categoryType)
        {
            Listing listing;

            switch (categoryType)
            {
                case CategoryType.Sale:
                    listing = new ResidentialListing();
                    break;
                case CategoryType.Rent:
                    listing = new RentalListing();
                    break;
                case CategoryType.Land:
                    listing = new LandListing();
                    break;
                case CategoryType.Rural:
                    listing = new RuralListing();
                    break;
                default:
                    // Not sure if we should do some logging here?
                    listing = null;
                    break;
            }

            return listing;
        }
            public void GivenAnREAResidentialFileThatIsNotCurrent_Validate_ShouldNotHaveValidationErrors(string ruleSet, ResidentialListing listing, int expectedErrorCount)
            {
                // Arrange.
                var validator = new ResidentialListingValidator();

                // Act.
                var result = validator.Validate(listing, ruleSet: ruleSet);

                // Assert.
                result.Errors.Count.ShouldBe(expectedErrorCount);
            }
        public static ResidentialListing ResidentialListing(bool isClearAllIsModified = true)
        {
            var listing = new ResidentialListing
                {
                    AuctionOn = new DateTime(2015, 5, 23),
                    Agents = new List<ListingAgent>
                    {
                        new ListingAgent
                        {
                            Name = "Princess Leia",
                            Order = 1,
                            Communications = new List<Communication>
                            {
                                new Communication
                                {
                                    CommunicationType = CommunicationType.Email,
                                    Details = "[email protected]"
                                }
                            }
                        }
                    },
                    BuildingDetails = new BuildingDetails
                    {
                        Area = new UnitOfMeasure
                        {
                            Type = "Some type",
                            Value = 1.2345m
                        },
                        EnergyRating = 111.222m,
                    },
                    CouncilRates = "some council rates",
                    PropertyType = PropertyType.Townhouse,
                    Pricing = new SalePricing
                    {
                        IsUnderOffer = true,
                        SalePrice = 12345.66m,
                        SalePriceText = "house for sale",
                        SoldOn = new DateTime(2015, 6, 1),
                        SoldPrice = 45432.99m,
                        SoldPriceText = "just sold woot!"
                    }
                };

            if (isClearAllIsModified)
            {
                listing.ClearAllIsModified();
            }

            return listing;
        }
            private static void AssertResidentialSoldListing(ResidentialListing listing,
                bool isSoldPriceVisibile = true)
            {
                listing.AgencyId.ShouldBe("XNWXNW");
                listing.Id.ShouldBe("Residential-Sold-ABCD1234");
                listing.StatusType.ShouldBe(StatusType.Sold);

                decimal? soldPrice = 580000m;
                listing.Pricing.SoldPrice.ShouldBe(soldPrice);
                listing.Pricing.SoldPriceText.ShouldBe(isSoldPriceVisibile
                    ? soldPrice.Value.ToString("C0")
                    : null);
                listing.Pricing.SoldOn.ShouldBe(new DateTime(2009, 01, 10, 12, 30, 00));
            }