From b897b9e1fdfe5568d290bcbb03296fcb5a53613e Mon Sep 17 00:00:00 2001 From: michaelr Date: Mon, 17 Feb 2020 15:12:19 +0000 Subject: [PATCH 01/14] Search For Properties by Postcode --- .../property/PropertyController.java | 32 +++++++-- .../property/SearchPropertyService.java | 9 +++ .../property/SearchPropertyServiceImpl.java | 33 +++++++++ .../java/com/rightmove/ApplicationTests.java | 39 +++++++++++ .../property/PropertyControllerTest.java | 68 +++++++++++++++++++ .../SearchPropertyServiceImplTest.java | 8 +++ 6 files changed, 185 insertions(+), 4 deletions(-) create mode 100644 web/src/main/java/com/rightmove/property/SearchPropertyService.java create mode 100644 web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java create mode 100644 web/src/test/java/com/rightmove/property/PropertyControllerTest.java create mode 100644 web/src/test/java/com/rightmove/property/SearchPropertyServiceImplTest.java diff --git a/web/src/main/java/com/rightmove/property/PropertyController.java b/web/src/main/java/com/rightmove/property/PropertyController.java index 0f2a664..64ecffe 100644 --- a/web/src/main/java/com/rightmove/property/PropertyController.java +++ b/web/src/main/java/com/rightmove/property/PropertyController.java @@ -1,16 +1,40 @@ package com.rightmove.property; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; -import java.util.Collections; - @RestController public class PropertyController { + private final SearchPropertyService searchPropertyService; + + @Autowired + public PropertyController(SearchPropertyService searchPropertyService) { + this.searchPropertyService = searchPropertyService; + } + @GetMapping("/property") - public PropertyResult getProperties(@RequestParam String postcode) { - return new PropertyResult(Collections.emptyList()); + public @ResponseBody PropertyResult getPropertiesByPostcode(@RequestParam String postcode) { + return searchPropertyService.retrievePropertiesByPostcode(postcode); } + } + +//@RestController +//public class PropertyController { +// +// private final SearchPropertyService searchPropertyService; +// +// @Autowired +// public PropertyController(SearchPropertyService searchPropertyService) { +// this.searchPropertyService = searchPropertyService; +// } +// +// @RequestMapping(path = "/property/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) +// public @ResponseBody Property getPropertyById(@PathVariable long id) { +// return searchPropertyService.retrieveProperty(id); +// } +//} \ No newline at end of file diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyService.java b/web/src/main/java/com/rightmove/property/SearchPropertyService.java new file mode 100644 index 0000000..60688c0 --- /dev/null +++ b/web/src/main/java/com/rightmove/property/SearchPropertyService.java @@ -0,0 +1,9 @@ +package com.rightmove.property; + +import com.rightmove.property.data.PropertyEntity; + +import java.util.Set; + +public interface SearchPropertyService { + public PropertyResult retrievePropertiesByPostcode(String postcode); +} diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java new file mode 100644 index 0000000..1646228 --- /dev/null +++ b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java @@ -0,0 +1,33 @@ +package com.rightmove.property; + +import com.rightmove.property.data.PropertyDao; +import com.rightmove.property.data.PropertyEntity; +import com.rightmove.property.data.PropertyType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class SearchPropertyServiceImpl implements SearchPropertyService { + + private PropertyDao propertyDao; + + @Autowired + public SearchPropertyServiceImpl(PropertyDao propertyDao){ + this.propertyDao = propertyDao; + } + + @Override + public PropertyResult retrievePropertiesByPostcode(String postcode) { + List properties = propertyDao.getAll().stream() + .filter(propertyEntity -> postcode.equals(propertyEntity.getPostcode())).collect(Collectors.toList()); + PropertyResult propertyResult = new PropertyResult(properties); + return propertyResult; + } + +} diff --git a/web/src/test/java/com/rightmove/ApplicationTests.java b/web/src/test/java/com/rightmove/ApplicationTests.java index f6a1f5d..3314693 100644 --- a/web/src/test/java/com/rightmove/ApplicationTests.java +++ b/web/src/test/java/com/rightmove/ApplicationTests.java @@ -41,5 +41,44 @@ public void tearDown() { propertyDao.clear(); } + @Test + public void shouldFindPropertyByPostcode() { + PropertyEntity property = PropertyEntityBuilder.aDefaultPropertyEntity(1).postcode("W1D 3QU").build(); + PropertyEntity property2 = PropertyEntityBuilder.aDefaultPropertyEntity(2).postcode("W1F 3FT").build(); + propertyDao.save(property); + propertyDao.save(property2); + JsonPath jsonPath = given() + .when() + .accept(ContentType.JSON) + .queryParam("postcode", "W1D 3QU") + .get("/property") + .then() + .statusCode(HttpStatus.SC_OK) + .extract() + .jsonPath(); + + assertThat(jsonPath.getList("properties")).hasSize(1); + assertThat(jsonPath.getLong("properties[0].id")).isEqualTo(1L); + } + + @Test + public void shouldNotFindPropertyWherePostcodeNotFound() throws Exception { + PropertyEntity property = PropertyEntityBuilder.aDefaultPropertyEntity(1).postcode("W1D 3QU").build(); + PropertyEntity property2 = PropertyEntityBuilder.aDefaultPropertyEntity(2).postcode("W1F 3FT").build(); + propertyDao.save(property); + propertyDao.save(property2); + + JsonPath jsonPath = given() + .when() + .accept(ContentType.JSON) + .queryParam("postcode", "WA11 9RW") + .get("/property") + .then() + .statusCode(HttpStatus.SC_OK) + .extract() + .jsonPath(); + + assertThat(jsonPath.getList("properties")).hasSize(0); + } } diff --git a/web/src/test/java/com/rightmove/property/PropertyControllerTest.java b/web/src/test/java/com/rightmove/property/PropertyControllerTest.java new file mode 100644 index 0000000..0ec35aa --- /dev/null +++ b/web/src/test/java/com/rightmove/property/PropertyControllerTest.java @@ -0,0 +1,68 @@ +package com.rightmove.property; + +import com.rightmove.property.data.PropertyEntity; +import com.rightmove.property.data.PropertyType; +import org.junit.Before; +import org.junit.Test; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.ui.Model; +import org.springframework.web.client.HttpClientErrorException; +import org.junit.runner.RunWith; +import javax.servlet.http.HttpServletResponse; + +import java.util.ArrayList; +import java.util.List; + +import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.given; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup; +import static org.junit.Assert.*; + +public class PropertyControllerTest { + + private MockMvc mockMvc; + private PropertyController propertyController; + private SearchPropertyService searchPropertyService; + private PropertyResult propertyResult; + + @Before + public void setUp() { + searchPropertyService = mock(SearchPropertyService.class); + propertyController = new PropertyController(searchPropertyService); + mockMvc = standaloneSetup(propertyController).build(); + } + + @Test + public void test1(){ + String postcode = "W1D 3QU"; + List properties = new ArrayList<>(); + properties.add(new PropertyEntity(1L,1000000L,7,2,"12","Richard Lane","London","W1F 3ER", PropertyType.DETACHED)); + PropertyResult propertyResult = new PropertyResult(properties); + when(searchPropertyService.retrievePropertiesByPostcode(any())).thenReturn(propertyResult); + given(). + mockMvc(mockMvc) + .param("postcode", postcode) + .when() + .get("/property") + .then() + .statusCode(HttpServletResponse.SC_OK); + + } + + @Test + public void test2(){ + String postcode = "W1D 3QU"; + propertyController.getPropertiesByPostcode(postcode); + verify(searchPropertyService, times(1)).retrievePropertiesByPostcode(postcode); + } + + @Test + public void test3(){ + String postcode = ""; + propertyController.getPropertiesByPostcode(postcode); + verify(searchPropertyService, times(0)).retrievePropertiesByPostcode(postcode); + } + +} diff --git a/web/src/test/java/com/rightmove/property/SearchPropertyServiceImplTest.java b/web/src/test/java/com/rightmove/property/SearchPropertyServiceImplTest.java new file mode 100644 index 0000000..d4132e9 --- /dev/null +++ b/web/src/test/java/com/rightmove/property/SearchPropertyServiceImplTest.java @@ -0,0 +1,8 @@ +package com.rightmove.property; + + +public class SearchPropertyServiceImplTest { + + + +} From b8f8c36c2aeee38f61cad0d066e3a4da87459087 Mon Sep 17 00:00:00 2001 From: michaelr Date: Fri, 21 Feb 2020 16:26:05 +0000 Subject: [PATCH 02/14] Use DisplayProperty object with PriceIndicator --- .../rightmove/property/DisplayProperty.java | 83 +++++++++++++++++++ .../rightmove/property/PriceIndicator.java | 5 ++ .../property/PropertyController.java | 18 +--- ...pertyEntityToDisplayPropertyConverter.java | 36 ++++++++ .../rightmove/property/PropertyResult.java | 6 +- .../property/SearchPropertyServiceImpl.java | 21 ++--- .../java/com/rightmove/IntegrationTest.java | 68 +++++++++++++++ .../property/PropertyControllerTest.java | 10 +-- .../SearchPropertyServiceImplTest.java | 8 -- 9 files changed, 207 insertions(+), 48 deletions(-) create mode 100644 web/src/main/java/com/rightmove/property/DisplayProperty.java create mode 100644 web/src/main/java/com/rightmove/property/PriceIndicator.java create mode 100644 web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java create mode 100644 web/src/test/java/com/rightmove/IntegrationTest.java delete mode 100644 web/src/test/java/com/rightmove/property/SearchPropertyServiceImplTest.java diff --git a/web/src/main/java/com/rightmove/property/DisplayProperty.java b/web/src/main/java/com/rightmove/property/DisplayProperty.java new file mode 100644 index 0000000..e4149ee --- /dev/null +++ b/web/src/main/java/com/rightmove/property/DisplayProperty.java @@ -0,0 +1,83 @@ +package com.rightmove.property; + +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.rightmove.property.data.PropertyType; + +import java.util.Objects; + +public class DisplayProperty { + private final long id; + private final PriceIndicator priceIndicator; + private final String displayAddress; + private final PropertyType type; + + public DisplayProperty(Builder builder) { + this.id = builder.id; + this.priceIndicator = builder.priceIndicator; + this.displayAddress = builder.displayAddress; + this.type = builder.type; + } + + public long getId() { + return id; + } + + public PriceIndicator getPriceIndicator() { + return priceIndicator; + } + + public String getDisplayAddress() { + return displayAddress; + } + + public PropertyType getType() { + return type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DisplayProperty that = (DisplayProperty) o; + return id == that.id; + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + @JsonPOJOBuilder(withPrefix = "") + public static class Builder { + private long id; + private PriceIndicator priceIndicator; + private String displayAddress; + private PropertyType type; + + public Builder id(long id){ + this.id = id; + return this; + } + + public Builder priceIndicator(PriceIndicator priceIndicator){ + this.priceIndicator = priceIndicator; + return this; + } + + public Builder displayAddress(String address){ + this.displayAddress = address; + return this; + } + + public Builder propertyType(PropertyType type){ + this.type = type; + return this; + } + + public DisplayProperty build(){ + return new DisplayProperty(this); + } + + } + +} diff --git a/web/src/main/java/com/rightmove/property/PriceIndicator.java b/web/src/main/java/com/rightmove/property/PriceIndicator.java new file mode 100644 index 0000000..2bedb8a --- /dev/null +++ b/web/src/main/java/com/rightmove/property/PriceIndicator.java @@ -0,0 +1,5 @@ +package com.rightmove.property; + +public enum PriceIndicator { + LOW,MEDIUM,HIGH +} diff --git a/web/src/main/java/com/rightmove/property/PropertyController.java b/web/src/main/java/com/rightmove/property/PropertyController.java index 64ecffe..eb6b732 100644 --- a/web/src/main/java/com/rightmove/property/PropertyController.java +++ b/web/src/main/java/com/rightmove/property/PropertyController.java @@ -21,20 +21,4 @@ public PropertyController(SearchPropertyService searchPropertyService) { return searchPropertyService.retrievePropertiesByPostcode(postcode); } -} - -//@RestController -//public class PropertyController { -// -// private final SearchPropertyService searchPropertyService; -// -// @Autowired -// public PropertyController(SearchPropertyService searchPropertyService) { -// this.searchPropertyService = searchPropertyService; -// } -// -// @RequestMapping(path = "/property/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) -// public @ResponseBody Property getPropertyById(@PathVariable long id) { -// return searchPropertyService.retrieveProperty(id); -// } -//} \ No newline at end of file +} \ No newline at end of file diff --git a/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java b/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java new file mode 100644 index 0000000..4b9a2d5 --- /dev/null +++ b/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java @@ -0,0 +1,36 @@ +package com.rightmove.property; + +import com.rightmove.property.data.PropertyEntity; +import org.springframework.stereotype.Component; + +@Component +public class PropertyEntityToDisplayPropertyConverter { + + public PropertyEntityToDisplayPropertyConverter(){ } + + public DisplayProperty convert(PropertyEntity propertyEntity){ + + return new DisplayProperty.Builder() + .id(propertyEntity.getId()) + .priceIndicator(calculatePriceIndicator(propertyEntity.getPrice())) + .displayAddress(createDisplayAddress(propertyEntity.getNumber(), propertyEntity.getAddress(), propertyEntity.getRegion(), propertyEntity.getPostcode())) + .propertyType(propertyEntity.getType()) + .build(); + + } + + private PriceIndicator calculatePriceIndicator(Long price){ + if (price > 1000000){ + return PriceIndicator.HIGH; + } + if (price < 1000000 && price > 500000){ + return PriceIndicator.MEDIUM; + } + else return PriceIndicator.LOW; + } + + private String createDisplayAddress(String number, String address, String region, String postcode){ + return number + " " + address + ", " + region + ", " + postcode; + } + +} diff --git a/web/src/main/java/com/rightmove/property/PropertyResult.java b/web/src/main/java/com/rightmove/property/PropertyResult.java index e89131c..eb7c63f 100644 --- a/web/src/main/java/com/rightmove/property/PropertyResult.java +++ b/web/src/main/java/com/rightmove/property/PropertyResult.java @@ -6,13 +6,13 @@ public class PropertyResult { - private List properties; + private List properties; - public PropertyResult(List properties) { + public PropertyResult(List properties) { this.properties = properties; } - public List getProperties() { + public List getProperties() { return properties; } } diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java index 1646228..0f56cfe 100644 --- a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java +++ b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java @@ -1,33 +1,30 @@ package com.rightmove.property; import com.rightmove.property.data.PropertyDao; -import com.rightmove.property.data.PropertyEntity; -import com.rightmove.property.data.PropertyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; import java.util.stream.Collectors; @Service public class SearchPropertyServiceImpl implements SearchPropertyService { - private PropertyDao propertyDao; + private final PropertyDao propertyDao; + private final PropertyEntityToDisplayPropertyConverter propertyEntityToDisplayPropertyConverter; @Autowired - public SearchPropertyServiceImpl(PropertyDao propertyDao){ + public SearchPropertyServiceImpl(PropertyDao propertyDao, PropertyEntityToDisplayPropertyConverter propertyEntityToDisplayPropertyConverter){ this.propertyDao = propertyDao; + this.propertyEntityToDisplayPropertyConverter = propertyEntityToDisplayPropertyConverter; } @Override public PropertyResult retrievePropertiesByPostcode(String postcode) { - List properties = propertyDao.getAll().stream() - .filter(propertyEntity -> postcode.equals(propertyEntity.getPostcode())).collect(Collectors.toList()); - PropertyResult propertyResult = new PropertyResult(properties); - return propertyResult; + return new PropertyResult( + propertyDao.getAll().stream() + .filter(propertyEntity -> postcode.equals(propertyEntity.getPostcode())) + .map(propertyEntityToDisplayPropertyConverter::convert) + .collect(Collectors.toList())); } } diff --git a/web/src/test/java/com/rightmove/IntegrationTest.java b/web/src/test/java/com/rightmove/IntegrationTest.java new file mode 100644 index 0000000..4fab216 --- /dev/null +++ b/web/src/test/java/com/rightmove/IntegrationTest.java @@ -0,0 +1,68 @@ +package com.rightmove; + +import com.rightmove.property.data.PropertyDao; +import io.restassured.RestAssured; +import io.restassured.config.LogConfig; +import io.restassured.http.ContentType; +import io.restassured.path.json.JsonPath; +import org.apache.http.HttpStatus; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.test.context.junit4.SpringRunner; + +import static io.restassured.RestAssured.given; +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class IntegrationTest { + + @Autowired + private PropertyDao propertyDao; + + @LocalServerPort + private int serverPort; + + @Before + public void setup() throws Exception { + RestAssured.port = serverPort; + RestAssured.config = RestAssured.config().logConfig(LogConfig.logConfig()); + } + + @Test + public void shouldFindPropertyByPostcode() { + + JsonPath jsonPath = given() + .when() + .accept(ContentType.JSON) + .queryParam("postcode", "MA12 3ZY") + .get("/property") + .then() + .statusCode(HttpStatus.SC_OK) + .extract() + .jsonPath(); + + assertThat(jsonPath.getList("properties")).hasSize(1); + assertThat(jsonPath.getLong("properties[0].id")).isEqualTo(3L); + } + + @Test + public void shouldNotFindPropertyWherePostcodeNotFound() throws Exception { + + JsonPath jsonPath = given() + .when() + .accept(ContentType.JSON) + .queryParam("postcode", "WA11 9RW") + .get("/property") + .then() + .statusCode(HttpStatus.SC_OK) + .extract() + .jsonPath(); + + assertThat(jsonPath.getList("properties")).hasSize(0); + } +} diff --git a/web/src/test/java/com/rightmove/property/PropertyControllerTest.java b/web/src/test/java/com/rightmove/property/PropertyControllerTest.java index 0ec35aa..f7a2b3c 100644 --- a/web/src/test/java/com/rightmove/property/PropertyControllerTest.java +++ b/web/src/test/java/com/rightmove/property/PropertyControllerTest.java @@ -4,21 +4,15 @@ import com.rightmove.property.data.PropertyType; import org.junit.Before; import org.junit.Test; -import org.springframework.http.HttpStatus; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.ui.Model; -import org.springframework.web.client.HttpClientErrorException; -import org.junit.runner.RunWith; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.given; -import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup; -import static org.junit.Assert.*; public class PropertyControllerTest { @@ -37,8 +31,8 @@ public void setUp() { @Test public void test1(){ String postcode = "W1D 3QU"; - List properties = new ArrayList<>(); - properties.add(new PropertyEntity(1L,1000000L,7,2,"12","Richard Lane","London","W1F 3ER", PropertyType.DETACHED)); + List properties = new ArrayList<>(); + properties.add(new DisplayProperty.Builder().id(1).displayAddress("1 Dragon Street " + postcode).priceIndicator(PriceIndicator.HIGH).propertyType(PropertyType.FLAT).build()); PropertyResult propertyResult = new PropertyResult(properties); when(searchPropertyService.retrievePropertiesByPostcode(any())).thenReturn(propertyResult); given(). diff --git a/web/src/test/java/com/rightmove/property/SearchPropertyServiceImplTest.java b/web/src/test/java/com/rightmove/property/SearchPropertyServiceImplTest.java deleted file mode 100644 index d4132e9..0000000 --- a/web/src/test/java/com/rightmove/property/SearchPropertyServiceImplTest.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.rightmove.property; - - -public class SearchPropertyServiceImplTest { - - - -} From 6384b4d73125ba3ab37029dc3c1fb87ffff58b0e Mon Sep 17 00:00:00 2001 From: michaelr Date: Fri, 21 Feb 2020 16:38:15 +0000 Subject: [PATCH 03/14] remove unused imports --- web/src/main/java/com/rightmove/property/PropertyResult.java | 2 -- .../java/com/rightmove/property/SearchPropertyService.java | 4 ---- .../java/com/rightmove/property/PropertyControllerTest.java | 1 - 3 files changed, 7 deletions(-) diff --git a/web/src/main/java/com/rightmove/property/PropertyResult.java b/web/src/main/java/com/rightmove/property/PropertyResult.java index eb7c63f..a2f15bd 100644 --- a/web/src/main/java/com/rightmove/property/PropertyResult.java +++ b/web/src/main/java/com/rightmove/property/PropertyResult.java @@ -1,7 +1,5 @@ package com.rightmove.property; -import com.rightmove.property.data.PropertyEntity; - import java.util.List; public class PropertyResult { diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyService.java b/web/src/main/java/com/rightmove/property/SearchPropertyService.java index 60688c0..714a763 100644 --- a/web/src/main/java/com/rightmove/property/SearchPropertyService.java +++ b/web/src/main/java/com/rightmove/property/SearchPropertyService.java @@ -1,9 +1,5 @@ package com.rightmove.property; -import com.rightmove.property.data.PropertyEntity; - -import java.util.Set; - public interface SearchPropertyService { public PropertyResult retrievePropertiesByPostcode(String postcode); } diff --git a/web/src/test/java/com/rightmove/property/PropertyControllerTest.java b/web/src/test/java/com/rightmove/property/PropertyControllerTest.java index f7a2b3c..d616322 100644 --- a/web/src/test/java/com/rightmove/property/PropertyControllerTest.java +++ b/web/src/test/java/com/rightmove/property/PropertyControllerTest.java @@ -1,6 +1,5 @@ package com.rightmove.property; -import com.rightmove.property.data.PropertyEntity; import com.rightmove.property.data.PropertyType; import org.junit.Before; import org.junit.Test; From 42f945940f915d2edcb927a6c40d5b689c0beb32 Mon Sep 17 00:00:00 2001 From: michaelr Date: Fri, 21 Feb 2020 17:05:04 +0000 Subject: [PATCH 04/14] validate postcode --- .../property/SearchPropertyServiceImpl.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java index 0f56cfe..a7ff758 100644 --- a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java +++ b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java @@ -1,6 +1,7 @@ package com.rightmove.property; import com.rightmove.property.data.PropertyDao; +import com.rightmove.property.data.PropertyEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,11 +21,24 @@ public SearchPropertyServiceImpl(PropertyDao propertyDao, PropertyEntityToDispla @Override public PropertyResult retrievePropertiesByPostcode(String postcode) { - return new PropertyResult( - propertyDao.getAll().stream() - .filter(propertyEntity -> postcode.equals(propertyEntity.getPostcode())) - .map(propertyEntityToDisplayPropertyConverter::convert) - .collect(Collectors.toList())); + if (isValidPostcode(postcode)){ + return new PropertyResult( + propertyDao.getAll().stream() + .filter(propertyEntity -> hasPostcode(postcode,propertyEntity)) + .map(propertyEntityToDisplayPropertyConverter::convert) + .collect(Collectors.toList())); + } else { + throw new RuntimeException("not valid postcode"); + } + } + + private boolean isValidPostcode(String postcode){ + if (postcode.length() > 100) return false; + return true; + } + + private boolean hasPostcode(String postcode, PropertyEntity propertyEntity){ + return postcode.equals(propertyEntity.getPostcode()); } } From 626a018a5744f98072a381b5b2480a2f50002bef Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 26 Feb 2020 13:10:40 +0000 Subject: [PATCH 05/14] PropertyEntityToDisplayPropertyConverterTest --- ...ntityToDisplayPropertyConverterTest.groovy | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 web/src/test/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverterTest.groovy diff --git a/web/src/test/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverterTest.groovy b/web/src/test/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverterTest.groovy new file mode 100644 index 0000000..34d0f3a --- /dev/null +++ b/web/src/test/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverterTest.groovy @@ -0,0 +1,24 @@ +package com.rightmove.property + +import spock.lang.Specification +import spock.lang.Unroll + +class PropertyEntityToDisplayPropertyConverterTest extends Specification { + + + @Unroll + def "when price is #price price indicator should be #priceIndicator"(){ + def propertyEntityToDisplayPropertyConverter = new PropertyEntityToDisplayPropertyConverter(); + + expect: + propertyEntityToDisplayPropertyConverter.calculatePriceIndicator(price) == priceIndicator + + where: + price || priceIndicator + 1200000 || PriceIndicator.HIGH + 800000 || PriceIndicator.MEDIUM + 100000 || PriceIndicator.LOW + + } + +} From 73918fff2c7a625e9f70bb9ff352bcd5ac7e43a0 Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 26 Feb 2020 17:37:34 +0000 Subject: [PATCH 06/14] add spock dependencies to gradle --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index b945afd..4401f0b 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,7 @@ subprojects { sourceCompatibility = 1.8 dependencies { + testCompile "org.spockframework:spock-core:1.1-groovy-2.4" testCompile 'org.assertj:assertj-core:3.9.1' testCompile 'junit:junit:4.12' } From 172daf073516512bcf839190008e3ab6fddee986 Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 26 Feb 2020 18:02:16 +0000 Subject: [PATCH 07/14] Expect the flat/house number as an integer in the converter - and match types by using String.length --- .../property/PropertyEntityToDisplayPropertyConverter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java b/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java index 4b9a2d5..900611a 100644 --- a/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java +++ b/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java @@ -13,7 +13,7 @@ public DisplayProperty convert(PropertyEntity propertyEntity){ return new DisplayProperty.Builder() .id(propertyEntity.getId()) .priceIndicator(calculatePriceIndicator(propertyEntity.getPrice())) - .displayAddress(createDisplayAddress(propertyEntity.getNumber(), propertyEntity.getAddress(), propertyEntity.getRegion(), propertyEntity.getPostcode())) + .displayAddress(createDisplayAddress(propertyEntity.getNumber().length(), propertyEntity.getAddress(), propertyEntity.getRegion(), propertyEntity.getPostcode())) .propertyType(propertyEntity.getType()) .build(); @@ -29,7 +29,7 @@ private PriceIndicator calculatePriceIndicator(Long price){ else return PriceIndicator.LOW; } - private String createDisplayAddress(String number, String address, String region, String postcode){ + private String createDisplayAddress(Integer number, String address, String region, String postcode){ return number + " " + address + ", " + region + ", " + postcode; } From fc7021920fa418bd805dc8cf78ddb0c82b49c0f2 Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 26 Feb 2020 18:06:52 +0000 Subject: [PATCH 08/14] , in between house/flat number and street address. --- .../property/PropertyEntityToDisplayPropertyConverter.java | 2 +- .../PropertyEntityToDisplayPropertyConverterTest.groovy | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java b/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java index 900611a..818c45e 100644 --- a/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java +++ b/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java @@ -30,7 +30,7 @@ private PriceIndicator calculatePriceIndicator(Long price){ } private String createDisplayAddress(Integer number, String address, String region, String postcode){ - return number + " " + address + ", " + region + ", " + postcode; + return number + ", " + address + ", " + region + ", " + postcode; } } diff --git a/web/src/test/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverterTest.groovy b/web/src/test/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverterTest.groovy index 34d0f3a..9807f75 100644 --- a/web/src/test/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverterTest.groovy +++ b/web/src/test/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverterTest.groovy @@ -5,7 +5,6 @@ import spock.lang.Unroll class PropertyEntityToDisplayPropertyConverterTest extends Specification { - @Unroll def "when price is #price price indicator should be #priceIndicator"(){ def propertyEntityToDisplayPropertyConverter = new PropertyEntityToDisplayPropertyConverter(); From 10bc3a9185f123f64d6ec67f8993dfc0a66203df Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 4 Mar 2020 16:24:23 +0000 Subject: [PATCH 09/14] Change test class name to EndToEndTest --- .../com/rightmove/{IntegrationTest.java => EndToEndTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename web/src/test/java/com/rightmove/{IntegrationTest.java => EndToEndTest.java} (98%) diff --git a/web/src/test/java/com/rightmove/IntegrationTest.java b/web/src/test/java/com/rightmove/EndToEndTest.java similarity index 98% rename from web/src/test/java/com/rightmove/IntegrationTest.java rename to web/src/test/java/com/rightmove/EndToEndTest.java index 4fab216..c8e1a1c 100644 --- a/web/src/test/java/com/rightmove/IntegrationTest.java +++ b/web/src/test/java/com/rightmove/EndToEndTest.java @@ -19,7 +19,7 @@ @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class IntegrationTest { +public class EndToEndTest { @Autowired private PropertyDao propertyDao; From 6f873ae161b36f34d9c52b1b430a8d262b50e8a4 Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 11 Mar 2020 14:51:57 +0000 Subject: [PATCH 10/14] Move filtering by postcode from the service and use the new DAO method --- .../property/SearchPropertyServiceImpl.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java index a7ff758..0834a75 100644 --- a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java +++ b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java @@ -23,10 +23,10 @@ public SearchPropertyServiceImpl(PropertyDao propertyDao, PropertyEntityToDispla public PropertyResult retrievePropertiesByPostcode(String postcode) { if (isValidPostcode(postcode)){ return new PropertyResult( - propertyDao.getAll().stream() - .filter(propertyEntity -> hasPostcode(postcode,propertyEntity)) - .map(propertyEntityToDisplayPropertyConverter::convert) - .collect(Collectors.toList())); + propertyDao.getByPostcode(postcode) + .stream() + .map(propertyEntityToDisplayPropertyConverter::convert) + .collect(Collectors.toList())); } else { throw new RuntimeException("not valid postcode"); } @@ -37,8 +37,4 @@ private boolean isValidPostcode(String postcode){ return true; } - private boolean hasPostcode(String postcode, PropertyEntity propertyEntity){ - return postcode.equals(propertyEntity.getPostcode()); - } - } From ed588d05217772bb38a7b1102faa4a7f339bce1e Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 11 Mar 2020 15:02:10 +0000 Subject: [PATCH 11/14] Refactor out PropertyResult class --- .../rightmove/property/PropertyController.java | 5 ++++- .../com/rightmove/property/PropertyResult.java | 16 ---------------- .../property/SearchPropertyService.java | 4 +++- .../property/SearchPropertyServiceImpl.java | 9 ++++----- 4 files changed, 11 insertions(+), 23 deletions(-) delete mode 100644 web/src/main/java/com/rightmove/property/PropertyResult.java diff --git a/web/src/main/java/com/rightmove/property/PropertyController.java b/web/src/main/java/com/rightmove/property/PropertyController.java index eb6b732..d8c6dad 100644 --- a/web/src/main/java/com/rightmove/property/PropertyController.java +++ b/web/src/main/java/com/rightmove/property/PropertyController.java @@ -6,6 +6,8 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController public class PropertyController { @@ -17,7 +19,8 @@ public PropertyController(SearchPropertyService searchPropertyService) { } @GetMapping("/property") - public @ResponseBody PropertyResult getPropertiesByPostcode(@RequestParam String postcode) { + public @ResponseBody + List getPropertiesByPostcode(@RequestParam String postcode) { return searchPropertyService.retrievePropertiesByPostcode(postcode); } diff --git a/web/src/main/java/com/rightmove/property/PropertyResult.java b/web/src/main/java/com/rightmove/property/PropertyResult.java deleted file mode 100644 index a2f15bd..0000000 --- a/web/src/main/java/com/rightmove/property/PropertyResult.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.rightmove.property; - -import java.util.List; - -public class PropertyResult { - - private List properties; - - public PropertyResult(List properties) { - this.properties = properties; - } - - public List getProperties() { - return properties; - } -} diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyService.java b/web/src/main/java/com/rightmove/property/SearchPropertyService.java index 714a763..6fb28ff 100644 --- a/web/src/main/java/com/rightmove/property/SearchPropertyService.java +++ b/web/src/main/java/com/rightmove/property/SearchPropertyService.java @@ -1,5 +1,7 @@ package com.rightmove.property; +import java.util.List; + public interface SearchPropertyService { - public PropertyResult retrievePropertiesByPostcode(String postcode); + public List retrievePropertiesByPostcode(String postcode); } diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java index 0834a75..b198fc1 100644 --- a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java +++ b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java @@ -1,10 +1,10 @@ package com.rightmove.property; import com.rightmove.property.data.PropertyDao; -import com.rightmove.property.data.PropertyEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.stream.Collectors; @Service @@ -20,13 +20,12 @@ public SearchPropertyServiceImpl(PropertyDao propertyDao, PropertyEntityToDispla } @Override - public PropertyResult retrievePropertiesByPostcode(String postcode) { + public List retrievePropertiesByPostcode(String postcode) { if (isValidPostcode(postcode)){ - return new PropertyResult( - propertyDao.getByPostcode(postcode) + return propertyDao.getByPostcode(postcode) .stream() .map(propertyEntityToDisplayPropertyConverter::convert) - .collect(Collectors.toList())); + .collect(Collectors.toList()); } else { throw new RuntimeException("not valid postcode"); } From c00c6ccb97d8ae260345300d46b4406c30c6cf1b Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 11 Mar 2020 15:06:39 +0000 Subject: [PATCH 12/14] new lines --- .../PropertyEntityToDisplayPropertyConverter.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java b/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java index 818c45e..b111c9a 100644 --- a/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java +++ b/web/src/main/java/com/rightmove/property/PropertyEntityToDisplayPropertyConverter.java @@ -12,8 +12,14 @@ public DisplayProperty convert(PropertyEntity propertyEntity){ return new DisplayProperty.Builder() .id(propertyEntity.getId()) - .priceIndicator(calculatePriceIndicator(propertyEntity.getPrice())) - .displayAddress(createDisplayAddress(propertyEntity.getNumber().length(), propertyEntity.getAddress(), propertyEntity.getRegion(), propertyEntity.getPostcode())) + .priceIndicator( + calculatePriceIndicator(propertyEntity.getPrice())) + .displayAddress( + createDisplayAddress( + propertyEntity.getNumber().length(), + propertyEntity.getAddress(), + propertyEntity.getRegion(), + propertyEntity.getPostcode())) .propertyType(propertyEntity.getType()) .build(); From 9c374f82842c9b6aa23df8c4825e9c5132c84872 Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 11 Mar 2020 15:09:23 +0000 Subject: [PATCH 13/14] refactor converter name --- .../com/rightmove/property/SearchPropertyServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java index b198fc1..69fe96a 100644 --- a/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java +++ b/web/src/main/java/com/rightmove/property/SearchPropertyServiceImpl.java @@ -11,12 +11,12 @@ public class SearchPropertyServiceImpl implements SearchPropertyService { private final PropertyDao propertyDao; - private final PropertyEntityToDisplayPropertyConverter propertyEntityToDisplayPropertyConverter; + private final PropertyEntityToDisplayPropertyConverter converter; @Autowired - public SearchPropertyServiceImpl(PropertyDao propertyDao, PropertyEntityToDisplayPropertyConverter propertyEntityToDisplayPropertyConverter){ + public SearchPropertyServiceImpl(PropertyDao propertyDao, PropertyEntityToDisplayPropertyConverter converter){ this.propertyDao = propertyDao; - this.propertyEntityToDisplayPropertyConverter = propertyEntityToDisplayPropertyConverter; + this.converter = converter; } @Override @@ -24,7 +24,7 @@ public List retrievePropertiesByPostcode(String postcode) { if (isValidPostcode(postcode)){ return propertyDao.getByPostcode(postcode) .stream() - .map(propertyEntityToDisplayPropertyConverter::convert) + .map(converter::convert) .collect(Collectors.toList()); } else { throw new RuntimeException("not valid postcode"); From a79f3e5361f4d788efae115cd4909f3d677f7394 Mon Sep 17 00:00:00 2001 From: michaelr Date: Wed, 11 Mar 2020 16:14:13 +0000 Subject: [PATCH 14/14] REmove PropertyResult from test --- .../java/com/rightmove/property/PropertyControllerTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/web/src/test/java/com/rightmove/property/PropertyControllerTest.java b/web/src/test/java/com/rightmove/property/PropertyControllerTest.java index e9d9856..3763348 100644 --- a/web/src/test/java/com/rightmove/property/PropertyControllerTest.java +++ b/web/src/test/java/com/rightmove/property/PropertyControllerTest.java @@ -18,7 +18,6 @@ public class PropertyControllerTest { private MockMvc mockMvc; private PropertyController propertyController; private SearchPropertyService searchPropertyService; - private PropertyResult propertyResult; @BeforeEach public void setUp() { @@ -32,8 +31,7 @@ public void test1(){ String postcode = "W1D 3QU"; List properties = new ArrayList<>(); properties.add(new DisplayProperty.Builder().id(1).displayAddress("1 Dragon Street " + postcode).priceIndicator(PriceIndicator.HIGH).propertyType(PropertyType.FLAT).build()); - PropertyResult propertyResult = new PropertyResult(properties); - when(searchPropertyService.retrievePropertiesByPostcode(any())).thenReturn(propertyResult); + when(searchPropertyService.retrievePropertiesByPostcode(any())).thenReturn(properties); given(). mockMvc(mockMvc) .param("postcode", postcode)