diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java index 1f12b52ffe4efc2b1f4731ff88181b2968759f32..9c414c51988a8b588367420fc17e0b386a45f06d 100644 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java +++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java @@ -65,6 +65,7 @@ class FormDataController { private final FormCycleFormDataMapper mapper; private final SemantikAdapter semantikAdapter; + private final VorgangNummerSupplier vorgangNummerSupplier; @PostMapping(consumes = "multipart/form-data", produces = "application/protobuf") public FormCycleConfirmationResponse receiveFormData(@RequestPart FormCycleFormData formData, @@ -78,7 +79,7 @@ class FormDataController { semantikAdapter.processFormData(mappedFormData); - return FormCycleConfirmationResponse.newBuilder().setVorgangNummer("TODO FILL ME").build(); + return FormCycleConfirmationResponse.newBuilder().setVorgangNummer(vorgangNummerSupplier.get()).build(); } private FormData addRepresentations(Optional<Collection<MultipartFile>> files, FormData mappedFormData) { diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java new file mode 100644 index 0000000000000000000000000000000000000000..cebe8c74bb4d6fe3fa94035b24eb5caf0818c57d --- /dev/null +++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java @@ -0,0 +1,32 @@ +package de.itvsh.kop.eingang.formcycle; + +import java.time.Instant; +import java.time.LocalDate; + +import org.springframework.stereotype.Component; + +@Component +class VorgangNummerSupplier { + + static final String BASE30_ALPHABET = "23456789ABCDEFGHJKMNPQRSTVWXYZ"; + static final int SUFFIX_LENGTH = 6; + + public String get() { + var resultBuilder = initWithPrefix(); + long currentTimeSeconds = Instant.now().toEpochMilli(); + for (int i = 0; i < SUFFIX_LENGTH; i++) { + resultBuilder.append(BASE30_ALPHABET.charAt((int) currentTimeSeconds % 30)); + currentTimeSeconds /= 30; + } + return resultBuilder.toString(); + } + + StringBuilder initWithPrefix() { + var today = LocalDate.now(); + var lastYearNumber = today.getYear() % 10; + var monthValue = "%02d".formatted(today.getMonthValue()); + var dayValue = "%02d".formatted(today.getDayOfMonth()); + return new StringBuilder().append(lastYearNumber).append(monthValue).append(dayValue).append("-"); + } + +} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/FormDataControllerTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/FormDataControllerTest.java index d5bb079c7c955bc8601e83cd5bb074fe901e511b..9731385a03eb028748073092e9700af87d0f06a3 100644 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/FormDataControllerTest.java +++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/FormDataControllerTest.java @@ -68,6 +68,8 @@ class FormDataControllerTest { private FormCycleFormDataMapper mapper; @Mock private SemantikAdapter semantikAdapter; + @Mock + private VorgangNummerSupplier vorgangNummerSupplier; private MockMvc mockMvc; @@ -81,6 +83,8 @@ class FormDataControllerTest { @Nested class ReceiveFormData { + static final String VORGANG_NUMMER = "VorgangNummer"; + private FormData mappedFormData = FormDataTestFactory.create(); @Captor @@ -89,6 +93,7 @@ class FormDataControllerTest { @BeforeEach void init() { when(mapper.toFormData(any())).thenReturn(mappedFormData); + when(vorgangNummerSupplier.get()).thenReturn(VORGANG_NUMMER); } @Test @@ -96,13 +101,22 @@ class FormDataControllerTest { doPostRequest().andExpect(status().is2xxSuccessful()); } + + @Test + void shouldCallVorgangNummerSupplier() { + doPostRequest(); + + verify(vorgangNummerSupplier).get(); + } + @Test @SneakyThrows void shouldRespondeWithVorgangNummer() { + var confirmation = FormCycleConfirmationResponse.parseFrom( doPostRequest().andReturn().getResponse().getContentAsByteArray()); - assertThat(confirmation.getVorgangNummer()).isEqualTo("TODO FILL ME"); + assertThat(confirmation.getVorgangNummer()).isEqualTo(VORGANG_NUMMER); } @Test diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java new file mode 100644 index 0000000000000000000000000000000000000000..42a7be6008e89a9b316a933cf5dcaac7c78ab229 --- /dev/null +++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java @@ -0,0 +1,84 @@ +package de.itvsh.kop.eingang.formcycle; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.time.LocalDate; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Spy; + +class VorgangNummerSupplierTest { + + @Spy + private VorgangNummerSupplier vorgangNummerSupplier = new VorgangNummerSupplier(); + + @Nested + @DisplayName("Get Vorgang Nummer") + class TestGetVorgangNummer { + + @Test + void shouldCallAddPrefix() { + vorgangNummerSupplier.get(); + + verify(vorgangNummerSupplier).initWithPrefix(); + } + + @Test + @DisplayName("should add random suffix of length 6") + void shouldAddSuffix() { + doReturn(new StringBuilder()).when(vorgangNummerSupplier).initWithPrefix(); + + var result = vorgangNummerSupplier.get(); + + assertThat(result).hasSize(6); + } + } + + @Nested + class TestAddPrefix{ + + @Test + void shouldHaveSize(){ + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder).hasSize(6); + } + @Test + void shouldAddLastYearNumberFirst(){ + var lastYearNumber = "" + LocalDate.now().getYear() % 10; + + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder.substring(0,1)).isEqualTo(lastYearNumber); + } + + @Test + void shouldAddMonthValueSecond(){ + var monthValue = "%02d".formatted(LocalDate.now().getMonthValue()); + + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder.substring(1, 3)).isEqualTo(monthValue); + } + + @Test + void shouldAddDayValueThird(){ + var dayValue = "%02d".formatted(LocalDate.now().getDayOfMonth()); + + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder.substring(3, 5)).isEqualTo(dayValue); + } + + @Test + void shouldAddHyphenAtEnd(){ + var resultBuilder = vorgangNummerSupplier.initWithPrefix(); + + assertThat(resultBuilder.charAt(5)).isEqualTo('-'); + } + } + +} \ No newline at end of file