/*
* Copyright 2009 Alberto Gimeno <gimenete at gmail.com>
*
* 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 siena.remote.test;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.Properties;
import junit.framework.TestCase;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import siena.PersistenceManagerFactory;
import siena.SienaException;
import siena.remote.Common;
import siena.remote.RemotePersistenceManager;
public class SienaRemoteTest extends TestCase {
private static Person TESLA;
private static Person CURIE;
private static Person EINSTEIN;
private static Discovery RADIOACTIVITY;
private static Discovery RELATIVITY;
private static Discovery TESLA_COIL;
private ClassLoader cl = this.getClass().getClassLoader();
@Override
protected void setUp() throws Exception {
super.setUp();
PersistenceManagerFactory.install(new MockPersistenceManager(), Person.class);
TESLA = new Person(1, "Nikola", "Tesla", "Smiljam");
CURIE = new Person(2, "Marie", "Curie", "Warsaw");
EINSTEIN = new Person(3, "Albert", "Einstein", "Ulm");
RADIOACTIVITY = new Discovery(1, "Radioactivity");
RELATIVITY = new Discovery(2, "Relativity");
TESLA_COIL = new Discovery(3, "Tesla Coil");
RADIOACTIVITY.discoverer = CURIE;
RELATIVITY.discoverer = EINSTEIN;
TESLA_COIL.discoverer = TESLA;
}
public void testFillAndParseIds() throws IOException {
Element root = createSimpleDocument();
Common.fillRequestElement(TESLA, root, true);
Person person = (Person) Common.parseEntity(root, cl);
assertEquals(person.id, TESLA.id);
assertNull(person.firstName);
assertNull(person.lastName);
assertNull(person.city);
}
public void testFillAndParse() throws IOException {
Element root = createSimpleDocument();
Common.fillRequestElement(TESLA, root, false);
Person person = (Person) Common.parseEntity(root, cl);
assertEquals(TESLA, person);
}
public void testFillAndParseDataTypesEmpty() throws IOException {
Element root = createSimpleDocument();
DataTypes original = new DataTypes();
Common.fillRequestElement(original, root, false);
DataTypes parsed = (DataTypes) Common.parseEntity(root, cl);
assertEquals(original, parsed);
}
public void testFillAndParseDataTypesFull() throws IOException {
Element root = createSimpleDocument();
DataTypes original = new DataTypes();
original.typeByte = 1;
original.typeShort = 2;
original.typeInt = 3;
original.typeLong = 4;
original.typeFloat = 5;
original.typeDouble = 6;
original.typeString = "hello";
original.typeDate = new Date();
Common.fillRequestElement(original, root, false);
DataTypes parsed = (DataTypes) Common.parseEntity(root, cl);
assertEquals(original, parsed);
}
public void testFillAndParseDataTypesEmptyString() throws IOException {
Element root = createSimpleDocument();
DataTypes original = new DataTypes();
original.typeByte = 1;
original.typeShort = 2;
original.typeInt = 3;
original.typeLong = 4;
original.typeFloat = 5;
original.typeDouble = 6;
original.typeString = "";
original.typeDate = new Date();
Common.fillRequestElement(original, root, false);
DataTypes parsed = (DataTypes) Common.parseEntity(root, cl);
assertEquals(original, parsed);
}
public void testFillAndParseDataTypesNullString() throws IOException {
Element root = createSimpleDocument();
DataTypes original = new DataTypes();
original.typeByte = 1;
original.typeShort = 2;
original.typeInt = 3;
original.typeLong = 4;
original.typeFloat = 5;
original.typeDouble = 6;
original.typeString = null;
original.typeDate = new Date();
Common.fillRequestElement(original, root, false);
DataTypes parsed = (DataTypes) Common.parseEntity(root, cl);
assertEquals(original, parsed);
}
public void testFillAndParseRelationship() throws IOException {
Element root = createSimpleDocument();
Common.fillRequestElement(RADIOACTIVITY, root, false);
Discovery parsed = (Discovery) Common.parseEntity(root, cl);
assertEquals(RADIOACTIVITY.id, parsed.id);
assertEquals(RADIOACTIVITY.name, parsed.name);
assertNotNull(parsed.discoverer);
assertEquals(RADIOACTIVITY.discoverer.id, parsed.discoverer.id);
assertNull(parsed.discoverer.firstName);
assertNull(parsed.discoverer.lastName);
assertNull(parsed.discoverer.city);
}
public void testRemote() {
MockPersistenceManager mock = new MockPersistenceManager();
PersistenceManagerFactory.install(mock, Person.class);
RemotePersistenceManager remote = new RemotePersistenceManager();
Properties properties = new Properties();
properties.setProperty("connector", MockConnector.class.getName());
properties.setProperty("serializer", MockConnector.class.getName());
remote.init(properties);
remote.insert(TESLA);
assertEquals("insert", mock.action);
assertEquals(TESLA, mock.object);
remote.update(TESLA);
assertEquals("update", mock.action);
assertEquals(TESLA, mock.object);
Person expected = new Person();
expected.id = TESLA.id;
remote.delete(TESLA);
assertEquals("delete", mock.action);
assertEquals(expected, mock.object);
remote.get(TESLA);
assertEquals("get", mock.action);
assertEquals(expected, mock.object);
remote.createQuery(Person.class).fetch();
assertEquals(0, mock.lastQuery.filters.size());
assertEquals(0, mock.lastQuery.orders.size());
remote.createQuery(Person.class).order("firstName").order("lastName").fetch();
assertEquals(0, mock.lastQuery.filters.size());
assertEquals(Arrays.asList("firstName", "lastName"), mock.lastQuery.orders);
remote.createQuery(Person.class)
.filter("city", "Ulm")
.filter("firstName", "Albert")
.filter("lastName", null)
.order("firstName")
.order("lastName")
.fetch();
assertEquals(3, mock.lastQuery.filters.size());
assertEquals("city", ((Object[])mock.lastQuery.filters.get(0))[0]);
assertEquals("Ulm", ((Object[])mock.lastQuery.filters.get(0))[1]);
assertEquals("firstName", ((Object[])mock.lastQuery.filters.get(1))[0]);
assertEquals("Albert", ((Object[])mock.lastQuery.filters.get(1))[1]);
assertEquals("lastName", ((Object[])mock.lastQuery.filters.get(2))[0]);
assertEquals(null, ((Object[])mock.lastQuery.filters.get(2))[1]);
assertEquals(Arrays.asList("firstName", "lastName"), mock.lastQuery.orders);
}
public void testSecurity() {
MockPersistenceManager mock = new MockPersistenceManager();
PersistenceManagerFactory.install(mock, Person.class);
RemotePersistenceManager remote = new RemotePersistenceManager();
Properties properties = new Properties();
properties.setProperty("connector", MockConnector.class.getName());
properties.setProperty("serializer", MockConnector.class.getName());
properties.setProperty("key", "siena");
remote.init(properties);
remote.createQuery(Person.class).fetch();
}
public void testFailSecurity() {
MockPersistenceManager mock = new MockPersistenceManager();
PersistenceManagerFactory.install(mock, Person.class);
RemotePersistenceManager remote = new RemotePersistenceManager();
Properties properties = new Properties();
properties.setProperty("connector", MockConnector.class.getName());
properties.setProperty("serializer", MockConnector.class.getName());
properties.setProperty("key", "siena");
remote.init(properties);
MockConnector.key = "1234";
try {
remote.createQuery(Person.class).fetch();
} catch(SienaException e) {
return;
}
fail("It should have failed due to invalid hash");
}
private Element createSimpleDocument(String rootName) {
return DocumentHelper.createDocument().addElement(rootName);
}
private Element createSimpleDocument() {
return createSimpleDocument("root");
}
}