// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.dataprofiler.core.ui.utils; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.powermock.api.support.membermodification.MemberMatcher.method; import static org.powermock.api.support.membermodification.MemberModifier.stub; import java.sql.Types; import java.util.ResourceBundle; import junit.framework.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.rule.PowerMockRule; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.management.i18n.Messages; import org.talend.cwm.relational.TdColumn; import org.talend.cwm.relational.TdSqlDataType; import org.talend.dataquality.analysis.ExecutionLanguage; import org.talend.dq.dbms.DbmsLanguage; import org.talend.dq.dbms.DbmsLanguageFactory; import org.talend.dq.nodes.indicator.type.IndicatorEnum; /** * DOC yyin class global comment. Detailled comment */ @PrepareForTest({ ConnectionHelper.class, Messages.class, DbmsLanguageFactory.class }) public class ModelElementIndicatorRuleTest { @Rule public PowerMockRule powerMockRule = new PowerMockRule(); private TdSqlDataType tdsql; private TdColumn me; /** * DOC yyin Comment method "setUp". * * @throws java.lang.Exception */ @Before public void setUp() throws Exception { tdsql = mock(TdSqlDataType.class); me = mock(TdColumn.class); when(me.getSqlDataType()).thenReturn(tdsql); when(me.getContentType()).thenReturn("type"); //$NON-NLS-1$ ResourceBundle rb = mock(ResourceBundle.class); stub(method(ResourceBundle.class, "getBundle", String.class)).toReturn(rb); //$NON-NLS-1$ PowerMockito.mock(Messages.class); stub(method(Messages.class, "getString", String.class)).toReturn("String"); //$NON-NLS-1$ //$NON-NLS-2$ } /** * TDQ-5241 Test method for * {@link org.talend.dataprofiler.core.ui.utils.ModelElementIndicatorRule#patternRule(org.talend.dq.nodes.indicator.type.IndicatorEnum, orgomg.cwm.objectmodel.core.ModelElement, org.talend.dataquality.analysis.ExecutionLanguage)} * . */ @Test public void testPatternRule_1() { // modified: when the column is TIME type, any indicator using year(),month(),week() ,quarter(),day() should be // disabled when(tdsql.getJavaDataType()).thenReturn(Types.TIME); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.ModeIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.FrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.DateFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.WeekFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.MonthFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.QuarterFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.YearFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.DateLowFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.WeekLowFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.MonthLowFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.QuarterLowFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.YearLowFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); } /** * test for BenfordLaw indicator */ @Test public void testPatternRule_2() { // modified: when the column is TIME type, any indicator using year(),month(),week() ,quarter(),day() should be // disabled when(tdsql.getJavaDataType()).thenReturn(Types.DOUBLE).thenReturn(Types.INTEGER).thenReturn(Types.VARCHAR); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.BenfordLawFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.BenfordLawFrequencyIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.BenfordLawFrequencyIndicatorEnum, me, ExecutionLanguage.SQL)); } /** * * test for Hive connection and some indicators should be disabled. */ @Test public void testPatternRule_3() { when(tdsql.getJavaDataType()).thenReturn(Types.VARCHAR); DatabaseConnection connection = mock(DatabaseConnection.class); PowerMockito.mockStatic(ConnectionHelper.class); when(ConnectionHelper.getTdDataProvider(me)).thenReturn(connection); when(ConnectionHelper.isHive(connection)).thenReturn(true); DbmsLanguage dbmsLanguage = mock(DbmsLanguage.class); when(dbmsLanguage.getDbmsName()).thenReturn("MySQL"); //$NON-NLS-1$ when(dbmsLanguage.getDbVersion()).thenReturn(null); PowerMockito.mockStatic(DbmsLanguageFactory.class); when(DbmsLanguageFactory.createDbmsLanguage(connection)).thenReturn(dbmsLanguage); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.SoundexIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule .patternRule(IndicatorEnum.SoundexLowIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertTrue(ModelElementIndicatorRule .patternRule(IndicatorEnum.PatternFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternLowFreqIndicatorEnum, me, ExecutionLanguage.SQL)); when(tdsql.getJavaDataType()).thenReturn(Types.INTEGER); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.MedianIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.UpperQuartileIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.LowerQuartileIndicatorEnum, me, ExecutionLanguage.SQL)); } // Test for Teradata's INTERVAL type , sql language @Test public void testPatternRule_4() { when(tdsql.getName()).thenReturn("INTERVAL YEAR"); //$NON-NLS-1$ when(tdsql.getJavaDataType()).thenReturn(Types.REAL); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.MeanIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule .patternRule(IndicatorEnum.SoundexLowIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertTrue(ModelElementIndicatorRule .patternRule(IndicatorEnum.PatternFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternLowFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.BenfordLawFrequencyIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.LowerQuartileIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.TextIndicatorEnum, me, ExecutionLanguage.SQL)); } // Test for Teradata's INTERVAL type with java language @Test public void testPatternRule_5() { when(tdsql.getName()).thenReturn("INTERVAL YEAR"); //$NON-NLS-1$ when(tdsql.getJavaDataType()).thenReturn(Types.REAL); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.MeanIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.SoundexLowIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternFreqIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.BenfordLawFrequencyIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.LowerQuartileIndicatorEnum, me, ExecutionLanguage.JAVA)); } // Test for Teradata's INTERVAL_xx_to_xx type , sql language @Test public void testPatternRule_6() { when(tdsql.getName()).thenReturn("INTERVAL YEAR TO MONTH"); //$NON-NLS-1$ when(tdsql.getJavaDataType()).thenReturn(Types.NVARCHAR); Assert.assertFalse(ModelElementIndicatorRule .patternRule(IndicatorEnum.BlankCountIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.ModeIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternLowFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.BenfordLawFrequencyIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.LowerQuartileIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.TextIndicatorEnum, me, ExecutionLanguage.SQL)); } /** * * test for teradata connection and Pattern Frequency Statistics indicators should be disabled. */ @Test public void testPatternRule_7() { when(tdsql.getJavaDataType()).thenReturn(Types.VARCHAR); DatabaseConnection connection = mock(DatabaseConnection.class); PowerMockito.mockStatic(ConnectionHelper.class); when(ConnectionHelper.getTdDataProvider(me)).thenReturn(connection); when(ConnectionHelper.isTeradata(connection)).thenReturn(true); DbmsLanguage dbmsLanguage = mock(DbmsLanguage.class); when(dbmsLanguage.getDbmsName()).thenReturn("MySQL"); //$NON-NLS-1$ when(dbmsLanguage.getDbVersion()).thenReturn(null); PowerMockito.mockStatic(DbmsLanguageFactory.class); when(DbmsLanguageFactory.createDbmsLanguage(connection)).thenReturn(dbmsLanguage); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternLowFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.DatePatternFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternFreqIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternLowFreqIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.DatePatternFreqIndicatorEnum, me, ExecutionLanguage.JAVA)); when(tdsql.getJavaDataType()).thenReturn(Types.DATE); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternLowFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertFalse(ModelElementIndicatorRule.patternRule(IndicatorEnum.DatePatternFreqIndicatorEnum, me, ExecutionLanguage.SQL)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternFreqIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.PatternLowFreqIndicatorEnum, me, ExecutionLanguage.JAVA)); Assert.assertTrue(ModelElementIndicatorRule.patternRule(IndicatorEnum.DatePatternFreqIndicatorEnum, me, ExecutionLanguage.JAVA)); } }