Skip to content

Commit a313a89

Browse files
committed
test(eventing-service): init tests
1 parent e3dec39 commit a313a89

File tree

6 files changed

+147
-2
lines changed

6 files changed

+147
-2
lines changed

ticketing-eventing/eventing-service/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,10 @@
168168
<artifactId>junit-jupiter</artifactId>
169169
<scope>test</scope>
170170
</dependency>
171+
<dependency>
172+
<groupId>org.springframework.kafka</groupId>
173+
<artifactId>spring-kafka-test</artifactId>
174+
</dependency>
171175

172176
<!-- Logging -->
173177
<dependency>

ticketing-eventing/eventing-service/src/main/java/de/muenchen/oss/dbs/ticketing/eventing/service/adapter/in/rest/EventMapper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import de.muenchen.oss.dbs.ticketing.eventing.service.domain.model.Event;
44
import org.mapstruct.Mapper;
5+
import org.mapstruct.Mapping;
56
import org.springframework.stereotype.Component;
67

78
@Component
89
@Mapper
9-
interface EventMapper {
10+
public interface EventMapper {
11+
@Mapping(source = "dto.status_id", target = "statusId")
1012
Event fromDto(String action, EventDTO dto);
1113
}

ticketing-eventing/eventing-service/src/main/java/de/muenchen/oss/dbs/ticketing/eventing/service/domain/model/Event.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public record Event(
66
@NotBlank String action,
77
@NotBlank String ticket,
88
String status,
9-
String status_id,
9+
String statusId,
1010
String anliegenart,
1111
String lhmExtId
1212
// TODO additional payload or everything/partial as map?
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package de.muenchen.oss.dbs.ticketing.eventing.service;
2+
3+
import static de.muenchen.oss.dbs.ticketing.eventing.service.TestConstants.SPRING_TEST_PROFILE;
4+
import static org.awaitility.Awaitility.await;
5+
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
7+
import com.fasterxml.jackson.databind.ObjectMapper;
8+
import de.muenchen.oss.dbs.ticketing.eventing.service.adapter.in.rest.EventDTO;
9+
import de.muenchen.oss.dbs.ticketing.eventing.service.adapter.in.rest.EventMapperImpl;
10+
import de.muenchen.oss.dbs.ticketing.eventing.service.domain.model.Event;
11+
import java.nio.charset.StandardCharsets;
12+
import java.util.Base64;
13+
import java.util.Map;
14+
import java.util.concurrent.TimeUnit;
15+
import org.apache.kafka.clients.consumer.Consumer;
16+
import org.apache.kafka.clients.consumer.ConsumerRecord;
17+
import org.junit.jupiter.api.Test;
18+
import org.junit.jupiter.api.extension.ExtendWith;
19+
import org.junit.runner.RunWith;
20+
import org.mockito.junit.jupiter.MockitoExtension;
21+
import org.springframework.beans.factory.annotation.Autowired;
22+
import org.springframework.boot.test.context.SpringBootTest;
23+
import org.springframework.boot.test.web.client.TestRestTemplate;
24+
import org.springframework.http.HttpEntity;
25+
import org.springframework.http.HttpHeaders;
26+
import org.springframework.http.HttpStatusCode;
27+
import org.springframework.http.MediaType;
28+
import org.springframework.http.ResponseEntity;
29+
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
30+
import org.springframework.kafka.test.EmbeddedKafkaBroker;
31+
import org.springframework.kafka.test.context.EmbeddedKafka;
32+
import org.springframework.kafka.test.utils.KafkaTestUtils;
33+
import org.springframework.test.context.ActiveProfiles;
34+
import org.springframework.test.context.ContextConfiguration;
35+
import org.springframework.test.context.junit4.SpringRunner;
36+
37+
@SpringBootTest(classes = DbsTicketingEventingService.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
38+
@RunWith(SpringRunner.class)
39+
@ContextConfiguration(classes = { EventMapperImpl.class, ObjectMapper.class })
40+
@ActiveProfiles(SPRING_TEST_PROFILE)
41+
@EmbeddedKafka(partitions = 1, topics = { "event-out" })
42+
@ExtendWith(MockitoExtension.class)
43+
class E2ETest {
44+
45+
@Autowired
46+
private TestRestTemplate restTemplate;
47+
48+
@Autowired
49+
private EmbeddedKafkaBroker embeddedKafkaBroker;
50+
51+
@Autowired
52+
private ObjectMapper objectMapper;
53+
54+
@Test
55+
void testEventUnauthorized() {
56+
final ResponseEntity<Void> response = restTemplate.postForEntity("/api/event", Map.of(), Void.class);
57+
assertEquals(HttpStatusCode.valueOf(401), response.getStatusCode());
58+
}
59+
60+
@Test
61+
void testEventSuccessful() throws Exception {
62+
// setup Kafka consumer
63+
final Map<String, Object> consumerProps = KafkaTestUtils.consumerProps("testGroup", "true", embeddedKafkaBroker);
64+
final DefaultKafkaConsumerFactory<String, String> consumerFactory = new DefaultKafkaConsumerFactory<>(consumerProps);
65+
@SuppressWarnings("PMD.CloseResource")
66+
final Consumer<String, String> consumer = consumerFactory.createConsumer();
67+
embeddedKafkaBroker.consumeFromEmbeddedTopics(consumer, "event-out");
68+
69+
// setup call
70+
final EventDTO eventDTO = new EventDTO("123", "open", "1", "test-anliegen", "test-lhm-1");
71+
final String basicAuth = "Basic %s".formatted(Base64.getEncoder().encodeToString("test-user:test-password".getBytes(StandardCharsets.UTF_8)));
72+
@SuppressWarnings("PMD.LooseCoupling")
73+
final HttpHeaders headers = new HttpHeaders();
74+
headers.set("Authorization", basicAuth);
75+
headers.set("X-Zammad-Trigger", "test-trigger");
76+
headers.set("X-Zammad-Delivery", "test-delivery-id");
77+
headers.setContentType(MediaType.APPLICATION_JSON);
78+
final HttpEntity<String> entity = new HttpEntity<>(objectMapper.writeValueAsString(eventDTO), headers);
79+
// call
80+
final ResponseEntity<Void> response = restTemplate.postForEntity("/api/event", entity, Void.class);
81+
82+
// test
83+
assertEquals(HttpStatusCode.valueOf(200), response.getStatusCode());
84+
// await and verify the event sent to Kafka
85+
await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> {
86+
final ConsumerRecord<String, String> singleRecord = KafkaTestUtils.getSingleRecord(consumer, "event-out");
87+
final Event capturedEvent = objectMapper.readValue(singleRecord.value(), Event.class);
88+
// test
89+
assertEquals("test-action", capturedEvent.action());
90+
assertEquals("123", capturedEvent.ticket());
91+
assertEquals("open", capturedEvent.status());
92+
assertEquals("1", capturedEvent.statusId());
93+
assertEquals("test-anliegen", capturedEvent.anliegenart());
94+
assertEquals("test-lhm-1", capturedEvent.lhmExtId());
95+
});
96+
}
97+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package de.muenchen.oss.dbs.ticketing.eventing.service.adapter.in.rest;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import de.muenchen.oss.dbs.ticketing.eventing.service.domain.model.Event;
6+
import org.junit.jupiter.api.Test;
7+
8+
class EventMapperTest {
9+
private final static String ACTION = "Test Action";
10+
private final static String TICKET_ID = "123";
11+
private final static String STATUS = "open";
12+
private final static String STATUS_ID = "1";
13+
private final static String ANLIEGENART = "Test Anliegen";
14+
private final static String LHM_EXT_ID = "lhm-123";
15+
16+
private final EventMapper eventMapper = new EventMapperImpl();
17+
18+
@Test
19+
void testEventFromDto() {
20+
final EventDTO eventDTO = new EventDTO(
21+
TICKET_ID, STATUS, STATUS_ID, ANLIEGENART, LHM_EXT_ID);
22+
final Event event = eventMapper.fromDto(ACTION, eventDTO);
23+
assertEquals(ACTION, event.action());
24+
assertEquals(TICKET_ID, event.ticket());
25+
assertEquals(STATUS, event.status());
26+
assertEquals(STATUS_ID, event.statusId());
27+
assertEquals(ANLIEGENART, event.anliegenart());
28+
assertEquals(LHM_EXT_ID, event.lhmExtId());
29+
}
30+
}

ticketing-eventing/eventing-service/src/test/resources/application-test.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,15 @@ logging:
33
structured:
44
format:
55
console: # set to empty to disable structured logging for testing
6+
7+
spring:
8+
security:
9+
user:
10+
name: test-user
11+
password: test-password
12+
13+
dbs:
14+
eventing:
15+
trigger-mapping:
16+
- trigger-name: test-trigger
17+
action: test-action

0 commit comments

Comments
 (0)