feat(#145): add recent-activity endpoint sorted by updatedAt
Add GET /api/documents/recent-activity?size=N endpoint that returns the N most recently updated documents sorted by updatedAt DESC. Includes TDD: failing tests written first, then production code. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -406,6 +406,27 @@ class DocumentControllerTest {
|
||||
.andExpect(status().isNoContent());
|
||||
}
|
||||
|
||||
// ─── GET /api/documents/recent-activity ──────────────────────────────────
|
||||
|
||||
@Test
|
||||
void getRecentActivity_returns401_whenUnauthenticated() throws Exception {
|
||||
mockMvc.perform(get("/api/documents/recent-activity"))
|
||||
.andExpect(status().isUnauthorized());
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockUser
|
||||
void getRecentActivity_returnsOkWithDocuments() throws Exception {
|
||||
Document doc1 = Document.builder().id(UUID.randomUUID()).title("Alpha").originalFilename("a.pdf").build();
|
||||
Document doc2 = Document.builder().id(UUID.randomUUID()).title("Beta").originalFilename("b.pdf").build();
|
||||
when(documentService.getRecentActivity(5)).thenReturn(List.of(doc1, doc2));
|
||||
|
||||
mockMvc.perform(get("/api/documents/recent-activity").param("size", "5"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$[0].title").value("Alpha"))
|
||||
.andExpect(jsonPath("$[1].title").value("Beta"));
|
||||
}
|
||||
|
||||
// ─── GET /api/documents/{id}/versions ────────────────────────────────────
|
||||
|
||||
@Test
|
||||
|
||||
@@ -1213,4 +1213,26 @@ class DocumentServiceTest {
|
||||
|
||||
verify(documentRepository).findAll(any(org.springframework.data.jpa.domain.Specification.class), any(Sort.class));
|
||||
}
|
||||
|
||||
// ─── getRecentActivity ────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
void getRecentActivity_returnsMostRecentlyUpdatedDocuments() {
|
||||
java.time.LocalDateTime oldest = java.time.LocalDateTime.of(2024, 1, 1, 0, 0);
|
||||
java.time.LocalDateTime middle = java.time.LocalDateTime.of(2024, 6, 1, 0, 0);
|
||||
java.time.LocalDateTime newest = java.time.LocalDateTime.of(2024, 12, 1, 0, 0);
|
||||
|
||||
Document doc1 = Document.builder().id(UUID.randomUUID()).title("Oldest").build();
|
||||
Document doc2 = Document.builder().id(UUID.randomUUID()).title("Middle").build();
|
||||
Document doc3 = Document.builder().id(UUID.randomUUID()).title("Newest").build();
|
||||
|
||||
// findAll(Sort) returns documents already sorted DESC by updatedAt
|
||||
when(documentRepository.findAll(Sort.by(Sort.Direction.DESC, "updatedAt")))
|
||||
.thenReturn(List.of(doc3, doc2, doc1));
|
||||
|
||||
List<Document> result = documentService.getRecentActivity(2);
|
||||
|
||||
assertThat(result).hasSize(2);
|
||||
assertThat(result).containsExactly(doc3, doc2);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user