content: package com.alibaba.cobar.client.router.rules;
  
  import static org.testng.AssertJUnit.assertEquals;
  import static org.testng.AssertJUnit.assertFalse;
  import static org.testng.AssertJUnit.assertTrue;
  import static org.testng.AssertJUnit.fail;
  
  import java.util.List;
  
  import org.apache.commons.lang.ArrayUtils;
  import org.testng.annotations.AfterMethod;
  import org.testng.annotations.BeforeMethod;
  import org.testng.annotations.Test;
  
  import com.alibaba.cobar.client.router.rules.ibatis.IBatisSqlActionRule;
  import com.alibaba.cobar.client.router.support.IBatisRoutingFact;
  import com.alibaba.cobar.client.support.utils.CollectionUtils;
  @Test
  public class IBatisSqlActionRuleTest {
      public static final String   SQL_MAP_ACTION_ID = "com.alibaba.cobar.client.entity.Tweet.delete";
      public static final String[] EXPECTED_SHARDS   = { "shard1", "shard2", "shard3" };
  
      private IBatisSqlActionRule  rule;
  
      @BeforeMethod
      protected void setUp() throws Exception {
          rule = new IBatisSqlActionRule(SQL_MAP_ACTION_ID, "shard1, shard2, shard3");
      }
      
      @AfterMethod
      protected void tearDown() throws Exception {
          rule = null;
      }
  
      public void testSqlActionRuleOnShardIdsNormally() {
          List<String> shards = rule.action();
          assertTrue(CollectionUtils.isNotEmpty(shards));
          assertEquals(3, shards.size());
  
          for (String shard : shards) {
              assertTrue(ArrayUtils.contains(EXPECTED_SHARDS, shard));
          }
      }
  
      public void testSqlActionRuleOnShardIdsAbnormally() {
          try {
              new IBatisSqlActionRule(SQL_MAP_ACTION_ID, "");
          } catch (IllegalArgumentException e) {
              // pass
          }
  
          try {
              new IBatisSqlActionRule(SQL_MAP_ACTION_ID, null);
          } catch (IllegalArgumentException e) {
              // pass
          }
      }
  
      public void testSqlActionRuleOnShardIdsWithCustomActionPatternSeparatorNormally() {
          rule.setActionPatternSeparator(";");
          List<String> shards = rule.action();
          assertTrue(CollectionUtils.isNotEmpty(shards));
          assertEquals(1, shards.size());
          assertEquals("shard1, shard2, shard3", shards.get(0));
  
          rule = new IBatisSqlActionRule(SQL_MAP_ACTION_ID, "shard1; shard2; shard3");
          rule.setActionPatternSeparator(";");
          shards = null;
          shards = rule.action();
          assertTrue(CollectionUtils.isNotEmpty(shards));
          assertEquals(3, shards.size());
  
          for (String shard : shards) {
              assertTrue(ArrayUtils.contains(EXPECTED_SHARDS, shard));
          }
      }
  
      public void testSqlActionRuleOnShardIdsWithCustomActionPatternSeparatorAbnormally() {
          try {
              rule.setActionPatternSeparator(null);
          } catch (IllegalArgumentException e) {
              // pass
          }
      }
  
      public void testSqlActionRuleOnTypePatternNormally() {
          IBatisRoutingFact fact = new IBatisRoutingFact(SQL_MAP_ACTION_ID, null);
          assertTrue(rule.isDefinedAt(fact));
          
          fact = new IBatisRoutingFact("com.alibaba.cobar.client.entity.Tweet.del", null);
          assertFalse(rule.isDefinedAt(fact));
          
          fact = new IBatisRoutingFact("com.alibaba.cobar.client.entity.Tweet", null);
          assertFalse(rule.isDefinedAt(fact));
          
          fact = new IBatisRoutingFact(null, null);
          assertFalse(rule.isDefinedAt(fact));
      }
      
      public void testSqlActionRuleOnTypePatternAbnormally(){
          try{
              rule.isDefinedAt(null);
              fail();
          }
          catch(IllegalArgumentException e)
          {
              // pass
          }
      }
  }
  