package com.alibaba.cobar.client; import static org.testng.AssertJUnit.assertEquals; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import com.alibaba.cobar.client.entities.Offer; @Test(sequential = true) public class CobarSqlMapClientDaoSupportTestWithComposedRuleRouter extends AbstractTestNGCobarClientTest { private CobarSqlMapClientDaoSupport dao = new CobarSqlMapClientDaoSupport(); private Long[] memberIds = new Long[] { 1L, 129L, 257L, 2L, 130L, 258L, 386L }; public static final String CREATE_SQL = "com.alibaba.cobar.client.entities.Offer.create"; public static final String UPDATE_SQL = "com.alibaba.cobar.client.entities.Offer.update"; public static final String DELETE_SQL = "com.alibaba.cobar.client.entities.Offer.deleteByMemberId"; public CobarSqlMapClientDaoSupportTestWithComposedRuleRouter() { super(new String[] { "META-INF/spring/cobar-client-appctx.xml", "META-INF/spring/datasources-appctx.xml", "META-INF/spring/namespace-sqlaction-composed-router-appctx.xml" }); } @BeforeTest public void setupDaoSupport() { dao.setSqlMapClientTemplate(getSqlMapClientTemplate()); } public void testBatchInsertOnDaoSupport() { verifyNonExistenceOnPartitions(); List<Offer> offers = createOffersWithMemberIds(memberIds); int result = dao.batchInsert(CREATE_SQL, offers); assertEquals(7, result); verifyExistenceOnPartitions(); } public void testBatchUpdateOnDaoSupport() { verifyNonExistenceOnPartitions(); List<Offer> offers = createOffersWithMemberIds(memberIds); int updatedNumber = dao.batchUpdate(UPDATE_SQL, offers); assertEquals(0, updatedNumber); int result = dao.batchInsert(CREATE_SQL, offers); assertEquals(7, result); verifyExistenceOnPartitions(); for (Offer offer : offers) { offer.setSubject("_subject_to_update_"); } updatedNumber = dao.batchUpdate(UPDATE_SQL, offers); assertEquals(7, updatedNumber); } public void testBatchDeleteOnDaoSupport() { verifyNonExistenceOnPartitions(); List<Offer> offers = createOffersWithMemberIds(memberIds); int result = dao.batchDelete(DELETE_SQL, offers); assertEquals(0, result); int insertCount = dao.batchInsert(CREATE_SQL, offers); assertEquals(7, insertCount); verifyExistenceOnPartitions(); int deleteCount = dao.batchDelete(DELETE_SQL, offers); assertEquals(7, deleteCount); verifyNonExistenceOnPartitions(); } private List<Offer> createOffersWithMemberIds(Long[] memberIds) { List<Offer> offers = new ArrayList<Offer>(); for (Long mid : memberIds) { Offer offer = new Offer(); offer.setGmtUpdated(new Date()); offer.setMemberId(mid); offer.setSubject("fake offer"); offers.add(offer); } return offers; } private void verifyNonExistenceOnPartitions() { for (int i = 0; i < memberIds.length; i++) { String confirmSQL = "select subject from offers where memberId=" + memberIds[i]; if (i < 3) { verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt1m); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt1s); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt2m); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt2s); } else { verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt1m); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt1s); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt2m); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt2s); } } } private void verifyExistenceOnPartitions() { for (int i = 0; i < memberIds.length; i++) { String confirmSQL = "select subject from offers where memberId=" + memberIds[i]; if (i < 3) { verifyEntityExistenceOnSpecificDataSource(confirmSQL, jt1m); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt1s); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt2m); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt2s); } else { verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt1m); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt1s); verifyEntityExistenceOnSpecificDataSource(confirmSQL, jt2m); verifyEntityNonExistenceOnSpecificDataSource(confirmSQL, jt2s); } } } }