001package edu.pdx.cs.joy.airlineweb;
002
003import org.junit.jupiter.api.Test;
004import org.mockito.ArgumentCaptor;
005
006import jakarta.servlet.http.HttpServletRequest;
007import jakarta.servlet.http.HttpServletResponse;
008import java.io.IOException;
009import java.io.PrintWriter;
010import java.io.StringWriter;
011
012import static org.hamcrest.MatcherAssert.assertThat;
013import static org.hamcrest.Matchers.containsString;
014import static org.hamcrest.Matchers.equalTo;
015import static org.mockito.Mockito.*;
016
017/**
018 * A unit test for the {@link AirlineServlet}.  It uses mockito to
019 * provide mock http requests and responses.
020 */
021class AirlineServletTest {
022
023  @Test
024  void initiallyServletContainsNoDictionaryEntries() throws IOException {
025    AirlineServlet servlet = new AirlineServlet();
026
027    HttpServletRequest request = mock(HttpServletRequest.class);
028    HttpServletResponse response = mock(HttpServletResponse.class);
029    PrintWriter pw = mock(PrintWriter.class);
030
031    when(response.getWriter()).thenReturn(pw);
032
033    servlet.doGet(request, response);
034
035    // Nothing is written to the response's PrintWriter
036    verify(pw, never()).println(anyString());
037    verify(response).setStatus(HttpServletResponse.SC_OK);
038  }
039
040  @Test
041  void addOneWordToDictionary() throws IOException {
042    AirlineServlet servlet = new AirlineServlet();
043
044    String word = "TEST WORD";
045    String definition = "TEST DEFINITION";
046
047    HttpServletRequest request = mock(HttpServletRequest.class);
048    when(request.getParameter(AirlineServlet.WORD_PARAMETER)).thenReturn(word);
049    when(request.getParameter(AirlineServlet.DEFINITION_PARAMETER)).thenReturn(definition);
050
051    HttpServletResponse response = mock(HttpServletResponse.class);
052
053    // Use a StringWriter to gather the text from multiple calls to println()
054    StringWriter stringWriter = new StringWriter();
055    PrintWriter pw = new PrintWriter(stringWriter, true);
056
057    when(response.getWriter()).thenReturn(pw);
058
059    servlet.doPost(request, response);
060
061    assertThat(stringWriter.toString(), containsString(Messages.definedWordAs(word, definition)));
062
063    // Use an ArgumentCaptor when you want to make multiple assertions against the value passed to the mock
064    ArgumentCaptor<Integer> statusCode = ArgumentCaptor.forClass(Integer.class);
065    verify(response).setStatus(statusCode.capture());
066
067    assertThat(statusCode.getValue(), equalTo(HttpServletResponse.SC_OK));
068
069    assertThat(servlet.getDefinition(word), equalTo(definition));
070  }
071
072}