package com.avaje.tests.types;

import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.tests.model.json.EBasicHstore;
import org.assertj.core.api.Assertions;
import org.avaje.ebeantest.LoggedSqlCollector;
import org.junit.Test;

import java.util.List;

import static org.assertj.core.api.StrictAssertions.assertThat;
import static org.junit.Assert.assertEquals;

public class TestHstore extends BaseTestCase {

  private EBasicHstore bean;

  @Test
  public void insert() {

    if (isPostgres()) {
      // run this manually for Postgres with the HSTORE extension installed
      // psql mydb -c 'create extension hstore;'
      return;
    }

    bean = new EBasicHstore("one");
    bean.getMap().put("home", "123");
    bean.getMap().put("work", "987");

    Ebean.save(bean);

    json_parse_format();
    update_when_notDirty();
    update_when_dirty();
    insert_when_null();
  }

  void json_parse_format() {

    String asJson = Ebean.json().toJson(bean);
    assertThat(asJson).contains("\"map\":{\"home\":\"123\",\"work\":\"987\"}");

    EBasicHstore fromJson = Ebean.json().toBean(EBasicHstore.class, asJson);
    assertEquals(bean.getId(), fromJson.getId());
    assertEquals(bean.getName(), fromJson.getName());
    Assertions.assertThat(fromJson.getMap().keySet()).containsExactly("home", "work");
  }

  void update_when_notDirty() {

    EBasicHstore found = Ebean.find(EBasicHstore.class, bean.getId());
    found.setName("modName");

    LoggedSqlCollector.start();
    Ebean.save(found);
    List<String> sql = LoggedSqlCollector.stop();

    // we don't update the map as it is not dirty
    assertThat(sql.get(0)).contains("update ebasic_hstore set name=?, version=? where");
  }

  void update_when_dirty() {

    EBasicHstore found = Ebean.find(EBasicHstore.class, bean.getId());
    found.setName("modNamePlus");
    found.getMap().put("foo","9987");

    LoggedSqlCollector.start();
    Ebean.save(found);
    List<String> sql = LoggedSqlCollector.stop();

    assertThat(sql.get(0)).contains("update ebasic_hstore set name=?, map=?, version=? where id=? and version=?");
  }

  void insert_when_null() {

    EBasicHstore bean = new EBasicHstore("one");
    bean.setMap(null);
    Ebean.save(bean);
  }
}
