Ejemplo n.º 1
0
        public void GivenACurrentReaRentalFileAndAnExistingListing_Parse_ReturnsTheUpdatedListing()
        {
            // Arrange.
            var existingListing = FakeListings.CreateAFakeRentalListing();

            existingListing.Pricing.RentalPrice     = 444;
            existingListing.Pricing.RentalPriceText = Guid.NewGuid().ToString();
            existingListing.Title       = Guid.NewGuid().ToString();
            existingListing.Description = Guid.NewGuid().ToString();

            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Rental-Current.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();
            var newListing            = reaXmlTransmorgrifier.Parse(reaXml)
                                        .Listings
                                        .First()
                                        .Listing as RentalListing;

            // Arrange.
            var result = reaXmlTransmorgrifier.Parse(reaXml, existingListing);

            // Assert.
            var listing = result.Listings.First().Listing as RentalListing;

            listing.StatusType.ShouldBe(existingListing.StatusType);
            listing.Pricing.RentalPrice.ShouldBe(newListing.Pricing.RentalPrice);
            listing.Pricing.RentalPriceText.ShouldBe(newListing.Pricing.RentalPriceText);
            listing.Title.ShouldBe(newListing.Title);
            listing.Description.ShouldBe(newListing.Description);
        }
        protected IList <Listing> CreateListings(Type listingType,
                                                 int numberOfFakeListings)
        {
            if (listingType == typeof(ResidentialListing))
            {
                return(FakeListings.CreateFakeListings <ResidentialListing>(numberOfFakeListings)
                       .Cast <Listing>()
                       .ToList());
            }

            if (listingType == typeof(RentalListing))
            {
                return(FakeListings.CreateFakeListings <RentalListing>(numberOfFakeListings)
                       .Cast <Listing>()
                       .ToList());
            }

            if (listingType == typeof(LandListing))
            {
                return(FakeListings.CreateFakeListings <LandListing>(numberOfFakeListings)
                       .Cast <Listing>()
                       .ToList());
            }

            if (listingType == typeof(RuralListing))
            {
                return(FakeListings.CreateFakeListings <RuralListing>(numberOfFakeListings)
                       .Cast <Listing>()
                       .ToList());
            }

            throw new Exception($"Failed to assert the suggested type: '{listingType}'.");
        }
