Skip to content
Snippets Groups Projects
Commit a65619f6 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-530 -> OZG-555 impl fileService; impl BinaryController; add "download"...

OZG-530 -> OZG-555 impl fileService; impl BinaryController; add "download" Link on File; impl Dummy for FileRemoteService
parent 1d7d4d77
No related branches found
No related tags found
No related merge requests found
Showing
with 488 additions and 16 deletions
package de.itvsh.goofy.binary;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(BinaryController.FILE_PATH)
public class BinaryController {
public static final String FILE_PATH = "/api/binary"; // NOSONAR
@GetMapping("/{fileId}")
public ResponseEntity<org.springframework.core.io.Resource> download(@PathVariable String fileId) {
return null;
}
}
\ No newline at end of file
package de.itvsh.goofy.attachment; package de.itvsh.goofy.file;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.EntityModel;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -7,8 +8,6 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -7,8 +8,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import de.itvsh.goofy.file.File;
@RestController @RestController
@RequestMapping(AttachmentController.ATTACHMENT_PATH) @RequestMapping(AttachmentController.ATTACHMENT_PATH)
public class AttachmentController { public class AttachmentController {
...@@ -17,8 +16,13 @@ public class AttachmentController { ...@@ -17,8 +16,13 @@ public class AttachmentController {
static final String PARAM_EINGANG_ID = "eingangId"; static final String PARAM_EINGANG_ID = "eingangId";
@Autowired
private FileService fileService;
@Autowired
private FileModelAssembler modelAssembler;
@GetMapping(params = PARAM_EINGANG_ID) @GetMapping(params = PARAM_EINGANG_ID)
public CollectionModel<EntityModel<File>> getAllByEingang(@RequestParam String eingangId) { public CollectionModel<EntityModel<File>> getAllByEingang(@RequestParam String eingangId) {
return CollectionModel.empty(); return modelAssembler.toCollectionModel(fileService.getAttachmentsByEingang(eingangId));
} }
} }
\ No newline at end of file
package de.itvsh.goofy.file;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Builder
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Getter
public class File {
private String id;
private String name;
private long size;
}
\ No newline at end of file
package de.itvsh.goofy.file;
import org.springframework.hateoas.EntityModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController(FileController.FILE_PATH)
public class FileController {
static final String FILE_PATH = "/api/files"; // NOSONAR
@GetMapping("{fileId}")
public EntityModel<File> getFileData(@PathVariable String fileId) {
return null;
}
}
\ No newline at end of file
package de.itvsh.goofy.file;
import org.mapstruct.Mapper;
import de.itvsh.ozg.pluto.grpc.file.GrpcFile;
@Mapper
interface FileMapper {
File toEingang(GrpcFile file);
}
\ No newline at end of file
package de.itvsh.goofy.file;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.LinkRelation;
import org.springframework.hateoas.server.RepresentationModelAssembler;
import org.springframework.stereotype.Component;
import de.itvsh.goofy.binary.BinaryController;
import de.itvsh.goofy.common.ResourceBuilder;
@Component
class FileModelAssembler implements RepresentationModelAssembler<File, EntityModel<File>> {
static final LinkRelation REL_DOWNLOAD = LinkRelation.of("download");
@Override
public EntityModel<File> toModel(File file) {
var selfLink = linkTo(FileController.class).slash(file.getId());
return ResourceBuilder.fromEntity(file).addLink(selfLink.withSelfRel())
.addLink(linkTo(BinaryController.class).slash(file.getId()).withRel(REL_DOWNLOAD))
.buildResource();
}
public CollectionModel<EntityModel<File>> toCollectionModel(Stream<File> entities) {
return CollectionModel.of(entities.map(this::toModel).collect(Collectors.toList()),
linkTo(FileController.class).withSelfRel());
}
}
\ No newline at end of file
package de.itvsh.goofy.file;
import java.util.UUID;
import java.util.stream.Stream;
import org.springframework.stereotype.Service;
import com.thedeanda.lorem.LoremIpsum;
import de.itvsh.ozg.pluto.grpc.file.FileServiceGrpc.FileServiceBlockingStub;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
public class FileRemoteService {
@GrpcClient("pluto")
private FileServiceBlockingStub fileServiceStub;
// @Autowired
// private ContextService contextService;
// @Autowired
// private FileMapper fileMapper;
public Stream<File> getAttachmentsByEingang(String eingangId) {
// TODO an Pluto ankabeln
// GrpcGetAttachmentsResponse response = fileServiceStub.getAttachments(buildGrpcGetAttachmentsRequest(eingangId));
//
// return response.getFileList().stream().map(fileMapper::toEingang);
return Stream.of(File.builder().id(UUID.randomUUID().toString()).name(LoremIpsum.getInstance().getName()).size(1024).build());
}
// private GrpcGetAttachmentsRequest buildGrpcGetAttachmentsRequest(String eingangId) {
// return GrpcGetAttachmentsRequest.newBuilder()
// .setContext(contextService.createCallContext())
// .setEingangId(eingangId)
// .build();
// }
}
\ No newline at end of file
package de.itvsh.goofy.file;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class FileService {
@Autowired
private FileRemoteService remoteService;
public Stream<File> getAttachmentsByEingang(String eingangId) {
return remoteService.getAttachmentsByEingang(eingangId);
}
}
\ No newline at end of file
package de.itvsh.goofy.representation; package de.itvsh.goofy.file;
import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.EntityModel;
...@@ -7,8 +7,6 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -7,8 +7,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import de.itvsh.goofy.file.File;
@RestController @RestController
@RequestMapping(RepresentationController.REPRESENTATIONS_PATH) @RequestMapping(RepresentationController.REPRESENTATIONS_PATH)
public class RepresentationController { public class RepresentationController {
......
...@@ -13,10 +13,10 @@ import org.springframework.hateoas.EntityModel; ...@@ -13,10 +13,10 @@ import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.hateoas.server.RepresentationModelAssembler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import de.itvsh.goofy.attachment.AttachmentController;
import de.itvsh.goofy.common.ResourceBuilder; import de.itvsh.goofy.common.ResourceBuilder;
import de.itvsh.goofy.common.command.CommandController; import de.itvsh.goofy.common.command.CommandController;
import de.itvsh.goofy.representation.RepresentationController; import de.itvsh.goofy.file.AttachmentController;
import de.itvsh.goofy.file.RepresentationController;
import de.itvsh.goofy.wiedervorlage.WiedervorlageCommandController.WiedervorlageCommandByVorgangController; import de.itvsh.goofy.wiedervorlage.WiedervorlageCommandController.WiedervorlageCommandByVorgangController;
import de.itvsh.goofy.wiedervorlage.WiedervorlageController.WiedervorlageByVorgangController; import de.itvsh.goofy.wiedervorlage.WiedervorlageController.WiedervorlageByVorgangController;
......
package de.itvsh.goofy.attachment; package de.itvsh.goofy.binary;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
...@@ -10,22 +10,24 @@ import org.mockito.InjectMocks; ...@@ -10,22 +10,24 @@ import org.mockito.InjectMocks;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders;
class AttachmentControllerTest { import de.itvsh.goofy.file.FileTestFactory;
private final String PATH = AttachmentController.ATTACHMENT_PATH; class BinaryControllerTest {
private final String PATH = BinaryController.FILE_PATH + "/";
@InjectMocks @InjectMocks
private AttachmentController controller; private BinaryController controller;
private MockMvc mockMvc; private MockMvc mockMvc;
@BeforeEach @BeforeEach
void initTest() { void init() {
mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
} }
@Nested @Nested
class TestGetAttachmentsByEingang { class TestDownload {
@Test @Test
void shouldCallEndpoint() throws Exception { void shouldCallEndpoint() throws Exception {
...@@ -33,7 +35,7 @@ class AttachmentControllerTest { ...@@ -33,7 +35,7 @@ class AttachmentControllerTest {
} }
private void callEndpoint() throws Exception { private void callEndpoint() throws Exception {
mockMvc.perform(get(PATH).param(AttachmentController.PARAM_EINGANG_ID, "1")).andExpect(status().isOk()); mockMvc.perform(get(PATH + FileTestFactory.ID)).andExpect(status().isOk());
} }
} }
} }
\ No newline at end of file
package de.itvsh.goofy.common;
import de.itvsh.goofy.common.user.GrpcUserTestFactory;
import de.itvsh.ozg.pluto.grpc.command.GrpcCallContext;
import de.itvsh.ozg.pluto.grpc.command.GrpcUser;
public class GrpcCallContextTestFactory {
private static final GrpcUser USER = GrpcUserTestFactory.create();
public static final String CLIENT = "testGoofyClient";
public static GrpcCallContext create() {
return createBuilder().build();
}
public static GrpcCallContext.Builder createBuilder() {
return GrpcCallContext.newBuilder()
.setUser(USER)
.setClient(CLIENT);
}
}
package de.itvsh.goofy.common.user;
import java.util.Collections;
import java.util.UUID;
import de.itvsh.ozg.pluto.grpc.command.GrpcUser;
public class GrpcUserTestFactory {
public static final String ID = UUID.randomUUID().toString();
public static final String NAME = UserTestFactory.FULLNAME;
public static final String ROLE = UserTestFactory.ROLE;
public static GrpcUser create() {
return createBuilder().build();
}
public static GrpcUser.Builder createBuilder() {
return GrpcUser.newBuilder()
.setId(ID)
.setName(NAME)
.addAllRoles(Collections.singleton(ROLE));
}
}
\ No newline at end of file
package de.itvsh.goofy.file;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import java.util.stream.Stream;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
class AttachmentControllerTest {
private final String PATH = AttachmentController.ATTACHMENT_PATH;
@InjectMocks
private AttachmentController controller;
@Mock
private FileModelAssembler modelAssembler;
@Mock
private FileService fileService;
private MockMvc mockMvc;
@BeforeEach
void initTest() {
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Nested
class TestGetAttachmentsByEingang {
@BeforeEach
void mockFileService() {
when(fileService.getAttachmentsByEingang(anyString())).thenReturn(Stream.of(FileTestFactory.create()));
}
@Test
void shouldCallEndpoint() throws Exception {
callEndpoint();
}
@Test
void shoudlCallFileService() throws Exception {
callEndpoint();
verify(fileService).getAttachmentsByEingang(any());
}
@SuppressWarnings("unchecked")
@Test
void shouldCallModelAssembler() throws Exception {
callEndpoint();
verify(modelAssembler).toCollectionModel(any(Stream.class));
}
private void callEndpoint() throws Exception {
mockMvc.perform(get(PATH).param(AttachmentController.PARAM_EINGANG_ID, "1")).andExpect(status().isOk());
}
}
}
\ No newline at end of file
package de.itvsh.goofy.file;
import static org.assertj.core.api.Assertions.*;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.LinkRelation;
import org.springframework.hateoas.server.EntityLinks;
class FileModelAssemblerTest {
@InjectMocks
private FileModelAssembler modelAssembler;
@Mock
private EntityLinks entityLinks;
@Test
void shouldHaveDownloadLink() throws Exception {
var link = getLinkFromModel(FileTestFactory.create(), FileModelAssembler.REL_DOWNLOAD);
assertThat(link).isPresent();
assertThat(link.get().getHref()).isEqualTo("/api/binary/" + FileTestFactory.ID);
}
private Optional<Link> getLinkFromModel(File file, LinkRelation linkRel) {
return modelAssembler.toModel(file).getLink(linkRel);
}
}
\ No newline at end of file
package de.itvsh.goofy.file;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import de.itvsh.goofy.common.ContextService;
import de.itvsh.goofy.common.GrpcCallContextTestFactory;
import de.itvsh.goofy.vorgang.EingangTestFactory;
import de.itvsh.ozg.pluto.grpc.command.GrpcCallContext;
import de.itvsh.ozg.pluto.grpc.file.FileServiceGrpc.FileServiceBlockingStub;
import de.itvsh.ozg.pluto.grpc.file.GrpcGetAttachmentsResponse;
class FileRemoteServiceTest {
@InjectMocks
private FileRemoteService remoteService;
@Mock
private FileServiceBlockingStub serviceStub;
@Mock
private FileMapper mapper;
@Mock
private ContextService contextService;
@Disabled("TODO Einkommentieren, wenn Pluto angekabelt ist")
@Nested
class TestGetAttachmentsByEingang {
private final GrpcGetAttachmentsResponse response = GrpcGetAttachmentsResponseTestFactory.create();
private GrpcCallContext callContext = GrpcCallContextTestFactory.create();
@BeforeEach
void mock() {
when(serviceStub.getAttachments(any())).thenReturn(response);
when(contextService.createCallContext()).thenReturn(callContext);
}
@Test
void shouldCallContextService() {
doServiceCall();
verify(contextService).createCallContext();
}
@Test
void shouldCallFileStub() {
doServiceCall();
verify(serviceStub).getAttachments(any());
}
@Test
void shouldCallMapper() {
var fileStream = remoteService.getAttachmentsByEingang(EingangTestFactory.ID);
fileStream = forceActionsDone(fileStream);
verify(mapper).toEingang(GrpcFileTestFactory.create());
}
private Stream<File> forceActionsDone(Stream<File> stream) {
return stream.collect(Collectors.toList()).stream();
}
private void doServiceCall() {
remoteService.getAttachmentsByEingang(EingangTestFactory.ID);
}
}
}
\ No newline at end of file
package de.itvsh.goofy.file;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import de.itvsh.goofy.vorgang.EingangTestFactory;
class FileServiceTest {
@InjectMocks
private FileService service;
@Mock
private FileRemoteService remoteService;
@Nested
class TestGetAttachmentsByEingang {
@Test
void shouldCallRemoteService() {
service.getAttachmentsByEingang(EingangTestFactory.ID);
verify(remoteService).getAttachmentsByEingang(EingangTestFactory.ID);
}
}
}
\ No newline at end of file
package de.itvsh.goofy.file;
import java.util.UUID;
import com.thedeanda.lorem.LoremIpsum;
public class FileTestFactory {
public static final String ID = UUID.randomUUID().toString();
public static final String NAME = LoremIpsum.getInstance().getName();
public static File create() {
return createBuilder().build();
}
public static File.FileBuilder createBuilder() {
return File.builder()
.id(ID)
.name(NAME);
}
}
\ No newline at end of file
package de.itvsh.goofy.file;
import java.util.UUID;
import de.itvsh.ozg.pluto.grpc.file.GrpcFile;
public class GrpcFileTestFactory {
static final String ID = UUID.randomUUID().toString();
static final String NAME = FileTestFactory.NAME;
public static GrpcFile create() {
return createBuilder().build();
}
public static GrpcFile.Builder createBuilder() {
return GrpcFile.newBuilder()
.setId(ID)
.setName(NAME);
}
}
package de.itvsh.goofy.file;
import java.util.Collections;
import de.itvsh.ozg.pluto.grpc.file.GrpcFile;
import de.itvsh.ozg.pluto.grpc.file.GrpcGetAttachmentsResponse;
public class GrpcGetAttachmentsResponseTestFactory {
private static GrpcFile GRPC_FILE = GrpcFileTestFactory.create();
public static GrpcGetAttachmentsResponse create() {
return createBuilder().build();
}
public static GrpcGetAttachmentsResponse.Builder createBuilder() {
return GrpcGetAttachmentsResponse.newBuilder()
.addAllFile(Collections.singleton(GRPC_FILE));
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment