1   package com.atlassian.user.search.page;
2   
3   import com.atlassian.user.Group;
4   import com.atlassian.user.impl.DefaultGroup;
5   import com.atlassian.user.impl.ldap.LDAPEntityFactory;
6   import com.atlassian.user.impl.ldap.properties.DefaultLdapSearchProperties;
7   import com.atlassian.user.impl.ldap.search.LDAPPagerInfo;
8   import com.atlassian.user.impl.ldap.search.page.LDAPEntityPager;
9   import junit.framework.TestCase;
10  import net.sf.ldaptemplate.support.filter.EqualsFilter;
11  
12  import javax.naming.directory.Attributes;
13  import javax.naming.directory.SearchResult;
14  import java.util.Arrays;
15  import java.util.LinkedList;
16  import java.util.List;
17  
18  public class TestLDAPEntityPager extends TestCase
19  {
20      public void testConstructionPreloadsGroupObjects()
21      {
22          final List<Throwable> calledBy = new LinkedList<Throwable>();
23          LDAPEntityFactory<Group> groupFactory = new LDAPEntityFactory<Group>()
24          {
25              public Group getEntity(Attributes attrs, String distinguishedName)
26              {
27                  calledBy.add(new Throwable("getEntity was called"));
28                  return new DefaultGroup("foo");
29              }
30          };
31          List<MockSearchResult> searchResults = Arrays.asList(new MockSearchResult("foo"));
32          LDAPPagerInfo pagerInfo = new LDAPPagerInfo(new MockNamingEnumeration<SearchResult>(searchResults),
33              new EqualsFilter("cn", "group1"), "ou=groups", true, new String[]{"cn", "member"}, 500);
34          new LDAPEntityPager<Group>(new DefaultLdapSearchProperties(), new MockLdapContextFactory(searchResults), groupFactory, pagerInfo);
35          assertEquals("Group objects should be preloaded by prefetching pager once only", 1, calledBy.size());
36      }
37  
38      public void testConstructionPreloadsFirstPageOnly()
39      {
40          final List<String> methodCalls = new LinkedList<String>();
41          LDAPEntityFactory<Group> groupFactory = new LDAPEntityFactory<Group>()
42          {
43              public Group getEntity(Attributes attrs, String distinguishedName)
44              {
45                  methodCalls.add("getEntity(Attributes, String)");
46                  return new DefaultGroup("foo");
47              }
48          };
49          List<MockSearchResult> searchResults = new LinkedList<MockSearchResult>();
50          for (int i=0; i<1000; i++)
51              searchResults.add(new MockSearchResult("foo"));
52          LDAPPagerInfo pagerInfo = new LDAPPagerInfo(new MockNamingEnumeration<SearchResult>(searchResults),
53              new EqualsFilter("cn", "group1"), "ou=groups", true, new String[]{"cn", "member"}, 500);
54          new LDAPEntityPager<Group>(new DefaultLdapSearchProperties(), new MockLdapContextFactory(searchResults), groupFactory, pagerInfo);
55          assertEquals("Only first page of groups should be preloaded by prefetching pager", 100, methodCalls.size());
56      }
57  }