From 8c3ee9b4342f8a0781d51130f896371df0b44350 Mon Sep 17 00:00:00 2001 From: Paulo Oliveira Date: Mon, 21 Apr 2025 17:36:25 +0100 Subject: [PATCH 1/8] flyway: add flyway and create SQL scripts --- maven-spring/pom.xml | 6 ++++++ maven-spring/src/main/resources/application.yml | 4 ++++ .../main/resources/db/migration/V1__create_tasks.sql | 7 +++++++ .../src/main/resources/db/migration/V2__add_status.sql | 10 ++++++++++ .../main/resources/db/migration/V3__insert_data.sql | 10 ++++++++++ 5 files changed, 37 insertions(+) create mode 100644 maven-spring/src/main/resources/db/migration/V1__create_tasks.sql create mode 100644 maven-spring/src/main/resources/db/migration/V2__add_status.sql create mode 100644 maven-spring/src/main/resources/db/migration/V3__insert_data.sql diff --git a/maven-spring/pom.xml b/maven-spring/pom.xml index 7c9c33a..fa779ed 100644 --- a/maven-spring/pom.xml +++ b/maven-spring/pom.xml @@ -56,6 +56,12 @@ 42.7.4 + + org.flywaydb + flyway-core + 10.20.0 + + org.mockito mockito-core diff --git a/maven-spring/src/main/resources/application.yml b/maven-spring/src/main/resources/application.yml index 9a73bc5..38a8999 100644 --- a/maven-spring/src/main/resources/application.yml +++ b/maven-spring/src/main/resources/application.yml @@ -12,5 +12,9 @@ spring: hibernate: ddl-auto: update + flyway: + enabled: true + baseline-on-migrate: true + server: port: 5190 diff --git a/maven-spring/src/main/resources/db/migration/V1__create_tasks.sql b/maven-spring/src/main/resources/db/migration/V1__create_tasks.sql new file mode 100644 index 0000000..83119e0 --- /dev/null +++ b/maven-spring/src/main/resources/db/migration/V1__create_tasks.sql @@ -0,0 +1,7 @@ +CREATE TABLE tasks +( + id UUID PRIMARY KEY NOT NULL, + name VARCHAR(255) NOT NULL, + description TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); \ No newline at end of file diff --git a/maven-spring/src/main/resources/db/migration/V2__add_status.sql b/maven-spring/src/main/resources/db/migration/V2__add_status.sql new file mode 100644 index 0000000..4cd44fa --- /dev/null +++ b/maven-spring/src/main/resources/db/migration/V2__add_status.sql @@ -0,0 +1,10 @@ +CREATE TABLE status +( + id UUID PRIMARY KEY NOT NULL, + name VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +ALTER TABLE tasks +ADD COLUMN status_id UUID, +ADD CONSTRAINT fk_status FOREIGN KEY (status_id) REFERENCES status(id); \ No newline at end of file diff --git a/maven-spring/src/main/resources/db/migration/V3__insert_data.sql b/maven-spring/src/main/resources/db/migration/V3__insert_data.sql new file mode 100644 index 0000000..c21f478 --- /dev/null +++ b/maven-spring/src/main/resources/db/migration/V3__insert_data.sql @@ -0,0 +1,10 @@ +INSERT INTO status (id, name) +VALUES + ('D6127F26-55B6-408D-A010-322FBEC9B1B1', 'Open'), + ('C78BDBC7-E2D6-4C39-AF32-FDDAC2DC9004', 'In Progress'), + ('31BD3B30-FFCC-44C5-B24B-F169E28FC138', 'Blocked'), + ('9CD7D8F8-980B-4344-9A6C-44DA84A72974', 'Done'); + +-- create new task with status in progress +INSERT INTO tasks (id, name, description, created_at, status_id) +VALUES ('525B5626-D373-4023-A026-FBA5642EAEF0', 'Create CLI', 'This todo list as CLI', now(), 'C78BDBC7-E2D6-4C39-AF32-FDDAC2DC9004'); \ No newline at end of file From bcf70a8d89afabad019322b0102f46e98634ca45 Mon Sep 17 00:00:00 2001 From: Paulo Oliveira Date: Mon, 21 Apr 2025 17:43:56 +0100 Subject: [PATCH 2/8] flyway: update with MacOS rule --- maven-spring/.gitignore | 1 + .../javaverse/{controller => controllers}/HelloWorld.java | 0 .../javaverse/{controller => controllers}/TaskController.java | 0 .../com/poliveira/javaverse/{model => models}/SimpleTaskVO.java | 0 .../java/com/poliveira/javaverse/{model => models}/Status.java | 0 .../com/poliveira/javaverse/{model => models}/SuccessVO.java | 0 .../java/com/poliveira/javaverse/{model => models}/TaskVO.java | 0 .../javaverse/{repository => repositories}/TaskRepository.java | 0 .../poliveira/javaverse/{service => services}/TaskService.java | 0 9 files changed, 1 insertion(+) rename maven-spring/src/main/java/com/poliveira/javaverse/{controller => controllers}/HelloWorld.java (100%) rename maven-spring/src/main/java/com/poliveira/javaverse/{controller => controllers}/TaskController.java (100%) rename maven-spring/src/main/java/com/poliveira/javaverse/{model => models}/SimpleTaskVO.java (100%) rename maven-spring/src/main/java/com/poliveira/javaverse/{model => models}/Status.java (100%) rename maven-spring/src/main/java/com/poliveira/javaverse/{model => models}/SuccessVO.java (100%) rename maven-spring/src/main/java/com/poliveira/javaverse/{model => models}/TaskVO.java (100%) rename maven-spring/src/main/java/com/poliveira/javaverse/{repository => repositories}/TaskRepository.java (100%) rename maven-spring/src/main/java/com/poliveira/javaverse/{service => services}/TaskService.java (100%) diff --git a/maven-spring/.gitignore b/maven-spring/.gitignore index 549e00a..9ad541b 100644 --- a/maven-spring/.gitignore +++ b/maven-spring/.gitignore @@ -3,6 +3,7 @@ target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ +**/.DS_Store ### STS ### .apt_generated diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/controller/HelloWorld.java b/maven-spring/src/main/java/com/poliveira/javaverse/controllers/HelloWorld.java similarity index 100% rename from maven-spring/src/main/java/com/poliveira/javaverse/controller/HelloWorld.java rename to maven-spring/src/main/java/com/poliveira/javaverse/controllers/HelloWorld.java diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/controller/TaskController.java b/maven-spring/src/main/java/com/poliveira/javaverse/controllers/TaskController.java similarity index 100% rename from maven-spring/src/main/java/com/poliveira/javaverse/controller/TaskController.java rename to maven-spring/src/main/java/com/poliveira/javaverse/controllers/TaskController.java diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/model/SimpleTaskVO.java b/maven-spring/src/main/java/com/poliveira/javaverse/models/SimpleTaskVO.java similarity index 100% rename from maven-spring/src/main/java/com/poliveira/javaverse/model/SimpleTaskVO.java rename to maven-spring/src/main/java/com/poliveira/javaverse/models/SimpleTaskVO.java diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/model/Status.java b/maven-spring/src/main/java/com/poliveira/javaverse/models/Status.java similarity index 100% rename from maven-spring/src/main/java/com/poliveira/javaverse/model/Status.java rename to maven-spring/src/main/java/com/poliveira/javaverse/models/Status.java diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/model/SuccessVO.java b/maven-spring/src/main/java/com/poliveira/javaverse/models/SuccessVO.java similarity index 100% rename from maven-spring/src/main/java/com/poliveira/javaverse/model/SuccessVO.java rename to maven-spring/src/main/java/com/poliveira/javaverse/models/SuccessVO.java diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/model/TaskVO.java b/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java similarity index 100% rename from maven-spring/src/main/java/com/poliveira/javaverse/model/TaskVO.java rename to maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/repository/TaskRepository.java b/maven-spring/src/main/java/com/poliveira/javaverse/repositories/TaskRepository.java similarity index 100% rename from maven-spring/src/main/java/com/poliveira/javaverse/repository/TaskRepository.java rename to maven-spring/src/main/java/com/poliveira/javaverse/repositories/TaskRepository.java diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/service/TaskService.java b/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java similarity index 100% rename from maven-spring/src/main/java/com/poliveira/javaverse/service/TaskService.java rename to maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java From f4d1a5f4b7c90b86b38f658786a13f52b5b80907 Mon Sep 17 00:00:00 2001 From: Paulo Oliveira Date: Mon, 21 Apr 2025 17:44:17 +0100 Subject: [PATCH 3/8] flyway: change packages names --- .../com/poliveira/javaverse/controller/.DS_Store | Bin 6148 -> 0 bytes .../javaverse/controllers/HelloWorld.java | 2 +- .../javaverse/controllers/TaskController.java | 10 +++++----- .../poliveira/javaverse/models/SimpleTaskVO.java | 2 +- .../com/poliveira/javaverse/models/Status.java | 2 +- .../poliveira/javaverse/models/SuccessVO.java | 2 +- .../com/poliveira/javaverse/models/TaskVO.java | 2 +- .../javaverse/repositories/TaskRepository.java | 4 ++-- .../javaverse/services/TaskService.java | 10 +++++----- .../poliveira/javaverse/TasksRepositoryTest.java | 6 +++--- .../poliveira/javaverse/TasksServiceTest.java | 10 +++++----- 11 files changed, 25 insertions(+), 25 deletions(-) delete mode 100644 maven-spring/src/main/java/com/poliveira/javaverse/controller/.DS_Store diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/controller/.DS_Store b/maven-spring/src/main/java/com/poliveira/javaverse/controller/.DS_Store deleted file mode 100644 index c77904ade7fda38c14f012b9aa61c0f7d1686952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ8nWT5S&erf#^56 zwmik#w*YMQzFPuw08_dnK7AOQ@4Juep&~}4^Na(w*zeBU3Wq4i#3;vHcsX7~ cQsy Date: Tue, 22 Apr 2025 17:35:56 +0100 Subject: [PATCH 4/8] flyway: create mapping service; entities for Task and change connection between VO and Entity --- .../javaverse/controllers/TaskController.java | 7 +-- .../javaverse/entities/StatusEntity.java | 26 ++++++++++ .../javaverse/entities/TaskEntity.java | 36 ++++++++++++++ .../poliveira/javaverse/models/TaskVO.java | 12 +---- .../javaverse/processors/MappingService.java | 49 +++++++++++++++++++ .../repositories/TaskRepository.java | 11 ++--- .../javaverse/services/TaskService.java | 33 +++++++------ .../poliveira/javaverse/utils/TimeUtils.java | 23 +++++++++ 8 files changed, 161 insertions(+), 36 deletions(-) create mode 100644 maven-spring/src/main/java/com/poliveira/javaverse/entities/StatusEntity.java create mode 100644 maven-spring/src/main/java/com/poliveira/javaverse/entities/TaskEntity.java create mode 100644 maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java create mode 100644 maven-spring/src/main/java/com/poliveira/javaverse/utils/TimeUtils.java diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/controllers/TaskController.java b/maven-spring/src/main/java/com/poliveira/javaverse/controllers/TaskController.java index 3bf710e..d72f1a5 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/controllers/TaskController.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/controllers/TaskController.java @@ -7,6 +7,7 @@ import com.poliveira.javaverse.models.TaskVO; import com.poliveira.javaverse.services.TaskService; import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -32,17 +33,17 @@ public TaskVO createTask(@RequestBody SimpleTaskVO taskVO) { } @GetMapping("/{id}") - public TaskVO readTask(@PathVariable Long id) { + public TaskVO readTask(@PathVariable UUID id) { return taskService.getTaskById(id); } @PatchMapping("/{id}") - public TaskVO updateTask(@PathVariable Long id, @RequestBody SimpleTaskVO taskVO) { + public TaskVO updateTask(@PathVariable UUID id, @RequestBody SimpleTaskVO taskVO) { return taskService.updateTask(id, taskVO); } @DeleteMapping("/{id}") - public SuccessVO deleteTask(@PathVariable Long id) { + public SuccessVO deleteTask(@PathVariable UUID id) { return SuccessVO.builder() .success(taskService.deleteTask(id)) .message("Task deleted successfully") diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/entities/StatusEntity.java b/maven-spring/src/main/java/com/poliveira/javaverse/entities/StatusEntity.java new file mode 100644 index 0000000..518ed18 --- /dev/null +++ b/maven-spring/src/main/java/com/poliveira/javaverse/entities/StatusEntity.java @@ -0,0 +1,26 @@ +package com.poliveira.javaverse.entities; + +import jakarta.persistence.*; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Entity +@NoArgsConstructor +@Table(name = "status", schema = "public") +public class StatusEntity { + @Id + @Column(columnDefinition = "UUID") + private UUID id; + + @Column(nullable = false) + private String name; + + @Column( + name = "created_at", + nullable = false, + columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") + private LocalDateTime createdAt; +} diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/entities/TaskEntity.java b/maven-spring/src/main/java/com/poliveira/javaverse/entities/TaskEntity.java new file mode 100644 index 0000000..efc2c3d --- /dev/null +++ b/maven-spring/src/main/java/com/poliveira/javaverse/entities/TaskEntity.java @@ -0,0 +1,36 @@ +package com.poliveira.javaverse.entities; + +import com.poliveira.javaverse.models.Status; +import jakarta.persistence.*; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "tasks") +public class TaskEntity { + + @Id @GeneratedValue private UUID id; + + @Column(nullable = false) + private String title; + + private String description; + + @Column(name = "created_at", nullable = false, updatable = false) + private LocalDateTime createdAt; + + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @ManyToOne + @JoinColumn(name = "status_id") + private Status status; +} diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java b/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java index eb19422..dadac90 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java @@ -1,26 +1,18 @@ package com.poliveira.javaverse.models; -import static jakarta.persistence.GenerationType.IDENTITY; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; +import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data -@Entity @Builder @NoArgsConstructor @AllArgsConstructor public class TaskVO { - @Id - @GeneratedValue(strategy = IDENTITY) - private long id; - + private UUID id; private String title; private String description; private Status status; diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java b/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java new file mode 100644 index 0000000..680bba1 --- /dev/null +++ b/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java @@ -0,0 +1,49 @@ +package com.poliveira.javaverse.processors; + +import com.poliveira.javaverse.entities.TaskEntity; +import com.poliveira.javaverse.models.SimpleTaskVO; +import com.poliveira.javaverse.models.Status; +import com.poliveira.javaverse.models.TaskVO; +import com.poliveira.javaverse.utils.TimeUtils; +import java.time.LocalDateTime; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MappingService { + + private final TimeUtils timeUtils; + + public TaskEntity toEntity(TaskVO taskVO) { + return TaskEntity.builder() + .id(taskVO.getId()) + .title(taskVO.getTitle()) + .description(taskVO.getDescription()) + .createdAt(timeUtils.toLocalDateTime(taskVO.getCreatedAt())) + .updatedAt(timeUtils.toLocalDateTime(taskVO.getUpdatedAt())) + .status(taskVO.getStatus()) + .build(); + } + + public TaskEntity toEntity(SimpleTaskVO simpleTaskVO) { + return TaskEntity.builder() + .title(simpleTaskVO.getTitle()) + .description(simpleTaskVO.getDescription()) + .createdAt(LocalDateTime.now()) + .updatedAt(LocalDateTime.now()) + .status(Status.TODO) // Default status + .build(); + } + + public TaskVO toVO(TaskEntity taskEntity) { + return TaskVO.builder() + .id(taskEntity.getId()) + .title(taskEntity.getTitle()) + .description(taskEntity.getDescription()) + .status(taskEntity.getStatus()) + .createdAt(timeUtils.toEpochMilli(taskEntity.getCreatedAt())) + .updatedAt(timeUtils.toEpochMilli(taskEntity.getUpdatedAt())) + .build(); + } +} diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/repositories/TaskRepository.java b/maven-spring/src/main/java/com/poliveira/javaverse/repositories/TaskRepository.java index f76b125..61dcf3d 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/repositories/TaskRepository.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/repositories/TaskRepository.java @@ -1,14 +1,9 @@ package com.poliveira.javaverse.repositories; -import com.poliveira.javaverse.models.TaskVO; +import com.poliveira.javaverse.entities.TaskEntity; +import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface TaskRepository extends JpaRepository { - - // Custom query methods can be defined here if needed - // For example, to find tasks by status: - // List findByStatus(Status status); - -} +public interface TaskRepository extends JpaRepository {} diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java b/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java index 1e129fe..a431ed8 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java @@ -2,12 +2,14 @@ import static com.poliveira.javaverse.models.Status.TODO; import static java.lang.System.currentTimeMillis; -import static java.util.Objects.nonNull; +import com.poliveira.javaverse.entities.TaskEntity; import com.poliveira.javaverse.models.SimpleTaskVO; import com.poliveira.javaverse.models.TaskVO; +import com.poliveira.javaverse.processors.MappingService; import com.poliveira.javaverse.repositories.TaskRepository; import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -16,13 +18,15 @@ public class TaskService { private final TaskRepository taskRepository; + private final MappingService mappingService; public List getAllTasks() { - return taskRepository.findAll(); + return taskRepository.findAll().stream().map(mappingService::toVO).toList(); } - public TaskVO getTaskById(Long id) { - return taskRepository.findById(id).orElse(null); + public TaskVO getTaskById(UUID id) { + TaskEntity taskEntity = taskRepository.findById(id).orElseThrow(); + return mappingService.toVO(taskEntity); } public TaskVO createTask(SimpleTaskVO simpleTaskVO) { @@ -34,21 +38,20 @@ public TaskVO createTask(SimpleTaskVO simpleTaskVO) { .createdAt(currentTimeMillis()) .updatedAt(currentTimeMillis()) .build(); - return taskRepository.save(task); + TaskEntity taskEntity = mappingService.toEntity(task); + return mappingService.toVO(taskRepository.save(taskEntity)); } - public TaskVO updateTask(Long id, SimpleTaskVO task) { - TaskVO existingTask = taskRepository.findById(id).orElse(null); - if (nonNull(existingTask)) { - existingTask.setTitle(task.getTitle()); - existingTask.setDescription(task.getDescription()); - existingTask.setUpdatedAt(currentTimeMillis()); - return taskRepository.save(existingTask); - } - return null; + public TaskVO updateTask(UUID id, SimpleTaskVO task) { + TaskEntity existingTask = taskRepository.findById(id).orElseThrow(); + TaskVO taskVo = mappingService.toVO(existingTask); + taskVo.setTitle(task.getTitle()); + taskVo.setDescription(task.getDescription()); + taskVo.setUpdatedAt(currentTimeMillis()); + return mappingService.toVO(taskRepository.save(mappingService.toEntity(taskVo))); } - public boolean deleteTask(Long id) { + public boolean deleteTask(UUID id) { try { taskRepository.deleteById(id); return true; diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/utils/TimeUtils.java b/maven-spring/src/main/java/com/poliveira/javaverse/utils/TimeUtils.java new file mode 100644 index 0000000..a61f4e9 --- /dev/null +++ b/maven-spring/src/main/java/com/poliveira/javaverse/utils/TimeUtils.java @@ -0,0 +1,23 @@ +package com.poliveira.javaverse.utils; + +import static java.lang.System.currentTimeMillis; +import static java.time.ZoneOffset.UTC; + +import java.time.LocalDateTime; +import java.util.Objects; +import org.springframework.stereotype.Service; + +@Service +public class TimeUtils { + public LocalDateTime toLocalDateTime(long epochSecond) { + return LocalDateTime.ofEpochSecond(epochSecond / 1000, 0, UTC); + } + + public long toEpochMilli(LocalDateTime localDateTime) { + if (Objects.isNull(localDateTime)) { + return currentTimeMillis(); + } + + return localDateTime.toEpochSecond(UTC) * 1000; + } +} From e7aa67b2a1f2e3f6449e3a3a831fc19986109aa5 Mon Sep 17 00:00:00 2001 From: Paulo Oliveira Date: Wed, 23 Apr 2025 11:33:46 +0100 Subject: [PATCH 5/8] flyway: clean code --- .../javaverse/processors/MappingService.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java b/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java index 680bba1..42e3f6a 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java @@ -1,11 +1,8 @@ package com.poliveira.javaverse.processors; import com.poliveira.javaverse.entities.TaskEntity; -import com.poliveira.javaverse.models.SimpleTaskVO; -import com.poliveira.javaverse.models.Status; import com.poliveira.javaverse.models.TaskVO; import com.poliveira.javaverse.utils.TimeUtils; -import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -26,16 +23,6 @@ public TaskEntity toEntity(TaskVO taskVO) { .build(); } - public TaskEntity toEntity(SimpleTaskVO simpleTaskVO) { - return TaskEntity.builder() - .title(simpleTaskVO.getTitle()) - .description(simpleTaskVO.getDescription()) - .createdAt(LocalDateTime.now()) - .updatedAt(LocalDateTime.now()) - .status(Status.TODO) // Default status - .build(); - } - public TaskVO toVO(TaskEntity taskEntity) { return TaskVO.builder() .id(taskEntity.getId()) From 18dbd168416b840a374e4900f91aee486ea086b9 Mon Sep 17 00:00:00 2001 From: Paulo Oliveira Date: Wed, 23 Apr 2025 18:42:16 +0100 Subject: [PATCH 6/8] flyway: add postgresql flyway dependency; fixed VO/entities names; fixed test with new objects; --- maven-spring/pom.xml | 8 +- .../javaverse/entities/StatusEntity.java | 4 + .../javaverse/entities/TaskEntity.java | 5 +- .../javaverse/models/SimpleTaskVO.java | 12 +- .../poliveira/javaverse/models/Status.java | 12 +- .../poliveira/javaverse/models/TaskVO.java | 2 +- .../javaverse/processors/MappingService.java | 18 ++- .../javaverse/services/TaskService.java | 8 +- .../src/main/resources/application-dev.yml | 15 +- .../javaverse/TasksRepositoryTest.java | 145 ++++++++++-------- .../poliveira/javaverse/TasksServiceTest.java | 117 +++++++++----- 11 files changed, 208 insertions(+), 138 deletions(-) diff --git a/maven-spring/pom.xml b/maven-spring/pom.xml index fa779ed..8f82e41 100644 --- a/maven-spring/pom.xml +++ b/maven-spring/pom.xml @@ -59,7 +59,13 @@ org.flywaydb flyway-core - 10.20.0 + 11.7.2 + + + + org.flywaydb + flyway-database-postgresql + 11.7.2 diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/entities/StatusEntity.java b/maven-spring/src/main/java/com/poliveira/javaverse/entities/StatusEntity.java index 518ed18..fbf56cc 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/entities/StatusEntity.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/entities/StatusEntity.java @@ -3,12 +3,16 @@ import jakarta.persistence.*; import java.time.LocalDateTime; import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Entity +@Builder @NoArgsConstructor +@AllArgsConstructor @Table(name = "status", schema = "public") public class StatusEntity { @Id diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/entities/TaskEntity.java b/maven-spring/src/main/java/com/poliveira/javaverse/entities/TaskEntity.java index efc2c3d..a56adfc 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/entities/TaskEntity.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/entities/TaskEntity.java @@ -1,6 +1,5 @@ package com.poliveira.javaverse.entities; -import com.poliveira.javaverse.models.Status; import jakarta.persistence.*; import java.time.LocalDateTime; import java.util.UUID; @@ -20,7 +19,7 @@ public class TaskEntity { @Id @GeneratedValue private UUID id; @Column(nullable = false) - private String title; + private String name; private String description; @@ -32,5 +31,5 @@ public class TaskEntity { @ManyToOne @JoinColumn(name = "status_id") - private Status status; + private StatusEntity status; } diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/models/SimpleTaskVO.java b/maven-spring/src/main/java/com/poliveira/javaverse/models/SimpleTaskVO.java index 7732ad4..8a4504b 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/models/SimpleTaskVO.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/models/SimpleTaskVO.java @@ -1,26 +1,16 @@ package com.poliveira.javaverse.models; -import static jakarta.persistence.GenerationType.IDENTITY; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data -@Entity @Builder @NoArgsConstructor @AllArgsConstructor public class SimpleTaskVO { - @Id - @GeneratedValue(strategy = IDENTITY) - private long id; - - private String title; + private String name; private String description; } diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/models/Status.java b/maven-spring/src/main/java/com/poliveira/javaverse/models/Status.java index 540591b..4fabeb2 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/models/Status.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/models/Status.java @@ -8,9 +8,19 @@ @Getter @RequiredArgsConstructor(access = PRIVATE) public enum Status { - TODO("To Do"), + OPEN("Open"), IN_PROGRESS("In Progress"), + BLOCKED("Blocked"), DONE("Done"); private final String status; + + public static Status from(String status) { + for (Status s : Status.values()) { + if (s.getStatus().equalsIgnoreCase(status)) { + return s; + } + } + throw new IllegalArgumentException("Invalid status: " + status); + } } diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java b/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java index dadac90..34de51a 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/models/TaskVO.java @@ -13,7 +13,7 @@ public class TaskVO { private UUID id; - private String title; + private String name; private String description; private Status status; private long createdAt; diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java b/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java index 42e3f6a..a42bbc0 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/processors/MappingService.java @@ -1,6 +1,8 @@ package com.poliveira.javaverse.processors; +import com.poliveira.javaverse.entities.StatusEntity; import com.poliveira.javaverse.entities.TaskEntity; +import com.poliveira.javaverse.models.Status; import com.poliveira.javaverse.models.TaskVO; import com.poliveira.javaverse.utils.TimeUtils; import lombok.RequiredArgsConstructor; @@ -12,23 +14,31 @@ public class MappingService { private final TimeUtils timeUtils; + public Status toVO(StatusEntity statusEntity) { + return Status.from(statusEntity.getName()); + } + + public StatusEntity toEntity(Status status) { + return StatusEntity.builder().name(status.name()).build(); + } + public TaskEntity toEntity(TaskVO taskVO) { return TaskEntity.builder() .id(taskVO.getId()) - .title(taskVO.getTitle()) + .name(taskVO.getName()) .description(taskVO.getDescription()) .createdAt(timeUtils.toLocalDateTime(taskVO.getCreatedAt())) .updatedAt(timeUtils.toLocalDateTime(taskVO.getUpdatedAt())) - .status(taskVO.getStatus()) + .status(toEntity(taskVO.getStatus())) .build(); } public TaskVO toVO(TaskEntity taskEntity) { return TaskVO.builder() .id(taskEntity.getId()) - .title(taskEntity.getTitle()) + .name(taskEntity.getName()) .description(taskEntity.getDescription()) - .status(taskEntity.getStatus()) + .status(toVO(taskEntity.getStatus())) .createdAt(timeUtils.toEpochMilli(taskEntity.getCreatedAt())) .updatedAt(timeUtils.toEpochMilli(taskEntity.getUpdatedAt())) .build(); diff --git a/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java b/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java index a431ed8..acb08d6 100644 --- a/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java +++ b/maven-spring/src/main/java/com/poliveira/javaverse/services/TaskService.java @@ -1,6 +1,6 @@ package com.poliveira.javaverse.services; -import static com.poliveira.javaverse.models.Status.TODO; +import static com.poliveira.javaverse.models.Status.OPEN; import static java.lang.System.currentTimeMillis; import com.poliveira.javaverse.entities.TaskEntity; @@ -32,9 +32,9 @@ public TaskVO getTaskById(UUID id) { public TaskVO createTask(SimpleTaskVO simpleTaskVO) { TaskVO task = TaskVO.builder() - .title(simpleTaskVO.getTitle()) + .name(simpleTaskVO.getName()) .description(simpleTaskVO.getDescription()) - .status(TODO) + .status(OPEN) .createdAt(currentTimeMillis()) .updatedAt(currentTimeMillis()) .build(); @@ -45,7 +45,7 @@ public TaskVO createTask(SimpleTaskVO simpleTaskVO) { public TaskVO updateTask(UUID id, SimpleTaskVO task) { TaskEntity existingTask = taskRepository.findById(id).orElseThrow(); TaskVO taskVo = mappingService.toVO(existingTask); - taskVo.setTitle(task.getTitle()); + taskVo.setName(task.getName()); taskVo.setDescription(task.getDescription()); taskVo.setUpdatedAt(currentTimeMillis()); return mappingService.toVO(taskRepository.save(mappingService.toEntity(taskVo))); diff --git a/maven-spring/src/main/resources/application-dev.yml b/maven-spring/src/main/resources/application-dev.yml index 56d6bb7..2cc43ae 100644 --- a/maven-spring/src/main/resources/application-dev.yml +++ b/maven-spring/src/main/resources/application-dev.yml @@ -1,16 +1,3 @@ spring: - application: - name: javaverse - datasource: - url: jdbc:postgresql://localhost:5432/tasks - username: myuser - password: mypassword - driver-class-name: "org.postgresql.Driver" - - jpa: - hibernate: - ddl-auto: update - -server: - port: 5190 + url: jdbc:postgresql://localhost:5432/tasks \ No newline at end of file diff --git a/maven-spring/src/test/java/com/poliveira/javaverse/TasksRepositoryTest.java b/maven-spring/src/test/java/com/poliveira/javaverse/TasksRepositoryTest.java index 5fc2d90..742818c 100644 --- a/maven-spring/src/test/java/com/poliveira/javaverse/TasksRepositoryTest.java +++ b/maven-spring/src/test/java/com/poliveira/javaverse/TasksRepositoryTest.java @@ -1,16 +1,18 @@ package com.poliveira.javaverse; -import static com.poliveira.javaverse.models.Status.TODO; import static java.lang.System.currentTimeMillis; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -import com.poliveira.javaverse.models.TaskVO; +import com.poliveira.javaverse.entities.StatusEntity; +import com.poliveira.javaverse.entities.TaskEntity; import com.poliveira.javaverse.repositories.TaskRepository; +import com.poliveira.javaverse.utils.TimeUtils; import java.util.List; +import java.util.Optional; +import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -22,108 +24,123 @@ public class TasksRepositoryTest { @Mock private TaskRepository taskRepository; + private TimeUtils timeUtils = new TimeUtils(); + private StatusEntity open = + StatusEntity.builder() + .id(UUID.fromString("D6127F26-55B6-408D-A010-322FBEC9B1B1")) + .name("Open") + .build(); + @BeforeEach public void setUp() {} @Test public void testCreateTask() { - TaskVO mockTaskVO = - TaskVO.builder() - .id(1L) - .title("New Task") + UUID taskId = UUID.randomUUID(); + TaskEntity mockTaskEntity = + TaskEntity.builder() + .id(taskId) + .name("New Task") .description("This is a new task") - .status(TODO) - .createdAt(currentTimeMillis()) - .updatedAt(currentTimeMillis()) + .status(open) + .status(open) + .status(open) + .createdAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .updatedAt(timeUtils.toLocalDateTime(currentTimeMillis())) .build(); - when(taskRepository.save(any(TaskVO.class))).thenReturn(mockTaskVO); + when(taskRepository.save(any(TaskEntity.class))).thenReturn(mockTaskEntity); - TaskVO taskVO = taskRepository.save(mockTaskVO); - assertTrue(taskVO.getId() > 0); - assertEquals(mockTaskVO.getTitle(), taskVO.getTitle()); - assertEquals(mockTaskVO.getDescription(), taskVO.getDescription()); - assertEquals(TODO, taskVO.getStatus()); + TaskEntity taskEntity = taskRepository.save(mockTaskEntity); + assertEquals(taskEntity.getId(), taskId); + assertEquals(mockTaskEntity.getName(), taskEntity.getName()); + assertEquals(mockTaskEntity.getDescription(), taskEntity.getDescription()); + assertEquals(open.getId(), taskEntity.getStatus().getId()); + assertEquals(open.getName(), taskEntity.getStatus().getName()); } @Test public void testFindAllTasks() { - TaskVO task1 = - TaskVO.builder() - .id(1L) - .title("Task 1") + UUID taskId1 = UUID.randomUUID(); + TaskEntity task1 = + TaskEntity.builder() + .id(taskId1) + .name("Task 1") .description("Description 1") - .status(TODO) - .createdAt(currentTimeMillis()) - .updatedAt(currentTimeMillis()) + .createdAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .updatedAt(timeUtils.toLocalDateTime(currentTimeMillis())) .build(); - TaskVO task2 = - TaskVO.builder() - .id(2L) - .title("Task 2") + UUID taskId2 = UUID.randomUUID(); + TaskEntity task2 = + TaskEntity.builder() + .id(taskId2) + .name("Task 2") .description("Description 2") - .status(TODO) - .createdAt(currentTimeMillis()) - .updatedAt(currentTimeMillis()) + .createdAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .updatedAt(timeUtils.toLocalDateTime(currentTimeMillis())) .build(); when(taskRepository.findAll()).thenReturn(List.of(task1, task2)); - List tasks = taskRepository.findAll(); + List tasks = taskRepository.findAll(); assertEquals(2, tasks.size()); - assertEquals(task1.getTitle(), tasks.get(0).getTitle()); - assertEquals(task2.getTitle(), tasks.get(1).getTitle()); + assertEquals(task1.getName(), tasks.get(0).getName()); + assertEquals(task2.getName(), tasks.get(1).getName()); } @Test public void testFindById() { - TaskVO task1 = - TaskVO.builder() - .id(1L) - .title("Task 1") + UUID taskId = UUID.randomUUID(); + TaskEntity task1 = + TaskEntity.builder() + .id(taskId) + .name("Task 1") .description("Description 1") - .status(TODO) - .createdAt(currentTimeMillis()) - .updatedAt(currentTimeMillis()) + .status(open) + .createdAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .updatedAt(timeUtils.toLocalDateTime(currentTimeMillis())) .build(); - when(taskRepository.findById(1L)).thenReturn(java.util.Optional.of(task1)); + when(taskRepository.findById(taskId)).thenReturn(Optional.of(task1)); - TaskVO foundTask = taskRepository.findById(1L).orElse(null); + TaskEntity foundTask = taskRepository.findById(taskId).orElse(null); assertNotNull(foundTask); - assertEquals(task1.getTitle(), foundTask.getTitle()); + assertEquals(task1.getName(), foundTask.getName()); assertEquals(task1.getDescription(), foundTask.getDescription()); } @Test public void testUpdateTask() { - TaskVO mockTaskVO = - TaskVO.builder() - .id(1L) - .title("New Task") + UUID taskId = UUID.randomUUID(); + TaskEntity mockTaskEntity = + TaskEntity.builder() + .id(taskId) + .name("New Task") .description("This is an new task") - .status(TODO) - .createdAt(currentTimeMillis()) - .updatedAt(currentTimeMillis()) + .status(open) + .createdAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .updatedAt(timeUtils.toLocalDateTime(currentTimeMillis())) .build(); - when(taskRepository.save(any(TaskVO.class))).thenReturn(mockTaskVO); + when(taskRepository.save(any(TaskEntity.class))).thenReturn(mockTaskEntity); - TaskVO taskVO1 = taskRepository.save(mockTaskVO); - assertTrue(taskVO1.getId() > 0); - assertEquals(mockTaskVO.getTitle(), taskVO1.getTitle()); - assertEquals(mockTaskVO.getDescription(), taskVO1.getDescription()); - assertEquals(TODO, taskVO1.getStatus()); + TaskEntity taskEntity1 = taskRepository.save(mockTaskEntity); + assertEquals(taskEntity1.getId(), taskId); + assertEquals(mockTaskEntity.getName(), taskEntity1.getName()); + assertEquals(mockTaskEntity.getDescription(), taskEntity1.getDescription()); + assertEquals(open.getId(), taskEntity1.getStatus().getId()); + assertEquals(open.getName(), taskEntity1.getStatus().getName()); // update the task - mockTaskVO.setTitle("Updated Task"); - when(taskRepository.save(any(TaskVO.class))).thenReturn(mockTaskVO); - - TaskVO taskVO2 = taskRepository.save(mockTaskVO); - assertTrue(taskVO2.getId() > 0); - assertEquals(mockTaskVO.getTitle(), taskVO2.getTitle()); - assertEquals(mockTaskVO.getDescription(), taskVO2.getDescription()); - assertEquals(TODO, taskVO2.getStatus()); + mockTaskEntity.setName("Updated Task"); + when(taskRepository.save(any(TaskEntity.class))).thenReturn(mockTaskEntity); + + TaskEntity taskEntity2 = taskRepository.save(mockTaskEntity); + assertEquals(taskEntity2.getId(), taskId); + assertEquals(mockTaskEntity.getName(), taskEntity2.getName()); + assertEquals(mockTaskEntity.getDescription(), taskEntity2.getDescription()); + assertEquals(open.getId(), taskEntity2.getStatus().getId()); + assertEquals(open.getName(), taskEntity2.getStatus().getName()); } } diff --git a/maven-spring/src/test/java/com/poliveira/javaverse/TasksServiceTest.java b/maven-spring/src/test/java/com/poliveira/javaverse/TasksServiceTest.java index 8997984..d94c417 100644 --- a/maven-spring/src/test/java/com/poliveira/javaverse/TasksServiceTest.java +++ b/maven-spring/src/test/java/com/poliveira/javaverse/TasksServiceTest.java @@ -1,18 +1,22 @@ package com.poliveira.javaverse; -import static com.poliveira.javaverse.models.Status.TODO; +import static com.poliveira.javaverse.models.Status.OPEN; import static java.lang.System.currentTimeMillis; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; +import com.poliveira.javaverse.entities.StatusEntity; +import com.poliveira.javaverse.entities.TaskEntity; import com.poliveira.javaverse.models.SimpleTaskVO; import com.poliveira.javaverse.models.TaskVO; +import com.poliveira.javaverse.processors.MappingService; import com.poliveira.javaverse.repositories.TaskRepository; import com.poliveira.javaverse.services.TaskService; +import com.poliveira.javaverse.utils.TimeUtils; import java.util.List; import java.util.Optional; +import java.util.UUID; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -22,79 +26,122 @@ @ExtendWith(MockitoExtension.class) public class TasksServiceTest { + private final StatusEntity open = + StatusEntity.builder() + .id(UUID.fromString("D6127F26-55B6-408D-A010-322FBEC9B1B1")) + .name("Open") + .build(); + + @Mock private TimeUtils timeUtils; + @Mock private MappingService mappingService; @Mock private TaskRepository taskRepository; @InjectMocks private TaskService taskService; @Test public void testCreateTask() { SimpleTaskVO task = - SimpleTaskVO.builder().title("New Task").description("This is a new task").build(); + SimpleTaskVO.builder().name("New Task").description("This is a new task").build(); + UUID taskId = UUID.randomUUID(); + long now = currentTimeMillis(); + TaskEntity mockTaskEntity = + TaskEntity.builder() + .id(taskId) + .name("New Task") + .description("This is a new task") + .status(open) + .createdAt(timeUtils.toLocalDateTime(now)) + .updatedAt(timeUtils.toLocalDateTime(now)) + .build(); TaskVO mockTaskVO = TaskVO.builder() - .id(1L) - .title(task.getTitle()) - .description(task.getDescription()) - .status(TODO) - .createdAt(currentTimeMillis()) - .updatedAt(currentTimeMillis()) + .id(taskId) + .name("New Task") + .description("This is a new task") + .status(OPEN) + .createdAt(now) + .updatedAt(now) .build(); - when(taskRepository.save(any(TaskVO.class))).thenReturn(mockTaskVO); + when(mappingService.toVO(any(TaskEntity.class))).thenReturn(mockTaskVO); + when(mappingService.toEntity(any(TaskVO.class))).thenReturn(mockTaskEntity); + when(taskRepository.save(any(TaskEntity.class))).thenReturn(mockTaskEntity); TaskVO taskVO = taskService.createTask(task); - assertTrue(taskVO.getId() > 0); - assertEquals(task.getTitle(), taskVO.getTitle()); - assertEquals(task.getDescription(), taskVO.getDescription()); - assertEquals(TODO, taskVO.getStatus()); + assertEquals(taskVO.getId(), taskId); + assertEquals("New Task", taskVO.getName()); + assertEquals("This is a new task", taskVO.getDescription()); + assertEquals(OPEN, taskVO.getStatus()); } @Test public void testFindAll() { - TaskVO task = + TaskVO mockTaskVO = TaskVO.builder() - .id(1L) - .title("Test Task") + .id(UUID.randomUUID()) + .name("Test Task") .description("This is a test task") - .status(TODO) + .status(OPEN) .createdAt(currentTimeMillis()) .updatedAt(currentTimeMillis()) .build(); + TaskEntity task = + TaskEntity.builder() + .id(UUID.randomUUID()) + .name("Test Task") + .description("This is a test task") + .status(open) + .createdAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .updatedAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .build(); + when(mappingService.toVO(any(TaskEntity.class))).thenReturn(mockTaskVO); when(taskRepository.findAll()).thenReturn(List.of(task)); List tasks = taskService.getAllTasks(); assertEquals(1, tasks.size()); - assertEquals(task.getTitle(), tasks.getFirst().getTitle()); + assertEquals(task.getName(), tasks.getFirst().getName()); } @Test public void testUpdateTask() { - TaskVO mockExistingTask = + UUID taskId = UUID.randomUUID(); + TaskEntity mockExistingTask = + TaskEntity.builder() + .id(taskId) + .name("Old Task") + .description("This is an old task") + .status(open) + .createdAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .updatedAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .build(); + TaskVO mockExistingTaskVO = TaskVO.builder() - .id(1L) - .title("Old Task") + .id(taskId) + .name("Old Task") .description("This is an old task") - .status(TODO) + .status(OPEN) .createdAt(currentTimeMillis()) .updatedAt(currentTimeMillis()) .build(); - TaskVO mockUpdatedTask = - TaskVO.builder() - .id(1L) - .title("Updated Task") + TaskEntity mockUpdatedTask = + TaskEntity.builder() + .id(taskId) + .name("Updated Task") .description("This is an updated task") - .status(TODO) - .createdAt(currentTimeMillis()) - .updatedAt(currentTimeMillis()) + .status(open) + .createdAt(timeUtils.toLocalDateTime(currentTimeMillis())) + .updatedAt(timeUtils.toLocalDateTime(currentTimeMillis())) .build(); - when(taskRepository.findById(1L)).thenReturn(Optional.of(mockExistingTask)); - when(taskRepository.save(any(TaskVO.class))).thenReturn(mockUpdatedTask); + when(taskRepository.findById(taskId)).thenReturn(Optional.of(mockExistingTask)); + when(mappingService.toVO(any(TaskEntity.class))).thenReturn(mockExistingTaskVO); + when(mappingService.toEntity(any(TaskVO.class))).thenReturn(mockUpdatedTask); + when(taskRepository.save(any(TaskEntity.class))).thenReturn(mockUpdatedTask); SimpleTaskVO task = - SimpleTaskVO.builder().title("Updated Task").description("This is an updated task").build(); - TaskVO updatedTask = taskService.updateTask(1L, task); - assertEquals(task.getTitle(), updatedTask.getTitle()); + SimpleTaskVO.builder().name("Updated Task").description("This is an updated task").build(); + TaskVO updatedTask = taskService.updateTask(taskId, task); + assertEquals(task.getName(), updatedTask.getName()); assertEquals(task.getDescription(), updatedTask.getDescription()); } } From de8ab82ac35c1896029d72325d35e741d225c2e5 Mon Sep 17 00:00:00 2001 From: Paulo Oliveira Date: Wed, 23 Apr 2025 21:50:09 +0100 Subject: [PATCH 7/8] flyway: bump version --- maven-spring/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven-spring/pom.xml b/maven-spring/pom.xml index 8f82e41..7ce0976 100644 --- a/maven-spring/pom.xml +++ b/maven-spring/pom.xml @@ -11,7 +11,7 @@ com.poliveira javaverse - 0.0.1 + 0.1.0 javaverse JavaVerse macro project for mutiverse of Java From d93052ab3fc4d8d214d357bd0911f48f78225444 Mon Sep 17 00:00:00 2001 From: Paulo Oliveira Date: Wed, 23 Apr 2025 22:03:49 +0100 Subject: [PATCH 8/8] flyway: update dependencies --- maven-spring/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maven-spring/pom.xml b/maven-spring/pom.xml index 7ce0976..2def633 100644 --- a/maven-spring/pom.xml +++ b/maven-spring/pom.xml @@ -35,13 +35,13 @@ org.springframework.boot spring-boot-starter-web - 3.3.4 + 3.4.4 org.springframework.boot spring-boot-starter-data-jpa - 3.3.4 + 3.4.4 @@ -53,7 +53,7 @@ org.postgresql postgresql - 42.7.4 + 42.7.5