content: 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);
              }
          }
      }
  }
  