package de.otto.edison.testsupport.util;
import org.junit.Test;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import static de.otto.edison.testsupport.util.JsonMap.jsonMapFrom;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static java.time.Instant.now;
import static java.time.ZoneOffset.UTC;
import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
public class JsonMapTest {
@Test
public void shouldGetInnerMap() {
Map<String, ?> inner = singletonMap("key", "value");
Map<String, ?> map = singletonMap("inner", inner);
assertThat(jsonMapFrom(map).get("inner"), is(jsonMapFrom(inner)));
}
@Test
public void shouldGetInnerValueByDottedKeys() {
/**
* {
* "outer" : {
* "innter": {
* "key" : "value"
* }
* }
*/
Map<String, ?> inner = singletonMap("key", "value");
Map<String, ?> map = singletonMap("outer", singletonMap("inner", inner));
assertThat(jsonMapFrom(map).get("outer.inner").getString("key"), is("value"));
}
// -------- remove -------------
@Test
public void shouldRemoveKeyFromTopLevel() {
Map<String, ?> map = new HashMap<String,String>(){{put("removeMe", "hello world");}};
JsonMap jsonMap = jsonMapFrom(map);
jsonMap.remove("removeMe");
assertThat(jsonMap, is(jsonMapFrom(emptyMap())));
}
@Test
public void shouldRemoveKeyFromInnerObject() {
Map<String, ?> map = singletonMap("key", new HashMap<String,String>(){{put("removeMe", "hello world");}});
final JsonMap jsonMap = jsonMapFrom(map);
jsonMap.get("key").remove("removeMe");
assertThat(jsonMap, is(jsonMapFrom(singletonMap("key", emptyMap()))));
}
// -------- getString -------------
@Test
public void shouldGetNullForMissingString() {
Map<String, ?> map = singletonMap("key", null);
assertThat(jsonMapFrom(map).getString("key"), is(nullValue()));
assertThat(jsonMapFrom(map).getString("doesnotexist"), is(nullValue()));
}
@Test
public void shouldGetString() {
Map<String, ?> map = singletonMap("key", "value");
assertThat(jsonMapFrom(map).getString("key"), is("value"));
}
@Test
public void shouldFallbackOnDefaultString() {
JsonMap empty = jsonMapFrom(new HashMap<String, Object>());
assertThat(empty.getString("key", "default"), is("default"));
}
@Test
public void shouldGetStringFromDouble() {
Map<String, ?> map = singletonMap("key", 2.0d);
assertThat(jsonMapFrom(map).getString("key"), is("2.0"));
}
@Test
public void shouldGetStringFromLong() {
Map<String, ?> map = singletonMap("key", 2L);
assertThat(jsonMapFrom(map).getString("key"), is("2"));
}
@Test
public void shouldGetStringFromInteger() {
Map<String, ?> map = singletonMap("key", 1);
assertThat(jsonMapFrom(map).getString("key"), is("1"));
}
@Test
public void shouldGetStringFromBoolean() {
Map<String, ?> map = new HashMap<String,Boolean>() {{
put("somethingTrue", TRUE);
put("somethingFalse", FALSE);
}};
assertThat(jsonMapFrom(map).getString("somethingTrue"), is("true"));
assertThat(jsonMapFrom(map).getString("somethingFalse"), is("false"));
}
// --------------- double ---------------
@Test
public void shouldGetDouble() {
Map<String, ?> map = singletonMap("key", 2.0);
assertThat(jsonMapFrom(map).getDouble("key"), is(2.0));
}
@Test
public void shouldGetDoubleFromString() {
Map<String, ?> map = singletonMap("key", "2");
assertThat(jsonMapFrom(map).getDouble("key"), is(2.0));
}
@Test
public void shouldFallbackOnDefaultDouble() {
JsonMap empty = jsonMapFrom(new HashMap<String, Object>());
assertThat(empty.getDouble("key", 2.0), is(2.0));
}
// ----------- boolean ------------
@Test
public void shouldGetBoolean() {
Map<String, ?> map = singletonMap("key", TRUE);
assertThat(jsonMapFrom(map).getBoolean("key"), is(TRUE));
}
@Test
public void shouldGetBooleanFromString() {
Map<String, ?> map = singletonMap("key", "true");
assertThat(jsonMapFrom(map).getBoolean("key"), is(TRUE));
}
@Test
public void shouldFallbackOnDefaultBoolean() {
JsonMap empty = jsonMapFrom(new HashMap<String, Object>());
assertThat(empty.getBoolean("key", TRUE), is(TRUE));
}
// -------------- date ------------------
@Test
public void shouldGetDate() {
Date date = new Date();
Map<String, ?> map = singletonMap("key", date);
assertThat(jsonMapFrom(map).getDate("key"), is(date));
}
@Test
public void shouldGetDateFromProperStringFormat() {
// 2012-04-23T18:25:43.511Z ISO 8601
Map<String, ?> map = singletonMap("key", "2012-04-23T18:25:43.511Z");
assertThat(jsonMapFrom(map).getDate("key"), is(Date.from(LocalDateTime.of(2012, 4, 23, 18, 25, 43, 511000000).toInstant(UTC))));
}
@Test(expected = DateTimeParseException.class)
public void shouldThrowExceptionWhenGettingDateFromWrongStringFormat() {
Map<String, ?> map = singletonMap("key", "Tue Jul 13 00:00:00");
jsonMapFrom(map).getDate("key");
}
// -------------- int ------------------
@Test
public void shouldGetInt() {
Map<String, ?> map = singletonMap("key", 1);
assertThat(jsonMapFrom(map).getInt("key"), is(1));
}
@Test
public void shouldGetIntFromString() {
Map<String, ?> map = singletonMap("key", "1");
assertThat(jsonMapFrom(map).getInt("key"), is(1));
}
@Test
public void shouldFallbackOnDefaultInt() {
JsonMap empty = jsonMapFrom(new HashMap<String, Object>());
assertThat(empty.getInt("key", 1), is(1));
}
// -------------- long ------------------
@Test
public void shouldGetLong() {
Map<String, ?> map = singletonMap("key", 1L);
assertThat(jsonMapFrom(map).getLong("key"), is(1L));
}
@Test
public void shouldGetLongFromString() {
Map<String, ?> map = singletonMap("key", "1");
assertThat(jsonMapFrom(map).getLong("key"), is(1L));
}
@Test
public void shouldFallbackOnDefaultLong() {
JsonMap empty = jsonMapFrom(new HashMap<String, Object>());
assertThat(empty.getLong("key", 1L), is(1L));
}
@Test
public void shouldReturnNullIfLongValueIsNotPresentAndNoDefaultSpecified() {
JsonMap empty = jsonMapFrom(new HashMap<String, Object>());
assertThat(empty.getLong("key"), is(nullValue()));
}
// --- Instant
@Test
public void shouldReturnNullIfInstantValueIsNotPresentAndNoDefaultSpecified() {
JsonMap empty = jsonMapFrom(new HashMap<String, Object>());
assertThat(empty.getInstant("key"), is(nullValue()));
}
@Test
public void shouldGetInstant() {
Instant instant = now();
Map<String, ?> map = singletonMap("key", instant.toString());
assertThat(jsonMapFrom(map).getInstant("key"), is(instant));
}
}