11package dev .delivercraft .math .gui ;
22
3- import static org .assertj .core .api .Assertions .assertThat ;
4- import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .get ;
5- import static org .springframework .test .web .servlet .result .MockMvcResultMatchers .status ;
6-
73import org .htmlunit .WebClient ;
8- import org .htmlunit .html .HtmlDivision ;
94import org .htmlunit .html .HtmlNumberInput ;
105import org .htmlunit .html .HtmlPage ;
11- import java .io .IOException ;
126import org .junit .jupiter .api .Test ;
137import org .junit .jupiter .params .ParameterizedTest ;
148import org .junit .jupiter .params .provider .ValueSource ;
1812import org .springframework .test .web .servlet .setup .MockMvcBuilders ;
1913import org .springframework .web .context .WebApplicationContext ;
2014
15+ import java .io .IOException ;
16+
17+ import static org .assertj .core .api .Assertions .assertThat ;
18+ import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .get ;
19+ import static org .springframework .test .web .servlet .result .MockMvcResultMatchers .status ;
20+
2121@ WebMvcTest
2222class ApplicationTest {
2323
24+ private static final String BAD_INPUT_MESSAGE = "Enter whole numbers greater than or equal to zero." ;
25+
26+ private static final String FIRST_ID = "firstInput" ;
27+
28+ private static final String SECOND_ID = "secondInput" ;
29+
30+ private static final String MESSAGE_ID = "validationMessage" ;
31+
32+ private static final String ADDITION_ID = "addition" ;
33+
34+ private static final String SUBTRACTION_ID = "subtraction" ;
35+
36+ private static final String MULTIPLICATION_ID = "multiplication" ;
37+
38+ private static final String DIVISION_ID = "division" ;
39+
2440 private final MockMvc mockMvc ;
2541
2642 private final WebClient webClient ;
@@ -41,60 +57,105 @@ void indexFileIsAccessibleImplicitlyOrExplicitly(String path) throws Exception {
4157 void defaultCalculationsAreShown () throws IOException {
4258 HtmlPage page = getHtmlPage ();
4359
44- assertThat (firstInputNumberInput (page ).getDefaultValue ()).isEqualTo ("10" );
45- assertThat (secondInputNumberInput (page ).getDefaultValue ()).isEqualTo ("5" );
46- assertThat (additionDiv (page ).getTextContent ()).isEqualTo ("10 + 5 = 15" );
47- assertThat (subtractionDiv (page ).getTextContent ()).isEqualTo ("10 - 5 = 5" );
48- assertThat (multiplicationDiv (page ).getTextContent ()).isEqualTo ("10 × 5 = 50" );
49- assertThat (divisionDiv (page ).getTextContent ()).isEqualTo ("10 ÷ 5 = 2" );
60+ assertThat (numberInput (page , FIRST_ID ).getDefaultValue ()).isEqualTo ("10" );
61+ assertThat (numberInput (page , SECOND_ID ).getDefaultValue ()).isEqualTo ("5" );
62+ assertThat (text (page , MESSAGE_ID )).isEmpty ();
63+ assertThat (text (page , ADDITION_ID )).isEqualTo ("10 + 5 = 15" );
64+ assertThat (text (page , SUBTRACTION_ID )).isEqualTo ("10 - 5 = 5" );
65+ assertThat (text (page , MULTIPLICATION_ID )).isEqualTo ("10 × 5 = 50" );
66+ assertThat (text (page , DIVISION_ID )).isEqualTo ("10 ÷ 5 = 2" );
67+ }
68+
69+ @ Test
70+ void pageMetadataAndNumberInputConstraintsAreShown () throws IOException {
71+ HtmlPage page = getHtmlPage ();
72+
73+ assertThat (page .asXml ()).contains ("rel=\" icon\" " );
74+ assertThat (numberInput (page , FIRST_ID ).hasAttribute ("required" )).isTrue ();
75+ assertThat (numberInput (page , FIRST_ID ).getAttribute ("min" )).isEqualTo ("0" );
76+ assertThat (numberInput (page , FIRST_ID ).getAttribute ("step" )).isEqualTo ("1" );
77+ assertThat (numberInput (page , SECOND_ID ).hasAttribute ("required" )).isTrue ();
78+ assertThat (numberInput (page , SECOND_ID ).getAttribute ("min" )).isEqualTo ("0" );
79+ assertThat (numberInput (page , SECOND_ID ).getAttribute ("step" )).isEqualTo ("1" );
5080 }
5181
5282 @ Test
5383 void calculationsAreUpdatedOnUserInput () throws IOException {
5484 HtmlPage page = getHtmlPage ();
55- HtmlNumberInput firstInput = firstInputNumberInput (page );
56- HtmlNumberInput secondInput = secondInputNumberInput (page );
85+ HtmlNumberInput firstInput = numberInput (page , FIRST_ID );
86+ HtmlNumberInput secondInput = numberInput (page , SECOND_ID );
5787
5888 firstInput .setValueAttribute ("20" );
5989 fireInputEventFor (firstInput );
6090 secondInput .setValueAttribute ("4" );
6191 fireInputEventFor (secondInput );
6292
63- assertThat (additionDiv (page ).getTextContent ()).isEqualTo ("20 + 4 = 24" );
64- assertThat (subtractionDiv (page ).getTextContent ()).isEqualTo ("20 - 4 = 16" );
65- assertThat (multiplicationDiv (page ).getTextContent ()).isEqualTo ("20 × 4 = 80" );
66- assertThat (divisionDiv (page ).getTextContent ()).isEqualTo ("20 ÷ 4 = 5" );
93+ assertThat (text (page , ADDITION_ID )).isEqualTo ("20 + 4 = 24" );
94+ assertThat (text (page , SUBTRACTION_ID )).isEqualTo ("20 - 4 = 16" );
95+ assertThat (text (page , MULTIPLICATION_ID )).isEqualTo ("20 × 4 = 80" );
96+ assertThat (text (page , DIVISION_ID )).isEqualTo ("20 ÷ 4 = 5" );
97+ }
98+
99+ @ ParameterizedTest
100+ @ ValueSource (strings = {"" , "-1" , "1.5" })
101+ void calculationsAreHiddenWhenInputIsInvalid (String invalidInput ) throws IOException {
102+ HtmlPage page = getHtmlPage ();
103+ HtmlNumberInput firstInput = numberInput (page , FIRST_ID );
104+
105+ firstInput .setValueAttribute (invalidInput );
106+ fireInputEventFor (firstInput );
107+
108+ assertThat (text (page , MESSAGE_ID )).isEqualTo (BAD_INPUT_MESSAGE );
109+ assertThat (text (page , ADDITION_ID )).isEmpty ();
110+ assertThat (text (page , SUBTRACTION_ID )).isEmpty ();
111+ assertThat (text (page , MULTIPLICATION_ID )).isEmpty ();
112+ assertThat (text (page , DIVISION_ID )).isEmpty ();
113+ }
114+
115+ @ Test
116+ void validInputClearsValidationMessage () throws IOException {
117+ HtmlPage page = getHtmlPage ();
118+ HtmlNumberInput firstInput = numberInput (page , FIRST_ID );
119+
120+ firstInput .setValueAttribute ("-1" );
121+ fireInputEventFor (firstInput );
122+ firstInput .setValueAttribute ("12" );
123+ fireInputEventFor (firstInput );
124+
125+ assertThat (text (page , MESSAGE_ID )).isEmpty ();
126+ assertThat (text (page , ADDITION_ID )).isEqualTo ("12 + 5 = 17" );
67127 }
68128
69129 @ Test
70130 void resetToDefaultButtonShouldWork () throws IOException {
71131 HtmlPage page = getHtmlPage ();
72- HtmlNumberInput firstInput = firstInputNumberInput (page );
132+ HtmlNumberInput firstInput = numberInput (page , FIRST_ID );
73133 firstInput .setValueAttribute ("20" );
74134 fireInputEventFor (firstInput );
75- HtmlNumberInput secondInput = secondInputNumberInput (page );
135+ HtmlNumberInput secondInput = numberInput (page , SECOND_ID );
76136 secondInput .setValueAttribute ("4" );
77137 fireInputEventFor (secondInput );
78138
79139 page = page .getHtmlElementById ("resetButton" ).click ();
80140
81- assertThat (firstInputNumberInput (page ).getValue ()).isEqualTo ("10" );
82- assertThat (secondInputNumberInput (page ).getValue ()).isEqualTo ("5" );
83- assertThat (additionDiv (page ).getTextContent ()).isEqualTo ("10 + 5 = 15" );
84- assertThat (subtractionDiv (page ).getTextContent ()).isEqualTo ("10 - 5 = 5" );
85- assertThat (multiplicationDiv (page ).getTextContent ()).isEqualTo ("10 × 5 = 50" );
86- assertThat (divisionDiv (page ).getTextContent ()).isEqualTo ("10 ÷ 5 = 2" );
141+ assertThat (numberInput (page , FIRST_ID ).getValue ()).isEqualTo ("10" );
142+ assertThat (numberInput (page , SECOND_ID ).getValue ()).isEqualTo ("5" );
143+ assertThat (text (page , MESSAGE_ID )).isEmpty ();
144+ assertThat (text (page , ADDITION_ID )).isEqualTo ("10 + 5 = 15" );
145+ assertThat (text (page , SUBTRACTION_ID )).isEqualTo ("10 - 5 = 5" );
146+ assertThat (text (page , MULTIPLICATION_ID )).isEqualTo ("10 × 5 = 50" );
147+ assertThat (text (page , DIVISION_ID )).isEqualTo ("10 ÷ 5 = 2" );
87148 }
88149
89150 @ Test
90151 void divisionByZeroIsHandledProperlyByShowingAMessage () throws IOException {
91152 HtmlPage page = getHtmlPage ();
92- HtmlNumberInput secondInput = secondInputNumberInput (page );
153+ HtmlNumberInput secondInput = numberInput (page , SECOND_ID );
93154
94155 secondInput .setValueAttribute ("0" );
95156 fireInputEventFor (secondInput );
96157
97- assertThat (divisionDiv (page ). getTextContent ( )).isEqualTo ("Cannot divide by zero!" );
158+ assertThat (text (page , DIVISION_ID )).isEqualTo ("Cannot divide by zero!" );
98159 }
99160
100161 private HtmlPage getHtmlPage () throws IOException {
@@ -105,27 +166,11 @@ private static void fireInputEventFor(HtmlNumberInput numberInput) {
105166 numberInput .fireEvent ("input" );
106167 }
107168
108- private HtmlNumberInput secondInputNumberInput (HtmlPage page ) {
109- return page .getHtmlElementById ("secondInput" );
110- }
111-
112- private HtmlNumberInput firstInputNumberInput (HtmlPage page ) {
113- return page .getHtmlElementById ("firstInput" );
114- }
115-
116- private HtmlDivision additionDiv (HtmlPage page ) {
117- return page .getHtmlElementById ("addition" );
118- }
119-
120- private HtmlDivision subtractionDiv (HtmlPage page ) {
121- return page .getHtmlElementById ("subtraction" );
122- }
123-
124- private HtmlDivision multiplicationDiv (HtmlPage page ) {
125- return page .getHtmlElementById ("multiplication" );
169+ private static HtmlNumberInput numberInput (HtmlPage page , String elementId ) {
170+ return page .getHtmlElementById (elementId );
126171 }
127172
128- private HtmlDivision divisionDiv (HtmlPage page ) {
129- return page .getHtmlElementById ("division" );
173+ private static String text (HtmlPage page , String elementId ) {
174+ return page .getHtmlElementById (elementId ). getTextContent ( );
130175 }
131176}
0 commit comments