Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.patinanetwork.patchats.api.member.dto.UpdateMemberRequest;
import org.patinanetwork.patchats.common.dto.ApiResponder;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
Expand Down Expand Up @@ -37,11 +38,11 @@ public ResponseEntity<ApiResponder<MemberDto>> updateMember(
return ResponseEntity.ok(ApiResponder.success("Member updated successfully", response));
}

// @GetMapping("/{id}")
// public ResponseEntity<ApiResponder<MemberDto>> getMember(@PathVariable final UUID id) {
// final MemberDto response = memberService.getMemberById(id);
// return ResponseEntity.ok(ApiResponder.success("Member retrieved successfully", response));
// }
@GetMapping("/{id}")
public ResponseEntity<ApiResponder<MemberDto>> getMemberById(@PathVariable final UUID id) {
final MemberDto response = memberService.getMemberById(id);
return ResponseEntity.ok(ApiResponder.success("Member retrieved successfully", response));
}

// @DeleteMapping("/{id}")
// public ResponseEntity<ApiResponder<MemberDto>> deactivateMember(@PathVariable final UUID id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public MemberDto updateMember(UpdateMemberRequest request, UUID id) {
return MemberDto.from(updatedMember);
}

// Helper methods for updateMember
private void validateAndUpdateRequired(Member member, UpdateMemberRequest request) {
validateAndUpdate(request.firstName(), member::setFirstName, "firstName");
validateAndUpdate(request.lastName(), member::setLastName, "lastName");
Expand Down Expand Up @@ -98,13 +99,10 @@ private void updateOptional(Member member, UpdateMemberRequest request) {
request.extraNotes().ifPresent(member::setExtraNotes);
}

// TODO: Implement these methods after createMember and updateMember is fully functional and tested
// public MemberDto getMemberById(UUID id) {
// return memberRepo
// .getMemberById(id)
// .map(MemberDto::from)
// .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Member not found"));
// }
public MemberDto getMemberById(UUID id) {
Member member = memberRepo.getMemberById(id).orElseThrow(() -> new MemberNotFoundException(id));
return MemberDto.from(member);
}

// public MemberDto deactivateMember(UUID id) {
// return memberRepo
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
Expand Down Expand Up @@ -123,6 +125,47 @@ void createMemberReturnsConflictOnDuplicateEmail() throws Exception {
.andExpect(jsonPath("$.success").value(false));
}

@Test
void getMemberById_returnsOkAndMemberDto() throws Exception {
final UUID id = UUID.randomUUID();
final MemberDto response = MemberDto.builder()
.id(id)
.firstName("John")
.lastName("Doe")
.email("john.doe@example.com")
.active(true)
.build();
when(memberService.getMemberById(id)).thenReturn(response);

mockMvc.perform(get("/api/members/{id}", id))
.andExpect(status().isOk())
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.message").value("Member retrieved successfully"))
.andExpect(jsonPath("$.payload.id").value(id.toString()))
.andExpect(jsonPath("$.payload.firstName").value("John"))
.andExpect(jsonPath("$.payload.lastName").value("Doe"))
.andExpect(jsonPath("$.payload.email").value("john.doe@example.com"))
.andExpect(jsonPath("$.payload.active").value(true));

verify(memberService).getMemberById(id);
}

@Test
void getMemberById_returnsNotFoundWhenMemberDoesNotExist() throws Exception {
final UUID id = UUID.randomUUID();
when(memberService.getMemberById(id)).thenThrow(new MemberNotFoundException(id));

mockMvc.perform(get("/api/members/{id}", id))
.andExpect(status().isNotFound())
.andExpect(jsonPath("$.success").value(false))
.andExpect(jsonPath("$.message").value("Member with ID " + id + " not found"));
}

@Test
void getMemberById_returnsBadRequestWhenIdIsInvalid() throws Exception {
mockMvc.perform(get("/api/members/{id}", "invalid-uuid")).andExpect(status().isBadRequest());
}

@Test
void updateMember_successWithValidRequest() throws Exception {
final UUID id = UUID.randomUUID();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,56 @@ void createMemberThrowsExceptionWhenEmailAlreadyExists() {
verify(memberRepo, never()).createMember(any());
}

@Test
void getMemberById_returnsMemberDtoWhenMemberExists() {
final UUID id = UUID.randomUUID();
final Member member = Member.builder()
.id(id)
.firstName("John")
.lastName("Doe")
.email("john.doe@example.com")
.linkedInUrl("https://www.linkedin.com/in/johndoe")
.introduction("Hello, I'm John!")
.referralSource("Friend")
.active(true)
.matchPref("Mentor")
.industryPref("Technology")
.rolePref("Software Engineer")
.topics("Career Development")
.extraNotes("Prefers in-person chats")
.build();
when(memberRepo.getMemberById(id)).thenReturn(Optional.of(member));

final MemberDto response = memberService.getMemberById(id);

assertEquals(id, response.getId());
assertEquals("John", response.getFirstName());
assertEquals("Doe", response.getLastName());
assertEquals("john.doe@example.com", response.getEmail());
assertEquals("https://www.linkedin.com/in/johndoe", response.getLinkedInUrl());
assertEquals("Hello, I'm John!", response.getIntroduction());
assertEquals("Friend", response.getReferralSource());
assertTrue(response.getActive());
assertEquals("Mentor", response.getMatchPref());
assertEquals("Technology", response.getIndustryPref());
assertEquals("Software Engineer", response.getRolePref());
assertEquals("Career Development", response.getTopics());
assertEquals("Prefers in-person chats", response.getExtraNotes());
verify(memberRepo).getMemberById(id);
}

@Test
void getMemberById_throwsExceptionWhenMemberNotFound() {
final UUID id = UUID.randomUUID();
when(memberRepo.getMemberById(id)).thenReturn(Optional.empty());

final MemberNotFoundException exception =
assertThrows(MemberNotFoundException.class, () -> memberService.getMemberById(id));

assertEquals("Member with ID " + id + " not found", exception.getMessage());
verify(memberRepo).getMemberById(id);
}

@Test
void updateMember_throwsExceptionWhenMemberNotFound() {
final UUID id = UUID.randomUUID();
Expand Down