Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 33b745a

Browse files
refactor BaseEntity and Book.java, refactor ISBNValidator regarding Long -> BigDecimal, refactor validator test, create Mapper (using ModelMapper), create test for Mapper, refactor BookService regarding the changes
1 parent e891658 commit 33b745a

File tree

7 files changed

+140
-11
lines changed

7 files changed

+140
-11
lines changed

‎api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,37 @@
33
import jakarta.persistence.Column;
44
import jakarta.persistence.Id;
55
import jakarta.persistence.MappedSuperclass;
6+
import lombok.Data;
7+
import lombok.Getter;
8+
import lombok.RequiredArgsConstructor;
9+
import lombok.Setter;
10+
import lombok.ToString;
11+
import org.hibernate.Hibernate;
612

13+
import java.util.Objects;
714
import java.util.UUID;
815

916
@MappedSuperclass
17+
@Getter
18+
@Setter
19+
@ToString
20+
@RequiredArgsConstructor
1021
public class BaseEntity {
1122

1223
@Id
1324
@Column(name = "id", nullable = false)
1425
private UUID id = UUID.randomUUID();
26+
27+
@Override
28+
public boolean equals(Object o) {
29+
if (this == o) return true;
30+
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
31+
BaseEntity that = (BaseEntity) o;
32+
return id != null && Objects.equals(id, that.id);
33+
}
34+
35+
@Override
36+
public int hashCode() {
37+
return getClass().hashCode();
38+
}
1539
}

‎api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import lombok.ToString;
1515
import org.hibernate.annotations.Where;
1616

17+
import java.math.BigDecimal;
1718
import java.time.LocalDateTime;
1819
import java.util.UUID;
1920

@@ -42,7 +43,7 @@ public class Book extends BaseEntity {
4243
private String title;
4344

4445
@Column(name = "isbn", nullable = false, unique = true, length = 13)
45-
private Long isbn;
46+
private BigDecimal isbn;
4647

4748
@Column(name = "genre", nullable = false)
4849
@Enumerated(EnumType.STRING)

‎api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
import com.csaba79coder.apifirstdevelopment.entity.Book;
44
import com.csaba79coder.apifirstdevelopment.persistence.BookRepository;
55
import com.csaba79coder.models.BookModel;
6+
import com.csaba79coder.models.ModifiedBookModel;
67
import com.csaba79coder.models.NewBookModel;
78
import lombok.RequiredArgsConstructor;
89
import lombok.extern.slf4j.Slf4j;
910
import org.springframework.stereotype.Service;
1011

12+
import java.util.List;
1113
import java.util.NoSuchElementException;
1214
import java.util.UUID;
1315

@@ -32,4 +34,16 @@ public void deleteAnExistingBookById(UUID id) {
3234
});
3335
bookRepository.delete(book);
3436
}
37+
38+
public BookModel getBookById(UUID id) {
39+
return null;
40+
}
41+
42+
public List<BookModel> renderAllBooks() {
43+
return null;
44+
}
45+
46+
public BookModel updateAnExistingBook(UUID id, ModifiedBookModel modifyBook) {
47+
return null;
48+
}
3549
}

‎api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
11
package com.csaba79coder.apifirstdevelopment.util;
22

