diff --git a/src/main/java/cat/udl/eps/softarch/demo/domain/Location.java b/src/main/java/cat/udl/eps/softarch/demo/domain/Location.java index d515f78..670f41b 100644 --- a/src/main/java/cat/udl/eps/softarch/demo/domain/Location.java +++ b/src/main/java/cat/udl/eps/softarch/demo/domain/Location.java @@ -13,7 +13,7 @@ @EqualsAndHashCode(callSuper = false) public class Location { @OneToOne - @NotNull + /*@NotNull*/ @JsonIdentityReference(alwaysAsId = true) private Shelter shelter; @@ -24,10 +24,8 @@ public class Location { @NotBlank private String address; - @NotNull private Float latitude; - @NotNull private Float longitude; @NotBlank diff --git a/src/main/java/cat/udl/eps/softarch/demo/repository/LocationRepository.java b/src/main/java/cat/udl/eps/softarch/demo/repository/LocationRepository.java index e705bd3..d48452f 100644 --- a/src/main/java/cat/udl/eps/softarch/demo/repository/LocationRepository.java +++ b/src/main/java/cat/udl/eps/softarch/demo/repository/LocationRepository.java @@ -4,10 +4,14 @@ import cat.udl.eps.softarch.demo.domain.User; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RepositoryRestResource; +import java.util.List; +import java.util.Optional; + @RepositoryRestResource public interface LocationRepository extends CrudRepository, PagingAndSortingRepository { + Location findLocationByAddressAndProvinceAndCityAndPostalCode(@Param("address") String address, @Param("province") String province, @Param("city") String city, @Param("postalCode") Integer postalCode); - -} +} \ No newline at end of file diff --git a/src/test/java/cat/udl/eps/softarch/demo/steps/CreateLocationStepsDefs.java b/src/test/java/cat/udl/eps/softarch/demo/steps/CreateLocationStepsDefs.java index 30ea587..f3adaf9 100644 --- a/src/test/java/cat/udl/eps/softarch/demo/steps/CreateLocationStepsDefs.java +++ b/src/test/java/cat/udl/eps/softarch/demo/steps/CreateLocationStepsDefs.java @@ -6,14 +6,25 @@ import io.cucumber.java.en.When; import org.junit.Assert; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import java.net.URI; import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; import java.util.Map; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; + public class CreateLocationStepsDefs { @Autowired @@ -24,32 +35,68 @@ public class CreateLocationStepsDefs { public static String newResourceUri; - @When("I create a new Location with the following details:$") - public void iCreateANewSeedWithScientificNameAndCommonName(Map locationDetails) throws Throwable { + @When("There is already a Location with the following details:$") + public void thereIsAlreadyALocationWithTheFollowingDetails(Map locationDetails) throws Throwable{ Location location = new Location(); location.setAddress(locationDetails.get("address")); - location.setLatitude(Float.parseFloat(locationDetails.get("latitude"))); - location.setLongitude(Float.parseFloat(locationDetails.get("longitude"))); location.setProvince(locationDetails.get("province")); location.setCity(locationDetails.get("city")); location.setPostalCode(Integer.parseInt(locationDetails.get("postalCode"))); + locationRepository.save(location); + } + @When("I create a new Location with the following details:$") + public void iCreateANewLocationWithTheFollowingDetails(Map locationDetails) throws Throwable { + Location existingLocation = locationRepository.findLocationByAddressAndProvinceAndCityAndPostalCode( + locationDetails.get("address"), + locationDetails.get("province"), + locationDetails.get("city"), + Integer.parseInt(locationDetails.get("postalCode")) + ); + + if (existingLocation == null) { + + Location location = new Location(); + location.setAddress(locationDetails.get("address")); + location.setProvince(locationDetails.get("province")); + location.setCity(locationDetails.get("city")); + location.setPostalCode(Integer.parseInt(locationDetails.get("postalCode"))); + + // Verify and assign latitude and longitude if exists + if (locationDetails.containsKey("longitude") && locationDetails.get("longitude") != null) { + location.setLongitude(Float.parseFloat(locationDetails.get("longitude"))); + } - stepDefs.result = stepDefs.mockMvc.perform( - post("/locations") - .contentType(MediaType.APPLICATION_JSON) - .content(stepDefs.mapper.writeValueAsString(location)) - .characterEncoding(StandardCharsets.UTF_8) - .accept(MediaType.APPLICATION_JSON) - .with(AuthenticationStepDefs.authenticate())) - .andDo(print()); - newResourceUri = stepDefs.result.andReturn().getResponse().getHeader("Location"); + + if (locationDetails.containsKey("latitude") && locationDetails.get("latitude") != null) { + location.setLatitude(Float.parseFloat(locationDetails.get("latitude"))); + } + + stepDefs.result = stepDefs.mockMvc.perform( + post("/locations") + .contentType(MediaType.APPLICATION_JSON) + .content(stepDefs.mapper.writeValueAsString(location)) + .characterEncoding(StandardCharsets.UTF_8) + .accept(MediaType.APPLICATION_JSON) + .with(AuthenticationStepDefs.authenticate())) + .andDo(print()); + newResourceUri = stepDefs.result.andReturn().getResponse().getHeader("Location"); + + } else { + assertThat(existingLocation).isNotNull(); + } } + + @And("There is (\\d+) Location created$") public void thereIsLocationCreated(int locationCreatedNum) { Assert.assertEquals(locationCreatedNum, locationRepository.count()); } + @And("There is only (\\d+) Location with the details:$") + public void thereIsOnlyLocationWithTheDeatils(int locationCreatedNum, Map locationDetails) { + Assert.assertEquals(locationCreatedNum, locationRepository.count()); + } } diff --git a/src/test/resources/features/CreateLocation.feature b/src/test/resources/features/CreateLocation.feature index c1c9cc0..f498fca 100644 --- a/src/test/resources/features/CreateLocation.feature +++ b/src/test/resources/features/CreateLocation.feature @@ -20,25 +20,28 @@ Feature: Create Location Scenario: Create a Location with an existing address, city, province, and postal code Given I can login with username "username" and password "password" And There is already a Location with the following details: - | address | Major Street 3 | - | city | Seròs | - | province | Lleida | - | postalCode | 25183 | - When I attempt to create a new Location with the following details: + | address | Major Street 3 | + | province | Lleida | + | city | Seròs | + | postalCode | 25183 | + When I create a new Location with the following details: | address | Major Street 3 | | latitude | 41.6167 | | longitude | 0.6222 | | province | Lleida | | city | Seròs | | postalCode | 25183 | - Then The response code is 409 - And There is 0 Location created + Then The response code is 200 + And There is only 1 Location with the details: + | address | Major Street 3 | + | province | Lleida | + | city | Seròs | + | postalCode | 25183 | Scenario: Attempt to create a Location with address blank and latitude null Given I can login with username "username" and password "password" When I create a new Location with the following details: | address | | - | latitude | null | | longitude | -74.0060 | | province | Lleida | | city | Seròs | @@ -46,6 +49,16 @@ Feature: Create Location Then The response code is 400 And There is 0 Location created + Scenario: Attempt to create a Location with longitude null and latitude null + Given I can login with username "username" and password "password" + When I create a new Location with the following details: + | address | Major Street 3 | + | province | Lleida | + | city | Seròs | + | postalCode | 25183 | + Then The response code is 201 + And There is 1 Location created + Scenario: Attempt to create a Location without being logged in Given I'm not logged in When I create a new Location with the following details: