/*
 * Copyright 2015, Yahoo Inc.
 * Copyrights licensed under the Apache 2.0 License.
 * See the accompanying LICENSE file for terms.
 */
package com.yahoo.squidb.data;

import com.yahoo.squidb.sql.Query;
import com.yahoo.squidb.test.DatabaseTestCase;
import com.yahoo.squidb.test.TestVirtualModel;

public class VirtualModelTest extends DatabaseTestCase {

    public void testCrudMethods() {
        // insert
        TestVirtualModel model = new TestVirtualModel()
                .setTitle("Charlie")
                .setBody("Charlie and the Chocolate Factory");
        assertTrue(database.createNew(model));
        assertEquals(1, database.countAll(TestVirtualModel.class));

        // query
        final long id = model.getRowId();
        TestVirtualModel fetched = database.fetch(TestVirtualModel.class, id, TestVirtualModel.PROPERTIES);
        assertEquals(model, fetched);

        // update
        model.setTitle("Charlie Brown").setBody("It's the Easter Beagle, Charlie Brown");
        assertTrue(database.saveExisting(model));
        assertEquals(1, database.countAll(TestVirtualModel.class));
        assertEquals(1, database.count(TestVirtualModel.class, TestVirtualModel.TITLE.eq("Charlie Brown")));

        // update using setId on a template
        TestVirtualModel model2 = new TestVirtualModel().setTitle("Charlie Brown 2").setRowId(model.getRowId());
        assertTrue(database.saveExisting(model2));
        assertEquals(1, database.countAll(TestVirtualModel.class));
        assertEquals(1, database.count(TestVirtualModel.class, TestVirtualModel.TITLE.eq("Charlie Brown 2")));

        // delete
        assertTrue(database.delete(TestVirtualModel.class, id));
        assertEquals(0, database.countAll(TestVirtualModel.class));
    }

    public void testNonStringPropertyInVirtualTableModel() {
        final Long testNum = 7L;
        TestVirtualModel model = new TestVirtualModel()
                .setTestNumber(testNum);
        assertTrue(database.createNew(model));

        final long id = model.getRowId();
        TestVirtualModel fetched = database.fetch(TestVirtualModel.class, id, TestVirtualModel.PROPERTIES);
        assertEquals(id, fetched.getRowId());
        assertEquals(testNum, fetched.getTestNumber());
    }

    public void testSelectAllIncludesRowid() {
        // insert
        TestVirtualModel model = new TestVirtualModel()
                .setTitle("Charlie")
                .setBody("Charlie and the Chocolate Factory");
        assertTrue(database.createNew(model));

        long expectedId = model.getRowId();

        TestVirtualModel fetchedModel = database.fetchByQuery(TestVirtualModel.class, Query.select());
        assertEquals(expectedId, fetchedModel.getRowId());
        assertEquals(model, fetchedModel);
    }

    public void testVirtualTableHasCorrectModule() {
        assertEquals("fts4", TestVirtualModel.TABLE.getModuleName());
    }
}