3+
import java.math.BigDecimal;
4+
35
public class ISBN13Validator {
46

5-
public static boolean isValidISBN(Long isbnLong) {
7+
public static boolean isValidISBN(BigDecimal isbnLong) {
68
String isbn = String.valueOf(isbnLong);
79
if (isbn == null) {
810
return false;
911
}
1012
if (isbn.startsWith("-")) {
1113
return false;
1214
}
13-
isbn = isbn.replaceAll("-", "");
15+
isbn = isbn.replaceAll("-", "");
1416
if ( isbn.length() != 13 ) {
1517
return false;
1618
}
1719
try {
1820
int tot = 0;
1921
for (int i = 0; i < 12; i++) {
20-
int digit = Integer.parseInt(isbn.substring( i, i + 1 ));
22+
int digit = Integer.parseInt(isbn.substring( i, i + 1 ));
2123
tot += (i % 2 == 0) ? digit : digit * 3;
2224
}
2325
int checksum = 10 - (tot % 10);
24-
if (checksum == 10) {
26+
if (checksum == 10) {
2527
checksum = 0;
2628
}
27-
return checksum == Integer.parseInt(isbn.substring(12 ) );
29+
return checksum == Integer.parseInt(isbn.substring(12));
2830
}
2931
catch (NumberFormatException nfe) {
3032
return false;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.csaba79coder.apifirstdevelopment.util;
2+
3+
import com.csaba79coder.apifirstdevelopment.entity.Book;
4+
import com.csaba79coder.models.BookModel;
5+
import com.csaba79coder.models.NewBookModel;
6+
import org.modelmapper.ModelMapper;
7+
8+
public class Mapper {
9+
10+
private static final ModelMapper modelMapper = new ModelMapper();
11+
12+
public static Book mapNewBookModelToBookEntity(NewBookModel bookModel) {
13+
Book book = new Book();
14+
modelMapper.map(bookModel, book);
15+
return book;
16+
}
17+
18+
19+
public static BookModel mapBookEntityToBookModel(Book book) {
20+
BookModel bookModel = new BookModel();
21+
modelMapper.map(book, bookModel);
22+
return bookModel;
23+
}
24+
25+
private Mapper() {
26+
27+
}
28+
}

‎api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,24 @@
22

33
import org.junit.jupiter.api.Test;
44

5+
import java.math.BigDecimal;
6+
57
import static org.assertj.core.api.BDDAssertions.then;
68

79
class ISBN13ValidatorTest {
810

11+
// https://medium.com/@stefanovskyi/unit-test-naming-conventions-dd9208eadbea
12+
913
@Test
1014
void validISBN() {
11-
boolean isValid = ISBN13Validator.isValidISBN(9788845292613L);
15+
boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(9780671557003L));
1216
then(isValid)
1317
.isTrue();
1418
}
1519

1620
@Test
1721
void invalidISBN() {
18-
boolean isValid = ISBN13Validator.isValidISBN(999L);
22+
boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(999L));
1923
then(isValid)
2024
.isFalse();
2125
}
@@ -29,21 +33,21 @@ void nullISBN() {
2933

3034
@Test
3135
void zeroISBN() {
32-
boolean isValid = ISBN13Validator.isValidISBN(0L);
36+
boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(0L));
3337
then(isValid)
3438
.isFalse();
3539
}
3640

3741
@Test
3842
void negativeNonValidISBN() {
39-
boolean isValid = ISBN13Validator.isValidISBN(-112L);
43+
boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(-112L));
4044
then(isValid)
4145
.isFalse();
4246
}
4347

4448
@Test
4549
void negativeValidISBN() {
46-
boolean isValid = ISBN13Validator.isValidISBN(-9780425175477L);
50+
boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(-9780425175477L));
4751
then(isValid)
4852
.isFalse();
4953
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.csaba79coder.apifirstdevelopment.util;
2+
3+
import com.csaba79coder.apifirstdevelopment.entity.Book;
4+
import com.csaba79coder.apifirstdevelopment.value.Genre;
5+
import com.csaba79coder.models.BookModel;
6+
import com.csaba79coder.models.NewBookModel;
7+
import org.junit.jupiter.api.Test;
8+
9+
import java.math.BigDecimal;
10+
import java.time.LocalDateTime;
11+
12+
import static org.assertj.core.api.BDDAssertions.then;
13+
14+
class MapperTest {
15+
16+
@Test
17+
void mapNewBookModelToBookEntity() {
18+
// Given
19+
NewBookModel newBookModel = new NewBookModel().title("Cat Among the Pigeons").isbn(BigDecimal.valueOf(9780671557003L)).genre(NewBookModel.GenreEnum.NOVEL);
20+
Book expectedEntity = new Book();
21+
expectedEntity.setTitle(newBookModel.getTitle());
22+
expectedEntity.setIsbn(BigDecimal.valueOf(9780671557003L));
23+
expectedEntity.setGenre(Genre.valueOf(newBookModel.getGenre().name()));
24+
25+
// When
26+
Book book = Mapper.mapNewBookModelToBookEntity(newBookModel);
27+
28+
// Then
29+
then(book)
30+
.usingRecursiveComparison()
31+
.ignoringFields("id", "createdAt", "updatedAt")
32+
.isEqualTo(expectedEntity);
33+
}
34+
35+
@Test
36+
void mapBookEntityToBookModel() {
37+
// Given
38+
Book book = new Book();
39+
book.setTitle("Cat Among the Pigeons");
40+
book.setIsbn(BigDecimal.valueOf(9780671557003L));
41+
book.setGenre(Genre.valueOf(Genre.DETECTIVE_FICTION.name()));
42+
43+
// When
44+
BookModel bookModel = Mapper.mapBookEntityToBookModel(book);
45+
46+
// Then
47+
then(bookModel)
48+
.usingRecursiveComparison()
49+
.ignoringFields("createdAt", "updatedAt")
50+
.isEqualTo(book);
51+
then(LocalDateTime.parse(bookModel.getCreatedAt()))
52+
.isEqualTo(book.getCreatedAt());
53+
then(LocalDateTime.parse(bookModel.getUpdatedAt()))
54+
.isEqualTo(book.getUpdatedAt());
55+
}
56+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /