From c01e9944f0d252134031a3685fc2011fa9164f99 Mon Sep 17 00:00:00 2001 From: swatanabe Date: Wed, 24 Sep 2025 23:14:54 +0900 Subject: [PATCH 1/2] 2025-09-24commit --- .../petclinic/owner/OwnerController.java | 5 ++- .../petclinic/owner/OwnerRepository.java | 5 ++- .../petclinic/owner/OwnerRestController.java | 21 ++++++++++++ .../samples/petclinic/owner/OwnerService.java | 17 ++++++++++ .../samples/petclinic/owner/Pet.java | 10 ++++-- .../petclinic/system/WelcomeController.java | 18 ++++++++--- .../resources/messages/messages.properties | 1 + src/main/resources/templates/welcome.html | 4 ++- .../petclinic/owner/OwnerRepositoryTest.java | 20 ++++++++++++ .../owner/OwnerRestControllerTest.java | 32 +++++++++++++++++++ .../petclinic/service/OwnerServiceTest.java | 32 +++++++++++++++++++ 11 files changed, 153 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/springframework/samples/petclinic/owner/OwnerRestController.java create mode 100644 src/main/java/org/springframework/samples/petclinic/owner/OwnerService.java create mode 100644 src/test/java/org/springframework/samples/petclinic/owner/OwnerRepositoryTest.java create mode 100644 src/test/java/org/springframework/samples/petclinic/owner/OwnerRestControllerTest.java create mode 100644 src/test/java/org/springframework/samples/petclinic/service/OwnerServiceTest.java diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java index 1348457ee7d..11e3077bcfd 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java @@ -18,6 +18,8 @@ import java.util.List; import java.util.Optional; +import jakarta.validation.Valid; + import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -32,8 +34,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; - -import jakarta.validation.Valid; import org.springframework.web.servlet.mvc.support.RedirectAttributes; /** @@ -169,5 +169,4 @@ public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { mav.addObject(owner); return mav; } - } diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java index 9384b318e1f..34cb25d70d3 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java @@ -15,10 +15,10 @@ */ package org.springframework.samples.petclinic.owner; -import java.util.List; import java.util.Optional; import jakarta.annotation.Nonnull; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -61,5 +61,8 @@ public interface OwnerRepository extends JpaRepository { * input for id) */ Optional findById(@Nonnull Integer id); + + @Query("SELECT COUNT(o) FROM Owner o") + long countOwners(); } diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerRestController.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerRestController.java new file mode 100644 index 00000000000..a7033d20672 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerRestController.java @@ -0,0 +1,21 @@ +package org.springframework.samples.petclinic.owner; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/owners") +public class OwnerRestController { + + private final OwnerService ownerService; + + public OwnerRestController(OwnerService ownerService) { + this.ownerService = ownerService; + } + + @GetMapping("/count") + public long getOwnerCount() { + return ownerService.getOwnerCount(); + } +} diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerService.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerService.java new file mode 100644 index 00000000000..c4f6d946575 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerService.java @@ -0,0 +1,17 @@ +package org.springframework.samples.petclinic.owner; + +import org.springframework.stereotype.Service; + +@Service +public class OwnerService { + + private final OwnerRepository ownerRepository; + + public OwnerService(OwnerRepository ownerRepository) { + this.ownerRepository = ownerRepository; + } + + public long getOwnerCount() { + return ownerRepository.countOwners(); + } +} \ No newline at end of file diff --git a/src/main/java/org/springframework/samples/petclinic/owner/Pet.java b/src/main/java/org/springframework/samples/petclinic/owner/Pet.java index 1945f9b6718..e9f12bcbe63 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/Pet.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/Pet.java @@ -20,9 +20,6 @@ import java.util.LinkedHashSet; import java.util.Set; -import org.springframework.format.annotation.DateTimeFormat; -import org.springframework.samples.petclinic.model.NamedEntity; - import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -32,6 +29,10 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.OrderBy; import jakarta.persistence.Table; +import jakarta.validation.constraints.Size; + +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.samples.petclinic.model.NamedEntity; /** * Simple business object representing a pet. @@ -44,6 +45,9 @@ @Entity @Table(name = "pets") public class Pet extends NamedEntity { + + @Size(min = 3, max = 50, message = "{pet.name.size}") + private String name; @Column(name = "birth_date") @DateTimeFormat(pattern = "yyyy-MM-dd") diff --git a/src/main/java/org/springframework/samples/petclinic/system/WelcomeController.java b/src/main/java/org/springframework/samples/petclinic/system/WelcomeController.java index d77a35ea8c6..e8b4ebc884d 100644 --- a/src/main/java/org/springframework/samples/petclinic/system/WelcomeController.java +++ b/src/main/java/org/springframework/samples/petclinic/system/WelcomeController.java @@ -16,15 +16,25 @@ package org.springframework.samples.petclinic.system; +import org.springframework.samples.petclinic.owner.OwnerService; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller class WelcomeController { + + private final OwnerService ownerService; - @GetMapping("/") - public String welcome() { - return "welcome"; - } + public WelcomeController(OwnerService ownerService) { + this.ownerService = ownerService; + } + + @GetMapping("/") + public String welcome(Model model) { + long ownerCount = ownerService.getOwnerCount(); + model.addAttribute("ownerCount", ownerCount); + return "welcome"; // welcome.html を表示 + } } diff --git a/src/main/resources/messages/messages.properties b/src/main/resources/messages/messages.properties index 7b8b5dfd8b8..ac62ad9bff6 100644 --- a/src/main/resources/messages/messages.properties +++ b/src/main/resources/messages/messages.properties @@ -46,3 +46,4 @@ visitDate=Visit Date editOwner=Edit Owner addNewPet=Add New Pet petsAndVisits=Pets and Visits +pet.name.size=ペットの名前は3文字以上50文字以内で入力してください diff --git a/src/main/resources/templates/welcome.html b/src/main/resources/templates/welcome.html index eb795c2f487..c474e29decc 100644 --- a/src/main/resources/templates/welcome.html +++ b/src/main/resources/templates/welcome.html @@ -4,12 +4,14 @@ -