Ejemplo n.º 3
0
        [InlineData(50, 10, 3, 7)] // #50 is not included.
        public void GivenTheRequirementToCreateSomeFakeListings_CreateFakeListings_ReturnsSomeListings(int numberOfListings,
                                                                                                       int numberOfActive,
                                                                                                       int numberOfSold,
                                                                                                       int numberOfRemoved)
        {
            // Arrange
            const int defaultNumberOfFixedListings = 20;

            //Act.
            var listings = FakeListings.CreateFakeListings <ResidentialListing>(numberOfListings)
                           .Take(defaultNumberOfFixedListings)
                           .ToArray();

            // Assert.
            if (numberOfListings > defaultNumberOfFixedListings)
            {
                listings.Length.ShouldBe(defaultNumberOfFixedListings);
            }
            else
            {
                listings.Length.ShouldBe(numberOfListings);
            }

            listings.Count(x => x.StatusType == StatusType.Available).ShouldBe(numberOfActive);
            listings.Count(x => x.StatusType == StatusType.Sold).ShouldBe(numberOfSold);
            listings.Count(x => x.StatusType == StatusType.Leased).ShouldBe(0); // Can never have a leased residential listing.
            listings.Count(x => x.StatusType == StatusType.Removed).ShouldBe(numberOfRemoved);
        }
        GivenTheFileREAResidentialCurrent_ParseThenSerializeThenDeserialize_ReturnsAResidentialAvailableListing(string fileName,
                                                                                                                bool isFloorPlansCleared,
                                                                                                                StatusType statusType)
        {
            // Arrange.
            ResidentialListing expectedListing;

            if (statusType == StatusType.Available)
            {
                expectedListing = FakeListings.CreateAFakeResidentialListing();
            }
            else
            {
                expectedListing              = CreateAFakeEmptyResidentialListing("Residential-Sold-ABCD1234");
                expectedListing.StatusType   = StatusType.Sold;
                expectedListing.SourceStatus = "sold";
                expectedListing.Pricing      = new SalePricing
                {
                    SoldOn        = new DateTime(2009, 1, 10, 12, 30, 00),
                    SoldPrice     = 580000M,
                    SoldPriceText = "$580,000"
                };
            }

            if (isFloorPlansCleared)
            {
                expectedListing.FloorPlans = new List <Media>();
            }
            var reaXml = File.ReadAllText(FakeDataFolder + fileName);
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Parse the xml, once for the first time.
            var tempResult = reaXmlTransmorgrifier.Parse(reaXml);
            var source     = tempResult.Listings.First().Listing;
            var json       = source.SerializeObject();

            // Act.
            var result = JsonConvertHelpers.DeserializeObject(json);

            // Assert.
            var listingResult = new ListingResult
            {
                Listing    = result,
                SourceData = "blahblah"
            };
            var parsedResult = new ParsedResult
            {
                Listings = new List <ListingResult>
                {
                    listingResult
                },
                UnhandledData       = new List <string>(),
                Errors              = new List <ParsedError>(),
                TransmorgrifierName = "REA"
            };

            AssertResidentialListing(parsedResult, expectedListing);
        }
        public void GivenASpecificListingWithAllUtcDates_CreateAFakeListing_HasAllUtcDates(Type type)
        {
            // Arrange & Act.
            var listing = type == typeof(ResidentialListing)
                              ? FakeListings.CreateAFakeListing <ResidentialListing>()
                              : type == typeof(RentalListing)
                                  ? FakeListings.CreateAFakeListing <RentalListing>()
                                  : type == typeof(LandListing)
                                      ? FakeListings.CreateAFakeListing <LandListing>()
                                      : (Listing)FakeListings.CreateAFakeListing <RuralListing>();

            // Assert.
            listing.ShouldNotBeNull();
            listing.CreatedOn.Kind.ShouldBe(DateTimeKind.Utc);
            listing.UpdatedOn.Kind.ShouldBe(DateTimeKind.Utc);
            foreach (var inspection in listing.Inspections)
            {
                inspection.OpensOn.Kind.ShouldBe(DateTimeKind.Utc);
                inspection.ClosesOn.Value.Kind.ShouldBe(DateTimeKind.Utc);
            }

            if (listing is RentalListing rentalListing)
            {
                rentalListing.AvailableOn.Value.Kind.ShouldBe(DateTimeKind.Utc);
                if (rentalListing.Pricing.RentedOn.HasValue)
                {
                    rentalListing.Pricing.RentedOn.Value.Kind.ShouldBe(DateTimeKind.Utc);
                }
            }

            if ((listing is ISalePricing salePricing) &&
                (salePricing.Pricing.SoldOn.HasValue))
            {
                salePricing.Pricing.SoldOn.Value.Kind.ShouldBe(DateTimeKind.Utc);
            }

            if (listing is IAuctionOn auctionOn)
            {
                auctionOn.AuctionOn.Value.Kind.ShouldBe(DateTimeKind.Utc);
            }

            if (listing.Images.Any())
            {
                listing.Images.ShouldAllBe(x => x.CreatedOn.Value.Kind == DateTimeKind.Utc);
            }

            if (listing.FloorPlans.Any())
            {
                listing.FloorPlans.ShouldAllBe(x => x.CreatedOn.Value.Kind == DateTimeKind.Utc);
            }

            if (listing.Documents.Any())
            {
                listing.Documents.ShouldAllBe(x => x.CreatedOn.Value.Kind == DateTimeKind.Utc);
            }
        }
        public void GivenTheFileREAResidentialCurrentWithDuplicateAgents_Parse_ReturnsAResidentialAvailableListing()
        {
            // Arrange.
            var agents = new List <Agent>
            {
                new Agent
                {
                    Name           = "Princess Leia",
                    Order          = 1,
                    Communications = new List <Communication>
                    {
                        new Communication
                        {
                            CommunicationType = CommunicationType.Email,
                            Details           = "*****@*****.**"
                        },
                        new Communication
                        {
                            CommunicationType = CommunicationType.Mobile,
                            Details           = "1234 1234"
                        }
                    }
                },
                new Agent
                {
                    Name           = "Han Solo",
                    Order          = 2,
                    Communications = new List <Communication>
                    {
                        new Communication
                        {
                            CommunicationType = CommunicationType.Email,
                            Details           = "*****@*****.**"
                        },
                        new Communication
                        {
                            CommunicationType = CommunicationType.Mobile,
                            Details           = "0987 0987"
                        }
                    }
                }
            };
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Agents = agents;
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-WithDuplicateAgents.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
Ejemplo n.º 7
0
            public void GivenSomeJsonOfAnArrayOfListings_DeserializeObject_ReturnsACollectionOfListings()
            {
                // Arrange.
                var listings = FakeListings.CreateFakeListings <ResidentialListing>();
                var json     = listings.SerializeObject();

                // Act.
                var convertedListings = JsonConvertHelpers.DeserializeObjects(json);

                // Assert.
                convertedListings.Count().ShouldBe(listings.Count());
            }
Ejemplo n.º 8
0
            public void GivenSomeJsonOfASingleListing_DeserializeObjectToAbstractListing_ReturnsAListing()
            {
                // Arrange.
                var listing = FakeListings.CreateAFakeListing <ResidentialListing>();
                var json    = listing.SerializeObject();

                // Act.
                var convertedListing = JsonConvertHelpers.DeserializeObject <Listing>(json);

                // Assert.
                convertedListing.Id.ShouldBe(listing.Id);
            }
Ejemplo n.º 9
0
            public void GivenSomeListings_SerializeObject_ReturnsSomeJson()
            {
                // Arrange.
                var listings = FakeListings.CreateFakeListings <ResidentialListing>();

                // Act.
                var json = listings.SerializeObject();

                // Assert.
                json.ShouldStartWith("[");
                json.ShouldEndWith("]");
                json.Length.ShouldBeGreaterThan(2);
            }
        public void GivenTheFileREAResidentialCurrent_Parse_ReturnsAResidentialAvailableListing(string fileName)
        {
            // Arrange.
            var expectedListing       = FakeListings.CreateAFakeResidentialListing();
            var reaXml                = File.ReadAllText(FakeDataFolder + fileName);
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        public void GivenTheFileREAResidentialCurrentWithASingleAgentName_Parse_ReturnsAResidentialAvailableListing()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Agents[0].Communications = new List <Communication>(); // Remove all communications for this agent.
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-WithASingleAgentName.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        public void GivenThatWeNeedAListing_CreateAFakeListing_ReturnsAListing(Type type)
        {
            // Arrange & Act.
            var listing = type == typeof(ResidentialListing)
                              ? FakeListings.CreateAFakeListing <ResidentialListing>()
                              : type == typeof(RentalListing)
                                  ? FakeListings.CreateAFakeListing <RentalListing>()
                                  : type == typeof(LandListing)
                                      ? FakeListings.CreateAFakeListing <LandListing>()
                                      : (Listing)FakeListings.CreateAFakeListing <RuralListing>();

            // Assert.
            listing.ShouldNotBeNull();
            listing.GetType().ShouldBe(type);
        }
Ejemplo n.º 13
0
        public void GivenTheFileREARentalCurrentWithNoBond_Parse_ReturnsARentalAvailableListing()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeRentalListing();

            expectedListing.Pricing.Bond = null;
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Rental-Current-WithNoBond.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertRentalListing(result, expectedListing);
        }
        public void GivenTheFileREAResidentialCurrentWithPriceAndDisplayYesButNoPriceView_Parse_ReturnsAListing()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Pricing.SalePriceText = "$500,000";
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-WithPriceAndDisplayYesButNoPriceView.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        public void GivenTheFileREAResidentialCurrentMinimumAndAnExistingListing_Parse_ReturnsAResidentialAvailableListing()
        {
            // Arrange.
            var source      = FakeListings.CreateAFakeResidentialListing();
            var destination = FakeListings.CreateAFakeResidentialListing();

            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-Minimum.xml");

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml, source);

            // Assert.
            AssertResidentialListing(result, destination);
        }
        public void GivenTheFileREAResidentialCurrentBedroomIsStudio_Parse_ReturnsAResidentialAvailableListing()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.PropertyType      = PropertyType.Studio;
            expectedListing.Features.Bedrooms = 0;
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-BedroomIsStudio.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        [InlineData("REA-Residential-Current-AddressDisplayIsNo.xml", "RICHMOND, Victoria 3121")] // Display == false/no.
        public void GivenTheFileREAResidentialWithSomeAddressDisplayValues_Parse_ReturnsAResidentialSoldListing(string fileName,
                                                                                                                string expectedDisplayAddress)
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Address.DisplayAddress = expectedDisplayAddress;
            var reaXml = File.ReadAllText(FakeDataFolder + fileName);
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        GivenTheFileREAResidentialCurrentWithEmptyImagesAndFloorplans_Parse_ReturnsAResidentialAvailableListing()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Images     = new List <Media>();
            expectedListing.FloorPlans = new List <Media>();
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-WithEmptyImagesAndFloorplans.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        GivenTheFileREAResidentialCurrentWithNoModTimeInImagesAndFloorPlans_Parse_ReturnsAResidentialAvailableListing
            ()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Images.ToList().ForEach(x => x.CreatedOn     = null);
            expectedListing.FloorPlans.ToList().ForEach(x => x.CreatedOn = null);
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-WithNoModTimeInImagesAndFloorPlans.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        public void GivenTheFileREAResidentialCurrentWithEnsuiteIsTrue_Parse_ReturnsAResidentialAvailableListing(
            string filename,
            byte ensuiteCount)
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Features.Ensuites = ensuiteCount;
            var reaXml = File.ReadAllText(FakeDataFolder + filename);
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        public void GivenTheFileREALandCurrent_Parse_ReturnsALandAvailableListing(string fileName)
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeLandListing();

            expectedListing.Address.StreetNumber   = "LOT 12/39";
            expectedListing.Address.DisplayAddress = expectedListing.Address.ToFormattedAddress(true, StateReplacementType.ReplaceToLongText, false, true);

            var reaXml = File.ReadAllText(FakeDataFolder + fileName);
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertLandListing(result, expectedListing);
        }
        public void GivenTheFileREALandCurrentMissingLandCategory_Parse_ReturnsALandAvailableListing()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeLandListing();

            expectedListing.Address.StreetNumber   = "LOT 12/39";
            expectedListing.Address.DisplayAddress = expectedListing.Address.ToFormattedAddress(true, StateReplacementType.ReplaceToLongText, false, true);
            expectedListing.CategoryType           = LandRuralCategoryType.Unknown;

            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Land-Current-MissingLandCategory.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertLandListing(result, expectedListing);
        }
        public void GivenTheFileREALandCurrentIncompleteLandDetails_Parse_ReturnsALandAvailableListing()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeLandListing();

            expectedListing.Address.StreetNumber   = "LOT 12/39";
            expectedListing.Address.DisplayAddress = expectedListing.Address.ToFormattedAddress(true, StateReplacementType.ReplaceToLongText, false, true);
            expectedListing.LandDetails.CrossOver  = null;
            expectedListing.LandDetails.Depths     = new List <Depth>();
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Land-Current-IncompleteLandDetails.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertLandListing(result, expectedListing);
        }
        GivenTheFileREAResidentialCurrentWithNoStreetNumberButASubNumber_Parse_ReturnsAResidentialAvailableListing
            ()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Address.StreetNumber   = "2/77a";
            expectedListing.Address.DisplayAddress = expectedListing.Address.ToString();

            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-WithNoStreetNumberButASubNumber.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
        public void GivenTheFileREAResidentialCurrentWithLocalFilesForImages_Parse_ReturnsAListing()
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Images[0].Url     = "imageM.jpg";
            expectedListing.Images[1].Url     = "imageA.jpg";
            expectedListing.FloorPlans[0].Url = "floorplan1.gif";
            expectedListing.FloorPlans[1].Url = "floorplan2.gif";
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-WithLocalFilesForImages.xml");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }
Ejemplo n.º 26
0
        public void GivenAnExistingListingAndTheResultListingChangesSomething_Parse_ReturnsANewListingWithTheSourceListingWasntChanged()
        {
            // Arrange.
            var source = FakeListings.CreateAFakeResidentialListing();

            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();
            var reaXml = File.ReadAllText(FakeDataFolder + "REA-Residential-Current-Minimum.xml");

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml, source);

            // Assert.

            // Change something on the result which shouldn't effect the original source.
            var newListing = result.Listings.First().Listing;

            newListing.Description.ShouldBe(source.Description);    // Right now, both are the same.
            newListing.Description = DateTime.UtcNow.ToString();    // Change.
            newListing.Description.ShouldNotBe(source.Description); // Both should now be different.
        }
