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}