Skip to content

Commit 8365ee2

Browse files
committed
migrates to Junit 5 and Java 8 date/time API
1 parent 2b19ddc commit 8365ee2

14 files changed

Lines changed: 113 additions & 52 deletions

pom.xml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<parent>
1818
<groupId>org.springframework.boot</groupId>
1919
<artifactId>spring-boot-starter-parent</artifactId>
20-
<version>2.3.2.RELEASE</version>
20+
<version>2.7.18</version>
2121
<relativePath /> <!-- lookup parent from repository -->
2222
</parent>
2323

@@ -55,7 +55,7 @@
5555
</organization>
5656

5757
<properties>
58-
<java.version>11</java.version>
58+
<java.version>17</java.version>
5959
<maven.compiler.source>${java.version}</maven.compiler.source>
6060
<maven.compiler.target>${java.version}</maven.compiler.target>
6161
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -89,11 +89,23 @@
8989
<optional>true</optional>
9090
</dependency>
9191

92+
<!-- Jackson JSR310 support -->
93+
<dependency>
94+
<groupId>com.fasterxml.jackson.datatype</groupId>
95+
<artifactId>jackson-datatype-jsr310</artifactId>
96+
</dependency>
97+
9298
<!-- Test -->
9399
<dependency>
94100
<groupId>org.springframework.boot</groupId>
95101
<artifactId>spring-boot-starter-test</artifactId>
96102
<scope>test</scope>
103+
<exclusions>
104+
<exclusion>
105+
<groupId>org.junit.vintage</groupId>
106+
<artifactId>junit-vintage-engine</artifactId>
107+
</exclusion>
108+
</exclusions>
97109
</dependency>
98110
<dependency>
99111
<groupId>org.mockito</groupId>