Welcome

+

Welcome

登録されているオーナー数:

+ + diff --git a/src/test/java/org/springframework/samples/petclinic/owner/OwnerRepositoryTest.java b/src/test/java/org/springframework/samples/petclinic/owner/OwnerRepositoryTest.java new file mode 100644 index 00000000000..1f4379420cf --- /dev/null +++ b/src/test/java/org/springframework/samples/petclinic/owner/OwnerRepositoryTest.java @@ -0,0 +1,20 @@ +package org.springframework.samples.petclinic.owner; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +@DataJpaTest +public class OwnerRepositoryTest { + + @Autowired + private OwnerRepository ownerRepository; + + @Test + void testCountOwners() { + long count = ownerRepository.count(); + assertThat(count).isGreaterThan(0); // データがあることを確認 + } +} diff --git a/src/test/java/org/springframework/samples/petclinic/owner/OwnerRestControllerTest.java b/src/test/java/org/springframework/samples/petclinic/owner/OwnerRestControllerTest.java new file mode 100644 index 00000000000..f587c2f5844 --- /dev/null +++ b/src/test/java/org/springframework/samples/petclinic/owner/OwnerRestControllerTest.java @@ -0,0 +1,32 @@ +package org.springframework.samples.petclinic.owner; + +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; + +@WebMvcTest(OwnerRestController.class) +public class OwnerRestControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private OwnerService ownerService; + + @Test + void testGetOwnerCountEndpoint() throws Exception { + when(ownerService.getOwnerCount()).thenReturn(10L); + + mockMvc.perform(get("/api/owners/count")) + .andExpect(status().isOk()) + .andExpect(content().string("10")); + + verify(ownerService, times(1)).getOwnerCount(); + } +} diff --git a/src/test/java/org/springframework/samples/petclinic/service/OwnerServiceTest.java b/src/test/java/org/springframework/samples/petclinic/service/OwnerServiceTest.java new file mode 100644 index 00000000000..53af59d9f96 --- /dev/null +++ b/src/test/java/org/springframework/samples/petclinic/service/OwnerServiceTest.java @@ -0,0 +1,32 @@ +package org.springframework.samples.petclinic.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.samples.petclinic.owner.OwnerRepository; +import org.springframework.samples.petclinic.owner.OwnerService; + +@ExtendWith(MockitoExtension.class) +public class OwnerServiceTest { + + @Mock + private OwnerRepository ownerRepository; + + @InjectMocks + private OwnerService ownerService; + + @Test + void testGetOwnerCount() { + when(ownerRepository.count()).thenReturn(5L); + + long count = ownerService.getOwnerCount(); + + assertThat(count).isEqualTo(5L); + verify(ownerRepository, times(1)).count(); + } +} From 074d7db0c8e1745050c4cf0bb07a33e70e8a0533 Mon Sep 17 00:00:00 2001 From: swatanabe Date: Mon, 29 Sep 2025 22:28:57 +0900 Subject: [PATCH 2/2] =?UTF-8?q?20250929=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springframework/samples/petclinic/model/NamedEntity.java | 2 ++ .../java/org/springframework/samples/petclinic/owner/Pet.java | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java index d4be03e9ee4..7c2e6ad39a2 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java +++ b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java @@ -18,6 +18,7 @@ import jakarta.persistence.Column; import jakarta.persistence.MappedSuperclass; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; /** * Simple JavaBean domain object adds a name property to BaseEntity. Used as @@ -32,6 +33,7 @@ public class NamedEntity extends BaseEntity { @Column(name = "name") @NotBlank + @Size(min = 3, max = 50) private String name; public String getName() { diff --git a/src/main/java/org/springframework/samples/petclinic/owner/Pet.java b/src/main/java/org/springframework/samples/petclinic/owner/Pet.java index e9f12bcbe63..68c37d886aa 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/Pet.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/Pet.java @@ -29,7 +29,6 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.OrderBy; import jakarta.persistence.Table; -import jakarta.validation.constraints.Size; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.samples.petclinic.model.NamedEntity; @@ -45,9 +44,6 @@ @Entity @Table(name = "pets") public class Pet extends NamedEntity { - - @Size(min = 3, max = 50, message = "{pet.name.size}") - private String name; @Column(name = "birth_date") @DateTimeFormat(pattern = "yyyy-MM-dd")