package org.esmerilprogramming.overtown.http; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.util.Map; import io.undertow.server.HttpServerExchange; import io.undertow.server.ServerConnection; import org.esmerilprogramming.overtown.http.converter.DefaultObjectToJsonConverter; import org.esmerilprogramming.overtown.http.converter.ObjectToJsonConverter; import org.esmerilprogramming.overtown.http.converter.TestModel; import org.esmerilprogramming.overtown.view.ViewAttributes; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import static org.junit.Assert.*; @RunWith(MockitoJUnitRunner.class) public class JsonResponseTest { JsonResponse jsonResponse; @Mock ServerConnection connection; HttpServerExchange exchange; ViewAttributes viewAttributes; @Before public void setUp() { exchange = new HttpServerExchange(connection); viewAttributes = new ViewAttributes(); jsonResponse = new JsonResponse(exchange, viewAttributes); } @Test(expected = IllegalStateException.class) public void doesThrowIllegalStateExceptionWhenTryToRedirectWithAJsonResponse() { jsonResponse.sendRedirect("/NO_NO_NO_NO_DO_NOT_DO_THAT"); } @Test(expected = IllegalStateException.class) public void doesThrowIllegalStateExceptionWhenTryToChangeTheContentTypeOfAJsonResponse() { jsonResponse.setContentType("application/pdf"); } @Test public void doesAddAttributeToViewAttributes() { jsonResponse.addAttribute("hello", "world"); assertTrue("Should contains the hello attribute key", viewAttributes.attributeExists("hello")); } //Will not add the default convert, on the other hand in the moment of the response will use // the defaultConveter if none is set @Ignore @Test public void doesAddToConvertesTheDefaultConverterToAnyAddedAttribute() { jsonResponse.addAttribute("hello", "world"); Map<String, ObjectToJsonConverter> converters = jsonResponse.getConverters(); assertTrue("Should contains a converter to the added attribute", converters.containsKey("hello")); assertTrue("Should be a instance of DefaultConverter", converters.get("hello") instanceof DefaultObjectToJsonConverter); } @Test public void doesReturnAddedStringAttributesAsJsonString() { jsonResponse.addAttribute("hello", "world"); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"hello\":\"world\"}", generateStringResponse); } @Test public void doesReturnAddedPrimitiveIntegerAttributesAsJsonString() { jsonResponse.addAttribute("age", 26); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"age\":26}", generateStringResponse); } @Test public void doesReturnAddedIntegerAttributesAsJsonString() { jsonResponse.addAttribute("age", new Integer(26)); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"age\":26}", generateStringResponse); } @Test public void doesReturnAddedPrimitiveDoubleAttributesAsJsonString() { jsonResponse.addAttribute("salary", 100.99d); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"salary\":100.99}", generateStringResponse); } @Test public void doesReturnAddedDoubleAttributesAsJsonString() { jsonResponse.addAttribute("salary", new Double(100.99)); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"salary\":100.99}", generateStringResponse); } @Test public void doesReturnPrimitiveFloatAttributesAsJsonString() { jsonResponse.addAttribute("salary", 100.99f); String generateStringResponse = jsonResponse.generateStringResponse(); // float value includes many decimal values assertTrue(generateStringResponse.startsWith("{\"salary\":100.9")); } @Test public void doesReturnFloatAttributesAsJsonString() { jsonResponse.addAttribute("salary", new Float(100.99)); String generateStringResponse = jsonResponse.generateStringResponse(); // float value includes many decimal values assertTrue(generateStringResponse.startsWith("{\"salary\":100.9")); } @Test public void doesReturnPrimitiveLongAttributesAsJson() { jsonResponse.addAttribute("taxes", 1000000000000l); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"taxes\":1000000000000}", generateStringResponse); } @Test public void doesReturnLongAttributesAsJson() { jsonResponse.addAttribute("taxes", new Long(1000000000000l)); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"taxes\":1000000000000}", generateStringResponse); } @Test public void doesReturnPrimitiveBooleanAttributesAsJson() { jsonResponse.addAttribute("pool", true); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"pool\":true}", generateStringResponse); } @Test public void doesReturnBooleanAttributesAsJson() { jsonResponse.addAttribute("pool", new Boolean(true)); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"pool\":true}", generateStringResponse); } @Test public void doesReturnBigDecimalAttributesAsJson() { jsonResponse.addAttribute("over", new BigDecimal(9999.99).setScale(2, RoundingMode.HALF_UP)); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"over\":9999.99}", generateStringResponse); } @Test public void doesReturnBigIntegerAttributesAsJson() { jsonResponse.addAttribute("over", new BigInteger("99")); String generateStringResponse = jsonResponse.generateStringResponse(); assertEquals("{\"over\":99}", generateStringResponse); } @Test public void doesReturnComplexJson(){ jsonResponse.addAttribute("bool", false); jsonResponse.addAttribute("over", new BigInteger("99")); jsonResponse.addAttribute("model", new TestModel() ); String response = jsonResponse.generateStringResponse(); assertTrue( response.contains( "\"over\":99" ) ); assertTrue( response.contains( "\"bool\":false" ) ); assertTrue( response.contains( "\"model\":{\"name\":\"null\",\"age\":\"null\"}" ) ); } }