package com.eas.client.queries; import com.eas.client.DatabasesClientWithResource; import com.eas.client.SqlQuery; import com.eas.client.StoredQueryFactory; import com.eas.client.TestConstants; import com.eas.client.cache.ApplicationSourceIndexer; import com.eas.client.cache.ScriptsConfigs; import com.eas.client.metadata.Field; import com.eas.client.metadata.Fields; import com.eas.client.settings.DbConnectionSettings; import com.eas.script.JsDoc; import java.net.URI; import java.nio.file.Paths; import org.junit.*; import static org.junit.Assert.*; /** * * @author pk, mg */ public class StoredQueryFactoryTest { protected static ApplicationSourceIndexer indexer; protected static DatabasesClientWithResource resource; public StoredQueryFactoryTest() { } private static String rn2n(String withRn){ return withRn.replace("\r\n", "\n").replace("\n\r", "\n").replace("\r", "\n"); } @BeforeClass public static void setUpClass() throws Exception { String url = System.getProperty(TestConstants.DATASOURCE_URL_1); if (url == null) { throw new IllegalStateException(TestConstants.DATASOURCE_URL_1 + TestConstants.PROPERTY_ERROR); } String user = System.getProperty(TestConstants.DATASOURCE_USER_1); if (user == null) { throw new IllegalStateException(TestConstants.DATASOURCE_USER_1 + TestConstants.PROPERTY_ERROR); } String passwd = System.getProperty(TestConstants.DATASOURCE_PASSWORD_1); if (passwd == null) { throw new IllegalStateException(TestConstants.DATASOURCE_PASSWORD_1 + TestConstants.PROPERTY_ERROR); } String schema = System.getProperty(TestConstants.DATASOURCE_SCHEMA_1); if (schema == null) { throw new IllegalStateException(TestConstants.DATASOURCE_SCHEMA_1 + TestConstants.PROPERTY_ERROR); } String sourceURL = System.getProperty(TestConstants.TEST_SOURCE_URL); if (sourceURL == null) { throw new IllegalStateException(TestConstants.TEST_SOURCE_URL + TestConstants.PROPERTY_ERROR); } URI uri = new URI(sourceURL); URI classesUri = new URI(sourceURL+ "WEB-INF/classes"); indexer = new ApplicationSourceIndexer(Paths.get(uri), Paths.get(classesUri), new ScriptsConfigs()); DbConnectionSettings settings = new DbConnectionSettings(); settings.setUrl(url); settings.setUser(user); settings.setPassword(passwd); settings.setSchema(schema); settings.setMaxConnections(1); settings.setMaxStatements(1); resource = new DatabasesClientWithResource(settings); } @AfterClass public static void tearDownClass() throws Exception { } @Before public void setUp() { } @After public void tearDown() { } @Test public void testFirstAnnotationsComma1() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("" + "/**\n" + " * %s %s , %s,%s\n" + " * \n" + " * \n" + " */\n" + "select from dual", JsDoc.Tag.ROLES_ALLOWED_TAG, role1, role2, role3); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(q.getReadRoles(), q.getWriteRoles()); assertEquals(3, q.getReadRoles().size()); assertTrue(q.getReadRoles().contains(role1)); assertTrue(q.getReadRoles().contains(role2)); assertTrue(q.getReadRoles().contains(role3)); } @Test public void testFirstAnnotationsComma2() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("" + "/**\n\r" + " * %s %s , %s,%s\r\n" + " * \n\r" + " * \r\n" + " */\n" + "select from dual", JsDoc.Tag.ROLES_ALLOWED_TAG, role1, role2, role3); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(q.getReadRoles(), q.getWriteRoles()); assertEquals(3, q.getReadRoles().size()); assertTrue(q.getReadRoles().contains(role1)); assertTrue(q.getReadRoles().contains(role2)); assertTrue(q.getReadRoles().contains(role3)); } @Test public void testFirstAnnotationsSpace() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("" + "/**\n\r" + " * %s %s %s %s\r\n" + " * \n\r" + " * \r\n" + " */\n" + "select from dual", JsDoc.Tag.ROLES_ALLOWED_TAG, role1, role2, role3); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(q.getReadRoles(), q.getWriteRoles()); assertEquals(3, q.getReadRoles().size()); assertTrue(q.getReadRoles().contains(role1)); assertTrue(q.getReadRoles().contains(role2)); assertTrue(q.getReadRoles().contains(role3)); } @Test public void testLastAnnotationsSpace() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("select from dual" + "/**\n\r" + " * %s %s %s %s\r\n" + " * \n\r" + " * \r\n" + " */\n" + "", JsDoc.Tag.ROLES_ALLOWED_TAG.toUpperCase(), role1, role2, role3); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(q.getReadRoles(), q.getWriteRoles()); assertEquals(3, q.getReadRoles().size()); assertTrue(q.getReadRoles().contains(role1)); assertTrue(q.getReadRoles().contains(role2)); assertTrue(q.getReadRoles().contains(role3)); } @Test public void testMiddleAnnotationsSpace1() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("" + "/**\n\r" + " * select from dual\r\n" + " * %s %s %s %s\r\n" + " * \r\n" + " */\n" + "", JsDoc.Tag.ROLES_ALLOWED_TAG, role1, role2, role3); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(q.getReadRoles(), q.getWriteRoles()); assertEquals(3, q.getReadRoles().size()); assertTrue(q.getReadRoles().contains(role1)); assertTrue(q.getReadRoles().contains(role2)); assertTrue(q.getReadRoles().contains(role3)); } @Test public void testMiddleAnnotationsSpace2() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("" + "/**\n\r" + " * %s %s %s %s\r\n" + " * select from dual\r\n" + " * \r\n" + " */\n" + "", JsDoc.Tag.ROLES_ALLOWED_TAG, role1, role2, role3); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(q.getReadRoles(), q.getWriteRoles()); assertEquals(3, q.getReadRoles().size()); assertTrue(q.getReadRoles().contains(role1)); assertTrue(q.getReadRoles().contains(role2)); assertTrue(q.getReadRoles().contains(role3)); } @Test public void testMiddleReadAnnotationsSpace2() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("" + "/**\n\r" + " * %s %s %s %s\r\n" + " * select from dual\r\n" + " * \r\n" + " */\n" + "", JsDoc.Tag.ROLES_ALLOWED_READ_TAG, role1, role2, role3); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(0, q.getWriteRoles().size()); assertEquals(3, q.getReadRoles().size()); assertTrue(q.getReadRoles().contains(role1)); assertTrue(q.getReadRoles().contains(role2)); assertTrue(q.getReadRoles().contains(role3)); } @Test public void testMiddleWriteAnnotationsSpace2() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("" + "/**\n\r" + " * %s %s %s %s\r\n" + " * select from dual\r\n" + " * \r\n" + " */\n" + "", JsDoc.Tag.ROLES_ALLOWED_WRITE_TAG, role1, role2, role3); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(0, q.getReadRoles().size()); assertEquals(3, q.getWriteRoles().size()); assertTrue(q.getWriteRoles().contains(role1)); assertTrue(q.getWriteRoles().contains(role2)); assertTrue(q.getWriteRoles().contains(role3)); } @Test public void testMiddleReadWriteAnnotationsSpace2() throws Exception { String role1 = "admin"; String role2 = "mechaniker"; String role3 = "dispatcher"; String sqlText = String.format("" + "/**\n\r" + " * %s %s %s %s\r\n" + " */\n" + "select \r\n" + "/**\n" + " * %s %s %s \r\n" + " * \r\n" + " */\n" + "from dual", JsDoc.Tag.ROLES_ALLOWED_READ_TAG, role1, role2, role3, JsDoc.Tag.ROLES_ALLOWED_WRITE_TAG, role1, role2); SqlQuery q = new SqlQuery(null, sqlText); StoredQueryFactory.putRolesMutatables(q); assertEquals(3, q.getReadRoles().size()); assertTrue(q.getReadRoles().contains(role1)); assertTrue(q.getReadRoles().contains(role2)); assertTrue(q.getReadRoles().contains(role3)); assertEquals(2, q.getWriteRoles().size()); assertTrue(q.getWriteRoles().contains(role1)); assertTrue(q.getWriteRoles().contains(role2)); assertFalse(q.getWriteRoles().contains(role3)); } @Test public void testCompilingWithSubqueries() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("sub_query_compile", null, null, null); assertEquals(rn2n("/**\n" + " * \n" + " * @author mg\n" + " * @name sub_query_compile\n" + " */\n" + "SELECT T0.ORDER_NO, 'Some text' AS VALUE_FIELD_1, TABLE1.ID, TABLE1.F1, TABLE1.F3, T0.AMOUNT FROM TABLE1, TABLE2, (/**\n" + " * @name namedQuery4Tests\n" + "*/\n" + "Select goodOrder.ORDER_ID as ORDER_NO, goodOrder.AMOUNT, customers.CUSTOMER_NAME as CUSTOMER \n" + "From GOODORDER goodOrder\n" + " Inner Join CUSTOMER customers on (goodOrder.CUSTOMER = customers.CUSTOMER_ID)\n" + " and (goodOrder.AMOUNT > customers.CUSTOMER_NAME)\n" +" Where :P4 = goodOrder.GOOD) T0 WHERE ((TABLE2.FIELDA<TABLE1.F1) AND (:P2=TABLE1.F3)) AND (:P3=T0.AMOUNT)\n"), rn2n(testQuery.getSqlText())); assertEquals(6, testQuery.getFields().getFieldsCount()); for (int i = 0; i < testQuery.getFields().getFieldsCount(); i++) { Field fieldMtd = testQuery.getFields().get(i + 1); assertNotNull(fieldMtd); /* Jdbc friver of oracle <= ojdbc6 does not support remarks for tables and for columns if (i == 0 || i == 5) { assertNotNull(fieldMtd.getDescription()); } else { assertNull(fieldMtd.getDescription()); } */ } assertEquals(4, testQuery.getParameters().getParametersCount()); } @Test public void testCompilingWithSubqueriesBad() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("bad_schema", null, null, null); assertEquals(rn2n("/**\n" + " * \n" + " * @author mg\n" + " * @name bad_schema\n" + " */\n" + "SELECT T0.ORDER_NO, 'Some text', TABLE1.ID, TABLE1.F1, TABLE1.F3, T0.AMOUNT FROM TABLE1, TABLE2, (/**\n" + " * @name 128082898425059\n" + "*/\n" + "Select goodOrder.ORDER_ID as ORDER_NO, goodOrder.AMOUNT, customers.CUSTOMER_NAME as CUSTOMER \n" + "From GOODORDER goodOrder\n" + " Inner Join CUSTOMER customers on (goodOrder.CUSTOMER = customers.CUSTOMER_ID)\n" + " and (goodOrder.AMOUNT > customers.CUSTOMER_NAME)\n" + " Where :P4 = goodOrder.GOOD) T0 WHERE ((TABLE2.FIELDA<TABLE1.F1) AND (:P2=TABLE1.F3)) AND (:P3=T0.AMOUNT)\n"), rn2n(testQuery.getSqlText())); assertEquals(6, testQuery.getFields().getFieldsCount()); for (int i = 0; i < testQuery.getFields().getFieldsCount(); i++) { Field fieldMtd = testQuery.getFields().get(i + 1); assertNotNull(fieldMtd); /* Jdbc friver of oracle <= ojdbc6 does not support remarks for tables and for columns if (i == 0 || i == 5) { assertNotNull(fieldMtd.getDescription()); } else { assertNull(fieldMtd.getDescription()); } */ } assertEquals(4, testQuery.getParameters().getParametersCount()); } @Test(expected = IllegalStateException.class) public void testBadQueryName() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); queriesProxy.getQuery("bad_query_name", null, null, null); } @Test(expected = IllegalStateException.class) public void testEmptyQueryName() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); queriesProxy.getQuery("", null, null, null); } @Test public void testAsteriskMetadata() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("asterisk_schema", null, null, null); assertEquals(rn2n("" + "/**\n" + " * \n" + " * @author mg\n" + " * @name asterisk_schema\n" + " */\n" + "SELECT * FROM TABLE1, TABLE2, (/**\n" + " * @name 128082898425059\n" + "*/\n" + "Select goodOrder.ORDER_ID as ORDER_NO, goodOrder.AMOUNT, customers.CUSTOMER_NAME as CUSTOMER \n" +"From GOODORDER goodOrder\n" +" Inner Join CUSTOMER customers on (goodOrder.CUSTOMER = customers.CUSTOMER_ID)\n" +" and (goodOrder.AMOUNT > customers.CUSTOMER_NAME)\n" +" Where :P4 = goodOrder.GOOD) T0 WHERE ((TABLE2.FIELDA<TABLE1.F1) AND (:P2=TABLE1.F3)) AND (:P3=T0.AMOUNT)"), rn2n(testQuery.getSqlText())); assertEquals(11, testQuery.getFields().getFieldsCount()); for (int i = 0; i < testQuery.getFields().getFieldsCount(); i++) { Field fieldMtd = testQuery.getFields().get(i + 1); assertNotNull(fieldMtd); } assertEquals(4, testQuery.getParameters().getParametersCount()); } @Test public void testBadSubquery() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("bad_subquery", null, null, null); assertEquals(rn2n("" + "/**\n" + " * \n" + " * @author mg\n" + " * @name bad_subquery\n" + " */\n" + "SELECT * FROM TABLE1, TABLE2, #_1_2_8082898425059 T0 WHERE ((TABLE2.FIELDA<TABLE1.F1) AND (:P2=TABLE1.F3)) AND (:P3=T0.AMOUNT)\n" + ""), rn2n(testQuery.getSqlText())); } @Test public void testPartialTablesAsteriskMetadata() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("partial_asterisk_schema", null, null, null); assertEquals(rn2n("" + "/**\n" + " * \n" + " * @author mg\n" + " * @name partial_asterisk_schema\n" + " */\n" + "SELECT TABLE1.*, TABLE2.FiELdB FROM TABLE1, TABLE2, (/**\n" + " * @name namedQuery4Tests\n" + "*/\n" + "Select goodOrder.ORDER_ID as ORDER_NO, goodOrder.AMOUNT, customers.CUSTOMER_NAME as CUSTOMER \n" + "From GOODORDER goodOrder\n" + " Inner Join CUSTOMER customers on (goodOrder.CUSTOMER = customers.CUSTOMER_ID)\n" + " and (goodOrder.AMOUNT > customers.CUSTOMER_NAME)\n" + " Where :P4 = goodOrder.GOOD) T0 WHERE ((TABLE2.FIELDA<TABLE1.F1) AND (:P2=TABLE1.F3)) AND (:P3=T0.AMOUNT)\n"), rn2n(testQuery.getSqlText())); assertEquals(5, testQuery.getFields().getFieldsCount()); for (int i = 0; i < testQuery.getFields().getFieldsCount(); i++) { Field fieldMtd = testQuery.getFields().get(i + 1); assertNotNull(fieldMtd); } assertEquals(4, testQuery.getParameters().getParametersCount()); } @Test public void testPrimaryKey() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("primary_key", null, null, null); Fields fields = testQuery.getFields(); assertNotNull(fields); assertTrue(fields.getFieldsCount() > 0); assertTrue(fields.get(1).isPk()); } @Test public void testMultiplePrimaryKeys() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("multiple_primary_keys", null, null, null); Fields fields = testQuery.getFields(); assertNotNull(fields); assertTrue(fields.getFieldsCount() == 2); assertTrue(fields.get(1).isPk()); assertTrue(fields.get(2).isPk()); } @Test public void testWithoutAliases_Schema_NonSchema_Schema_Columns() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("without_aliases_with_schema_without_schema_columns_from_single_table", null, null, null); assertEquals(rn2n("" + "/**\n" + " * \n" + " * @author mg\n" + " * @name without_aliases_with_schema_without_schema_columns_from_single_table\n" + " */\n" + "SELECT EAS.MTD_EntitiES.MDENt_ID, MTD_EntitiES.MDENT_NAME, EAS.MTD_EntitiES.MDENT_TYPe, MDENT_ORDER FROM EaS.MTD_EntitiES\n"), rn2n(testQuery.getSqlText())); assertEquals(4, testQuery.getFields().getFieldsCount()); for (int i = 0; i < testQuery.getFields().getFieldsCount(); i++) { Field fieldMtd = testQuery.getFields().get(i + 1); assertNotNull(fieldMtd); } assertEquals(0, testQuery.getParameters().getParametersCount()); } @Test public void testMultiplePrimaryKeysWithAsterisk() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("multiple_primary_keys_asterisk", null, null, null); Fields fields = testQuery.getFields(); assertNotNull(fields); assertTrue(fields.getFieldsCount() == 23); assertNotNull(fields.get("MdENT_ID")); assertTrue(fields.get("MDENT_iD").isPk()); assertNotNull(fields.get("MDlOG_ID")); assertTrue(fields.get("MDLOG_ID").isPk()); assertFalse(fields.getPrimaryKeys().isEmpty()); assertEquals(2, fields.getPrimaryKeys().size()); assertEquals("mdent_id", fields.getPrimaryKeys().get(0).getName()); assertEquals("mdlog_id", fields.getPrimaryKeys().get(1).getName()); } @Test public void testGetQuery() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); SqlQuery testQuery = queriesProxy.getQuery("get_query", null, null, null); Fields metadata = testQuery.getFields(); assertEquals(3, metadata.getFieldsCount()); } @Test public void testGetEmptyQuery() throws Exception { LocalQueriesProxy queriesProxy = new LocalQueriesProxy(resource.getClient(), indexer); try { SqlQuery testQuery = queriesProxy.getQuery("empty_query", null, null, null); fail("Empty query must lead to an exception, but it doesn't. Why?"); } catch (Exception ex) { //fine. there muist be an exception } } }