Ejemplo n.º 27
0
        public void GivenANonCurrentReaRentalFileAndAnExistingListing_Parse_ReturnsTheUpdatedListing(string fileName,
                                                                                                     StatusType expectedStatusType)
        {
            // Arrange.
            var existingListing       = FakeListings.CreateAFakeRentalListing();
            var reaXml                = File.ReadAllText(FakeDataFolder + fileName);
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            // Arrange.
            var result = reaXmlTransmorgrifier.Parse(reaXml, existingListing);

            // Assert.
            var listing = result.Listings.First().Listing as RentalListing;

            listing.StatusType.ShouldBe(expectedStatusType);

            var validator        = new RentalListingValidator();
            var validationResult = validator.Validate(listing, ruleSet: RentalListingValidator.StrictRuleSet);

            validationResult.IsValid.ShouldBeTrue();
        }
        [InlineData("REA-Residential-Current-WithPriceAndDisplayNoAndNoPriceView.xml", false, null)]   // Will use the default Sale price value.
        public void GivenTheFileREAResidentialCurrentSomeVariousDisplayPriceOptions_Parse_ReturnsAListing(
            string fileName,
            bool isDefaultSalePriceSet,
            string expectedSalePriceText)
        {
            // Arrange.
            var expectedListing = FakeListings.CreateAFakeResidentialListing();

            expectedListing.Pricing.SalePriceText = expectedSalePriceText;
            var reaXml = File.ReadAllText($"{FakeDataFolder}{fileName}");
            var reaXmlTransmorgrifier = new ReaXmlTransmorgrifier();

            if (isDefaultSalePriceSet)
            {
                reaXmlTransmorgrifier.DefaultSalePriceTextIfMissing = expectedSalePriceText;
            }

            // Act.
            var result = reaXmlTransmorgrifier.Parse(reaXml);

            // Assert.
            AssertResidentialListing(result, expectedListing);
        }