Author: ludovic Date: 2007-12-18 16:24:28 +0100 (Tue, 18 Dec 2007) New Revision: 6404
Modified: xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/InvitationImplTest.java xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerTest.java xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestTest.java xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/MembershipRequestImplTest.java Log: Finished invitation manager impl and tests Modified: xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java =================================================================== --- xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java 2007-12-18 15:20:54 UTC (rev 6403) +++ xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java 2007-12-18 15:24:28 UTC (rev 6404) @@ -38,6 +38,7 @@ import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.XWikiException; +import com.xpn.xwiki.doc.XWikiDocument; import com.xpn.xwiki.plugin.mailsender.MailSenderPlugin; /** @@ -230,8 +231,69 @@ */ public List getInvitations(Invitation prototype, int start, int count, XWikiContext context) { - // TODO - return Collections.EMPTY_LIST; + try { + String className = getJoinRequestClassName(Invitation.class); + StringBuffer fromClause = + new StringBuffer("from XWikiDocument as doc, BaseObject as obj"); + StringBuffer whereClause = + new StringBuffer("where doc.fullName=obj.name and obj.className = '" + className + + "'"); + + String space = prototype.getSpace(); + String invitee = prototype.getInvitee(); + if (space != null && invitee != null) { + Invitation invitation = getInvitation(space, invitee, context); + // find a better way of testing if the invitation is new + if (((XWikiDocument) invitation).isNew()) { + return Collections.EMPTY_LIST; + } + List list = new ArrayList(); + list.add(invitation); + return list; + } else if (space != null) { + fromClause.append(", StringProperty as space"); + whereClause + .append(" and obj.id=space.id.id and space.id.name='" + + InvitationImpl.InvitationFields.SPACE + "' and space.value='" + space + + "'"); + } else if (invitee != null) { + fromClause.append(" StringProperty as invitee"); + whereClause.append(" and obj.id=invitee.id.id and invitee.id.name='" + + InvitationImpl.InvitationFields.INVITEE + "' and invitee.value='" + invitee + + "'"); + } + + int status = prototype.getStatus(); + if (status != JoinRequestStatus.ANY) { + fromClause.append(", IntegerProperty as status"); + whereClause.append(" and obj.id=status.id.id and status.id.name='" + + InvitationImpl.InvitationFields.STATUS + "' and status.value=" + status); + } + + List roles = prototype.getRoles(); + if (roles != null && roles.size() > 0) { + String role = (String) prototype.getRoles().get(0); + fromClause.append(", DBStringListProperty as roles join roles.list as role"); + whereClause.append(" and obj.id=roles.id.id and roles.id.name='" + + InvitationImpl.InvitationFields.ROLES + "' and instr(role.id, '" + role + + "')>0"); + } + + String inviter = prototype.getInviter(); + if (inviter != null) { + fromClause.append(" StringProperty as inviter"); + whereClause.append(" and obj.id=inviter.id.id and inviter.id.name='" + + InvitationImpl.InvitationFields.INVITER + "' and inviter.value='" + inviter + + "'"); + } + + String sql = + "select distinct doc " + fromClause.toString() + " " + whereClause.toString(); + return context.getWiki().getStore().search(sql, count, start, context); + } catch (XWikiException e) { + e.printStackTrace(); + return Collections.EMPTY_LIST; + } } /** @@ -393,8 +455,69 @@ public List getMembershipRequests(MembershipRequest prototype, int start, int count, XWikiContext context) { - // TODO - return Collections.EMPTY_LIST; + try { + String className = getJoinRequestClassName(MembershipRequest.class); + StringBuffer fromClause = + new StringBuffer("from XWikiDocument as doc, BaseObject as obj"); + StringBuffer whereClause = + new StringBuffer("where doc.fullName=obj.name and obj.className = '" + className + + "'"); + + String space = prototype.getSpace(); + String requester = prototype.getRequester(); + if (space != null && requester != null) { + MembershipRequest request = getMembershipRequest(space, requester, context); + // find a better way of testing if the request is new + if (((XWikiDocument) request).isNew()) { + return Collections.EMPTY_LIST; + } + List list = new ArrayList(); + list.add(request); + return list; + } else if (space != null) { + fromClause.append(", StringProperty as space"); + whereClause.append(" and obj.id=space.id.id and space.id.name='" + + MembershipRequestImpl.MembershipRequestFields.SPACE + "' and space.value='" + + space + "'"); + } else if (requester != null) { + fromClause.append(" StringProperty as requester"); + whereClause.append(" and obj.id=requester.id.id and requester.id.name='" + + MembershipRequestImpl.MembershipRequestFields.REQUESTER + + "' and requester.value='" + requester + "'"); + } + + int status = prototype.getStatus(); + if (status != JoinRequestStatus.ANY) { + fromClause.append(", IntegerProperty as status"); + whereClause.append(" and obj.id=status.id.id and status.id.name='" + + MembershipRequestImpl.MembershipRequestFields.STATUS + + "' and status.value=" + status); + } + + List roles = prototype.getRoles(); + if (roles != null && roles.size() > 0) { + String role = (String) prototype.getRoles().get(0); + fromClause.append(", DBStringListProperty as roles join roles.list as role"); + whereClause.append(" and obj.id=roles.id.id and roles.id.name='" + + MembershipRequestImpl.MembershipRequestFields.ROLES + + "' and instr(role.id, '" + role + "')>0"); + } + + String responder = prototype.getResponder(); + if (responder != null) { + fromClause.append(" StringProperty as responder"); + whereClause.append(" and obj.id=responder.id.id and responder.id.name='" + + MembershipRequestImpl.MembershipRequestFields.RESPONDER + + "' and responder.value='" + responder + "'"); + } + + String sql = + "select distinct doc " + fromClause.toString() + " " + whereClause.toString(); + return context.getWiki().getStore().search(sql, count, start, context); + } catch (XWikiException e) { + e.printStackTrace(); + return Collections.EMPTY_LIST; + } } /** @@ -856,9 +979,14 @@ toUser = membershipRequest.getRequester(); } } + if (!isEmailAddress(fromUser)) { + fromUser = getEmailAddress(fromUser, context); + } + if (!isEmailAddress(toUser)) { + toUser = getEmailAddress(toUser, context); + } MailSenderPlugin mailSender = (MailSenderPlugin) context.getWiki().getPlugin("mailsender", context); - // TODO wikiName to e-mail address mailSender.sendMailFromTemplate(templateDocFullName, fromUser, toUser, "", "", context .getLanguage(), vContext, context); } @@ -869,7 +997,7 @@ if (isEmailAddress(wikiNameOrMailAddress)) { String email = wikiNameOrMailAddress; String sql = - "select distinct doc.name from XWikiDocument as doc, BaseObject as obj, StringProperty typeprop where doc.fullName=obj.name and obj.className = 'XWiki.XWikiUsers' and obj.id=typeprop.id.id and typeprop.id.name='email' and typeprop.value='" + "select distinct doc.name from XWikiDocument as doc, BaseObject as obj, StringProperty as prop where doc.fullName=obj.name and obj.className = 'XWiki.XWikiUsers' and obj.id=prop.id.id and prop.id.name='email' and prop.value='" + email + "'"; List userList = context.getWiki().getStore().search(sql, 1, 0, context); if (userList.size() > 0) { @@ -892,6 +1020,13 @@ return str.contains("@"); } + private String getEmailAddress(String user, XWikiContext context) throws XWikiException + { + user = findUser(user, context); + XWikiDocument userDoc = context.getWiki().getDocument(user, context); + return userDoc.getObject("XWiki.XWikiUsers").getStringValue("email"); + } + // copy & paste from XWikiAuthServiceImpl#findUser(String, XWikiContext) private String findUser(String username, XWikiContext context) throws XWikiException { Modified: xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/InvitationImplTest.java =================================================================== --- xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/InvitationImplTest.java 2007-12-18 15:20:54 UTC (rev 6403) +++ xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/InvitationImplTest.java 2007-12-18 15:24:28 UTC (rev 6404) @@ -19,28 +19,78 @@ */ package org.xwiki.plugin.invitationmanager.impl; -import com.xpn.xwiki.XWikiContext; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang.RandomStringUtils; +import org.xwiki.plugin.invitationmanager.api.Invitation; +import org.xwiki.plugin.invitationmanager.api.JoinRequestStatus; + /** * Unit tests for [EMAIL PROTECTED] InvitationImpl} class */ public class InvitationImplTest extends InvitationTest { - private XWikiContext context; - private InvitationManagerImpl manager; protected void setUp() throws Exception { super.setUp(); - context = new XWikiContext(); manager = new InvitationManagerImpl(); joinRequest = new InvitationImpl(null, null, true, manager, context); } public void testSave() { - // TODO + try { + String invitee = "testInvitee"; + String space = "testSpace"; + + Invitation expected = new InvitationImpl(invitee, space, true, manager, context); + expected.setCode(RandomStringUtils.random(8)); + expected.setInviter("testInviter"); + + Map map = new HashMap(); + map.put("allowMailNotifications", "false"); + map.put("notifyChanges", "true"); + expected.setMap(map); + + expected.setOpen(false); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); + expected.setRequestDate(sdf.parse("2006.09.25")); + expected.setResponseDate(new Date()); + + List roles = new ArrayList(); + roles.add("developer"); + roles.add("tester"); + expected.setRoles(roles); + + expected.setStatus(JoinRequestStatus.REFUSED); + expected.setText("testText"); + + expected.save(); + + Invitation actual = new InvitationImpl(invitee, space, false, manager, context); + + assertEquals(expected.isOpen(), actual.isOpen()); + assertEquals(expected.getCode(), actual.getCode()); + assertEquals(expected.getInvitee(), actual.getInvitee()); + assertEquals(expected.getInviter(), actual.getInviter()); + assertEquals(expected.getMap(), actual.getMap()); + assertEquals(expected.getRequestDate(), actual.getRequestDate()); + assertEquals(expected.getResponseDate(), actual.getResponseDate()); + assertEquals(expected.getRoles(), actual.getRoles()); + assertEquals(expected.getSpace(), actual.getSpace()); + assertEquals(expected.getStatus(), actual.getStatus()); + assertEquals(expected.getText(), actual.getText()); + } catch (Exception e) { + assertTrue(false); + } } } Modified: xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerTest.java =================================================================== --- xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerTest.java 2007-12-18 15:20:54 UTC (rev 6403) +++ xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerTest.java 2007-12-18 15:24:28 UTC (rev 6404) @@ -19,9 +19,14 @@ */ package org.xwiki.plugin.invitationmanager.impl; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.jmock.Mock; import org.jmock.cglib.MockObjectTestCase; +import org.jmock.core.Invocation; +import org.jmock.core.stub.CustomStub; import org.xwiki.plugin.invitationmanager.api.Invitation; import org.xwiki.plugin.invitationmanager.api.InvitationManager; import org.xwiki.plugin.invitationmanager.api.JoinRequestStatus; @@ -29,8 +34,13 @@ import org.xwiki.plugin.spacemanager.api.SpaceManager; import org.xwiki.plugin.spacemanager.api.SpaceManagerException; +import com.xpn.xwiki.XWiki; +import com.xpn.xwiki.XWikiConfig; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.XWikiException; +import com.xpn.xwiki.doc.XWikiDocument; +import com.xpn.xwiki.store.XWikiHibernateStore; +import com.xpn.xwiki.store.XWikiStoreInterface; /** * Unit tests for classes implementing [EMAIL PROTECTED] InvitationManager} interface @@ -43,6 +53,12 @@ protected XWikiContext context; + protected XWiki xwiki; + + protected Mock mockXWikiStore; + + protected Map docs = new HashMap(); + protected static final String SPACE = "MySpace"; protected static final String ADMIN = "MySpaceAdmin"; @@ -54,7 +70,52 @@ protected void setUp() throws Exception { super.setUp(); - // TODO: mock objects + + context = new XWikiContext(); + xwiki = new XWiki(new XWikiConfig(), context); + context.setWiki(xwiki); + + mockXWikiStore = + mock(XWikiHibernateStore.class, new Class[] {XWiki.class, XWikiContext.class}, + new Object[] {xwiki, context}); + mockXWikiStore.stubs().method("loadXWikiDoc").will( + new CustomStub("Implements XWikiStoreInterface.loadXWikiDoc") + { + public Object invoke(Invocation invocation) throws Throwable + { + XWikiDocument shallowDoc = (XWikiDocument) invocation.parameterValues.get(0); + + if (docs.containsKey(shallowDoc.getFullName())) { + return (XWikiDocument) docs.get(shallowDoc.getFullName()); + } else { + return shallowDoc; + } + } + }); + this.mockXWikiStore.stubs().method("saveXWikiDoc").will( + new CustomStub("Implements XWikiStoreInterface.saveXWikiDoc") + { + public Object invoke(Invocation invocation) throws Throwable + { + XWikiDocument document = (XWikiDocument) invocation.parameterValues.get(0); + document.setNew(false); + document.setStore((XWikiStoreInterface) mockXWikiStore.proxy()); + docs.put(document.getFullName(), document); + return null; + } + }); + this.mockXWikiStore.stubs().method("exists").will( + new CustomStub("Implements XWikiStoreInterface.exists") + { + public Object invoke(Invocation invocation) throws Throwable + { + XWikiDocument document = (XWikiDocument) invocation.parameterValues.get(0); + return (docs.get(document.getFullName()) == null) ? Boolean.FALSE + : Boolean.TRUE; + } + }); + + xwiki.setStore((XWikiStoreInterface) mockXWikiStore.proxy()); } public void testAcceptInvitation() Modified: xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestTest.java =================================================================== --- xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestTest.java 2007-12-18 15:20:54 UTC (rev 6403) +++ xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestTest.java 2007-12-18 15:24:28 UTC (rev 6404) @@ -25,9 +25,20 @@ import java.util.List; import java.util.Map; +import org.jmock.Mock; +import org.jmock.core.Invocation; +import org.jmock.core.stub.CustomStub; import org.xwiki.plugin.invitationmanager.api.JoinRequest; import org.xwiki.plugin.invitationmanager.api.JoinRequestStatus; +import com.xpn.xwiki.XWiki; +import com.xpn.xwiki.XWikiConfig; +import com.xpn.xwiki.XWikiContext; +import com.xpn.xwiki.doc.XWikiDocument; +import com.xpn.xwiki.store.XWikiHibernateStore; +import com.xpn.xwiki.store.XWikiStoreInterface; +import com.xpn.xwiki.user.api.XWikiRightService; + /** * Unit tests for classes implementing [EMAIL PROTECTED] JoinRequest} interface */ @@ -35,14 +46,70 @@ { protected JoinRequest joinRequest; + protected XWikiContext context; + + protected XWiki xwiki; + + protected Mock mockXWikiStore; + + protected Mock mockXWikiRightService; + + protected Map docs = new HashMap(); + + protected void setUp() throws Exception + { + super.setUp(); + + context = new XWikiContext(); + xwiki = new XWiki(new XWikiConfig(), context); + context.setWiki(xwiki); + + mockXWikiStore = + mock(XWikiHibernateStore.class, new Class[] {XWiki.class, XWikiContext.class}, + new Object[] {xwiki, context}); + mockXWikiStore.stubs().method("loadXWikiDoc").will( + new CustomStub("Implements XWikiStoreInterface.loadXWikiDoc") + { + public Object invoke(Invocation invocation) throws Throwable + { + XWikiDocument shallowDoc = (XWikiDocument) invocation.parameterValues.get(0); + + if (docs.containsKey(shallowDoc.getFullName())) { + return (XWikiDocument) docs.get(shallowDoc.getFullName()); + } else { + return shallowDoc; + } + } + }); + this.mockXWikiStore.stubs().method("saveXWikiDoc").will( + new CustomStub("Implements XWikiStoreInterface.saveXWikiDoc") + { + public Object invoke(Invocation invocation) throws Throwable + { + XWikiDocument document = (XWikiDocument) invocation.parameterValues.get(0); + document.setNew(false); + document.setStore((XWikiStoreInterface) mockXWikiStore.proxy()); + docs.put(document.getFullName(), document); + return null; + } + }); + + mockXWikiRightService = mock(XWikiRightService.class, new Class[] {}, new Object[] {}); + mockXWikiRightService.stubs().method("hasAccessLevel").withAnyArguments().will( + returnValue(true)); + + xwiki.setStore((XWikiStoreInterface) mockXWikiStore.proxy()); + xwiki.setRightService((XWikiRightService) mockXWikiRightService.proxy()); + } + /** * test for [EMAIL PROTECTED] JoinRequest#getMap()} */ public void testMap() { Map map = new HashMap(); - map.put("allowMailNotifications", Boolean.TRUE); - map.put("notifyChanges", Boolean.FALSE); + map.put("allowMailNotifications", "true"); + map.put("notifyChanges", "false"); joinRequest.setMap(map); assertEquals(map, joinRequest.getMap()); } Modified: xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/MembershipRequestImplTest.java =================================================================== --- xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/MembershipRequestImplTest.java 2007-12-18 15:20:54 UTC (rev 6403) +++ xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/MembershipRequestImplTest.java 2007-12-18 15:24:28 UTC (rev 6404) @@ -19,25 +19,74 @@ */ package org.xwiki.plugin.invitationmanager.impl; -import com.xpn.xwiki.XWikiContext; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.xwiki.plugin.invitationmanager.api.JoinRequestStatus; +import org.xwiki.plugin.invitationmanager.api.MembershipRequest; + /** * Unit tests for [EMAIL PROTECTED] MembershipRequestImpl} class */ public class MembershipRequestImplTest extends MembershipRequestTest { - private XWikiContext context; - private InvitationManagerImpl manager; protected void setUp() throws Exception { super.setUp(); + + manager = new InvitationManagerImpl(); joinRequest = new MembershipRequestImpl(null, null, true, manager, context); } public void testSave() { - // TODO + try { + String requester = "testRequester"; + String space = "testSpace"; + + MembershipRequest expected = + new MembershipRequestImpl(requester, space, true, manager, context); + expected.setResponder("testResponder"); + + Map map = new HashMap(); + map.put("allowMailNotifications", "false"); + map.put("notifyChanges", "true"); + expected.setMap(map); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); + expected.setRequestDate(sdf.parse("2006.09.25")); + expected.setResponseDate(new Date()); + + List roles = new ArrayList(); + roles.add("developer"); + roles.add("tester"); + expected.setRoles(roles); + + expected.setStatus(JoinRequestStatus.REFUSED); + expected.setText("testText"); + + expected.save(); + + MembershipRequest actual = + new MembershipRequestImpl(requester, space, false, manager, context); + + assertEquals(expected.getRequester(), actual.getRequester()); + assertEquals(expected.getResponder(), actual.getResponder()); + assertEquals(expected.getMap(), actual.getMap()); + assertEquals(expected.getRequestDate(), actual.getRequestDate()); + assertEquals(expected.getResponseDate(), actual.getResponseDate()); + assertEquals(expected.getRoles(), actual.getRoles()); + assertEquals(expected.getSpace(), actual.getSpace()); + assertEquals(expected.getStatus(), actual.getStatus()); + assertEquals(expected.getText(), actual.getText()); + } catch (Exception e) { + assertTrue(false); + } } } _______________________________________________ notifications mailing list notifications@xwiki.org http://lists.xwiki.org/mailman/listinfo/notifications