conflicts resolved,
merge with KON-18
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java
index 584b02f..7f25a06 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressController.java
@@ -18,12 +18,17 @@
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
import org.eclipse.openk.contactbasedata.service.AddressService;
import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.annotation.Secured;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+import java.net.URI;
import java.util.List;
import java.util.UUID;
@@ -45,4 +50,69 @@
return addressService.getAddressesByContactUuid(contactUuid);
}
+ @GetMapping("/{contactUuid}/addresses/{addressUuid}")
+ @ApiOperation(value = "Eine bestimmte Adresse eines bestimmten Kontakts anzeigen.")
+ @ApiResponses(value = {
+ @ApiResponse(code = 404, message = "Kontaktadresse nicht gefunden."),
+ @ApiResponse(code = 400, message = "Ungültige Anfrage."),
+ @ApiResponse(code = 200, message = "Kontaktadresse erfolgreich gelesen.")})
+ public AddressDto readAddress(
+ @PathVariable UUID contactUuid,
+ @PathVariable UUID addressUuid) {
+
+ return addressService.getAddress(contactUuid, addressUuid);
+ }
+
+
+ @PostMapping("/{contactUuid}/addresses")
+ @ApiOperation(value = "Anlegen einer neuen Adresse")
+ @ApiResponses(value = {
+ @ApiResponse(code = 200, message = "Adresse erfolgreich angelegt"),
+ @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
+ })
+ public ResponseEntity<AddressDto> insertAddress(
+ @PathVariable UUID contactUuid,
+ @Validated @RequestBody AddressDto addressDto) {
+ if (!contactUuid.equals(addressDto.getContactUuid())) {
+ throw new BadRequestException("invalid.uuid.path.object");
+ }
+ AddressDto savedAddressDto = addressService.insertAddress(contactUuid, addressDto);
+ URI location = ServletUriComponentsBuilder
+ .fromCurrentRequestUri()
+ .path("/{uuid}")
+ .buildAndExpand(savedAddressDto.getUuid())
+ .toUri();
+ return ResponseEntity.created(location).body(savedAddressDto);
+ }
+
+
+ @PutMapping("/{contactUuid}/addresses/{addressUuid}")
+ @ApiOperation(value = "Eine bestimmte Adresse eines bestimmten Kontakts bearbeiten.")
+ @ApiResponses(value = {
+ @ApiResponse(code = 404, message = "Adresse nicht gefunden."),
+ @ApiResponse(code = 400, message = "Ungültige Anfrage."),
+ @ApiResponse(code = 200, message = "Adresse erfolgreich geändert.")})
+ public ResponseEntity updateAddress(
+ @PathVariable UUID contactUuid,
+ @PathVariable UUID addressUuid,
+ @Validated @RequestBody AddressDto addressDto) {
+ if (!addressUuid.equals(addressDto.getUuid())) {
+ throw new BadRequestException("invalid.uuid.path.object");
+ }
+ addressService.updateAddress(contactUuid, addressDto);
+ return ResponseEntity.ok().build();
+ }
+
+ @DeleteMapping("{contactUuid}/addresses/{addressUuid}")
+ @ResponseStatus(HttpStatus.OK)
+ @ApiOperation(value = "Eine bestimmte Adresse eines bestimmten Kontakts löschen")
+ @ApiResponses(value = {
+ @ApiResponse(code = 204, message = "Erfolgreich gelöscht"),
+ @ApiResponse(code = 400, message = "Ungültige Anfrage"),
+ @ApiResponse(code = 404, message = "Nicht gefunden")})
+ public void deleteAddress(@PathVariable("contactUuid") UUID contactUuid,
+ @PathVariable("addressUuid") UUID addressUuid) {
+ addressService.deleteAddress(contactUuid, addressUuid);
+ }
+
}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/enums/OperationType.java b/src/main/java/org/eclipse/openk/contactbasedata/enums/OperationType.java
new file mode 100644
index 0000000..c65a95e
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/enums/OperationType.java
@@ -0,0 +1,7 @@
+package org.eclipse.openk.contactbasedata.enums;
+
+public enum OperationType {
+ INSERT, UPDATE, CREATE, DELETE
+
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/exceptions/OperationDeniedException.java b/src/main/java/org/eclipse/openk/contactbasedata/exceptions/OperationDeniedException.java
new file mode 100644
index 0000000..f4440ae
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/exceptions/OperationDeniedException.java
@@ -0,0 +1,16 @@
+package org.eclipse.openk.contactbasedata.exceptions;
+
+import org.eclipse.openk.contactbasedata.enums.OperationType;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(code = HttpStatus.NOT_ACCEPTABLE)
+public class OperationDeniedException extends RuntimeException{
+
+ public OperationDeniedException() {
+
+ }
+
+ public OperationDeniedException(OperationType operation, String message) {super(message);
+ }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java
index e5a68cc..171fe9b 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressMapper.java
@@ -17,10 +17,24 @@
import org.eclipse.openk.contactbasedata.model.TblAddress;
import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface AddressMapper {
+ @Mappings({
+ @Mapping( source="tblContact.uuid", target="contactUuid"),
+ @Mapping( source="wgs_84_zone", target="wgs84Zone"),
+ @Mapping( source="refAddressType.uuid", target="addressTypeUuid"),
+ })
AddressDto toAddressDto(TblAddress tblAdress);
+
+ @Mappings({
+
+ @Mapping( source="wgs84Zone", target="wgs_84_zone")
+ })
+ TblAddress toTblAddress(AddressDto adressDto);
+
}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java
index 30c59a2..4726130 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/ContactMapper.java
@@ -17,8 +17,6 @@
import org.eclipse.openk.contactbasedata.model.TblContact;
import org.eclipse.openk.contactbasedata.viewmodel.ContactDto;
import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.Mappings;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java
index 276ac63..1282d06 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblAddress.java
@@ -42,6 +42,7 @@
private String urlMap;
private String note;
+
@ManyToOne
@JoinColumn( name = "fk_contact_id")
private TblContact tblContact;
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java
index d7e4bc5..19ef6d4 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressRepository.java
@@ -15,14 +15,29 @@
package org.eclipse.openk.contactbasedata.repository;
import org.eclipse.openk.contactbasedata.model.TblAddress;
+import org.eclipse.openk.contactbasedata.model.TblContact;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
import java.util.List;
+import java.util.Optional;
import java.util.UUID;
public interface AddressRepository extends JpaRepository<TblAddress, Long> {
- @Query("select a from TblAddress a where a.tblContact.uuid = ?1")
- List< TblAddress > findByTblContactUuid(final UUID contactUuid);
+ public Optional<TblAddress> findByUuid(UUID uuid );
+ @Query("select a from TblAddress a where a.tblContact.uuid = ?1")
+ public List< TblAddress > findByTblContactUuid(final UUID contactUuid);
+
+ Optional<TblAddress> findByTblContactAndUuid(TblContact tblContact, UUID uuid);
+
+ @Query("select count(*) from TblAddress a where a.tblContact.id=:contactId and a.isMainAddress=:isMainAddress")
+ Long countByContactIdAndIsMainAddress(@Param("contactId") Long contactId, @Param("isMainAddress") boolean isMainAddress);
+
+ @Query("select count(*) from TblAddress a where a.tblContact.id=:contactId and a.isMainAddress=:isMainAddress and uuid <> :addressUuid")
+ Long countByContactIdAndMainAddressIsNotSame(@Param("contactId") Long supplierId, @Param("isMainAddress") Boolean isMmainAddress, @Param("addressUuid") UUID addressUuid);
}
+
+
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java
index 37d932e..ad03785 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/AddressService.java
@@ -15,13 +15,20 @@
package org.eclipse.openk.contactbasedata.service;
import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.enums.OperationType;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.exceptions.OperationDeniedException;
import org.eclipse.openk.contactbasedata.mapper.AddressMapper;
import org.eclipse.openk.contactbasedata.model.TblAddress;
+import org.eclipse.openk.contactbasedata.model.TblContact;
import org.eclipse.openk.contactbasedata.repository.AddressRepository;
+import org.eclipse.openk.contactbasedata.repository.AddressTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-
+import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -33,6 +40,12 @@
private AddressRepository addressRepository;
@Autowired
+ private AddressTypeRepository addressTypeRepository;
+
+ @Autowired
+ private ContactRepository contactRepository;
+
+ @Autowired
AddressMapper addressMapper;
@@ -44,4 +57,88 @@
}
+ public AddressDto getAddress(UUID contactUuid, UUID addressUuid){
+ TblAddress tblAddress = addressRepository.findByUuid(addressUuid)
+ .orElseThrow( () -> new NotFoundException("address.uuid.not.existing"));
+ if(!tblAddress.getTblContact().getUuid().equals(contactUuid)) {
+ throw new BadRequestException("invalid.uuid.path.object");
+ }
+ return addressMapper.toAddressDto(tblAddress);
+ }
+
+ @Transactional
+ public AddressDto insertAddress(UUID contactUuid, AddressDto addressDto) {
+
+ TblContact tblContact = contactRepository
+ .findByUuid(contactUuid)
+ .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+
+ TblAddress addressToSave = addressMapper.toTblAddress(addressDto);
+ addressToSave.setUuid(UUID.randomUUID());
+ addressToSave.setTblContact(tblContact);
+
+ if (addressDto.getIsMainAddress()!=null && addressDto.getIsMainAddress() && !checkUniqueMainAddressForContactForInsert(tblContact.getId())) {
+ throw new OperationDeniedException(OperationType.UPDATE, "main.address.already.existing");
+ }
+
+ setFromAddressDto(addressToSave, addressDto);
+
+ TblAddress savedAddress = addressRepository.save(addressToSave);
+ return addressMapper.toAddressDto(savedAddress);
+ }
+
+ @Transactional
+ public AddressDto updateAddress(UUID contactUuid, AddressDto addressDto) {
+
+ TblContact contact = contactRepository.findByUuid(contactUuid)
+ .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+
+ TblAddress address = addressRepository.findByUuid(addressDto.getUuid())
+ .orElseThrow(() -> new NotFoundException("address.uuid.not.existing"));
+
+ TblAddress addressToSave = addressMapper.toTblAddress(addressDto);
+ addressToSave.setTblContact(contact);
+ addressToSave.setId(address.getId());
+
+ if (addressDto.getIsMainAddress()!=null && addressDto.getIsMainAddress() && !checkUniqueMainAddressForContactForUpdate(contact.getId(), addressDto.getUuid())) {
+ throw new OperationDeniedException(OperationType.UPDATE, "main.address.already.existing");
+ }
+
+ setFromAddressDto(addressToSave, addressDto);
+ TblAddress savedAddress = addressRepository.save(addressToSave);
+ return addressMapper.toAddressDto(savedAddress);
+ }
+
+
+ @Transactional
+ public void deleteAddress(UUID contactUuid, UUID addressUuid) {
+ TblContact tblContact = contactRepository.findByUuid(contactUuid)
+ .orElseThrow(() -> new NotFoundException("contact.uuid.not.existing"));
+ TblAddress tblAddress = addressRepository.findByTblContactAndUuid(tblContact, addressUuid)
+ .orElseThrow(() -> new NotFoundException("address.uuid.not.existing"));
+
+ addressRepository.delete(tblAddress);
+ }
+
+ private boolean checkUniqueMainAddressForContactForInsert(Long contactId){
+ return addressRepository.countByContactIdAndIsMainAddress(contactId, true) == 0;
+ }
+
+ private boolean checkUniqueMainAddressForContactForUpdate( Long contactId, UUID addressUuid){
+ Long result = addressRepository.countByContactIdAndMainAddressIsNotSame(contactId,true, addressUuid) ;
+ return result==0;
+ }
+
+ private void setFromAddressDto( TblAddress destTblAddress, AddressDto sourceDto ) {
+
+ if( sourceDto.getAddressTypeUuid() != null ) {
+ destTblAddress.setRefAddressType( addressTypeRepository
+ .findByUuid(sourceDto.getAddressTypeUuid())
+ .orElseThrow(() -> new NotFoundException("address.type.uuid.not.existing")));
+ }
+ else {
+ destTblAddress.setRefAddressType(null);
+ }
+ }
+
}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
index 9b61df1..feeead7 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/AddressDto.java
@@ -25,6 +25,10 @@
@JsonProperty("id")
private UUID uuid;
+
+ @JsonProperty("contactId")
+ private UUID contactUuid;
+
private Boolean isMainAddress;
private String postcode;
private String community;
@@ -38,8 +42,8 @@
private String note;
//fromAddressType
- @JsonProperty("adressId")
- private UUID adressUuid;
+ @JsonProperty("addressTypeId")
+ private UUID addressTypeUuid;
private String type;
private String description;
}
diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties
index 935091e..2469ea6 100644
--- a/src/main/resources/messages.properties
+++ b/src/main/resources/messages.properties
@@ -8,3 +8,7 @@
communication.type.uuid.not.existing= Die \u00fcbergebene UUID eines Kommunikationstyps existiert nicht
contact.uuid.not.existing= Die \u00fcbergebene UUID eines Kontaktes existiert nicht
person.type.uuid.not.existing= Die \u00fcbergebene UUID eines Personentyps existiert nicht
+address.uuid.not.existing= Die \u00fcbergebene UUID einer Adresse existiert nicht
+address.type.uuid.not.existing= Die \u00fcbergebene UUID eines Adresstyps existiert nicht
+
+main.address.already.existing F\u00fcdiesen Kontakt existiert bereits eine Hauptadresse
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressControllerTest.java
index 7ca9747..5e72971 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressControllerTest.java
@@ -15,11 +15,13 @@
package org.eclipse.openk.contactbasedata.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
+import jdk.nashorn.internal.ir.annotations.Ignore;
import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
import org.eclipse.openk.contactbasedata.service.AddressService;
import org.eclipse.openk.contactbasedata.service.SalutationService;
import org.eclipse.openk.contactbasedata.support.MockDataHelper;
import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
+import org.eclipse.openk.contactbasedata.viewmodel.CommunicationTypeDto;
import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.Test;
@@ -59,4 +61,87 @@
.andExpect(content().contentType(MediaType.APPLICATION_JSON));
}
+ @Test
+ public void shouldReturnSingleAddress() throws Exception {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+
+ when(addressService.getAddress(any(UUID.class), any(UUID.class))).thenReturn(addressDto);
+
+ mockMvc.perform(get("/contacts/fc7f598b-0d51-46bb-9563-99851fe6a3ad/addresses/72e2ade0-376c-11ea-978f-2e728ce88125"))
+ .andExpect(status().is2xxSuccessful())
+ .andExpect(content().contentType(MediaType.APPLICATION_JSON));
+ }
+
+
+ @Test
+ public void shouldInsertAddress() throws Exception {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ addressDto.setUuid(UUID.fromString("1ad98d00-3774-11ea-850d-2e728ce88125"));
+ addressDto.setCommunity("Mullewapp");
+ addressDto.setCommunitySuffix("Nieder-");
+ addressDto.setHousenumber("15");
+ addressDto.setIsMainAddress(true);
+ addressDto.setLatitude("52°N");
+ addressDto.setLongitude("3°W");
+ addressDto.setNote("Zufahrt über Hof");
+ addressDto.setPostcode("12356");
+ addressDto.setStreet("Weideweg");
+ addressDto.setUrlMap("www.xyz");
+ addressDto.setWgs84Zone("84");
+ addressDto.setContactUuid(UUID.fromString("1ad98f8a-3774-11ea-850d-2e728ce88125"));
+ addressDto.setType("Privat");
+ addressDto.setDescription("???");
+ addressDto.setAddressTypeUuid(UUID.fromString("5956e65e-3774-11ea-978f-2e728ce88125"));
+
+ when(addressService.insertAddress(any(UUID.class), any(AddressDto.class)))
+ .thenReturn(addressDto);
+
+ mockMvc.perform(post("/contacts/{uuid}/addresses", addressDto.getContactUuid())
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(new ObjectMapper().writeValueAsString(addressDto)))
+ .andExpect(jsonPath("$.id", Matchers.is("1ad98d00-3774-11ea-850d-2e728ce88125")))
+ .andExpect(jsonPath("$.community", Matchers.is("Mullewapp" )))
+ .andExpect(jsonPath("$.communitySuffix", Matchers.is("Nieder-" )))
+ .andExpect(jsonPath("$.housenumber", Matchers.is("15" )))
+ .andExpect(jsonPath("$.isMainAddress", Matchers.is(true )))
+ .andExpect(jsonPath("$.latitude", Matchers.is("52°N" )))
+ .andExpect(jsonPath("$.longitude", Matchers.is("3°W" )))
+ .andExpect(jsonPath("$.note", Matchers.is("Zufahrt über Hof" )))
+ .andExpect(jsonPath("$.postcode", Matchers.is("12356" )))
+ .andExpect(jsonPath("$.street", Matchers.is("Weideweg" )))
+ .andExpect(jsonPath("$.urlMap", Matchers.is("www.xyz" )))
+ .andExpect(jsonPath("$.wgs84Zone", Matchers.is("84" )))
+ .andExpect(jsonPath("$.contactId", Matchers.is("1ad98f8a-3774-11ea-850d-2e728ce88125" )))
+ .andExpect(jsonPath("$.type", Matchers.is("Privat" )))
+ .andExpect(jsonPath("$.description", Matchers.is("???" )))
+ .andExpect(jsonPath("$.addressTypeId", Matchers.is("5956e65e-3774-11ea-978f-2e728ce88125" )));
+
+ }
+
+
+ @Test
+ public void shouldUpdateAddress() throws Exception {
+
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ when( addressService.updateAddress(any(UUID.class), any(AddressDto.class))).thenReturn(addressDto);
+
+ mockMvc.perform(put("/contacts/{contactUuid}/addresses/{addressUuid}", addressDto.getContactUuid(), addressDto.getUuid())
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(new ObjectMapper().writeValueAsString(addressDto)))
+ .andExpect(status().is2xxSuccessful());
+ }
+
+ @Test
+ public void shouldNotUpdateAddress() throws Exception {
+
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ when( addressService.updateAddress(any(UUID.class), any(AddressDto.class))).thenReturn(addressDto);
+
+ mockMvc.perform(put("/contacts/{contactUuid}/addresses/{addressUuid}", addressDto.getContactUuid(), UUID.randomUUID().toString())
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(new ObjectMapper().writeValueAsString(addressDto)))
+ .andExpect(status().isBadRequest());
+ }
+
+
}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/AddressServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/AddressServiceTest.java
index 19b25c0..ff0bee5 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/service/AddressServiceTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/AddressServiceTest.java
@@ -15,15 +15,22 @@
package org.eclipse.openk.contactbasedata.service;
import org.eclipse.openk.contactbasedata.config.TestConfiguration;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.exceptions.OperationDeniedException;
+import org.eclipse.openk.contactbasedata.model.RefAddressType;
import org.eclipse.openk.contactbasedata.model.RefSalutation;
import org.eclipse.openk.contactbasedata.model.TblAddress;
+import org.eclipse.openk.contactbasedata.model.TblContact;
import org.eclipse.openk.contactbasedata.repository.AddressRepository;
+import org.eclipse.openk.contactbasedata.repository.AddressTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
import org.eclipse.openk.contactbasedata.support.MockDataHelper;
import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
import org.eclipse.openk.contactbasedata.viewmodel.SalutationDto;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
+import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@@ -36,8 +43,8 @@
import static org.hibernate.validator.internal.util.Contracts.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.isA;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;
@@ -52,6 +59,12 @@
@MockBean
private AddressRepository addressRepository;
+ @MockBean
+ private ContactRepository contactRepository;
+
+ @MockBean
+ private AddressTypeRepository addressTypeRepository;
+
@Test
public void shouldReturnAddressesByContactUuid() {
@@ -61,4 +74,205 @@
List<AddressDto> dtoList = addressService.getAddressesByContactUuid(UUID.randomUUID());
assertEquals(dtoList.size(), 2 );
}
+
+ @Test
+ public void shouldReturnAddressesByContactUuidAndAddressUuid() {
+
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ when(addressRepository.findByUuid( any(UUID.class)) ).thenReturn(Optional.of(tblAddress));
+
+ AddressDto dto = addressService.getAddress(tblAddress.getTblContact().getUuid(), UUID.randomUUID());
+ assertEquals(tblAddress.getUuid(), dto.getUuid() );
+ }
+
+ @Test
+ public void shouldUpdateAddress() {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+ when(addressRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblAddress));
+ when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+ when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+
+ AddressDto savedAddress = addressService.updateAddress(addressDto.getUuid(), addressDto);
+
+ assertEquals(tblAddress.getTblContact().getUuid(), savedAddress.getContactUuid());
+ assertEquals(tblAddress.getUuid(), savedAddress.getUuid());
+ assertEquals(tblAddress.getCommunity(), savedAddress.getCommunity());
+ assertEquals(tblAddress.getCommunitySuffix(), savedAddress.getCommunitySuffix());
+ assertEquals(tblAddress.getHousenumber(), savedAddress.getHousenumber());
+ assertEquals(tblAddress.getIsMainAddress(), savedAddress.getIsMainAddress());
+ assertEquals(tblAddress.getLatitude(), savedAddress.getLatitude());
+ assertEquals(tblAddress.getLongitude(), savedAddress.getLongitude());
+ assertEquals(tblAddress.getPostcode(), savedAddress.getPostcode());
+ assertEquals(tblAddress.getStreet(), savedAddress.getStreet());
+ assertEquals(tblAddress.getRefAddressType().getUuid(), savedAddress.getAddressTypeUuid()); //klappt nicht, da UUIDs von RefAddressType unterschiedlich
+ assertEquals(tblAddress.getUrlMap(), savedAddress.getUrlMap());
+ assertEquals(tblAddress.getWgs_84_zone(), savedAddress.getWgs84Zone());
+ }
+
+ @Test
+ public void shouldNotUpdateAddress_Exception1() {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.empty());
+ when(addressRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblAddress));
+ when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+ when(addressRepository.save(any(TblAddress.class)))
+ .then((Answer<TblAddress>) invocation -> {
+ Object[] args = invocation.getArguments();
+ return (TblAddress) args[0];
+ });
+
+ assertThrows( NotFoundException.class, () -> addressService.updateAddress(addressDto.getUuid(), addressDto));
+ }
+
+ @Test
+ public void shouldNotUpdateAddress_Exception2() {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+ when(addressRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblAddress));
+ when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.empty());
+ when(addressRepository.save(any(TblAddress.class)))
+ .then((Answer<TblAddress>) invocation -> {
+ Object[] args = invocation.getArguments();
+ return (TblAddress) args[0];
+ });
+
+ assertThrows( NotFoundException.class, () -> addressService.updateAddress(addressDto.getUuid(), addressDto));
+ }
+
+ @Test
+ public void shouldNotUpdateAddress_Exception3() {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ addressDto.setIsMainAddress(true);
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ tblAddress.setIsMainAddress(true);
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+ when(addressRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblAddress));
+ when(addressRepository.countByContactIdAndMainAddressIsNotSame(any(Long.class), anyBoolean(), any(UUID.class)) ).thenReturn(3L);
+ when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+
+ when(addressRepository.save(any(TblAddress.class)))
+ .then((Answer<TblAddress>) invocation -> {
+ Object[] args = invocation.getArguments();
+ return (TblAddress) args[0];
+ });
+
+ assertThrows( OperationDeniedException.class, () -> addressService.updateAddress(addressDto.getUuid(), addressDto));
+
+ }
+
+ @Test
+ public void shouldInsertAddress() {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+ when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+ when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+
+ AddressDto savedAddress = addressService.insertAddress(addressDto.getUuid(), addressDto);
+
+ assertNotNull(savedAddress.getContactUuid());
+ assertEquals(tblAddress.getTblContact().getUuid(), savedAddress.getContactUuid());
+ assertEquals(tblAddress.getUuid(), savedAddress.getUuid());
+ assertEquals(tblAddress.getCommunity(), savedAddress.getCommunity());
+ assertEquals(tblAddress.getCommunitySuffix(), savedAddress.getCommunitySuffix());
+ assertEquals(tblAddress.getHousenumber(), savedAddress.getHousenumber());
+ assertEquals(tblAddress.getIsMainAddress(), savedAddress.getIsMainAddress());
+ assertEquals(tblAddress.getLatitude(), savedAddress.getLatitude());
+ assertEquals(tblAddress.getLongitude(), savedAddress.getLongitude());
+ assertEquals(tblAddress.getPostcode(), savedAddress.getPostcode());
+ assertEquals(tblAddress.getStreet(), savedAddress.getStreet());
+ assertEquals(tblAddress.getRefAddressType().getUuid(), savedAddress.getAddressTypeUuid());
+ assertEquals(tblAddress.getUrlMap(), savedAddress.getUrlMap());
+ assertEquals(tblAddress.getWgs_84_zone(), savedAddress.getWgs84Zone());
+
+ }
+
+ @Test
+ public void shouldNotInsertAddress_Exception_1() {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.empty());
+ when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+ when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refAddressType));
+
+ assertThrows( NotFoundException.class, () -> addressService.insertAddress(addressDto.getUuid(), addressDto));
+
+ }
+
+ @Test
+ public void shouldNotInsertAddress_Exception_2() {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+ when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+ when (addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.empty());
+
+ assertThrows( NotFoundException.class, () -> addressService.insertAddress(addressDto.getUuid(), addressDto));
+ }
+
+
+ @Test
+ public void shouldNotInsertAddress_Exception3() {
+ AddressDto addressDto = MockDataHelper.mockAddressDto();
+ addressDto.setIsMainAddress(true);
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ tblAddress.setIsMainAddress(true);
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+ when(addressRepository.countByContactIdAndIsMainAddress(anyLong(), anyBoolean())).thenReturn(2L);
+ when(addressRepository.save(any(TblAddress.class))).thenReturn(tblAddress);
+
+ assertThrows( OperationDeniedException.class, () -> addressService.insertAddress(addressDto.getUuid(), addressDto));
+
+ }
+
+
+ @Test
+ public void shouldDeleteAddress() {
+ TblAddress tblAddress = MockDataHelper.mockTblAddress();
+ TblContact tblContact = MockDataHelper.mockTblContact();
+ tblAddress.setTblContact(tblContact);
+
+ when (contactRepository.findByUuid( any(UUID.class))).thenReturn(Optional.of(tblContact));
+ when(addressRepository.findByTblContactAndUuid(any(TblContact.class), any(UUID.class))).thenReturn(Optional.of(tblAddress));
+ Mockito.doNothing().when(addressRepository).delete( isA( TblAddress.class ));
+
+ addressService.deleteAddress(tblContact.getUuid(), tblAddress.getUuid());
+
+ Mockito.verify(addressRepository, times(1)).delete( tblAddress );
+ }
+
}
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
index c4724ff..1fd010e 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
@@ -217,9 +217,9 @@
tblAddress.setLongitude("2E");
tblAddress.setNote("-");
tblAddress.setPostcode("67890");
- //tblAddress.setRefAddressType();
+ tblAddress.setRefAddressType(mockRefAddressType());
tblAddress.setStreet("Moosrosenweg");
- //tblAddress.setTblContact();
+ tblAddress.setTblContact(mockTblContact());
tblAddress.setUrlMap("-");
tblAddress.setUuid(UUID.fromString("f34dfffc-314a-11ea-978f-2e728ce88125"));
tblAddress.setWgs_84_zone("-");
@@ -238,13 +238,15 @@
addressDto.setLongitude("2E");
addressDto.setNote("-");
addressDto.setPostcode("67890");
- //addressDto.setRefAddressType();
+ addressDto.setAddressTypeUuid(UUID.randomUUID());
addressDto.setStreet("Moosrosenweg");
- //addressDto.setTblContact();
+ addressDto.setContactUuid(UUID.randomUUID());
addressDto.setUrlMap("-");
addressDto.setUuid(UUID.fromString("f34dfffc-314a-11ea-978f-2e728ce88125"));
addressDto.setWgs84Zone("-");
+ addressDto.setContactUuid(UUID.randomUUID());
+
return addressDto;
}
@@ -291,7 +293,7 @@
tblAddressDto2.setLongitude("3E");
tblAddressDto2.setNote("-");
tblAddressDto2.setPostcode("87655");
- //tblAddressDto2.setRefAddressType();
+ tblAddressDto2.setRefAddressType(mockRefAddressType());
tblAddressDto2.setStreet("Birkenweg");
//tblAddressDto2.setTblContact();
tblAddressDto2.setUrlMap("-");
@@ -420,4 +422,23 @@
return new PageImpl<>(list, Pageable.unpaged(), list.size());
}
+ public static TblContact mockTblContact(){
+ TblContact tblContact = new TblContact();
+ tblContact.setId(5L);
+ tblContact.setUuid(UUID.randomUUID());
+ tblContact.setNote("Notiz");
+ tblContact.setContactType("E_P");
+
+ return tblContact;
+ }
+
+ public static ContactDto mockContactDto(){
+ ContactDto contactDto = new ContactDto();
+ contactDto.setUuid(UUID.randomUUID());
+ contactDto.setNote("Notiz");
+ contactDto.setContactType("E_P");
+
+ return contactDto;
+ }
+
}