src/main/java/org/vaulttec/gitlab/enforcer/EnforcerEventPublisher.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,18 @@
2929
@Service
3030
public class EnforcerEventPublisher {
3131
private static final Logger AUDIT_LOG = LoggerFactory.getLogger("AUDIT_LOG");
32-
private static final ObjectMapper MAPPER = new ObjectMapper();
33-
32+
3433
private final AuditEventRepository eventRepository;
34+
private final ObjectMapper objectMapper;
3535

36-
public EnforcerEventPublisher(AuditEventRepository eventRepository) {
36+
public EnforcerEventPublisher(AuditEventRepository eventRepository, ObjectMapper objectMapper) {
3737
this.eventRepository = eventRepository;
38+
this.objectMapper = objectMapper;
3839
}
3940

4041
public void publishEvent(AuditEvent event) {
4142
try {
42-
AUDIT_LOG.trace(MAPPER.writeValueAsString(event));
43+
AUDIT_LOG.trace(objectMapper.writeValueAsString(event));
4344
} catch (JsonProcessingException e) {
4445
AUDIT_LOG.error("Error serializing audit event: {}", event, e);
4546
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* GitLab Enforcer
3+
* Copyright (c) 2025 Torsten Juergeleit
4+
* mailto:torsten AT vaulttec DOT org
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
package org.vaulttec.gitlab.enforcer.config;
19+
20+
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
21+
import org.springframework.context.annotation.Bean;
22+
import org.springframework.context.annotation.Configuration;
23+
24+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
25+
26+
/**
27+
* Jackson configuration to ensure proper handling of Java 8 date/time types.
28+
*/
29+
@Configuration
30+
public class JacksonConfig {
31+
32+
/**
33+
* Customizes the application-wide ObjectMapper to register the JavaTimeModule
34+
* for proper handling of Java 8 date/time types like Instant.
35+
*
36+
* @return Jackson2ObjectMapperBuilderCustomizer to register JavaTimeModule
37+
*/
38+
@Bean
39+
public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
40+
return builder -> builder.modules(new JavaTimeModule());
41+
}
42+
}

src/main/java/org/vaulttec/gitlab/enforcer/systemhook/SystemEvent.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818
package org.vaulttec.gitlab.enforcer.systemhook;
1919

20-
import java.util.Date;
20+
import java.time.Instant;
2121

2222
import com.fasterxml.jackson.annotation.JsonAlias;
2323
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@@ -26,7 +26,7 @@
2626
@JsonIgnoreProperties(ignoreUnknown = true)
2727
public class SystemEvent {
2828
@JsonProperty("created_at")
29-
private Date createdAt;
29+
private Instant createdAt;
3030
@JsonProperty("event_name")
3131
private SystemEventName eventName;
3232
@JsonProperty("name")
@@ -39,11 +39,11 @@ public class SystemEvent {
3939
private String id;
4040
private Object object;
4141

42-
public Date getCreatedAt() {
42+
public Instant getCreatedAt() {
4343
return createdAt;
4444
}
4545

46-
public void setCreatedAt(Date createdAt) {
46+
public void setCreatedAt(Instant createdAt) {
4747
this.createdAt = createdAt;
4848
}
4949

src/main/java/org/vaulttec/gitlab/enforcer/systemhook/SystemEventBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818
package org.vaulttec.gitlab.enforcer.systemhook;
1919

20-
import java.util.Date;
20+
import java.time.Instant;
2121

2222
public class SystemEventBuilder {
2323
private SystemEventName eventName;
@@ -58,7 +58,7 @@ public SystemEventBuilder object(Object object) {
5858

5959
public SystemEvent build() {
6060
SystemEvent event = new SystemEvent();
61-
event.setCreatedAt(new Date(System.currentTimeMillis()));
61+
event.setCreatedAt(Instant.now());
6262
event.setEventName(eventName);
6363
event.setName(name);
6464
event.setPath(path);

src/main/java/org/vaulttec/gitlab/enforcer/systemhook/SystemHooksController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,17 @@ public class SystemHooksController {
3333

3434
private static final Logger LOG = LoggerFactory.getLogger(SystemHooksController.class);
3535

36-
private EnforcerClient client;
37-
private EnforcerConfig config;
36+
private final EnforcerClient client;
37+
private final EnforcerConfig config;
3838

3939
public SystemHooksController(EnforcerClient client, EnforcerConfig config) {
4040
this.client = client;
4141
this.config = config;
4242
}
4343

4444
@PostMapping(value = "/systemhooks", consumes = "application/json")
45-
public void process(@RequestHeader(name = "X-Gitlab-Event", required = true) String header,
46-
@RequestHeader(name = "X-Gitlab-Token", required = true) String token, @RequestBody SystemEvent event) {
45+
public void process(@RequestHeader(name = "X-Gitlab-Event") String header,
46+
@RequestHeader(name = "X-Gitlab-Token") String token, @RequestBody SystemEvent event) {
4747
if (StringUtils.hasText(config.getSystemHookToken()) && !config.getSystemHookToken().equals(token)) {
4848
LOG.warn("Unexpected token '{}' - ignoring {} event '{}'", token, header, event.getEventName());
4949
} else {

src/test/java/org/vaulttec/gitlab/enforcer/ApplicationTests.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@
1717
*/
1818
package org.vaulttec.gitlab.enforcer;
1919

20-
import org.junit.Test;
21-
import org.junit.runner.RunWith;
20+
import org.junit.jupiter.api.Test;
2221
import org.springframework.boot.test.context.SpringBootTest;
2322
import org.springframework.test.context.ActiveProfiles;
24-
import org.springframework.test.context.junit4.SpringRunner;
2523

2624
@ActiveProfiles("test")
27-
@RunWith(SpringRunner.class)
2825
@SpringBootTest
2926
public class ApplicationTests {
3027

src/test/java/org/vaulttec/gitlab/enforcer/client/GitLabClientIntegrationTest.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,15 @@
2121

2222
import java.util.List;
2323

24-
import org.junit.Test;
25-
import org.junit.runner.RunWith;
24+
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
2626
import org.slf4j.Logger;
2727
import org.slf4j.LoggerFactory;
2828
import org.springframework.beans.factory.annotation.Autowired;
2929
import org.springframework.boot.test.context.SpringBootTest;
3030
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
3131
import org.springframework.http.HttpMethod;
32-
import org.springframework.test.annotation.IfProfileValue;
3332
import org.springframework.test.context.ActiveProfiles;
34-
import org.springframework.test.context.junit4.SpringRunner;
3533
import org.vaulttec.gitlab.enforcer.Application;
3634
import org.vaulttec.gitlab.enforcer.client.model.Branch;
3735
import org.vaulttec.gitlab.enforcer.client.model.Group;
@@ -42,8 +40,7 @@
4240
import org.vaulttec.gitlab.enforcer.client.model.PushRules;
4341

4442
@ActiveProfiles("test")
45-
@IfProfileValue(name = "run.integration.tests", value = "true")
46-
@RunWith(SpringRunner.class)
43+
@EnabledIfSystemProperty(named = "run.integration.tests", matches = "true")
4744
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.NONE)
4845
public class GitLabClientIntegrationTest {
4946
private static final Logger LOG = LoggerFactory.getLogger(GitLabClientIntegrationTest.class);

src/test/java/org/vaulttec/gitlab/enforcer/client/model/PermissionTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
*/
1818
package org.vaulttec.gitlab.enforcer.client.model;
1919

20-
import static org.junit.Assert.assertFalse;
21-
import static org.junit.Assert.assertTrue;
20+
import static org.junit.jupiter.api.Assertions.assertFalse;
21+
import static org.junit.jupiter.api.Assertions.assertTrue;
2222

23-
import org.junit.Test;
23+
import org.junit.jupiter.api.Test;
2424

2525
public class PermissionTest {
2626

src/test/java/org/vaulttec/gitlab/enforcer/rule/GroupSettingsRuleTest.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import java.util.LinkedHashMap;
2727
import java.util.Map;
2828

29-
import org.junit.Before;
30-
import org.junit.Test;
29+
import org.junit.jupiter.api.BeforeEach;
30+
import org.junit.jupiter.api.Test;
3131
import org.springframework.boot.actuate.audit.AuditEvent;
3232
import org.springframework.boot.actuate.audit.AuditEventRepository;
3333
import org.vaulttec.gitlab.enforcer.EnforcerEventPublisher;
@@ -36,6 +36,7 @@
3636
import org.vaulttec.gitlab.enforcer.client.model.Group;
3737
import org.vaulttec.gitlab.enforcer.systemhook.SystemEventBuilder;
3838
import org.vaulttec.gitlab.enforcer.systemhook.SystemEventName;
39+
import com.fasterxml.jackson.databind.ObjectMapper;
3940

4041
public class GroupSettingsRuleTest {
4142

@@ -47,11 +48,13 @@ public class GroupSettingsRuleTest {
4748
private EnforcerEventPublisher eventPublisher;
4849
private GitLabClient client;
4950
private Map<String, String> config;
51+
private ObjectMapper objectMapper;
5052

51-
@Before
52-
public void setUp() throws Exception {
53+
@BeforeEach
54+
public void setUp() {
5355
eventRepository = mock(AuditEventRepository.class);
54-
eventPublisher = new EnforcerEventPublisher(eventRepository);
56+
objectMapper = mock(ObjectMapper.class);
57+
eventPublisher = new EnforcerEventPublisher(eventRepository, objectMapper);
5558
client = mock(GitLabClient.class);
5659
config = new LinkedHashMap<>();
5760
config.put("membership_lock", "true");

0 commit comments

Comments
 (0)