package nl.elastique.poetry.data.test;

import android.test.AndroidTestCase;

import com.j256.ormlite.dao.Dao;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.List;

import nl.elastique.poetry.data.test.data.models.UserTag;
import nl.elastique.poetry.json.JsonPathResolver;
import nl.elastique.poetry.json.JsonPersister;
import nl.elastique.poetry.data.test.data.DatabaseHelper;
import nl.elastique.poetry.data.test.data.JsonLoader;
import nl.elastique.poetry.data.test.data.models.Group;
import nl.elastique.poetry.data.test.data.models.User;

public class JsonTestCase extends AndroidTestCase
{
    public void testJsonMapper() throws Exception
    {
        DatabaseHelper helper = DatabaseHelper.getHelper(getContext());

        // Load JSON
        JSONObject json = JsonLoader.loadObject(getContext(), R.raw.test);

        // Get child arrays from JSON
        JSONArray users_json = JsonPathResolver.resolveArray(json, "users");
        JSONArray groups_json = JsonPathResolver.resolveArray(json, "groups");

        // Persist arrays to database
        JsonPersister persister = new JsonPersister(helper.getWritableDatabase());
        persister.persistArray(User.class, users_json);
		persister.persistArray(Group.class, groups_json);

        Dao<User, Integer> user_dao = helper.getDao(User.class);
		Dao<Group, Integer> group_dao = helper.getDao(Group.class);

		List<User> users = user_dao.queryForAll();
        assertEquals(2, users.size());

        List<Group> groups = group_dao.queryForAll();
        assertEquals(3, groups.size());

        User user = user_dao.queryForId(1);
        assertNotNull(user);
        assertEquals("John", user.getName());
        assertEquals(2, user.getTags().size());
        assertEquals("tag2", user.getTags().get(1));

        Group group = group_dao.queryForId(2);
        assertNotNull(group);
        assertEquals("Group B", group.getName());

        DatabaseHelper.releaseHelper();
    }
}