package org.ovirt.engine.core.dao;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.KeyValue;
import org.junit.Before;
import org.junit.Test;

import org.ovirt.engine.core.common.businessentities.BusinessEntitySnapshot;
import org.ovirt.engine.core.compat.Guid;

public class BusinessEntitySnapshotDAOTest extends BaseDAOTestCase {
    private BusinessEntitySnapshotDAO dao;
    private Guid commandWithTwoSnapshotsId = new Guid("48e85ac4-17cc-40d1-8b4e-37edcea8d78a");
    private Guid commandWithOneSnapshotId = new Guid("0dcaa6a5-16fe-4270-8614-5dd249a057e0");

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();
        dao = dbFacade.getBusinessEntitySnapshotDAO();
        prepareDAO(dao);
    }


    @Test
    public void testGetByCommandId() {
        List<BusinessEntitySnapshot> snapshots = dao.getAllForCommandId(commandWithTwoSnapshotsId);
        assertTrue(snapshots != null);
        assertEquals(2,snapshots.size());
        snapshots = dao.getAllForCommandId(commandWithOneSnapshotId);
        assertTrue(snapshots != null);
        assertEquals(1,snapshots.size());
    }

    @Test
    public void testInsertSnapshot() {
        BusinessEntitySnapshot snapshot = new BusinessEntitySnapshot();
        Guid commandId = Guid.NewGuid();
        snapshot.setCommandId(commandId);
        snapshot.setCommandType("org.ovirt.engine.core.bll.UpdateVdsCommand");
        snapshot.setEntityId(Guid.NewGuid().toString());
        snapshot.setEntityType("org.ovirt.engine.core.common.businessentities.VdsStatic");
        snapshot.setEntitySnapshot("something");
        snapshot.setSnapshotClass("someClass");
        dao.save(snapshot);
        List<BusinessEntitySnapshot> snapshotsFromDb = dao.getAllForCommandId(commandId);
        assertNotNull(snapshotsFromDb);
        assertEquals(1,snapshotsFromDb.size());
        assertEquals(snapshot,snapshotsFromDb.get(0));
    }

    @Test
    public void testDeleteByCommandId() {
        int numberOfResultsBeforeDeletion = 2;
        Guid commandId = commandWithTwoSnapshotsId;
            testDeleteByCommandId(numberOfResultsBeforeDeletion, commandId);
        numberOfResultsBeforeDeletion = 1;
        commandId = commandWithOneSnapshotId;
        testDeleteByCommandId(numberOfResultsBeforeDeletion, commandId);
    }

    @Test
    public void testGetAllCommands() {
        List<KeyValue> snapshots = dao.getAllCommands();
        assertNotNull(snapshots);
        assertEquals(2,snapshots.size());
        Set<Guid> expectedSet = new HashSet<Guid>();
        expectedSet.add(commandWithOneSnapshotId);
        expectedSet.add(commandWithTwoSnapshotsId);
        Set<Guid> resultSet = new HashSet<Guid>();
        for (KeyValue snapshot : snapshots) {
            resultSet.add((Guid)snapshot.getKey());
        }
        assertEquals(expectedSet,resultSet);
    }

    private void testDeleteByCommandId(int numberOfResultsBeforeDeletion, Guid commandId) {
        List<BusinessEntitySnapshot> snapshots = dao.getAllForCommandId(commandId);
        assertTrue(snapshots != null);
        assertEquals(numberOfResultsBeforeDeletion,snapshots.size());
        dao.removeAllForCommandId(commandId);
        snapshots = dao.getAllForCommandId(commandId);
        assertTrue(snapshots != null);
        assertEquals(0,snapshots.size());
    }
}
