package com.mockey.storage.xml;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.TransformerException;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import com.mockey.model.Scenario;
import com.mockey.model.Service;
import com.mockey.model.Url;
import com.mockey.storage.IMockeyStorage;
import com.mockey.storage.StorageRegistry;
import com.mockey.ui.ServiceMergeResults;
@Test
public class MockeyXmlFileManagerTest {
private static IMockeyStorage store = StorageRegistry.MockeyStorage;
private static String TESTCONFIG_DIR = System.getProperty("user.dir")+File.separator + "build" + File.separator + "test" + File.separator + "configfiles";
@Test
public void validateServiceScenarioFile(){
MockeyXmlFileManager.createInstance(TESTCONFIG_DIR);
Service feelingService = new Service();
feelingService.setServiceName("feeling");
feelingService.setUrl("/feeling");
Scenario happyScenario = new Scenario();
happyScenario.setScenarioName("happy");
happyScenario.setResponseMessage("HAPPY");
happyScenario = feelingService.saveOrUpdateScenario(happyScenario);
File scenarioFile = MockeyXmlFileManager.getInstance().getServiceScenarioFileAbsolutePath(feelingService, happyScenario);
assert(scenarioFile!=null) : "Scenario is null. It should not be.";
String correctPath = TESTCONFIG_DIR + File.separator + "mockey_def_depot" +File.separator +"feeling" + File.separator +"scenarios" + File.separator +"happy.xml";
assert(scenarioFile.getAbsolutePath().equals(correctPath)) : "Invalid scenario file path. \n WAS:" + scenarioFile.getAbsolutePath() +"\nCORRECT:" + correctPath;
}
@Test
public void validateDefaultBasePath() {
MockeyXmlFileManager.createInstance(TESTCONFIG_DIR);
MockeyXmlFileManager fileManager = MockeyXmlFileManager.getInstance();
File x = new File(TESTCONFIG_DIR);
assert(fileManager.getBasePathFile()!=null) : "Base file path is null. It should not be.";
assert (x.getAbsolutePath().equals(fileManager.getBasePathFile().getAbsolutePath())) : "Base path didn't match. File manager: '" +fileManager.getBasePathFile().getAbsolutePath()
+ "' vs. '"+x.getAbsolutePath() + "'";
}
@Test
public void validateNewBasePath() {
MockeyXmlFileManager.createInstance(TESTCONFIG_DIR);
MockeyXmlFileManager fileManager = MockeyXmlFileManager.getInstance();
File x = new File(TESTCONFIG_DIR);
if(!x.exists()){
x.mkdir();
}
assert (x.getAbsolutePath().equals(fileManager.getBasePathFile().getAbsolutePath())) : "Base path didn't match. File manager: '" +fileManager.getBasePathFile().getAbsolutePath()
+ "' vs. '"+x.getAbsolutePath() + "'";
}
@Test
public void validateServiceFileWithNewBasePath() {
MockeyXmlFileManager.createInstance(TESTCONFIG_DIR);
Service s = new Service();
s.setServiceName("a_service_name");
File x = MockeyXmlFileManager.getInstance().getServiceFile(s);
// Path should be.."/Users/clafonta/Work/Mockey/dist/test/mockey_def_depot/a_service_name/a_service_name.xml".
String path = TESTCONFIG_DIR + File.separator + "mockey_def_depot" + File.separator +"a_service_name" + File.separator + "a_service_name.xml";
assert (x.getAbsolutePath().equals(path) ) : "Base path didn't match. Should be '" + path + "' vs. '"+x.getAbsolutePath() + "'";
}
@Test
public void validateServiceAdd() {
// Clean Store
store.deleteEverything();
assert(store.getServices().size() == 0) : "Expected store to be empty (0) but got '" + store.getServices().size() +"'";
for (Service service : getServiceList()) {
store.saveOrUpdateService(service);
}
assert (store.getServices().size() == 2) : "Length should have been 2 but was "
+ store.getServices().size();
}
@Test
public void checkProxyAdditionMsg() {
//
// ***************************
// Clean Store
// ***************************
store.deleteEverything();
// ***************************
// New Store
// ***************************
for (Service service : getServiceList()) {
store.saveOrUpdateService(service);
}
assert (store.getServices().size() == 2) : "Length should have been 2 but was "
+ store.getServices().size();
// ***************************
// Get the store as XML
// ***************************
String storeAsXml = getStoreAsXml();
// ***************************
// Upload the store again.
// ***************************
ServiceMergeResults mergeResults = getMergeResults(storeAsXml);
// ******************************************************
// There should be 1 Addition message e.g. 'Proxy set'
// ******************************************************
assert (mergeResults.getAdditionMessages().size() == 1) : "Length should have been 1 but was "
+ mergeResults.getAdditionMessages().size()
+ ". Addition messages were: \n"
+ getPrettyPrint(mergeResults.getAdditionMessages());
}
@Test
public void checkForMergedRealUrls() {
//
// ***************************
// Clean Store
// ***************************
store.deleteEverything();
// ***************************
// New Store
// ***************************
Service service = new Service();
service.setServiceName("Service 1");
service.setTag("abc");
service.saveOrUpdateRealServiceUrl(new Url("http://www.abc.com"));
store.saveOrUpdateService(service);
// ***************************
// Get the store as XML
// ***************************
String storeAsXml = getStoreAsXml();
// ***************************
// Rebuild the store with:
// - Same Service
// - Different URL
// ***************************
store.deleteEverything();
service = new Service();
service.setServiceName("Service 1");
service.setTag("def");
service.saveOrUpdateRealServiceUrl(new Url("http://www.def.com"));
store.saveOrUpdateService(service);
// ***************************
// Upload/Merge the store again.
// Result should be 1 Service in the store with 2 Real URLS (merged)
// ***************************
getMergeResults(storeAsXml);
// ******************************************************
// There should be 1 Conflict messages e.g. 'Service not added because
// of conflicting name'
// ******************************************************
List<Service> storeServices = store.getServices();
assert (storeServices.size() == 1) : "Number of Services in the Store should have been 1 but was "
+ storeServices.size();
Service serviceToTest = storeServices.get(0);
assert (serviceToTest.getRealServiceUrls().size() == 2) : "Number of Real URLS in the Service should have been 2 but was "
+ serviceToTest.getRealServiceUrls().size();
}
@Test
public void checkForMergedServiceTags() {
//
// ***************************
// Clean Store
// ***************************
store.deleteEverything();
// ***************************
// New Store
// ***************************
Service service = new Service();
service.setServiceName("Service 1");
service.setTag("abc");
store.saveOrUpdateService(service);
// ***************************
// Get the store as XML
// ***************************
String storeAsXml = getStoreAsXml();
// ***************************
// Rebuild the store with:
// - Same Service
// - Different URL
// ***************************
store.deleteEverything();
service = new Service();
service.setServiceName("Service 1");
service.setTag("def");
store.saveOrUpdateService(service);
// ***************************
// Upload/Merge the store again.
// Result should be 1 Service in the store with 2 Real URLS (merged)
// ***************************
getMergeResults(storeAsXml);
List<Service> storeServices = store.getServices();
assert (storeServices.size() == 1) : "Number of Services in the Store should have been 1 but was "
+ storeServices.size();
Service serviceToTest = storeServices.get(0);
assert (serviceToTest.getTagList().size() == 2) : "Number of Tags in the Service should have been size 2, with value 'abc def' but was size "
+ serviceToTest.getTagList().size()
+ " with value '"
+ serviceToTest.getTag() + "'";
}
@Test
public void checkForMergedServiceScenarioTags() {
//
// ***************************
// Clean Store
// ***************************
store.deleteEverything();
// ***************************
// New Store
// ***************************
Service service = new Service();
service.setServiceName("Service 1");
Scenario scenario = new Scenario();
scenario.setScenarioName("ABC");
scenario.setTag("abc");
service.saveOrUpdateScenario(scenario);
store.saveOrUpdateService(service);
// ***************************
// Get the store as XML
// ***************************
String storeAsXml = getStoreAsXml();
// ***************************
// Rebuild the store with:
// - Same Service, same scenario
// - Service scenario has different tag
// ***************************
store.deleteEverything();
service = new Service();
service.setServiceName("Service 1");
scenario = new Scenario();
scenario.setScenarioName("ABC");
scenario.setTag("def");
service.saveOrUpdateScenario(scenario);
store.saveOrUpdateService(service);
// ***************************
// Upload/Merge the store again.
// Result should be 1 Service in the store with 2 Real URLS (merged)
// ***************************
getMergeResults(storeAsXml);
List<Service> storeServices = store.getServices();
assert (storeServices.size() == 1) : "Number of Services in the Store should have been 1 but was "
+ storeServices.size();
Service serviceToTest = storeServices.get(0);
List<Scenario> scenarioList = serviceToTest.getScenarios();
assert (scenarioList.size() == 1) : "Number of Service scenarios in the Store should have been 1 but was "
+ scenarioList.size()
+ " with value: \n"
+ getScenarioListAsString(scenarioList);
Scenario scenarioTest = scenarioList.get(0);
assert (scenarioTest.getTagList().size() == 2) : "Number of Tags in the Service Scenario should have been size 2, with value 'abc def' but was size "
+ scenarioTest.getTagList().size()
+ " with value '"
+ scenarioTest.getTag() + "'";
}
@Test
public void checkForRelativePath() {
File randomFile = new File(File.separator + "makebelieve" + File.separator + "somenewfile");
File seedFile = new File(File.separator + "seed");
MockeyXmlFileManager.createInstance(seedFile.getAbsolutePath());
MockeyXmlFileManager mxfm = MockeyXmlFileManager.getInstance();
Service s = new Service();
s.setServiceName("AnAccountService");
File serviceFile = MockeyXmlFileManager.getInstance().getServiceFile(s);
assert (("mockey_def_depot" +File.separator +"anaccountservice"+File.separator+"anaccountservice.xml").equals(mxfm.getRelativePath(serviceFile))) : "Fail in catching invalid child file path. Expected '"
+ "mockey_def_depo"+File.separator+"anaccountservice"+File.separator+"anaccountservice.xml' but got '"+mxfm.getRelativePath(serviceFile)+"'";
assert ("ERROR".equals(mxfm.getRelativePath(randomFile))) : "Fail in catching BAD file.";
}
@Test
public void checkForConflictingServiceName() {
//
// ***************************
// Clean Store
// ***************************
store.deleteEverything();
// ***************************
// New Store
// ***************************
Service service = new Service();
service.setServiceName("Service 1");
store.saveOrUpdateService(service);
// ***************************
// Get the store as XML
// ***************************
String storeAsXml = getStoreAsXml();
// ***************************
// Upload the store again.
// ***************************
ServiceMergeResults mergeResults = getMergeResults(storeAsXml);
// ******************************************************
// There should be 1 Conflict messages e.g. 'Service not added because
// of conflicting name'
// ******************************************************
assert (mergeResults.getConflictMsgs().size() == 1) : "Length should have been 1 but was "
+ mergeResults.getConflictMsgs().size()
+ ". Conflict messages were: \n"
+ getPrettyPrint(mergeResults.getConflictMsgs());
}
// ************************************************************************************************************
// HELPFUL UTILIITY METHODS BELOW
// ************************************************************************************************************
private String getStoreAsXml() {
MockeyXmlFactory g = new MockeyXmlFactory();
String storeAsXml = null;
try {
storeAsXml = g.getStoreAsString(store, true);
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
return storeAsXml;
}
private String getScenarioListAsString(List<Scenario> scenarioList) {
StringBuffer sb = new StringBuffer();
for (Scenario scenario : scenarioList) {
sb.append(scenario.toString() + "\n");
}
return sb.toString();
}
private List<Service> getServiceList() {
List<Service> serviceList = new ArrayList<Service>();
Service service = new Service();
service.setServiceName("Service 1");
service.saveOrUpdateRealServiceUrl(new Url("http://www.abc.com"));
service.saveOrUpdateRealServiceUrl(new Url("http://www.nbc.com"));
serviceList.add(service);
Service serviceB = new Service();
serviceB.setServiceName("Service 22");
serviceB.saveOrUpdateRealServiceUrl(new Url("http://www.abc.com"));
serviceB.saveOrUpdateRealServiceUrl(new Url("http://www.nbc.com"));
serviceList.add(serviceB);
return serviceList;
}
private ServiceMergeResults getMergeResults(String storeAsXml) {
MockeyXmlFileManager.createInstance("");
MockeyXmlFileManager configurationReader = MockeyXmlFileManager.getInstance();
ServiceMergeResults mergeResults = null;
try {
mergeResults = configurationReader.loadConfigurationWithXmlDef(
storeAsXml, "");
} catch (SAXParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mergeResults;
}
private String getPrettyPrint(List<String> g) {
StringBuffer sb = new StringBuffer();
for (String gg : g) {
sb.append(gg);
sb.append("\n");
}
return sb.toString();
}
}