/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.ext; import org.ldaptive.AbstractTest; import org.ldaptive.Connection; import org.ldaptive.LdapAttribute; import org.ldaptive.LdapEntry; import org.ldaptive.SearchOperation; import org.ldaptive.SearchRequest; import org.ldaptive.SearchResult; import org.ldaptive.TestControl; import org.ldaptive.TestUtils; import org.testng.AssertJUnit; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Parameters; import org.testng.annotations.Test; /** * Unit test for {@link MergeOperation}. * * @author Middleware Services */ public class MergeOperationTest extends AbstractTest { /** Entry created for ldap tests. */ private static LdapEntry testLdapEntry; /** * @param ldifFile to create. * * @throws Exception On test failure. */ @Parameters("createEntry30") @BeforeClass(groups = {"merge"}) public void createLdapEntry(final String ldifFile) throws Exception { final String ldif = TestUtils.readFileIntoString(ldifFile); testLdapEntry = TestUtils.convertLdifToResult(ldif).getEntry(); try (Connection conn = TestUtils.createConnection()) { conn.open(); AssertJUnit.assertFalse(super.entryExists(conn, testLdapEntry)); final MergeOperation merge = new MergeOperation(conn); merge.execute(new MergeRequest(testLdapEntry)); AssertJUnit.assertTrue(super.entryExists(conn, testLdapEntry)); } } /** @throws Exception On test failure. */ @AfterClass(groups = {"merge"}) public void deleteLdapEntry() throws Exception { try (Connection conn = TestUtils.createConnection()) { conn.open(); AssertJUnit.assertTrue(super.entryExists(conn, testLdapEntry)); final MergeOperation merge = new MergeOperation(conn); merge.execute(new MergeRequest(testLdapEntry, true)); AssertJUnit.assertFalse(super.entryExists(conn, testLdapEntry)); merge.execute(new MergeRequest(testLdapEntry, true)); } } /** @throws Exception On test failure. */ @Test(groups = {"merge"}) public void merge() throws Exception { final LdapEntry source = new LdapEntry(testLdapEntry.getDn()); try (Connection conn = TestUtils.createConnection()) { conn.open(); final MergeOperation merge = new MergeOperation(conn); final MergeRequest request = new MergeRequest(source); if (TestControl.isActiveDirectory()) { // remove objectClass for comparison testing related to AD testLdapEntry.removeAttribute("objectClass"); source.addAttributes(testLdapEntry.getAttributes()); // these attributes are single value in AD source.addAttribute(new LdapAttribute("givenName", "John")); source.addAttribute(new LdapAttribute("initials", "JC")); request.setIncludeAttributes("uid"); } else { source.addAttributes(testLdapEntry.getAttributes()); final LdapAttribute gn = new LdapAttribute("givenName"); gn.addStringValues(testLdapEntry.getAttribute("givenName").getStringValues()); gn.addStringValue("John"); source.addAttribute(gn); final LdapAttribute initials = new LdapAttribute("initials"); initials.addStringValues(testLdapEntry.getAttribute("initials").getStringValues()); initials.addStringValue("JC"); source.addAttribute(initials); request.setExcludeAttributes("givenName", "initials"); } // no-op, include/exclude should prevent a modify from occurring merge.execute(request); final SearchOperation search = new SearchOperation(conn); SearchResult result = search.execute( SearchRequest.newObjectScopeSearchRequest( testLdapEntry.getDn(), testLdapEntry.getAttributeNames())).getResult(); TestUtils.assertEquals(testLdapEntry, result.getEntry()); if (TestControl.isActiveDirectory()) { request.setIncludeAttributes("givenName", "initials"); } else { request.setExcludeAttributes((String[]) null); } merge.execute(request); result = search.execute( SearchRequest.newObjectScopeSearchRequest(source.getDn(), source.getAttributeNames())).getResult(); TestUtils.assertEquals(source, result.getEntry()); } } }