/* * Copyright (c) Smals */ package org.unitils.dbmaintainer.script.impl; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.unitils.UnitilsBlockJUnit4ClassRunner; import org.unitils.dbmaintainer.script.Script; import org.unitils.inject.annotation.TestedObject; import org.unitils.reflectionassert.ReflectionAssert; import org.unitils.reflectionassert.ReflectionComparatorMode; /** * test qualifiers and multi user support in {@link ResourceScriptSource}. * * @author wiw * * @since * */ @RunWith(UnitilsBlockJUnit4ClassRunner.class) public class ResourceScriptSourceQualifiersMultiSupportTest { private static final String LOCATION = "org/unitils/dbunit/testdbscripts"; @Rule public TemporaryFolder tempFolder = new TemporaryFolder(new File("target/test-classes/" + LOCATION)); @TestedObject private ResourceScriptSource scriptSource; private Properties configuration; private static final String PROPKEY_EXTENTION = "dbMaintainer.script.fileExtensions"; @Before public void setUp() { configuration = new Properties(); configuration.put(PROPKEY_EXTENTION, "sql"); } @Test public void testCheckIfFileMustBeAddedToScriptList() throws Exception { String schema1 = "USERS"; String schema2 = "pEoplE"; Assert.assertFalse(scriptSource.checkIfScriptContainsCorrectDatabaseName("test123.sql", "public", false)); Assert.assertTrue(scriptSource.checkIfScriptContainsCorrectDatabaseName("test123.sql", "public", true)); Assert.assertTrue(scriptSource.checkIfScriptContainsCorrectDatabaseName("@users_addusers.sql", schema1, true)); Assert.assertFalse(scriptSource.checkIfScriptContainsCorrectDatabaseName("@usersaddusers.sql", schema1, true)); Assert.assertFalse(scriptSource.checkIfScriptContainsCorrectDatabaseName("1@users_addusers.sql", schema1, true)); Assert.assertTrue(scriptSource.checkIfScriptContainsCorrectDatabaseName("1_@users_addusers.sql", schema1, true)); Assert.assertTrue(scriptSource.checkIfScriptContainsCorrectDatabaseName("01_@users_addusers.sql", schema1, true)); Assert.assertFalse(scriptSource.checkIfScriptContainsCorrectDatabaseName("01@users_addusers.sql", schema1, true)); Assert.assertFalse(scriptSource.checkIfScriptContainsCorrectDatabaseName("01@users_addpeople.sql", schema2, true)); Assert.assertFalse(scriptSource.checkIfScriptContainsCorrectDatabaseName("1@people_addusers.sql", schema1, true)); Assert.assertTrue(scriptSource.checkIfScriptContainsCorrectDatabaseName("01_@people_addusers.sql", schema2, true)); Assert.assertTrue(scriptSource.checkIfScriptContainsCorrectDatabaseName("01_@people_addUsers.sql", schema2, true)); } /** * test {@link DefaultScriptSource#checkIfThereAreNoQualifiers(String)} * @throws Exception */ @Test public void testCheckIfThereAreNoQualifiers() throws Exception { Assert.assertTrue(scriptSource.checkIfThereAreNoQualifiers("01_products.sql")); Assert.assertFalse(scriptSource.checkIfThereAreNoQualifiers("01_#refdata_#postgres_products.sql")); Assert.assertFalse(scriptSource.checkIfThereAreNoQualifiers("#refdata_#postgres_products.sql")); } @Test public void testContainsOneOfQualifiers_withoutIncludes() throws Exception { scriptSource = new ResourceScriptSource(); Properties configuration = new Properties(); configuration.setProperty(DefaultScriptSource.PROPKEY_QUALIFIERS, "include1, include2, include3, exclude1, exclude2, exclude3"); configuration.setProperty(DefaultScriptSource.PROPKEY_EXCLUDE_QUALIFIERS, "exclude1, exclude2, exclude3"); scriptSource.init(configuration); Assert.assertTrue(scriptSource.containsOneOfQualifiers("01_products.sql")); Assert.assertTrue(scriptSource.containsOneOfQualifiers("01_#include1_products.sql")); Assert.assertTrue(scriptSource.containsOneOfQualifiers("01_#include1_#include2_products.sql")); Assert.assertTrue(scriptSource.containsOneOfQualifiers("#include1_#include2_products.sql")); Assert.assertFalse(scriptSource.containsOneOfQualifiers("01_#refdata_#postgres_products.sql")); Assert.assertFalse(scriptSource.containsOneOfQualifiers("#refdata_#postgres_products.sql")); Assert.assertFalse(scriptSource.containsOneOfQualifiers("01_#include1_#exclude2_products.sql")); Assert.assertFalse(scriptSource.containsOneOfQualifiers("01_#exclude1_products.sql")); } @Test public void testContainsOneOfQualifiers_withIncludes() throws Exception { scriptSource = new ResourceScriptSource(); Properties configuration = new Properties(); configuration.setProperty(DefaultScriptSource.PROPKEY_QUALIFIERS, "include1, include2, include3, exclude1, exclude2, exclude3"); configuration.setProperty(DefaultScriptSource.PROPKEY_INCLUDE_QUALIFIERS, "include1, include2, include3"); configuration.setProperty(DefaultScriptSource.PROPKEY_EXCLUDE_QUALIFIERS, "exclude1, exclude2, exclude3"); scriptSource.init(configuration); Assert.assertFalse(scriptSource.containsOneOfQualifiers("01_products.sql")); Assert.assertTrue(scriptSource.containsOneOfQualifiers("01_#include1_products.sql")); Assert.assertTrue(scriptSource.containsOneOfQualifiers("01_#include1_#include2_products.sql")); Assert.assertTrue(scriptSource.containsOneOfQualifiers("#include1_#include2_products.sql")); Assert.assertFalse(scriptSource.containsOneOfQualifiers("01_#refdata_#postgres_products.sql")); Assert.assertFalse(scriptSource.containsOneOfQualifiers("#refdata_#postgres_products.sql")); Assert.assertFalse(scriptSource.containsOneOfQualifiers("01_#include1_#exclude2_products.sql")); Assert.assertFalse(scriptSource.containsOneOfQualifiers("01_#exclude1_products.sql")); } @Test public void testGetScriptsAt_multiUserSupport() throws Exception { File parentFile = tempFolder.newFolder("test1"); tempFolder.newFile("test1/file1.txt"); tempFolder.newFile("test1/file2.sql"); tempFolder.newFile("test1/@users_addusers.sql"); tempFolder.newFile("test1/01_@users_addusers.sql"); tempFolder.newFile("test1/1@people_addusers.sql"); String path = getPath(parentFile); List<Script> actual = new ArrayList<Script>(); configuration.setProperty(DefaultScriptSource.PROPKEY_SCRIPT_LOCATIONS, LOCATION); configuration.setProperty(DefaultScriptSource.PROPKEY_SCRIPT_EXTENSIONS, "sql"); configuration.setProperty(DefaultScriptSource.PROPKEY_POSTPROCESSINGSCRIPT_DIRNAME, "postprocessing"); configuration.setProperty(DefaultScriptSource.PROPKEY_USESCRIPTFILELASTMODIFICATIONDATES, "false"); scriptSource.init(configuration); scriptSource.getScriptsAt(actual, path, "test1", "users", true); List<String> actualNames = new ArrayList<String>(); for (Script script : actual) { actualNames.add(script.getFileName()); } Assert.assertEquals(3, actual.size()); ReflectionAssert.assertReflectionEquals(Arrays.asList("file2.sql", "@users_addusers.sql", "01_@users_addusers.sql"), actualNames, ReflectionComparatorMode.LENIENT_ORDER); } @Test public void testGetScriptsAt_qualifiers() throws Exception { String nameFolder = "getscriptsat_qualifiers"; File parentFile = tempFolder.newFolder(nameFolder); tempFolder.newFile(nameFolder + "/01_#include1_products.sql"); tempFolder.newFile(nameFolder + "/#include1_#include2_products.sql"); tempFolder.newFile(nameFolder + "/01_#include1_#include2_products.sql"); tempFolder.newFile(nameFolder + "/01_#refdata_#postgres_products.sql"); tempFolder.newFile(nameFolder + "/01_#include1_#exclude2_products.sql"); String path = getPath(parentFile); scriptSource = new ResourceScriptSource(); configuration.setProperty(DefaultScriptSource.PROPKEY_INCLUDE_QUALIFIERS, "include1, include2, include3"); configuration.setProperty(DefaultScriptSource.PROPKEY_EXCLUDE_QUALIFIERS, "exclude1, exclude2"); configuration.setProperty(DefaultScriptSource.PROPKEY_SCRIPT_LOCATIONS, path); configuration.setProperty(DefaultScriptSource.PROPKEY_SCRIPT_EXTENSIONS, "sql"); configuration.setProperty(DefaultScriptSource.PROPKEY_POSTPROCESSINGSCRIPT_DIRNAME, "postprocessing"); configuration.setProperty(DefaultScriptSource.PROPKEY_USESCRIPTFILELASTMODIFICATIONDATES, "false"); configuration.setProperty("database.dialect", "hsqldb"); scriptSource.init(configuration); List<Script> actual = new ArrayList<Script>(); scriptSource.getScriptsAt(actual, path, nameFolder, "users", true); List<String> actualNames = new ArrayList<String>(); for (Script script : actual) { actualNames.add(script.getFileName()); } Assert.assertEquals(3, actualNames.size()); ReflectionAssert.assertLenientEquals(Arrays.asList("01_#include1_products.sql", "#include1_#include2_products.sql", "01_#include1_#include2_products.sql"), actualNames); } @Test public void testGetScriptsAt_qualifiersAndMultiUserSupport_defaultDatabase() throws Exception { String nameFolder = "getscriptsat"; File parentFile = tempFolder.newFolder(nameFolder); tempFolder.newFile(nameFolder + "/01_#include1_products.sql"); tempFolder.newFile(nameFolder + "/01_#include2_@users_products.sql"); tempFolder.newFile(nameFolder + "/01_#include2_@people_products.sql"); tempFolder.newFile(nameFolder + "/#include1_@people_#include2_products.sql"); tempFolder.newFile(nameFolder + "/@users_#include1_#include2_products.sql"); tempFolder.newFile(nameFolder + "/#include1_#include2_products.sql"); tempFolder.newFile(nameFolder + "/01_#include1_#include2_products.sql"); tempFolder.newFile(nameFolder + "/01_#refdata_#postgres_products.sql"); tempFolder.newFile(nameFolder + "/01_#include1_#exclude2_products.sql"); String path = getPath(parentFile); List<Script> actual = new ArrayList<Script>(); scriptSource = new ResourceScriptSource(); configuration.setProperty(DefaultScriptSource.PROPKEY_INCLUDE_QUALIFIERS, "include1, include2, include3"); configuration.setProperty(DefaultScriptSource.PROPKEY_EXCLUDE_QUALIFIERS, "exclude1, exclude2"); configuration.setProperty(DefaultScriptSource.PROPKEY_QUALIFIERS, "include1, include2, include3, exclude1, exclude2"); scriptSource.init(configuration); scriptSource.getScriptsAt(actual, path, nameFolder, "users", true); List<String> actualNames = new ArrayList<String>(); for (Script script : actual) { actualNames.add(script.getFileName()); } List<String> expected = new ArrayList<String>(); expected.add("01_#include1_products.sql"); expected.add("01_#include2_@users_products.sql"); expected.add("@users_#include1_#include2_products.sql"); expected.add("#include1_#include2_products.sql"); expected.add("01_#include1_#include2_products.sql"); //Assert.assertEquals(5, actual.size()); ReflectionAssert.assertReflectionEquals(expected, actualNames, ReflectionComparatorMode.LENIENT_ORDER); } public String getPath(File file) { File baseFile = new File("target/test-classes/"); String path = ""; path = file.getAbsolutePath().substring(baseFile.getAbsolutePath().length()); path = path.startsWith(File.separator) ? path.substring(1) : path; path = path.replace("\\", "/"); return path; } }