/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2;

import javax.persistence.EntityManager;

import org.hibernate.envers.exception.NotAuditedException;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;

import org.junit.Test;

/**
 * @author Hern�n Chanfreau
 */
public abstract class AbstractPropertiesAudited2Test extends BaseEnversJPAFunctionalTestCase {
	private long ai_id;
	private long nai_id;

	private static int NUMERITO = 555;

	@Test
	@Priority(10)
	public void initData() {
		EntityManager em = getEntityManager();

		AuditedImplementor ai = new AuditedImplementor();
		ai.setData( "La data" );
		ai.setAuditedImplementorData( "audited implementor data" );
		ai.setNumerito( NUMERITO );

		NonAuditedImplementor nai = new NonAuditedImplementor();
		nai.setData( "info" );
		nai.setNonAuditedImplementorData( "sttring" );
		nai.setNumerito( NUMERITO );

		// Revision 1
		em.getTransaction().begin();

		em.persist( ai );

		em.persist( nai );

		em.getTransaction().commit();

		// Revision 2

		// Revision 3

		ai_id = ai.getId();
		nai_id = nai.getId();
	}

	@Test
	public void testRetrieveAudited() {
		// levanto las versiones actuales
		AuditedImplementor ai = getEntityManager().find(
				AuditedImplementor.class, ai_id
		);
		assert ai != null;
		SimpleInterface si = getEntityManager().find(
				SimpleInterface.class,
				ai_id
		);
		assert si != null;

		// levanto las de la revisi�n 1, ninguna debe ser null
		AuditedImplementor ai_rev1 = getAuditReader().find(
				AuditedImplementor.class, ai_id, 1
		);
		assert ai_rev1 != null;
		SimpleInterface si_rev1 = getAuditReader().find(
				SimpleInterface.class,
				ai_id, 1
		);
		assert si_rev1 != null;

		// data de las actuales no debe ser null
		assert ai.getData() != null;
		assert si.getData() != null;
		// data de las revisiones est� auditada
		assert ai_rev1.getData() != null;
		assert si_rev1.getData() != null;
		// numerito de las revisiones est� auditada, debe ser igual a NUMERITO
		assert ai_rev1.getNumerito() == NUMERITO;
		assert si_rev1.getNumerito() == NUMERITO;
	}

	@Test
	public void testRetrieveNonAudited() {
		// levanto las versiones actuales
		NonAuditedImplementor nai = getEntityManager().find(
				NonAuditedImplementor.class, nai_id
		);
		assert nai != null;
		SimpleInterface si = getEntityManager().find(
				SimpleInterface.class,
				nai_id
		);
		assert si != null;

		assert si.getData().equals( nai.getData() );

		try {
			// levanto la revision
			getAuditReader().find( NonAuditedImplementor.class, nai_id, 1 );
			assert false;
		}
		catch (Exception e) {
			// no es auditable!!!
			assert (e instanceof NotAuditedException);
		}

		// levanto la revision que no es auditable pero con la interfaz, el
		// resultado debe ser null
		SimpleInterface si_rev1 = getAuditReader().find(
				SimpleInterface.class,
				nai_id, 1
		);
		assert si_rev1 == null;
	}
}
