Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Trib 244: bug fix users may not cosign themselves #163

Merged
merged 11 commits into from
Mar 19, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.savvato.tribeapp.config.principal.UserPrincipal;
import com.savvato.tribeapp.controllers.annotations.controllers.ConnectAPIController.*;
import com.savvato.tribeapp.controllers.annotations.responses.BadRequest;
import com.savvato.tribeapp.controllers.dto.ConnectRequest;
import com.savvato.tribeapp.controllers.dto.CosignRequest;
import com.savvato.tribeapp.dto.ConnectIncomingMessageDTO;
Expand Down Expand Up @@ -92,10 +93,13 @@ public void connect(@Payload ConnectIncomingMessageDTO incoming, @Header("simpSe
@PostMapping("/cosign")
public ResponseEntity<CosignDTO> saveCosign(@RequestBody @Valid CosignRequest cosignRequest) {

CosignDTO cosignDTO = cosignService.saveCosign(cosignRequest.userIdIssuing, cosignRequest.userIdReceiving, cosignRequest.phraseId);

return ResponseEntity.status(HttpStatus.OK).body(cosignDTO);
Optional<CosignDTO> opt = cosignService.saveCosign(cosignRequest.userIdIssuing, cosignRequest.userIdReceiving, cosignRequest.phraseId);

if(opt.isEmpty()) {
log.error("Users may not cosign themselves. ");
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(null);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to a quick Googling, 400 BAD REQUEST, perhaps including the string "Users may not cosign themselves.", is most appropriate.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In oder to return a message, I changed the return type from ResponseEntity to ResponseEntity. The endpoint now returns either a CosignDTO or a GenericMessageDTO with a string. Is this what you were envisioning?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, I had a couple merge conflicts to fix, and it may make for some strange formatting commits in the cosign service imports. I didn't realize you were working on it and I didn't pull before push. oops.

}
return ResponseEntity.status(HttpStatus.OK).body(opt.get());
}
@DeleteCosign
@DeleteMapping("/cosign")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@

public interface CosignService {

CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId);
Optional<CosignDTO> saveCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId);
boolean deleteCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.savvato.tribeapp.services;

import com.savvato.tribeapp.controllers.dto.CosignRequest;
import com.savvato.tribeapp.dto.CosignDTO;
import com.savvato.tribeapp.entities.Cosign;
import com.savvato.tribeapp.repositories.CosignRepository;
Expand All @@ -18,7 +17,11 @@ public class CosignServiceImpl implements CosignService {
CosignRepository cosignRepository;

@Override
public CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId) {
public Optional<CosignDTO> saveCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId) {

if(userIdIssuing == userIdReceiving) {
return Optional.empty();
}

Cosign cosign = new Cosign();
cosign.setUserIdIssuing(userIdIssuing);
Expand All @@ -35,7 +38,7 @@ public CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phras
.phraseId(savedCosign.getPhraseId())
.build();

return cosignDTO;
return Optional.of(cosignDTO);
}

@Override
Expand Down
54 changes: 41 additions & 13 deletions src/test/java/com/savvato/tribeapp/controllers/ConnectAPITest.java
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ public void connectSadPath() throws Exception {
}



@Test
public void connectWhenQrCodeInvalid() throws Exception {
when(userPrincipalService.getUserPrincipalByEmail(Mockito.anyString()))
Expand Down Expand Up @@ -233,21 +234,21 @@ public void saveCosign() throws Exception {
.thenReturn(new UserPrincipal(user));
String auth = AuthServiceImpl.generateAccessToken(user);

Long userIdIssuing = 1L;
Long userIdReceiving = 1L;
Long phraseId = 1L;
Long testUserIdIssuing = 1L;
Long testUserIdReceiving = 2L;
Long testPhraseId = 1L;

CosignRequest cosignRequest = new CosignRequest();
cosignRequest.userIdIssuing = userIdIssuing;
cosignRequest.userIdReceiving = userIdReceiving;
cosignRequest.phraseId = phraseId;
CosignDTO mockCosignDTO = CosignDTO.builder().build();
mockCosignDTO.userIdIssuing = testUserIdIssuing;
mockCosignDTO.userIdReceiving = testUserIdReceiving;
mockCosignDTO.phraseId = testPhraseId;

CosignDTO cosignDTO = CosignDTO.builder().build();
cosignDTO.userIdIssuing = userIdIssuing;
cosignDTO.userIdReceiving = userIdReceiving;
cosignDTO.phraseId = phraseId;
CosignRequest cosignRequest = new CosignRequest();
cosignRequest.userIdIssuing = testUserIdIssuing;
cosignRequest.userIdReceiving = testUserIdReceiving;
cosignRequest.phraseId = testPhraseId;

when(cosignService.saveCosign(anyLong(), anyLong(), anyLong())).thenReturn(cosignDTO);
when(cosignService.saveCosign(anyLong(), anyLong(), anyLong())).thenReturn(Optional.of(mockCosignDTO));

this.mockMvc
.perform(
Expand All @@ -257,8 +258,35 @@ public void saveCosign() throws Exception {
.header("Authorization", "Bearer " + auth)
.characterEncoding("utf-8"))
.andExpect(status().isOk())
.andExpect(content().json("{\"userIdIssuing\":1,\"userIdReceiving\":1,\"phraseId\":1}"));
.andExpect(content().json("{\"userIdIssuing\":1,\"userIdReceiving\":2,\"phraseId\":1}"));

}

@Test
public void saveCosignSadPathUserCosignsThemselves() throws Exception {
when(userPrincipalService.getUserPrincipalByEmail(Mockito.anyString()))
.thenReturn(new UserPrincipal(user));
String auth = AuthServiceImpl.generateAccessToken(user);

Long testUserIdIssuing = 1L;
Long testUserIdReceiving = 1L;
Long testPhraseId = 1L;

CosignRequest cosignRequest = new CosignRequest();
cosignRequest.userIdIssuing = testUserIdIssuing;
cosignRequest.userIdReceiving = testUserIdReceiving;
cosignRequest.phraseId = testPhraseId;

when(cosignService.saveCosign(anyLong(), anyLong(), anyLong())).thenReturn(Optional.empty());

this.mockMvc
.perform(
post("/api/connect/cosign")
.content(gson.toJson(cosignRequest))
.contentType(MediaType.APPLICATION_JSON)
.header("Authorization", "Bearer " + auth)
.characterEncoding("utf-8"))
.andExpect(status().isForbidden());
}

public void removeConnectionHappyPath() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.util.Optional;

import static net.bytebuddy.matcher.ElementMatchers.any;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.*;

Expand All @@ -38,57 +41,63 @@ public CosignService cosignService() {
@Test
public void saveCosign() {
Long userIdIssuing = 1L;
Long userIdReceiving = 1L;
Long userIdReceiving = 2L;
Long phraseId = 1L;

Cosign cosign = new Cosign();
cosign.setUserIdIssuing(userIdIssuing);
cosign.setUserIdReceiving(userIdReceiving);
cosign.setPhraseId(phraseId);
Cosign mockCosign = new Cosign();
mockCosign.setUserIdIssuing(userIdIssuing);
mockCosign.setUserIdReceiving(userIdReceiving);
mockCosign.setPhraseId(phraseId);

CosignDTO cosignDTO = CosignDTO.builder().build();
cosignDTO.userIdIssuing = userIdIssuing;
cosignDTO.userIdReceiving = userIdReceiving;
cosignDTO.phraseId = phraseId;
CosignDTO expectedCosignDTO = CosignDTO.builder().build();
expectedCosignDTO.userIdIssuing = userIdIssuing;
expectedCosignDTO.userIdReceiving = userIdReceiving;
expectedCosignDTO.phraseId = phraseId;

when(cosignRepository.save(Mockito.any())).thenReturn(cosign);
when(cosignRepository.save(Mockito.any())).thenReturn(mockCosign);

CosignDTO expectedCosignDTO = cosignService.saveCosign(userIdIssuing, userIdReceiving, phraseId);
Optional<CosignDTO> CosignDTO = cosignService.saveCosign(userIdIssuing, userIdReceiving, phraseId);

verify(cosignRepository, times(1)).save(Mockito.any());
assertEquals(cosignDTO.userIdIssuing, expectedCosignDTO.userIdIssuing);
assertEquals(cosignDTO.userIdReceiving, expectedCosignDTO.userIdReceiving);
assertEquals(cosignDTO.phraseId, expectedCosignDTO.phraseId);
assertThat(CosignDTO.get()).usingRecursiveComparison().isEqualTo(expectedCosignDTO);
}

@Test
public void saveCosignAlreadyExisting() {
Long userIdIssuing = 1L;
Long userIdReceiving = 1L;
Long userIdReceiving = 2L;
Long phraseId = 1L;

Cosign cosign = new Cosign();
cosign.setUserIdIssuing(userIdIssuing);
cosign.setUserIdReceiving(userIdReceiving);
cosign.setPhraseId(phraseId);
Cosign mockCosign = new Cosign();
mockCosign.setUserIdIssuing(userIdIssuing);
mockCosign.setUserIdReceiving(userIdReceiving);
mockCosign.setPhraseId(phraseId);

CosignDTO expectedCosignDTO = CosignDTO.builder().build();
expectedCosignDTO.userIdIssuing = userIdIssuing;
expectedCosignDTO.userIdReceiving = userIdReceiving;
expectedCosignDTO.phraseId = phraseId;

when(cosignRepository.save(Mockito.any())).thenReturn(mockCosign).thenReturn(mockCosign);

CosignDTO cosignDTO = CosignDTO.builder().build();
cosignDTO.userIdIssuing = userIdIssuing;
cosignDTO.userIdReceiving = userIdReceiving;
cosignDTO.phraseId = phraseId;
Optional<CosignDTO> CosignDTO = cosignService.saveCosign(userIdIssuing, userIdReceiving, phraseId);

when(cosignRepository.save(Mockito.any())).thenReturn(cosign).thenReturn(cosign);
assertThat(CosignDTO.get()).usingRecursiveComparison().isEqualTo(expectedCosignDTO);

CosignDTO expectedCosignDTO = cosignService.saveCosign(userIdIssuing, userIdReceiving, phraseId);
Optional<CosignDTO> CosignDTORepeat = cosignService.saveCosign(userIdIssuing, userIdReceiving, phraseId);

assertEquals(cosignDTO.userIdIssuing, expectedCosignDTO.userIdIssuing);
assertEquals(cosignDTO.userIdReceiving, expectedCosignDTO.userIdReceiving);
assertEquals(cosignDTO.phraseId, expectedCosignDTO.phraseId);
assertThat(CosignDTORepeat.get()).usingRecursiveComparison().isEqualTo(expectedCosignDTO);
}

@Test
public void saveCosignFailsWhenIdsEqual() {
Long testUserIdIssuing = 1L;
Long testUserIdReceiving = 1L;
Long testPhraseId = 1L;

CosignDTO expectedCosignDTORepeat = cosignService.saveCosign(userIdIssuing, userIdReceiving, phraseId);
Optional<CosignDTO> cosignDTO = cosignService.saveCosign(testUserIdIssuing, testUserIdReceiving, testPhraseId);

assertEquals(cosignDTO.userIdIssuing, expectedCosignDTORepeat.userIdIssuing);
assertEquals(cosignDTO.userIdReceiving, expectedCosignDTORepeat.userIdReceiving);
assertEquals(cosignDTO.phraseId, expectedCosignDTORepeat.phraseId);
verify(cosignRepository, never()).save(Mockito.any());
assertThat(cosignDTO).usingRecursiveComparison().isEqualTo(Optional.empty());
}
}
Loading