Skip to content
This repository has been archived by the owner on Feb 12, 2022. It is now read-only.

Commit

Permalink
Merge pull request #18 from forcedotcom/namespace-to-query
Browse files Browse the repository at this point in the history
[FIX] Restricts the classes to be tested only in the default namespace.
+1
Merging pull request
  • Loading branch information
adarsh-ramakrishna-sfdc committed Jan 21, 2016
2 parents 3498644 + 09d53fe commit a91d42f
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 40 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

<groupId>com.sforce.cd.ApexUnit</groupId>
<artifactId>ApexUnit-core</artifactId>
<version>2.3.0.6</version>
<version>2.3.1.0</version>
<name>ApexUnit</name>
<description>Apex Unit v 2.0 with enhanced metrics and advanced features</description>
<!-- Fail fast for older Maven versions -->
Expand Down
50 changes: 27 additions & 23 deletions src/main/java/com/sforce/cd/apexUnit/client/QueryConstructor.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,10 @@ public class QueryConstructor {
*
* @return - Query to fetch apex classes as String
*/
public static String generateQueryToFetchApexClassesBasedOnRegex(String regex) {
public static String generateQueryToFetchApexClassesBasedOnRegex(String namespace, String regex) {
String processedRegex = processRegexForSoqlQueries(regex);
String soql = "SELECT Id , Name FROM ApexClass WHERE Name like '" + escapeSingleQuote(processedRegex) + "'";
String soql = "SELECT Id , Name FROM ApexClass WHERE NamespacePrefix ="+ escapeSingleQuote(namespace) +" AND "
+ "Name like " + escapeSingleQuote(processedRegex);
return soql;
}

Expand All @@ -64,9 +65,10 @@ public static String generateQueryToFetchApexClassesBasedOnRegex(String regex) {
*
* @return - Query to fetch apex triggers as String
*/
public static String generateQueryToFetchApexTriggersBasedOnRegex(String regex) {
public static String generateQueryToFetchApexTriggersBasedOnRegex(String namespace, String regex) {
String processedRegex = processRegexForSoqlQueries(regex);
String soql = "SELECT Id , Name FROM ApexTrigger WHERE Name like '" + escapeSingleQuote(processedRegex) + "'";
String soql = "SELECT Id , Name FROM ApexTrigger WHERE NamespacePrefix ="+ escapeSingleQuote(namespace) +" AND "
+ "Name like " + escapeSingleQuote(processedRegex);
return soql;
}

Expand All @@ -79,7 +81,7 @@ public static String generateQueryToFetchApexTriggersBasedOnRegex(String regex)
* @return - Query to fetch apex class as String
*/
public static String generateQueryToFetchApexClassFromId(String apexClassId) {
String soql = "SELECT Id, Name FROM ApexClass WHERE Id = '" + escapeSingleQuote(apexClassId) + "'";
String soql = "SELECT Id, Name FROM ApexClass WHERE Id = " + escapeSingleQuote(apexClassId);
return soql;
}

Expand All @@ -94,7 +96,7 @@ public static String generateQueryToFetchApexClassFromId(String apexClassId) {
public static String generateQueryToFetchApexTriggerFromId(String apexTriggerId) {
String soql = "";
if (apexTriggerId != null && !apexTriggerId.equals("")) {
soql = "SELECT Id, Name FROM ApexTrigger WHERE Id = '" + escapeSingleQuote(apexTriggerId) + "'";
soql = "SELECT Id, Name FROM ApexTrigger WHERE Id = " + escapeSingleQuote(apexTriggerId);
}
return soql;
}
Expand All @@ -107,10 +109,11 @@ public static String generateQueryToFetchApexTriggerFromId(String apexTriggerId)
*
* @return - Query to fetch apex class as String
*/
public static String generateQueryToFetchApexClass(String apexClassName) {
public static String generateQueryToFetchApexClass(String namespace, String apexClassName) {
String soql = "";
if (apexClassName != null && !apexClassName.equals("")) {
soql = "SELECT Id, Name FROM ApexClass WHERE Name = '" + escapeSingleQuote(apexClassName) + "'";
soql = "SELECT Id, Name FROM ApexClass WHERE NamespacePrefix ="+ escapeSingleQuote(namespace) +" AND "
+ "Name = " + escapeSingleQuote(apexClassName);
}
return soql;
}
Expand All @@ -123,10 +126,11 @@ public static String generateQueryToFetchApexClass(String apexClassName) {
*
* @return - Query to fetch apex trigger as String
*/
public static String generateQueryToFetchApexTrigger(String apexTriggerName) {
public static String generateQueryToFetchApexTrigger(String namespace, String apexTriggerName) {
String soql = "";
if (apexTriggerName != null && !apexTriggerName.equals("")) {
soql = "SELECT Id, Name FROM ApexTrigger WHERE Name = '" + escapeSingleQuote(apexTriggerName) + "'";
soql = "SELECT Id, Name FROM ApexTrigger WHERE NamespacePrefix ="+ escapeSingleQuote(namespace) +" AND "
+ "Name = " + escapeSingleQuote(apexTriggerName);
}
return soql;
}
Expand All @@ -144,8 +148,8 @@ public static String fetchParentJobIdForApexTestQueueItem(String testQueueItemId
if (testQueueItemId != null && !testQueueItemId.equals("")) {
// we need to limit the number of records we fetch to 1 because
// multiple records are returned for each ApexTestClass
soql = "select ParentJobId from ApexTestQueueItem where id = '" + escapeSingleQuote(testQueueItemId)
+ "' limit 1";
soql = "select ParentJobId from ApexTestQueueItem where id = " + escapeSingleQuote(testQueueItemId)
+ " limit 1";
}
return soql;
}
Expand All @@ -161,8 +165,8 @@ public static String fetchParentJobIdForApexTestQueueItem(String testQueueItemId
public static String getTestExecutionStatus(String parentJobId) {
String soql = "";
if (parentJobId != null && !parentJobId.equals("")) {
soql = "Select Id, ApexClassId, ApexClass.Name, ExtendedStatus, ParentJobId, Status, SystemModstamp, CreatedDate From ApexTestQueueItem Where ParentJobId = '"
+ escapeSingleQuote(parentJobId) + "'";
soql = "Select Id, ApexClassId, ApexClass.Name, ExtendedStatus, ParentJobId, Status, SystemModstamp, CreatedDate "
+ "From ApexTestQueueItem Where ParentJobId = "+ escapeSingleQuote(parentJobId);
}
return soql;
}
Expand All @@ -178,8 +182,8 @@ public static String getTestExecutionStatus(String parentJobId) {
public static String fetchResultFromApexTestQueueItem(String parentJobId) {
String soql = "";
if (parentJobId != null && !parentJobId.equals("")) {
soql = "SELECT ApexClassId,AsyncApexJobId,Id,Message,MethodName,Outcome,QueueItemId,StackTrace,SystemModstamp,TestTimestamp FROM ApexTestResult WHERE AsyncApexJobId = '"
+ escapeSingleQuote(parentJobId) + "'";
soql = "SELECT ApexClassId,AsyncApexJobId,Id,Message,MethodName,Outcome,QueueItemId,StackTrace,SystemModstamp,TestTimestamp "
+ "FROM ApexTestResult WHERE AsyncApexJobId = "+ escapeSingleQuote(parentJobId);
}
return soql;
}
Expand Down Expand Up @@ -254,8 +258,8 @@ public static String getOrgWideCoverage() {
public static String getApexClassInfo(String apexClassId) {
String soql = "";
if (apexClassId != null && !apexClassId.equals("")) {
soql = "SELECT Id,Name,ApiVersion,LengthWithoutComments FROM ApexClass where Id = '"
+ escapeSingleQuote(apexClassId) + "'";
soql = "SELECT Id,Name,ApiVersion,LengthWithoutComments FROM ApexClass where Id = "
+ escapeSingleQuote(apexClassId);
}
return soql;
}
Expand All @@ -271,14 +275,14 @@ public static String getApexClassInfo(String apexClassId) {
public static String getApexTriggerInfo(String apexClassId) {
String soql = "";
if (apexClassId != null && !apexClassId.equals("")) {
soql = "SELECT Id,Name,ApiVersion,LengthWithoutComments FROM ApexTrigger where Id = '"
+ escapeSingleQuote(apexClassId) + "'";
soql = "SELECT Id,Name,ApiVersion,LengthWithoutComments FROM ApexTrigger where Id = "
+ escapeSingleQuote(apexClassId);
}
return soql;
}

/*
* Process regex provided by the user sp that the regex can be consumed by
* Process regex provided by the user so that the regex can be consumed by
* soql queries * is converted to % in the regex. If no * is found in the
* regex, the regex is considered as a prefix and a % is added at the end of
* regex
Expand Down Expand Up @@ -309,10 +313,10 @@ private static String processRegexForSoqlQueries(String apexClassNameRegex) {
* @return : singleQuotrEscapedStr : String
*/
private static String escapeSingleQuote(String userInput) {
String singleQuoteEscapedStr = "";
String singleQuoteEscapedStr=null;
if (userInput != null) {
singleQuoteEscapedStr = userInput.replaceAll("'", "\'");

singleQuoteEscapedStr = "'"+singleQuoteEscapedStr+"'";
}
return singleQuoteEscapedStr;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.ArrayUtils;
Expand Down Expand Up @@ -120,16 +122,19 @@ private String[] readInputStreamAndConstructClassArray(InputStream inStr) throws
while ((strLine = bufferedReader.readLine()) != null) {
if (!newline.equals(strLine) && !strLine.equals("") && strLine.length() > 0) {
LOG.debug("The line says .... - " + strLine);

String soql = QueryConstructor.generateQueryToFetchApexClass(strLine);
Map<String, String> namespaceAndName = new HashMap<String, String>();
namespaceAndName.put("name",strLine);
String soql = QueryConstructor.generateQueryToFetchApexClass(namespaceAndName.get("namespace"),
namespaceAndName.get("name"));
// query using WSC
tempTestClassId = ApexClassFetcherUtils.fetchAndAddToMapApexClassIdBasedOnName(
ConnectionHandler.getConnectionHandlerInstance().getConnection(), soql);
LOG.debug("tempTestClassId: " + tempTestClassId);
if (tempTestClassId == null) {
// look if the given class name is a trigger if its not an
// ApexClass
String soqlForTrigger = QueryConstructor.generateQueryToFetchApexTrigger(strLine);
String soqlForTrigger = QueryConstructor.generateQueryToFetchApexTrigger(namespaceAndName.get("namespace"),
namespaceAndName.get("name"));
// query using WSC
tempTestClassId = ApexClassFetcherUtils.fetchAndAddToMapApexClassIdBasedOnName(
ConnectionHandler.getConnectionHandlerInstance().getConnection(), soqlForTrigger);
Expand Down Expand Up @@ -165,5 +170,4 @@ private String[] readInputStreamAndConstructClassArray(InputStream inStr) throws
}
return testClassesAsArray;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -188,13 +188,14 @@ private static String[] fetchApexClassesBasedOnRegex(PartnerConnection connectio
if (regex != null && !regex.equals(" ")) {
LOG.info("Using regex: \"" + regex + "\" to fetch apex classes");
// construct the query
String soql = QueryConstructor.generateQueryToFetchApexClassesBasedOnRegex(regex);
String namespace = null;
String soql = QueryConstructor.generateQueryToFetchApexClassesBasedOnRegex(namespace, regex);
// fire the query using WSC and fetch the results
String[] classesAsArrayUsingWSC = constructClassIdArrayUsingWSC(connection, soql);
// if both manifest file and testClass regex expression is provided
// as command line option, combine the results

String soqlForTrigger = QueryConstructor.generateQueryToFetchApexTriggersBasedOnRegex(regex);
String soqlForTrigger = QueryConstructor.generateQueryToFetchApexTriggersBasedOnRegex(namespace, regex);
String[] triggersAsArrayUsingWSC = constructClassIdArrayUsingWSC(connection, soqlForTrigger);

Set<String> uniqueSetOfClasses = new HashSet<String>();
Expand Down Expand Up @@ -321,8 +322,8 @@ public static String fetchAndAddToMapApexClassIdBasedOnName(PartnerConnection co
}
if (queryResult != null && queryResult.getDone()) {
String[] classIds = fetchApexClassesAsArray(queryResult);
for (String classId : classIds) {
apexClassId = classId;
if(classIds!=null && classIds.length>0){
apexClassId = classIds[0];
}
}

Expand Down Expand Up @@ -432,5 +433,5 @@ public static void logTheFetchedApexClasses(String[] classIds) {
}
}
}

}
4 changes: 2 additions & 2 deletions src/main/resources/ManifestFile.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
SimpleClass1
AuthorPageConfig
AuthorPageConfigTest
SampleClass2

SampleClass2
2 changes: 1 addition & 1 deletion src/main/resources/ManifestFile_For_Unit_Test_Classes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ OtherNamingConventionClass1
OtherNamingConventionClass2
AuthorPageConfigTest

AfterSpaceClass1
SimpleClass1Test
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public void fetchApexClassesBasedOnPrefixTest() {

@Test(priority = 1)
public void constructTestClassArrayUsingWSC() {
soql = QueryConstructor.generateQueryToFetchApexClassesBasedOnRegex(CommandLineArguments.getTestRegex());
soql = QueryConstructor.generateQueryToFetchApexClassesBasedOnRegex(null, CommandLineArguments.getTestRegex());
String[] testClasses = ApexClassFetcherUtils.constructClassIdArrayUsingWSC(conn, soql);
logFilteredTestClasses(testClasses);
if (testClasses != null) {
Expand All @@ -100,7 +100,7 @@ public void fetchApexClassIdFromNameTest() {
String className = null;
String expectedTestClassId = null;
// pass empty string so that random classes gets picked
soql = QueryConstructor.generateQueryToFetchApexClassesBasedOnRegex("*");
soql = QueryConstructor.generateQueryToFetchApexClassesBasedOnRegex(null, "*");
// limit the result to 1 . Thats all we need to test the method
// fetchApexClassIdFromName
soql += " limit 1";
Expand All @@ -112,7 +112,7 @@ public void fetchApexClassIdFromNameTest() {
expectedTestClassId = testClass;
}
}
soql = QueryConstructor.generateQueryToFetchApexClass(className);
soql = QueryConstructor.generateQueryToFetchApexClass(null, className);
String testClassId = ApexClassFetcherUtils.fetchAndAddToMapApexClassIdBasedOnName(conn, soql);
Assert.assertEquals(expectedTestClassId, testClassId);
}
Expand All @@ -122,7 +122,7 @@ public void fetchApexClassNameFromIdTest() {
String classId = null;
String expectedClassName = null;
// pass empty string so that random classes gets picked
soql = QueryConstructor.generateQueryToFetchApexClassesBasedOnRegex("*");
soql = QueryConstructor.generateQueryToFetchApexClassesBasedOnRegex(null,"*");
// limit the result to 1 . Thats all we need to test the method
// fetchApexClassIdFromName
soql += " limit 1";
Expand Down

0 comments on commit a91d42f

Please sign in to comment.