/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.actions;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.support.SoapUIException;
import com.eviware.soapui.utils.ModelItemFactory;
import com.eviware.x.form.XForm;
import com.eviware.x.form.XFormDialog;
import com.eviware.x.form.XFormField;
import com.eviware.x.impl.swing.FileFormField;
import org.apache.commons.io.FileUtils;
import org.apache.xmlbeans.XmlException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import static com.eviware.soapui.utils.ResourceUtils.getFilePathFromResource;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class MockAsWarActionTest {
private final String SOAPUI_HOME = "soapui.home";
private WsdlProject project;
private XFormDialog mockedDialog;
private String soapuiOriginalHome;
private final File warTestDir = new File("wartestdir");
private final String warDirectoryPath = warTestDir.getPath() + File.separator + "wardirectory";
private final String warFileName = warTestDir.getPath() + File.separator + "mock.war";
@Before
public void setUp() throws SoapUIException, URISyntaxException, IOException, XmlException {
setUpTestDirectories();
setUpProject();
setUpFormDialog();
}
private void setUpFormDialog() throws IOException, URISyntaxException {
mockedDialog = mock(XFormDialog.class);
when(mockedDialog.show()).thenReturn(true);
when(mockedDialog.getFormField(anyString())).thenReturn(any(XFormField.class));
createFileformfield(getFilePathFromResource("/config/soapui-test-settings.xml"), MockAsWarAction.MockAsWarDialog.SETTINGS_FILE);
createFileformfield(warFileName, MockAsWarAction.MockAsWarDialog.WAR_FILE);
createFileformfield(warDirectoryPath, MockAsWarAction.MockAsWarDialog.WAR_DIRECTORY);
when(mockedDialog.getValue(MockAsWarAction.MockAsWarDialog.MOCKSERVICE_ENDPOINT)).thenReturn("http://localhost:8080");
}
private void createFileformfield(String filePath, String fieldName) {
String name = filePath;
FileFormField fileFormField = new FileFormField("tooltip", XForm.FieldType.FILE, name);
fileFormField.setValue(filePath);
when(mockedDialog.getFormField(fieldName)).thenReturn(fileFormField);
}
private void setUpProject() throws URISyntaxException, XmlException, IOException, SoapUIException {
String fileNameWithPath = getFilePathFromResource("/soapui-projects/BasicMock-soapui-4.6.3-Project.xml");
project = new WsdlProject(fileNameWithPath);
ModelItemFactory.makeRestMockService(project);
}
private void setUpTestDirectories() throws IOException {
warTestDir.mkdirs();
setSoapUiHomeDirectory();
}
private void setSoapUiHomeDirectory() throws IOException {
File mockSoapHomeDir = new File(warTestDir, "soapuihometestdir");
mockSoapHomeDir.mkdirs();
File lib = new File(mockSoapHomeDir, "lib");
lib.mkdir();
File sampleJarFile = new File(lib, "soapui.jar");
FileUtils.touch(sampleJarFile);
soapuiOriginalHome = System.getProperty(SOAPUI_HOME);
System.setProperty(SOAPUI_HOME, lib.getPath());
}
@After
public void tearDown() throws IOException {
if (soapuiOriginalHome == null) {
System.getProperties().remove(SOAPUI_HOME);
} else {
System.setProperty(SOAPUI_HOME, soapuiOriginalHome);
}
FileUtils.deleteDirectory(warTestDir);
}
@Test
public void createMockAsWar() throws SoapUIException, IOException {
MockAsWarAction action = new MockAsWarAction();
action.setDialog(mockedDialog);
action.perform(project, null);
assertTrue(new File(warFileName).exists());
assertValidWarDirectory(warDirectoryPath);
assertValidWarFile(warFileName);
}
private void assertValidWarFile(String warFileName) throws IOException {
JarFile jarFile = new JarFile(warFileName);
try {
for (String fileName : getExpectedWarContents()) {
JarEntry jarEntry = jarFile.getJarEntry(fileName);
assertNotNull(jarEntry);
}
} finally {
jarFile.close();
}
}
private void assertValidWarDirectory(String warDirectoryPath) {
for (String fileName : getExpectedWarContents()) {
File file = new File(warDirectoryPath, fileName);
assertTrue(file.exists());
}
}
private String[] getExpectedWarContents() {
return new String[]{
"WEB-INF/web.xml",
"WEB-INF/lib/soapui.jar",
"WEB-INF/soapui/BasicMock-soapui-4.6.3-Project.xml"
};
}
}