KON-7 KON-347 Pflege AdressTypen
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/constants/Constants.java b/src/main/java/org/eclipse/openk/contactbasedata/constants/Constants.java
index ef8cfd9..e16cc50 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/constants/Constants.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/constants/Constants.java
@@ -16,6 +16,7 @@
 
 public final class Constants {
     public static final String PERSON_TYPE_UUID_NOT_EXISTING = "personType.uuid.not.existing";
+    public static final String ADDRESS_TYPE_UUID_NOT_EXISTING = "addressType.uuid.not.existing";
 
     private Constants() {
         // empty Constructor for the sake of SONAR
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressTypeController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressTypeController.java
new file mode 100644
index 0000000..8d68b41
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/AddressTypeController.java
@@ -0,0 +1,115 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import io.swagger.annotations.ApiOperation;
+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.AddressTypeService;
+import org.eclipse.openk.contactbasedata.viewmodel.AddressTypeDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.annotation.Secured;
+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;
+
+@Log4j2
+@RestController
+@RequestMapping("/addressTypes")
+public class AddressTypeController {
+    @Autowired
+    private AddressTypeService addressTypeService;
+
+    @ApiOperation(value = "Anzeigen aller Adresstypen")
+    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    @ResponseStatus(HttpStatus.OK)
+    @GetMapping
+    public List<AddressTypeDto> getAddressType() {
+        return addressTypeService.findAllAddressTypes();
+    }
+
+
+
+    @GetMapping("/{addressTypeUuid}")
+    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
+    @ApiOperation(value = "Suchen eines Adresstyps per UUID")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiResponses(value = {
+            @ApiResponse(code = 400, message = "Ungültige Anfrage."),
+            @ApiResponse(code = 200, message = "Adresstyp gefunden")})
+    public AddressTypeDto getAddressType(@PathVariable UUID addressTypeUuid) {
+
+        return addressTypeService.getAddressTypeByUuid(addressTypeUuid);
+    }
+
+
+    @PostMapping
+    @Secured("ROLE_KON-ADMIN")
+    @ApiOperation(value = "Anlegen eines neuen Adresstyps")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Adresstyp erfolgreich angelegt"),
+            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
+    })
+    public ResponseEntity<AddressTypeDto> insertAddressType(@Validated @RequestBody AddressTypeDto addressTypeDto) {
+        AddressTypeDto savedAddressTypeDto = addressTypeService.insertAddressType(addressTypeDto);
+        URI location = ServletUriComponentsBuilder
+                .fromCurrentRequestUri()
+                .path("/{uuid}")
+                .buildAndExpand(savedAddressTypeDto.getUuid())
+                .toUri();
+        return ResponseEntity.created(location).body(savedAddressTypeDto);
+    }
+
+
+    @PutMapping("/{addressTypeUuid}")
+    @Secured("ROLE_KON-ADMIN")
+    @ApiOperation(value = "Ändern eines Adresstyp")
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Adresstyp wurde erfolgreich aktualisiert"),
+            @ApiResponse(code = 400, message = "Ungültige Eingabe"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public ResponseEntity updateAddressType(@PathVariable UUID addressTypeUuid, @Validated @RequestBody AddressTypeDto addressTypeDto) {
+
+        if (!addressTypeDto.getUuid().equals(addressTypeUuid)) {
+            throw new BadRequestException("invalid.uuid.path.object");
+        }
+
+        addressTypeService.updateAddressType(addressTypeDto);
+        return ResponseEntity.ok().build();
+    }
+
+
+    @DeleteMapping("/{uuid}")
+    @Secured("ROLE_KON-ADMIN")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiOperation(value = "Adresstyp löschen")
+    @ApiResponses(value = {
+            @ApiResponse(code = 204, message = "Erfolgreich durchgeführt"),
+            @ApiResponse(code = 400, message = "Ungültige Anfrage"),
+            @ApiResponse(code = 404, message = "Nicht gefunden")})
+    public void removeAddressType(@PathVariable UUID uuid) {
+        addressTypeService.removeAddressType(uuid);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressTypeMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressTypeMapper.java
index e77f78d..96376fe 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressTypeMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/mapper/AddressTypeMapper.java
@@ -15,12 +15,14 @@
 package org.eclipse.openk.contactbasedata.mapper;
 
 import org.eclipse.openk.contactbasedata.model.RefAddressType;
-import org.eclipse.openk.contactbasedata.viewmodel.AddressDto;
+import org.eclipse.openk.contactbasedata.viewmodel.AddressTypeDto;
 import org.mapstruct.Mapper;
 import org.mapstruct.ReportingPolicy;
 
 @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
 public interface AddressTypeMapper {
 
-    AddressDto toAddressTypeDto(RefAddressType refAddressType);
+    AddressTypeDto toAddressTypeDto(RefAddressType refAddressType);
+
+    RefAddressType toRefAddressType(AddressTypeDto addressTypeDto);
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressTypeRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressTypeRepository.java
new file mode 100644
index 0000000..969fede
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/AddressTypeRepository.java
@@ -0,0 +1,27 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.repository;
+
+import org.eclipse.openk.contactbasedata.model.RefAddressType;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+public interface AddressTypeRepository extends JpaRepository<RefAddressType, Long> {
+    List< RefAddressType > findAll();
+    Optional<RefAddressType> findByUuid(UUID uuid);
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/AddressTypeService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/AddressTypeService.java
new file mode 100644
index 0000000..c96605e
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/AddressTypeService.java
@@ -0,0 +1,86 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.constants.Constants;
+import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.mapper.AddressTypeMapper;
+import org.eclipse.openk.contactbasedata.model.RefAddressType;
+import org.eclipse.openk.contactbasedata.repository.AddressTypeRepository;
+import org.eclipse.openk.contactbasedata.viewmodel.AddressTypeDto;
+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;
+
+@Log4j2
+@Service
+public class AddressTypeService {
+    @Autowired
+    private AddressTypeRepository addressTypeRepository;
+
+    @Autowired
+    AddressTypeMapper addressTypeMapper;
+
+    public List<AddressTypeDto> findAllAddressTypes() {
+        return addressTypeRepository.findAll().stream()
+                    .map( addressTypeMapper::toAddressTypeDto )
+                    .collect(Collectors.toList());
+    }
+
+
+    public AddressTypeDto getAddressTypeByUuid(UUID addressTypeUuid) {
+        RefAddressType refAddressType = addressTypeRepository
+                .findByUuid(addressTypeUuid)
+                .orElseThrow(() -> new NotFoundException(Constants.ADDRESS_TYPE_UUID_NOT_EXISTING));
+        return addressTypeMapper.toAddressTypeDto(refAddressType);
+    }
+
+    @Transactional
+    public AddressTypeDto insertAddressType(AddressTypeDto addressTypeDto) {
+        RefAddressType addressTypeToSave = addressTypeMapper.toRefAddressType(addressTypeDto);
+        addressTypeToSave.setUuid(UUID.randomUUID());
+
+        RefAddressType savedAddressType = addressTypeRepository.save(addressTypeToSave);
+        return addressTypeMapper.toAddressTypeDto(savedAddressType);
+    }
+
+    @Transactional
+    public AddressTypeDto updateAddressType(AddressTypeDto addressTypeDto){
+        RefAddressType addressTypeUpdated;
+        RefAddressType addressTypeToSave = addressTypeMapper.toRefAddressType(addressTypeDto);
+        RefAddressType existingAddressType = addressTypeRepository
+                .findByUuid(addressTypeDto.getUuid())
+                .orElseThrow(() -> new NotFoundException(Constants.ADDRESS_TYPE_UUID_NOT_EXISTING));
+        addressTypeToSave.setId(existingAddressType.getId());
+        addressTypeUpdated = addressTypeRepository.save(addressTypeToSave);
+
+        return addressTypeMapper.toAddressTypeDto(addressTypeUpdated);
+    }
+
+    @Transactional
+    public void removeAddressType(UUID uuid) {
+        RefAddressType existingAddressType = addressTypeRepository.findByUuid(uuid)
+                .orElseThrow( () -> new BadRequestException(Constants.ADDRESS_TYPE_UUID_NOT_EXISTING));
+
+        addressTypeRepository.delete(existingAddressType);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/PersonTypeService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/PersonTypeService.java
index 74f33f8..3c71472 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/PersonTypeService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/PersonTypeService.java
@@ -68,7 +68,7 @@
         RefPersonType personTypeToSave = personTypeMapper.toRefPersonType(personTypeDto);
         RefPersonType existingPersonType = personTypeRepository
                 .findByUuid(personTypeDto.getUuid())
-                .orElseThrow(() -> new NotFoundException("personType.uuid.not.existing"));
+                .orElseThrow(() -> new NotFoundException(Constants.PERSON_TYPE_UUID_NOT_EXISTING));
         personTypeToSave.setId(existingPersonType.getId());
         personTypeUpdated = personTypeRepository.save(personTypeToSave);
 
@@ -78,7 +78,7 @@
     @Transactional
     public void removePersonType(UUID uuid) {
         RefPersonType existingPersonType = personTypeRepository.findByUuid(uuid)
-                .orElseThrow( () -> new BadRequestException("personType.uuid.not.existing"));
+                .orElseThrow( () -> new BadRequestException(Constants.PERSON_TYPE_UUID_NOT_EXISTING));
 
         personTypeRepository.delete(existingPersonType);
     }
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
index 6ebab0c..a5961c3 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/config/TestConfiguration.java
@@ -51,6 +51,9 @@
     PersonTypeMapper personTypeMapper() { return new PersonTypeMapperImpl(); }
 
     @Bean
+    AddressTypeMapper addressTypeMapper() { return new AddressTypeMapperImpl(); }
+
+    @Bean
     AddressMapper addressMapper() { return new AddressMapperImpl(); }
 
     @Bean
@@ -77,6 +80,9 @@
     public PersonTypeService myPersonTypeService() { return new PersonTypeService(); }
 
     @Bean
+    public AddressTypeService myAddressTypeService() { return new AddressTypeService(); }
+
+    @Bean
     public AddressService myAddressService() { return new AddressService(); }
 
     @Bean
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressTypeControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressTypeControllerTest.java
new file mode 100644
index 0000000..7c629aa
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/AddressTypeControllerTest.java
@@ -0,0 +1,123 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
+import org.eclipse.openk.contactbasedata.service.AddressTypeService;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.AddressTypeDto;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.util.List;
+import java.util.UUID;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+@SpringBootTest(classes = ContactBaseDataApplication.class)
+@AutoConfigureMockMvc
+@ActiveProfiles("test") // Todo: Find a better way to configure the tests
+public class AddressTypeControllerTest {
+
+    @MockBean
+    private AddressTypeService addressTypeService;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Test
+    public void shouldReturnAllAddressTypes() throws Exception {
+        List<AddressTypeDto> sds = MockDataHelper.mockAddressTypesDtos();
+
+        when(addressTypeService.findAllAddressTypes()).thenReturn(sds);
+
+        mockMvc.perform(get("/addressTypes"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON));
+    }
+
+    @Test
+    public void shouldReturnSingleAddressType() throws Exception {
+        AddressTypeDto addressTypeDto = MockDataHelper.mockAddressTypeDto();
+
+        when(addressTypeService.getAddressTypeByUuid(any(UUID.class))).thenReturn(addressTypeDto);
+
+        mockMvc.perform(get("/addressTypes/37454f86-2006-11ea-978f-2e728ce88125"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON));
+    }
+
+    @Test
+    public void shouldInsertAddressType() throws Exception {
+        AddressTypeDto addressTypeDto = MockDataHelper.mockAddressTypeDto();
+        addressTypeDto.setType("Master");
+        addressTypeDto.setDescription("of the universe");
+
+        when(addressTypeService.insertAddressType(any(AddressTypeDto.class)))
+                .thenReturn(addressTypeDto);
+
+        mockMvc.perform(post("/addressTypes")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(addressTypeDto)))
+                .andExpect(jsonPath("$.type", Matchers.is("Master")))
+                .andExpect(jsonPath("$.description", Matchers.is("of the universe" )));
+    }
+
+    @Test
+    public void shouldUpdateAddressType() throws Exception {
+        AddressTypeDto addressTypeDto = MockDataHelper.mockAddressTypeDto();
+        addressTypeDto.setUuid(UUID.randomUUID());
+
+        when(  addressTypeService.updateAddressType(any(AddressTypeDto.class))).thenReturn(addressTypeDto);
+
+        mockMvc.perform(put("/addressTypes/{uuid}", addressTypeDto.getUuid().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(addressTypeDto)))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+    @Test
+    public void shouldNotUpdateAddressTypeDueToError() throws Exception {
+        AddressTypeDto addressTypeDto = MockDataHelper.mockAddressTypeDto();
+        addressTypeDto.setUuid(UUID.randomUUID());
+
+        when(  addressTypeService.updateAddressType(any(AddressTypeDto.class))).thenReturn(addressTypeDto);
+
+        // use different UUIDs for path and object
+        mockMvc.perform(put("/addressTypes/{uuid}", UUID.randomUUID().toString())
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(new ObjectMapper().writeValueAsString(addressTypeDto)))
+                .andExpect(status().isBadRequest());
+    }
+
+    @Test
+    public void shouldDeleteAddressType() throws Exception {
+        mockMvc.perform(delete("/addressTypes/05ff2344-20a5-11ea-978f-2e728ce88125")
+                .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().is2xxSuccessful());
+    }
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/PersonTypeControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/PersonTypeControllerTest.java
index 9379b1b..d5acbec 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/PersonTypeControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/PersonTypeControllerTest.java
@@ -43,7 +43,7 @@
 public class PersonTypeControllerTest {
 
     @MockBean
-    private PersonTypeService saluationService;
+    private PersonTypeService personTypeService;
 
     @Autowired
     private MockMvc mockMvc;
@@ -52,7 +52,7 @@
     public void shouldReturnAllPersonTypes() throws Exception {
         List<PersonTypeDto> sds = MockDataHelper.mockPersonTypesDtos();
 
-        when(saluationService.findAllPersonTypes()).thenReturn(sds);
+        when(personTypeService.findAllPersonTypes()).thenReturn(sds);
 
         mockMvc.perform(get("/personTypes"))
                 .andExpect(status().is2xxSuccessful())
@@ -63,7 +63,7 @@
     public void shouldReturnSinglePersonType() throws Exception {
         PersonTypeDto personTypeDto = MockDataHelper.mockPersonTypeDto();
 
-        when(saluationService.getPersonTypeByUuid(any(UUID.class))).thenReturn(personTypeDto);
+        when(personTypeService.getPersonTypeByUuid(any(UUID.class))).thenReturn(personTypeDto);
 
         mockMvc.perform(get("/personTypes/37454f86-2006-11ea-978f-2e728ce88125"))
                 .andExpect(status().is2xxSuccessful())
@@ -76,7 +76,7 @@
         personTypeDto.setType("Master");
         personTypeDto.setDescription("of the universe");
 
-        when(saluationService.insertPersonType(any(PersonTypeDto.class)))
+        when(personTypeService.insertPersonType(any(PersonTypeDto.class)))
                 .thenReturn(personTypeDto);
 
         mockMvc.perform(post("/personTypes")
@@ -91,7 +91,7 @@
         PersonTypeDto personTypeDto = MockDataHelper.mockPersonTypeDto();
         personTypeDto.setUuid(UUID.randomUUID());
 
-        when(  saluationService.updatePersonType(any(PersonTypeDto.class))).thenReturn(personTypeDto);
+        when(  personTypeService.updatePersonType(any(PersonTypeDto.class))).thenReturn(personTypeDto);
 
         mockMvc.perform(put("/personTypes/{uuid}", personTypeDto.getUuid().toString())
                 .contentType(MediaType.APPLICATION_JSON)
@@ -104,7 +104,7 @@
         PersonTypeDto personTypeDto = MockDataHelper.mockPersonTypeDto();
         personTypeDto.setUuid(UUID.randomUUID());
 
-        when(  saluationService.updatePersonType(any(PersonTypeDto.class))).thenReturn(personTypeDto);
+        when(  personTypeService.updatePersonType(any(PersonTypeDto.class))).thenReturn(personTypeDto);
 
         // use different UUIDs for path and object
         mockMvc.perform(put("/personTypes/{uuid}", UUID.randomUUID().toString())
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/AddressTypeServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/AddressTypeServiceTest.java
new file mode 100644
index 0000000..fe46a15
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/AddressTypeServiceTest.java
@@ -0,0 +1,123 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import org.eclipse.openk.contactbasedata.config.TestConfiguration;
+import org.eclipse.openk.contactbasedata.model.RefAddressType;
+import org.eclipse.openk.contactbasedata.repository.AddressTypeRepository;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.AddressTypeDto;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+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.mockito.Mockito.times;
+import static org.mockito.Mockito.when;
+
+@DataJpaTest
+@ContextConfiguration(classes = {TestConfiguration.class})
+
+public class AddressTypeServiceTest {
+    @Qualifier("myAddressTypeService")
+    @Autowired
+    private AddressTypeService addressTypeService;
+
+    @MockBean
+    private AddressTypeRepository addressTypeRepository;
+
+    @Test
+    public void shouldFindAllAddressTypesProperly() {
+        List<RefAddressType> rs = MockDataHelper.mockRefAddressTypes();
+        when(addressTypeRepository.findAll()).thenReturn(rs);
+        List<AddressTypeDto> retVals = addressTypeService.findAllAddressTypes();
+
+        assertEquals(rs.size(), retVals.size());
+        assertEquals(rs.size(), 2);
+        assertEquals(rs.get(1).getUuid(), retVals.get(1).getUuid());
+    }
+
+
+    @Test
+    public void shouldReturnAddressTypeByUuid() {
+
+        RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+        refAddressType.setType("Testtyp");
+        when( addressTypeRepository.findByUuid( any(UUID.class)) ).thenReturn(Optional.of(refAddressType));
+
+        AddressTypeDto addressTypeDto = addressTypeService.getAddressTypeByUuid(UUID.randomUUID());
+        assertEquals( addressTypeDto.getUuid(), refAddressType.getUuid() );
+        assertEquals( addressTypeDto.getType(), refAddressType.getType() );
+    }
+
+    @Test
+    public void shouldInsertAddressType(){
+        RefAddressType refAddressType = MockDataHelper.mockRefAddressType();
+
+        refAddressType.setUuid(UUID.fromString("1468275e-200b-11ea-978f-2e728ce88125"));
+        refAddressType.setType("Viertadresse");
+        refAddressType.setDescription("In der Wildnis");
+
+        AddressTypeDto addressTypeDto = MockDataHelper.mockAddressTypeDto();
+        addressTypeDto.setUuid(null);
+
+        when( addressTypeRepository.save( any( RefAddressType.class) )).thenReturn(refAddressType);
+
+        AddressTypeDto savedAddressTypeDto = addressTypeService.insertAddressType(addressTypeDto);
+        assertEquals("Viertadresse", savedAddressTypeDto.getType());
+        assertNotNull( savedAddressTypeDto.getUuid());
+    }
+
+    @Test
+    public void shouldUpdateAddressType() {
+
+        RefAddressType addressType = MockDataHelper.mockRefAddressType();
+        addressType.setType("Viertadresse");
+
+        AddressTypeDto addressTypeDto = MockDataHelper.mockAddressTypeDto();
+        addressTypeDto.setType("Kein guter Mensch");
+
+        when( addressTypeRepository.findByUuid( any(UUID.class)) ).thenReturn(Optional.of(addressType));
+        when( addressTypeRepository.save( any(RefAddressType.class)) ).thenReturn(addressType);
+        AddressTypeDto addressTypeDtoUpdated = addressTypeService.updateAddressType(addressTypeDto);
+
+        assertEquals(addressType.getUuid(), addressTypeDtoUpdated.getUuid());
+        assertEquals("Viertadresse", addressTypeDtoUpdated.getType());
+    }
+
+
+    @Test
+    public void shouldDeleteAddressType() {
+
+        RefAddressType addressType = MockDataHelper.mockRefAddressType();
+
+        when(addressTypeRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(addressType));
+        Mockito.doNothing().when(addressTypeRepository).delete( isA( RefAddressType.class ));
+        addressTypeService.removeAddressType(addressType.getUuid());
+
+        Mockito.verify(addressTypeRepository, times(1)).delete( addressType );
+    }
+}
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 17ab147..c4724ff 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/support/MockDataHelper.java
@@ -168,6 +168,42 @@
         return refs;
     }
 
+    public static RefAddressType mockRefAddressType() {
+        RefAddressType refAddressType = new RefAddressType();
+        refAddressType.setId(1L);
+        refAddressType.setUuid(UUID.randomUUID());
+        refAddressType.setDescription("Zweitwohnsitz");
+        refAddressType.setType("Nebenadresse");
+        return refAddressType;
+    }
+
+    public static AddressTypeDto mockAddressTypeDto() {
+        AddressTypeDto addressTypeDto = new AddressTypeDto();
+        addressTypeDto.setUuid(UUID.randomUUID());
+        addressTypeDto.setDescription("Zweitwohnsitz");
+        addressTypeDto.setType("Nebenadresse");
+        return addressTypeDto;
+    }
+
+    public static List<AddressTypeDto> mockAddressTypesDtos() {
+        List<AddressTypeDto> dtos = new LinkedList<>();
+        dtos.add( mockAddressTypeDto() );
+        AddressTypeDto sd2 = mockAddressTypeDto();
+        sd2.setType("Mülltonne");
+        sd2.setDescription("Drittwohnsitz");
+        dtos.add( sd2 );
+        return dtos;
+    }
+
+    public static List<RefAddressType> mockRefAddressTypes() {
+        List<RefAddressType> refs = new LinkedList<>();
+        refs.add( mockRefAddressType() );
+        RefAddressType sd2 = mockRefAddressType();
+        sd2.setType("Mülltonne");
+        sd2.setDescription("Drittwohnsitz");
+        refs.add( sd2 );
+        return refs;
+    }
 
     public static TblAddress mockTblAddress(){
         TblAddress tblAddress = new TblAddress();