Skip to content

Commit f2fd824

Browse files
committed
New spring boot and cleanups
1 parent 4b9ff00 commit f2fd824

File tree

9 files changed

+70
-138
lines changed

9 files changed

+70
-138
lines changed

docker-compose.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ services:
1414
mysql:
1515
image: 'mysql'
1616
environment:
17-
- MYSQL_ROOT_PASSWORD=password
18-
- MYSQL_DATABASE=noteappdb
17+
- "MYSQL_ROOT_PASSWORD=password"
18+
- "MYSQL_DATABASE=noteappdb"
1919
ports:
2020
- 3306:3306
2121
command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8mb4 --explicit_defaults_for_timestamp

pom.xml

+28-28
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>org.springframework.boot</groupId>
88
<artifactId>spring-boot-starter-parent</artifactId>
9-
<version>3.2.2</version>
9+
<version>3.4.0-M3</version>
1010
<relativePath/> <!-- lookup parent from repository -->
1111
</parent>
1212

@@ -16,25 +16,25 @@
1616
<properties>
1717
<java.version>21</java.version>
1818

19-
<springdoc-openapi-ui.version>2.3.0</springdoc-openapi-ui.version>
20-
<mapstruct.version>1.6.0.Beta1</mapstruct.version>
19+
<springdoc-openapi-ui.version>2.6.0</springdoc-openapi-ui.version>
20+
<mapstruct.version>1.6.2</mapstruct.version>
2121

22-
<selenide.version>7.1.0</selenide.version>
22+
<selenide.version>7.5.1</selenide.version>
2323

2424
<wro4j.version>1.9.0</wro4j.version>
25-
<spock.version>2.4-M1-groovy-4.0</spock.version>
25+
<spock.version>2.4-M4-groovy-4.0</spock.version>
2626
<!-- client deps -->
2727
<webjar-jquery.version>3.5.1</webjar-jquery.version>
2828
<webjar-bootstrap.version>4.5.0</webjar-bootstrap.version>
2929
<webjar-popperjs.version>2.0.2</webjar-popperjs.version>
3030

3131

3232
<!-- code quality -->
33-
<archunit-junit5.version>1.2.1</archunit-junit5.version>
33+
<archunit-junit5.version>1.3.0</archunit-junit5.version>
3434
<sonar-maven-plugin.version>3.10.0.2594</sonar-maven-plugin.version>
3535
<jacoco-maven-plugin.version>0.8.10</jacoco-maven-plugin.version>
3636
<maven.checkstyle.plugin.version>3.3.0</maven.checkstyle.plugin.version>
37-
<puppycrawl.checkstyle.version>10.13.0</puppycrawl.checkstyle.version>
37+
<puppycrawl.checkstyle.version>10.18.1</puppycrawl.checkstyle.version>
3838
<puppycrawl.checkstyle.config.file>src/main/resources/checkstyle.xml</puppycrawl.checkstyle.config.file>
3939

4040

@@ -231,7 +231,7 @@
231231
<dependency> <!-- enables mocking of classes without default constructor (together with ByteBuddy or CGLIB) -->
232232
<groupId>org.objenesis</groupId>
233233
<artifactId>objenesis</artifactId>
234-
<version>3.3</version>
234+
<version>3.4</version>
235235
<scope>test</scope>
236236
</dependency>
237237

@@ -617,24 +617,24 @@
617617
</profile>
618618

619619
</profiles>
620-
<!-- <repositories>-->
621-
<!-- <repository>-->
622-
<!-- <id>spring-milestones</id>-->
623-
<!-- <name>Spring Milestones</name>-->
624-
<!-- <url>https://repo.spring.io/milestone</url>-->
625-
<!-- <snapshots>-->
626-
<!-- <enabled>false</enabled>-->
627-
<!-- </snapshots>-->
628-
<!-- </repository>-->
629-
<!-- </repositories>-->
630-
<!-- <pluginRepositories>-->
631-
<!-- <pluginRepository>-->
632-
<!-- <id>spring-milestones</id>-->
633-
<!-- <name>Spring Milestones</name>-->
634-
<!-- <url>https://repo.spring.io/milestone</url>-->
635-
<!-- <snapshots>-->
636-
<!-- <enabled>false</enabled>-->
637-
<!-- </snapshots>-->
638-
<!-- </pluginRepository>-->
639-
<!-- </pluginRepositories>-->
620+
<repositories>
621+
<repository>
622+
<id>spring-milestones</id>
623+
<name>Spring Milestones</name>
624+
<url>https://repo.spring.io/milestone</url>
625+
<snapshots>
626+
<enabled>false</enabled>
627+
</snapshots>
628+
</repository>
629+
</repositories>
630+
<pluginRepositories>
631+
<pluginRepository>
632+
<id>spring-milestones</id>
633+
<name>Spring Milestones</name>
634+
<url>https://repo.spring.io/milestone</url>
635+
<snapshots>
636+
<enabled>false</enabled>
637+
</snapshots>
638+
</pluginRepository>
639+
</pluginRepositories>
640640
</project>

