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"); }
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); }
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); }
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); }
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)); }
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); }
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)); }
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"); }
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)); }