/*
* Copyright 2002-2007 the original author or authors.
*
* Licensed under the Apache license, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.internna.iwebmvc.spring.services.dwr;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import mock.MockUserManager;
import mock.OwnedEntity;
import org.hibernate.validator.InvalidValue;
import org.internna.iwebmvc.crypto.Decipherer;
import org.internna.iwebmvc.dao.DAO;
import org.internna.iwebmvc.dao.SecurityDAO;
import org.internna.iwebmvc.javascript.EntityParser;
import org.internna.iwebmvc.model.DomainEntity;
import org.internna.iwebmvc.model.I18nText;
import org.internna.iwebmvc.model.Link;
import org.internna.iwebmvc.model.UUID;
import org.internna.iwebmvc.model.security.RoleImpl;
import org.internna.iwebmvc.model.security.UserImpl;
import org.internna.iwebmvc.model.ui.Filter;
import org.internna.iwebmvc.model.ui.Sort;
import org.internna.iwebmvc.parsers.LinkParser;
import org.internna.iwebmvc.utils.CollectionUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import static org.junit.Assert.*;
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/dao.xml"})
@TransactionConfiguration(defaultRollback = true)
public class RemoteEntityManagerImplTest {
private UUID generatedID;
private LinkParser linkParser = new LinkParser(null);
@Autowired private DAO dao;
@Autowired private SecurityDAO securityDAO;
@Autowired private MockUserManager userManager;
private RemoteEntityManagerImpl impl = new RemoteEntityManagerImpl();
@Before
public void init() throws Exception {
Link l = new Link();
l.setReadableText(new I18nText());
l.getReadableText().add(Locale.CANADA, "a");
l.setTooltipText(new I18nText());
l.getReadableText().add(Locale.UK, "b");
l.setUrl("http://www.google.com");
dao.create(l);
generatedID = l.getId();
securityDAO.createAuthority("registered_user");
UserImpl john = new UserImpl();
john.setUsername("john");
john.setName("Jopn Smith");
john.setPassword("john");
john.addRole((RoleImpl) securityDAO.findAuthority("registered_user"));
securityDAO.createUser(john);
assertNotNull(securityDAO.findUser("john"));
List<EntityParser<?>> parsers = new ArrayList();
parsers.add(linkParser);
impl.setParsers(parsers);
impl.setDao(dao);
impl.setUserManager(userManager);
impl.setDecipherer(new Decipherer() {
@Override public String decrypt(String encText) {
return encText;
}
@Override public boolean isEncrypted(String test) {
return true;
}
});
}
@Test
public void testGetParser() {
assertNull(impl.getParser(null, null));
assertNull(impl.getParser(Object.class, null));
assertNull(impl.getParser(null, new Object()));
assertNotNull(impl.getParser(Link.class, null));
}
@Test(expected = UnsupportedOperationException.class)
public void testMapFilters() throws Exception {
assertTrue(CollectionUtils.isEmpty(impl.mapFilters(null, null, null)));
List<Filter> filterList = new ArrayList<Filter>(2);
filterList.add(new Filter());
assertTrue(CollectionUtils.isEmpty(impl.mapFilters(null, filterList, null)));
filterList.get(0).setFrom("1");
assertTrue(CollectionUtils.isEmpty(impl.mapFilters(null, filterList, null)));
filterList.get(0).setPath("rel");
filterList.get(0).setType("TEXT");
Map<String, Object> filters = impl.mapFilters(null, filterList, null);
assertTrue(filters.size() == 1);
assertTrue(filters.containsKey("rel"));
assertTrue(filters.containsValue("1%"));
filterList.get(0).setType("ENUM");
filters = impl.mapFilters(Link.class, filterList, null);
assertTrue(filters.size() == 1);
assertTrue(filters.containsValue(Link.REL_TYPES.BOOKMARK));
filterList.get(0).setType("TEXT");
filterList.get(0).setTo("2");
filters = impl.mapFilters(null, filterList, null);
assertTrue(filters.size() == 2);
assertTrue(filters.containsValue("2%"));
filterList.get(0).setPath("rel.first");
filterList.get(0).setType("DATE");
Date date = new Date();
filterList.get(0).setFrom(String.valueOf(date.getTime()));
filterList.add(new Filter());
filterList.get(1).setPath("rel.none");
Double doubles = new Double("3.47");
filterList.get(1).setType("DOUBLE");
filterList.get(1).setTo(String.valueOf(doubles));
filters = impl.mapFilters(null, filterList, null);
assertTrue(filters.size() == 3);
assertTrue(filters.containsKey("rel_first"));
assertTrue(filters.containsKey("rel_none_max"));
assertTrue(filters.containsValue(date));
assertTrue(filters.containsValue(doubles));
filterList.add(new Filter());
filterList.get(2).setType("ENTITY");
filterList.get(2).setPath("readableText");
filterList.get(2).setFrom("0000aa000000aa000000aa000000aa00");
filters = impl.mapFilters(Link.class, filterList, null);
assertTrue(filters.size() == 4);
assertTrue(filters.containsValue(new UUID("0000aa000000aa000000aa000000aa00")));
userManager.setName("guest");
assertNull(impl.mapFilters(OwnedEntity.class, null, null).entrySet().iterator().next().getValue());
userManager.setName("john");
assertTrue(CollectionUtils.isNotEmpty(impl.mapFilters(OwnedEntity.class, null, new MockHttpServletRequest())));
Map<String, Object> params = impl.mapFilters(OwnedEntity.class, null, new MockHttpServletRequest());
Object o = params.entrySet().iterator().next().getValue();
assertTrue("Param is a user", o instanceof UserImpl);
filterList.clear();
filterList.add(new Filter());
filterList.get(0).setType("COLLECTION");
filterList.get(0).setPath("xxx");
filterList.get(0).setEntityClass(Link.class.getName());
filterList.get(0).setFrom(generatedID.toString());
Map<String, Object> paramsCol = impl.mapFilters(Link.class, filterList, null);
assertTrue(CollectionUtils.isNotEmpty(paramsCol));
assertEquals("The collection is filtered by an UUID", generatedID, ((DomainEntity) paramsCol.get("xxx")).getId());
filters.put("x", "x");
}
@Test
public void testGetQuery() throws Exception {
assertEquals("SELECT e FROM Link e", impl.getQuery(Link.class, null, null).trim());
List<Filter> filterList = new ArrayList<Filter>(2);
assertEquals("SELECT e FROM Link e", impl.getQuery(Link.class, filterList, null).trim());
filterList.add(new Filter());
assertEquals("SELECT e FROM Link e", impl.getQuery(Link.class, filterList, null).trim());
filterList.get(0).setType("TEXT");
filterList.get(0).setPath("rel.x");
filterList.get(0).setFrom("a");
assertEquals("SELECT e FROM Link e WHERE ( LOWER(e.rel.x) LIKE :rel_x )", impl.getQuery(Link.class, filterList, null).trim());
filterList.get(0).setEmbedded("entity");
assertEquals("SELECT e FROM Link e WHERE ( LOWER(e.entity.rel.x) LIKE :rel_x )", impl.getQuery(Link.class, filterList, null).trim());
filterList.get(0).setRange(true);
filterList.get(0).setTo("b");
assertEquals("SELECT e FROM Link e WHERE ( LOWER(e.entity.rel.x) >= :rel_x ) AND ( LOWER(e.entity.rel.x) <= :rel_x_max )", impl.getQuery(Link.class, filterList, null).trim());
filterList.get(0).setEmbedded(null);
filterList.add(new Filter());
filterList.get(1).setPath("whatever");
filterList.get(1).setType("NUMBER");
filterList.get(1).setFrom("2");
assertEquals("SELECT e FROM Link e WHERE ( LOWER(e.rel.x) >= :rel_x ) AND ( LOWER(e.rel.x) <= :rel_x_max ) AND ( e.whatever = :whatever )", impl.getQuery(Link.class, filterList, null).trim());
filterList.get(1).setTo("3");
filterList.get(1).setRange(true);
assertEquals("SELECT e FROM Link e WHERE ( LOWER(e.rel.x) >= :rel_x ) AND ( LOWER(e.rel.x) <= :rel_x_max ) AND ( e.whatever >= :whatever ) AND ( e.whatever <= :whatever_max )", impl.getQuery(Link.class, filterList, null).trim());
filterList.clear();
filterList.add(new Filter());
filterList.get(0).setType("DATE");
filterList.get(0).setPath("xxx");
filterList.get(0).setFrom(String.valueOf(new Date().getTime()));
assertEquals("SELECT e FROM Link e WHERE ( LOWER(e.xxx) >= :xxx )", impl.getQuery(Link.class, filterList, null).trim());
filterList.add(new Filter());
filterList.get(1).setType("I18N");
filterList.get(1).setPath("yyy");
filterList.get(1).setFrom("a");
filterList.get(1).setTo("a");
filterList.get(1).setRange(true);
assertEquals("SELECT e FROM Link e WHERE ( LOWER(e.xxx) >= :xxx ) AND ( LOWER(yyy) BETWEEN :yyy AND :yyy_max )", impl.getQuery(Link.class, filterList, null).trim());
assertEquals("SELECT e FROM OwnedEntity e WHERE ( ( e.publicView = true ) OR ( :viewer IN ELEMENTS(e.viewers) ) )", impl.getQuery(OwnedEntity.class, null, null).trim());
filterList.clear();
filterList.add(new Filter());
filterList.get(0).setType("COLLECTION");
filterList.get(0).setPath("xxx");
filterList.get(0).setFrom("00aa00aa00aa00aa00aa00aa00aa00aa");
assertEquals("SELECT e FROM Link e WHERE ( :xxx IN ELEMENTS (e.xxx) )", impl.getQuery(Link.class, filterList, null).trim());
Sort sort = new Sort();
sort.setAttribute("xxx");
assertEquals("SELECT e FROM Link e WHERE ( :xxx IN ELEMENTS (e.xxx) ) ORDER BY e.xxx", impl.getQuery(Link.class, filterList, sort).trim());
sort.setDescending(true);
filterList.get(0).setInvert(true);
assertEquals("SELECT e FROM Link e WHERE ( :xxx NOT IN ELEMENTS (e.xxx) ) ORDER BY e.xxx DESC", impl.getQuery(Link.class, filterList, sort).trim());
filterList.get(0).setNullValue(true);
assertEquals("SELECT e FROM Link e WHERE ( e.xxx != NULL ) ORDER BY e.xxx DESC", impl.getQuery(Link.class, filterList, sort).trim());
}
@Test
public void testFilterErrors() {
InvalidValue[] invalidValues = null;
assertEquals("No values filtered for null", 0, impl.filterErrors(invalidValues).length);
invalidValues = new InvalidValue[0];
assertEquals("No values filtered for empty", 0, impl.filterErrors(invalidValues).length);
invalidValues = new InvalidValue[1];
assertEquals("Nulls are handled", 0, impl.filterErrors(invalidValues).length);
invalidValues[0] = new InvalidValue(null, null, "owners", null, null);
assertEquals("Security error removed", 0, impl.filterErrors(invalidValues).length);
invalidValues[0] = new InvalidValue(null, null, "any", null, null);
assertEquals("No other errors removed", 1, impl.filterErrors(invalidValues).length);
}
}