package com.constellio.model.packaging.custom; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.File; import java.util.Arrays; import junit.framework.TestCase; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.constellio.data.io.services.facades.FileService; import com.constellio.data.io.services.facades.IOServices; import com.constellio.data.io.services.zip.ZipService; import com.constellio.sdk.tests.ConstellioTest; public class CustomPluginsPackagingServiceAcceptanceTest extends ConstellioTest { int numbersOfCustomers = 3; FileService fileService; CustomPluginsPackagingService service; File workFolder; @Mock File srcFolder, tempLicenseDir; @Mock Customer customer1, customer2; private void assertCustomer1JarValid(File customer1Jar) { File customer1JarUnzipped = unzipInTempFolder(customer1Jar); File com = new File(customer1JarUnzipped, "com"); File comCustomers = new File(com, "customers"); File comCustomersCustomer1 = new File(comCustomers, "customer1"); File licenseClass = new File(comCustomersCustomer1, "License.class"); File plugin = new File(comCustomersCustomer1, "plugin"); File somePlugin = new File(plugin, "somePlugin"); File customer1PluginClass = new File(somePlugin, "Customer1Plugin.class"); assertEquals(1, customer1JarUnzipped.listFiles().length); assertTrue(com.exists()); assertEquals(1, com.listFiles().length); assertTrue(comCustomers.exists()); assertEquals(1, comCustomers.listFiles().length); assertTrue(comCustomersCustomer1.exists()); assertEquals(2, comCustomersCustomer1.listFiles().length); assertTrue(licenseClass.exists()); assertTrue(plugin.exists()); assertEquals(1, plugin.listFiles().length); assertTrue(somePlugin.exists()); assertEquals(1, somePlugin.listFiles().length); assertTrue(customer1PluginClass.exists()); } private void assertCustomer2JarValid(File customer2Jar) { File customer1JarUnzipped = unzipInTempFolder(customer2Jar); File com = new File(customer1JarUnzipped, "com"); File comCustomers = new File(com, "customers"); File comCustomersCustomer2 = new File(comCustomers, "customer2"); File licenseClass = new File(comCustomersCustomer2, "License.class"); assertEquals(1, customer1JarUnzipped.listFiles().length); assertTrue(com.exists()); assertEquals(1, com.listFiles().length); assertTrue(comCustomers.exists()); assertEquals(1, comCustomers.listFiles().length); assertTrue(comCustomersCustomer2.exists()); assertEquals(1, comCustomersCustomer2.listFiles().length); assertTrue(licenseClass.exists()); } private void assertCustomer3JarValid(File customer3Jar) { File customer3JarUnzipped = unzipInTempFolder(customer3Jar); File ca = new File(customer3JarUnzipped, "ca"); File caCustomers = new File(ca, "customers"); File caCustomersCustomer3 = new File(caCustomers, "customer3"); File licenseClass = new File(caCustomersCustomer3, "License.class"); File customer3PluginClass = new File(caCustomersCustomer3, "Customer3Plugin.class"); assertEquals(1, customer3JarUnzipped.listFiles().length); assertTrue(ca.exists()); assertEquals(1, ca.listFiles().length); assertTrue(caCustomers.exists()); assertEquals(1, caCustomers.listFiles().length); assertTrue(caCustomersCustomer3.exists()); assertEquals(2, caCustomersCustomer3.listFiles().length); assertTrue(licenseClass.exists()); assertTrue(customer3PluginClass.exists()); } @Before public void setup() { workFolder = newTempFolder(); ZipService zipService = new ZipService(new IOServices(newTempFolder())); fileService = spy(new FileService(null) { @Override public File newTemporaryFolder(String resourceName) { return workFolder; } }); service = spy(new CustomPluginsPackagingService(fileService, zipService)); } @Test public void whenBuildingCustomerJarWithTempFolderThenDeleteFolderAfterZip() { assertTrue(workFolder.exists()); File jarsDestinationFolder = newTempFolder(); File binFolder = new File(getUnzippedResourceFile("valid_bin.zip"), "bin"); Customer customer = mock(Customer.class); when(customer.getLicensePackage()).thenReturn("com.customers.customer1"); when(customer.getCode()).thenReturn("customer1"); String path = "com" + File.separator + "customers" + File.separator + "customer1"; service.buildCustomerJar(customer, binFolder, jarsDestinationFolder); verify(fileService, times(1)).copyDirectoryWithoutExpectableIOException(new File(binFolder, path), new File(workFolder, path)); assertFalse(workFolder.exists()); } @Test public void whenPackagingValidCustomPluginsThenBuildJarsForEarchClientsBasedOnLicenses() { File binFolder = new File(getUnzippedResourceFile("valid_bin.zip"), "bin"); File sourceFolder = new File(getUnzippedResourceFile("valid_src.zip"), "src"); File jarDestinationFolder = newTempFolder(); service.buildJars(sourceFolder, binFolder, jarDestinationFolder); File customer1Jar = new File(jarDestinationFolder, "constellio-customer1.jar"); File customer2Jar = new File(jarDestinationFolder, "constellio-customer2.jar"); File customer3Jar = new File(jarDestinationFolder, "constellio-customer3.jar"); TestCase.assertTrue(customer1Jar.exists()); TestCase.assertTrue(customer2Jar.exists()); TestCase.assertTrue(customer3Jar.exists()); TestCase.assertEquals(numbersOfCustomers, jarDestinationFolder.listFiles().length); assertCustomer1JarValid(customer1Jar); assertCustomer2JarValid(customer2Jar); assertCustomer3JarValid(customer3Jar); assertTrue(!workFolder.exists()); } @Test(expected = CustomPluginsPackagingServiceException.InvalidDate.class) public void whenParsingLicenseFileWithInvalidDateThenThrowException() { File invalidLicense = getTestResourceFile("invalidDate_License.java.txt"); service.buildCustomerFromLicense(invalidLicense); } @Test(expected = CustomPluginsPackagingServiceException.MethodCannotBeParsed.class) public void whenParsingLicenseFileWithInvalidMethodThenThrowException() { File invalidLicense = getTestResourceFile("invalidMethod_License.java.txt"); service.buildCustomerFromLicense(invalidLicense); } @Test public void whenParsingValidLicenseFileThenParseAttributesSuccessfully() { File validLicense = getTestResourceFile("valid_License.java.txt"); Customer customer = service.buildCustomerFromLicense(validLicense); assertEquals("customer1", customer.getCode()); assertEquals("Customer 1", customer.getName()); assertEquals("com.customers.customer1", customer.getLicensePackage()); assertEquals(dateTime(1, 10, 2013), customer.getInstallationDate()); assertEquals(dateTime(2, 11, 2014), customer.getSupportPlanStart()); assertEquals(dateTime(3, 12, 2015), customer.getSupportPlanEnd()); } @Test public void whenWriteCustomerLicenseThenXmlFileHasCorrectContentAndFormat() { Customer customer = new Customer(); customer.setCode("zeCode"); customer.setName("zeName"); customer.setPlan("zePlan"); customer.setInstallationDate(new LocalDateTime(2014, 11, 10, 0, 0)); customer.setSupportPlanStart(new LocalDateTime(2014, 11, 11, 0, 0)); customer.setSupportPlanEnd(new LocalDateTime(2015, 11, 11, 0, 0)); File tempFolder = newTempFolder(); File xmlFile = new File(tempFolder, "zeCode.xml"); service.writeCustomerLicense(customer, tempFolder); assertThat(xmlFile).exists(); assertThat(xmlFile).hasContentEqualTo(getTestResourceFile("expectedLicense.xml")); } @Test public void whenBuildingCustomerLicensesThenBuildLicenseForEachCustomer() { doReturn(Arrays.asList(customer1, customer2)).when(service).detectCustomers(srcFolder); doNothing().when(service).writeCustomerLicense(any(Customer.class), any(File.class)); service.buildLicensesFiles(srcFolder, tempLicenseDir); verify(service).writeCustomerLicense(customer1, tempLicenseDir); verify(service).writeCustomerLicense(customer2, tempLicenseDir); } }