src/main/java/gt/app/domain/AppUser.java

+6-84
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import jakarta.persistence.*;
44
import jakarta.validation.constraints.Size;
55
import lombok.EqualsAndHashCode;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
import lombok.Setter;
69
import org.hibernate.annotations.BatchSize;
710
import org.hibernate.annotations.Fetch;
811
import org.hibernate.annotations.FetchMode;
@@ -16,6 +19,9 @@
1619
@EqualsAndHashCode(callSuper = true)
1720
@Entity
1821
@Table(name = "APP_USER")
22+
@Getter
23+
@Setter
24+
@NoArgsConstructor
1925
public class AppUser extends BaseEntity implements UserDetails {
2026
@Basic(fetch = FetchType.LAZY)
2127
@Lob
@@ -98,90 +104,6 @@ public boolean isEnabled() {
98104
return active;
99105
}
100106

101-
public byte[] getAvatar() {
102-
return avatar;
103-
}
104-
105-
public String getFirstName() {
106-
return firstName;
107-
}
108-
109-
public String getLastName() {
110-
return lastName;
111-
}
112-
113-
public String getEmail() {
114-
return email;
115-
}
116-
117-
public String getUniqueId() {
118-
return uniqueId;
119-
}
120-
121-
public String getActivationKey() {
122-
return activationKey;
123-
}
124-
125-
public String getResetKey() {
126-
return resetKey;
127-
}
128-
129-
public void setAvatar(byte[] avatar) {
130-
this.avatar = avatar;
131-
}
132-
133-
public void setFirstName(String firstName) {
134-
this.firstName = firstName;
135-
}
136-
137-
public void setLastName(String lastName) {
138-
this.lastName = lastName;
139-
}
140-
141-
public void setEmail(String email) {
142-
this.email = email;
143-
}
144-
145-
public void setUniqueId(String uniqueId) {
146-
this.uniqueId = uniqueId;
147-
}
148-
149-
public void setPassword(String password) {
150-
this.password = password;
151-
}
152-
153-
public void setAuthorities(Set<Authority> authorities) {
154-
this.authorities = authorities;
155-
}
156-
157-
public void setActive(Boolean active) {
158-
this.active = active;
159-
}
160-
161-
public void setAccountNonExpired(Boolean accountNonExpired) {
162-
this.accountNonExpired = accountNonExpired;
163-
}
164-
165-
public void setAccountNonLocked(Boolean accountNonLocked) {
166-
this.accountNonLocked = accountNonLocked;
167-
}
168-
169-
public void setCredentialsNonExpired(Boolean credentialsNonExpired) {
170-
this.credentialsNonExpired = credentialsNonExpired;
171-
}
172-
173-
public void setActivationKey(String activationKey) {
174-
this.activationKey = activationKey;
175-
}
176-
177-
public void setResetKey(String resetKey) {
178-
this.resetKey = resetKey;
179-
}
180-
181-
public AppUser() {
182-
183-
}
184-
185107
public AppUser(String uniqueId, String firstName, String lastName, String email) {
186108
this.uniqueId = uniqueId;
187109
this.firstName = firstName;

src/main/java/gt/app/web/mvc/NoteController.java

-12
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,8 @@ public class NoteController {
2121

2222
final NoteService noteService;
2323

24-
@GetMapping("/add")
25-
public String startAddNote(Model model) {
26-
model.addAttribute("msg", "Add a new note");
27-
model.addAttribute("note", new Note());
28-
return "note/add-note";
29-
}
30-
3124
@PostMapping("/add")
3225
public String finishAddNote(NoteCreateDto noteDto, RedirectAttributes redirectAttrs) {
33-
3426
//TODO:validate and return to GET:/add on errors
3527

3628
Note note = noteService.createNote(noteDto);
@@ -43,7 +35,6 @@ public String finishAddNote(NoteCreateDto noteDto, RedirectAttributes redirectAt
4335
@GetMapping("/delete/{id}")
4436
@PreAuthorize("@permEvaluator.hasAccess(#id, 'Note' )")
4537
public String deleteNote(@PathVariable Long id, RedirectAttributes redirectAttrs) {
46-
4738
noteService.delete(id);
4839

4940
redirectAttrs.addFlashAttribute("success", "Note with id " + id + " is deleted");
@@ -63,11 +54,8 @@ public String startEditNote(Model model, @PathVariable Long id) {
6354
@PreAuthorize("@permEvaluator.hasAccess(#noteDto.id, 'Note' )")
6455
public String finishEditNote(Model model, NoteEditDto noteDto, RedirectAttributes redirectAttrs) {
6556
model.addAttribute("msg", "Add a new note");
66-
67-
6857
//TODO:validate and return to GET:/edit/{id} on errors
6958

70-
7159
noteService.update(noteDto);
7260

7361
redirectAttrs.addFlashAttribute("success", "Note with id " + noteDto.id() + " is updated");

src/main/java/gt/app/web/mvc/UserController.java

-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public String register(Model model) {
3535
@PostMapping(value = "/signup")
3636
public String register(@Valid @ModelAttribute UserSignUpDTO user, BindingResult bindingResult,
3737
RedirectAttributes redirectAttrs) {
38-
3938
//do custom validation along with the BeanValidation
4039
userSignupValidator.validate(user, bindingResult);
4140

@@ -59,7 +58,6 @@ public String updateProfile(Model model, @AuthenticationPrincipal AppUserDetails
5958
@PostMapping(value = "/profile")
6059
public String updateProfile(@Valid @ModelAttribute UserProfileUpdateDTO user, BindingResult bindingResult,
6160
@AuthenticationPrincipal AppUserDetails loggedInUserDtl, RedirectAttributes redirectAttrs) {
62-
6361
if (bindingResult.hasErrors()) {
6462
return "user/profile";
6563
}
@@ -80,7 +78,6 @@ public String updatePassword(Model model) {
8078
@PostMapping(value = "/password")
8179
public String updatePassword(@Valid @ModelAttribute("user") PasswordUpdateDTO reqDto, BindingResult bindingResult,
8280
@AuthenticationPrincipal AppUserDetails loggedInUserDtl, RedirectAttributes redirectAttrs) {
83-
8481
//do custom validation along with the BeanValidation
8582
passwordUpdateValidator.validate(reqDto, bindingResult, loggedInUserDtl);
8683

src/test/groovy/gt/app/SpringContextSpec.groovy

+3-4
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,12 @@ import spock.lang.Specification
1010
@SpringBootTest
1111
@ActiveProfiles(Constants.SPRING_PROFILE_TEST)
1212
class SpringContextSpec extends Specification {
13-
//this fails due to incompatibility between spring 6 and spock, comment until a fix is released
14-
// @Autowired
15-
// private HelloResource webController
13+
@Autowired
14+
private HelloResource webController
1615

1716
def "when context is loaded then all expected beans are created"() {
1817
expect: "the WebController is created"
1918
1 == 1
20-
// webController
19+
webController
2120
}
2221
}

src/test/groovy/gt/app/modules/user/AppUserServiceSpec.groovy

+12-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package gt.app.modules.user
33
import gt.app.config.Constants
44
import gt.app.domain.AppUser
55
import gt.app.modules.email.EmailService
6+
import gt.app.modules.email.dto.EmailDto
67
import gt.app.modules.user.dto.UserSignUpDTO
78
import org.springframework.security.crypto.password.NoOpPasswordEncoder
89
import org.springframework.security.crypto.password.PasswordEncoder
@@ -39,7 +40,17 @@ class AppUserServiceSpec extends Specification {
3940
user.email == toCreate.email
4041
1 * authorityService.findByNameIn(Constants.ROLE_USER)
4142
1 * userRepository.save(_)
42-
1 * emailService.sendEmail(_)
43+
1 * emailService.sendEmail(_) >> {
44+
//argument capture and assertions
45+
EmailDto dto ->
46+
assert dto.to()[0] == toCreate.email
47+
assert dto.cc().size() == 0
48+
assert dto.bcc().size() == 0
49+
assert dto.from() == "system@noteapp"
50+
assert dto.subject() == "NoteApp Account Created!"
51+
assert dto.content() == "Thanks for signing up."
52+
}
53+
4354
0 * _
4455
}
4556
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package gt.app;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.net.UnknownHostException;
6+
7+
class ApplicationStartupTest {
8+
9+
@Test
10+
void applicationCanBeStartedWithDefaultConfigByRunningMainMethod() throws UnknownHostException {
11+
/*
12+
this ensures that the 'Application' can be "Simply" run from IDE without doing any config change(the yml files or vm arg).
13+
*/
14+
Application.main(new String[]{});
15+
}
16+
17+
}
18+
19+

src/test/java/gt/app/modules/file/FileDownloadUtilTest.java

-4
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
import org.springframework.mock.web.MockHttpServletResponse;
66
import org.springframework.util.MimeTypeUtils;
77

8-
import java.io.File;
98
import java.io.IOException;
10-
import java.io.InputStream;
119
import java.net.URL;
1210

1311
import static org.assertj.core.api.Assertions.assertThat;
@@ -25,7 +23,6 @@ void downloadFile() throws IOException {
2523

2624

2725
assertThat(resp.getHeader("Content-Disposition")).isEqualTo("attachment; filename=original.txt");
28-
//assertThat(resp.getContentLength()).isEqualTo(toDownload.length());
2926
assertThat(resp.getContentType()).isEqualTo(MimeTypeUtils.APPLICATION_OCTET_STREAM.getType());
3027

3128
assertThat(resp.getContentAsString()).contains("Some Content");
@@ -45,7 +42,6 @@ void downloadFileWithContentType() throws IOException {
4542

4643

4744
assertThat(resp.getHeader("Content-Disposition")).isEqualTo("attachment; filename=original.txt");
48-
//assertThat(resp.getContentLength()).isEqualTo(toDownload.length());
4945
assertThat(resp.getContentType()).isEqualTo("mimetype");
5046

5147
assertThat(resp.getContentAsString()).contains("Some Content");

0 commit comments

Comments
 (0)