LoginControllerTest.java

package it.unisa.thespoon.login.control;

import it.unisa.thespoon.exceptionhandler.RestExceptionHandler;
import it.unisa.thespoon.filters.JwtAuthenticationFilter;
import it.unisa.thespoon.jwt.service.JwtService;
import it.unisa.thespoon.login.service.LoginServiceImpl;
import it.unisa.thespoon.login.service.UserService;
import it.unisa.thespoon.model.dao.RistoratoreDAO;
import it.unisa.thespoon.model.entity.Ristoratore;
import it.unisa.thespoon.model.entity.Role;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import java.time.LocalDate;

import static org.junit.jupiter.api.Assertions.*;

/**
 * @author Jacopo Gennaro Esposito
 * La classe si occupa di testare gli enpoint delle API del
 * sottosistema di login
 * */
@SpringBootTest
@ExtendWith(MockitoExtension.class)
class LoginControllerTest {
    @Autowired
    private JwtAuthenticationFilter filter;

    @Autowired
    private RistoratoreDAO ristoratoreDAO;
    @Mock
    private PasswordEncoder passwordEncoder;
    @Autowired
    private UserService userService;
    @Autowired
    private JwtService jwtService;
    @MockBean
    private AuthenticationManager authenticationManager;
    private LoginController underTest;
    MockMvc mockMvc;

    @BeforeEach
    void setUp() {
        this.underTest = new LoginController(new LoginServiceImpl(ristoratoreDAO,
            passwordEncoder, userService, jwtService, authenticationManager));
        this.mockMvc = MockMvcBuilders.standaloneSetup(underTest).setControllerAdvice(RestExceptionHandler.class).build();
    }

    @AfterEach
    void tearDown() {
        ristoratoreDAO.deleteAll();
    }

    /**
     * Testa l'endpoint di login effettuando una richiesta con
     * parametri validi
     * */
    @Test
    void login() throws Exception {
        //Given
        Ristoratore ristoratore = new Ristoratore(1, "ShenYue98", "Jacopo"
                , "Espsosito", "shen@yue.it", "3510857328", LocalDate.now(), Role.ROLE_RISTORATORE);
        ristoratoreDAO.save(ristoratore);

        String jsonString = "{" +
                "\"email\": \"shen@yue.it\"," +
                "\"password\": \"ShenYue98\"" +
                "}";

        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/auth/login")
                .contentType(MediaType.APPLICATION_JSON)
                .content(jsonString)
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON);

        //When
        MvcResult result = mockMvc.perform(requestBuilder).andDo(MockMvcResultHandlers.print()).andReturn();

        //Then
        assertEquals(MockHttpServletResponse.SC_OK, result.getResponse().getStatus());
    }

    /**
     * Testa l'endpoint di registrazione effettuando una richiesta con
     * parametri validi
     * */
    @Test
    void signUp() throws Exception {
        //Given
        String jsonString = "{" +
                "\"email\": \"shen@yue.it\"," +
                "\"password\": \"ShenYue98\"," +
                "\"rePassword\": \"ShenYue98\"," +
                "\"nome\": \"Yue\"," +
                "\"cognome\": \"Shen\"," +
                "\"telefono\": \"3510857328\"," +
                "\"data_Nascita\": \"1998-10-08\"" + "}";

        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/auth/signup")
                .contentType(MediaType.APPLICATION_JSON)
                .content(jsonString)
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON);

        //When
        MvcResult result = mockMvc.perform(requestBuilder).andDo(MockMvcResultHandlers.print()).andReturn();

        //Then
        assertEquals(MockHttpServletResponse.SC_OK, result.getResponse().getStatus());
    }

    /**
     * Testa l'endpoint di login effettuando una richiesta con
     * password non corrispondente a quella salvata nel DB
     * */
    @Test
    void loginFailed() throws Exception {

        String jsonString = "{" +
                "\"email\": \"shen@yue.it\"," +
                "\"password\": \"ShenYue\"" +
                "}";

        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/auth/login")
                .contentType(MediaType.APPLICATION_JSON)
                .content(jsonString)
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON);

        //When
        MvcResult result = mockMvc.perform(requestBuilder).andDo(MockMvcResultHandlers.print()).andReturn();

        //Then
        assertEquals(MockHttpServletResponse.SC_UNAUTHORIZED, result.getResponse().getStatus());
    }

    /**
     * Testa l'endpoint di registrazione effettuando una richiesta con
     * parametri non validi
     * */
    @Test
    void signUPFailed() throws Exception {
        //Given
        String jsonString = "{" +
                "\"email\": \"shen@yue.it\"," +
                "\"password\": \"ShenYue\"," +
                "\"rePassword\": \"ShenYue98\"," +
                "\"nome\": \"Yue\"," +
                "\"cognome\": \"Shen\"," +
                "\"telefono\": \"3510857328\"," +
                "\"data_Nascita\": \"1998-10-08\"" + "}";

        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/auth/signup")
                .contentType(MediaType.APPLICATION_JSON)
                .content(jsonString)
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON);

        //When
        MvcResult result = mockMvc.perform(requestBuilder).andDo(MockMvcResultHandlers.print()).andReturn();

        //Then
        assertEquals(MockHttpServletResponse.SC_BAD_REQUEST, result.getResponse().getStatus());
    }

    /**
     * Testa l'endpoint di registrazione effettuando una richiesta
     * inserendo una mail giĆ  presente nel DB
     * */
    @Test
    void signUPFailedUserAlreadyExists() throws Exception {
        //Given
        Ristoratore ristoratore = new Ristoratore(1, "ShenYue98", "Jacopo"
                , "Espsosito", "shen@yue.it", "3510857328", LocalDate.now(), Role.ROLE_RISTORATORE);
        ristoratoreDAO.save(ristoratore);

        String jsonString = "{" +
                "\"email\": \"shen@yue.it\"," +
                "\"password\": \"ShenYue98\"," +
                "\"rePassword\": \"ShenYue98\"," +
                "\"nome\": \"Yue\"," +
                "\"cognome\": \"Shen\"," +
                "\"telefono\": \"3510857328\"," +
                "\"data_Nascita\": \"1998-10-08\"" + "}";

        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/auth/signup")
                .contentType(MediaType.APPLICATION_JSON)
                .content(jsonString)
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON);

        //When
        MvcResult result = mockMvc.perform(requestBuilder).andDo(MockMvcResultHandlers.print()).andReturn();

        //Then
        assertEquals(MockHttpServletResponse.SC_CONFLICT, result.getResponse().getStatus());
    }
}