@Test
  public void testObjectSentToScalarValue() throws Exception {
    metastore.getOrCreateCollectionFields(
        "test", "test", ImmutableSet.of(new SchemaField("test", FieldType.STRING)));

    Event.EventContext api = Event.EventContext.apiKey(apiKeys.writeKey());
    ImmutableMap<String, Object> props = ImmutableMap.of("test", ImmutableList.of("test"));
    byte[] bytes =
        mapper.writeValueAsBytes(
            ImmutableMap.of(
                "api", api,
                "collection", "test",
                "properties", props));

    Event events = mapper.readValue(bytes, Event.class);
    assertEquals(events.properties().get("test"), "[\"test\"]");
  }
  @Test(
      expectedExceptions = JsonMappingException.class,
      expectedExceptionsMessageRegExp = "Cannot cast object to INTEGER for 'test' field.*")
  public void testObjectSentToInvalidScalarValue() throws Exception {
    metastore.getOrCreateCollectionFields(
        "test", "test", ImmutableSet.of(new SchemaField("test", FieldType.INTEGER)));

    Event.EventContext api = Event.EventContext.apiKey(apiKeys.writeKey());
    ImmutableMap<String, Object> props = ImmutableMap.of("test", ImmutableList.of("test"));
    byte[] bytes =
        mapper.writeValueAsBytes(
            ImmutableMap.of(
                "api", api,
                "collection", "test",
                "properties", props));

    mapper.readValue(bytes, Event.class);
  }
  @Test(
      expectedExceptions = JsonMappingException.class,
      expectedExceptionsMessageRegExp =
          "Scalar value 'test' cannot be cast to ARRAY_BOOLEAN type for 'test' field.*")
  public void testScalarSentToObjectValue() throws Exception {
    metastore.getOrCreateCollectionFields(
        "test", "test", ImmutableSet.of(new SchemaField("test", FieldType.ARRAY_BOOLEAN)));

    Event.EventContext api = Event.EventContext.apiKey(apiKeys.writeKey());
    ImmutableMap<String, Object> props = ImmutableMap.of("test", "test");
    byte[] bytes =
        mapper.writeValueAsBytes(
            ImmutableMap.of(
                "api", api,
                "collection", "test",
                "properties", props));

    mapper.readValue(bytes, Event.class);
  }
  @Test
  public void testNullSentToObjectValue() throws Exception {
    metastore.getOrCreateCollectionFields(
        "test", "test", ImmutableSet.of(new SchemaField("test", FieldType.ARRAY_BOOLEAN)));

    Event.EventContext api = Event.EventContext.apiKey(apiKeys.writeKey());

    HashMap<String, Object> props = new HashMap<>();
    props.put("test", null);

    byte[] bytes =
        mapper.writeValueAsBytes(
            ImmutableMap.of(
                "api", api,
                "collection", "test",
                "properties", props));

    Event event = mapper.readValue(bytes, Event.class);
    assertNull(event.properties().get("test"));
  }
  @Test
  public void testPrimitiveTypes() throws Exception {
    Event.EventContext api = Event.EventContext.apiKey(apiKeys.writeKey());
    ImmutableMap<String, Object> properties =
        ImmutableMap.of(
            "test",
            1L,
            "test1",
            false,
            "test2",
            Instant.now(),
            "test3",
            "test",
            "test4",
            LocalDate.now());

    byte[] bytes =
        mapper.writeValueAsBytes(
            ImmutableMap.of(
                "collection", "test",
                "api", api,
                "properties", properties));

    Event event = mapper.readValue(bytes, Event.class);

    assertEquals("test", event.project());
    assertEquals("test", event.collection());
    assertEquals(api, event.api());
    assertEquals(eventBuilder.createEvent("test", properties).properties(), event.properties());

    assertEquals(
        ImmutableSet.copyOf(metastore.getCollection("test", "test")),
        ImmutableSet.of(
            new SchemaField("test", FieldType.DOUBLE),
            new SchemaField("_user", FieldType.STRING),
            new SchemaField("test1", FieldType.BOOLEAN),
            new SchemaField("test2", FieldType.TIMESTAMP),
            new SchemaField("test3", FieldType.STRING),
            new SchemaField("test4", FieldType.DATE)));
  }
 @BeforeMethod
 public void setupMethod() throws Exception {
   metastore.createProject("test");
   apiKeys = apiKeyService.createApiKeys("test");
 }
 @AfterMethod
 public void tearDownMethod() throws Exception {
   metastore.deleteProject("test");
   eventDeserializer.cleanCache();
   eventBuilder.cleanCache();
 }