Add template for assignment 1
This commit is contained in:
parent
4147115ba2
commit
720d6c193f
36
ass1-doc/pom.xml
Normal file
36
ass1-doc/pom.xml
Normal file
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>at.ac.tuwien.infosys.dst</groupId>
|
||||
<artifactId>dst</artifactId>
|
||||
<version>2021.1</version>
|
||||
<relativePath>..</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>ass1-doc</artifactId>
|
||||
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>DST :: Assignment 1 :: Document DB</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>at.ac.tuwien.infosys.dst</groupId>
|
||||
<artifactId>ass1-jpa</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.mongodb</groupId>
|
||||
<artifactId>mongodb-driver</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>de.flapdoodle.embed</groupId>
|
||||
<artifactId>de.flapdoodle.embed.mongo</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
15
ass1-doc/src/main/java/dst/ass1/doc/IDocumentQuery.java
Normal file
15
ass1-doc/src/main/java/dst/ass1/doc/IDocumentQuery.java
Normal file
@ -0,0 +1,15 @@
|
||||
package dst.ass1.doc;
|
||||
|
||||
import org.bson.Document;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface IDocumentQuery {
|
||||
|
||||
Document findLocationById(Long locationId);
|
||||
|
||||
List<Long> findIdsByNameAndRadius(String name, double longitude, double latitude, double radius);
|
||||
|
||||
List<Document> getDocumentStatistics();
|
||||
|
||||
}
|
||||
11
ass1-doc/src/main/java/dst/ass1/doc/IDocumentRepository.java
Normal file
11
ass1-doc/src/main/java/dst/ass1/doc/IDocumentRepository.java
Normal file
@ -0,0 +1,11 @@
|
||||
package dst.ass1.doc;
|
||||
|
||||
import dst.ass1.jpa.model.ILocation;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface IDocumentRepository {
|
||||
|
||||
void insert(ILocation location, Map<String, Object> locationProperties);
|
||||
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
package dst.ass1.doc;
|
||||
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
|
||||
public interface IDocumentServiceFactory {
|
||||
|
||||
IDocumentQuery createDocumentQuery(MongoDatabase db);
|
||||
|
||||
IDocumentRepository createDocumentRepository();
|
||||
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
package dst.ass1.doc.impl;
|
||||
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import dst.ass1.doc.IDocumentQuery;
|
||||
import dst.ass1.doc.IDocumentRepository;
|
||||
import dst.ass1.doc.IDocumentServiceFactory;
|
||||
|
||||
public class DocumentServiceFactory implements IDocumentServiceFactory {
|
||||
|
||||
@Override
|
||||
public IDocumentQuery createDocumentQuery(MongoDatabase db) {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IDocumentRepository createDocumentRepository() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
}
|
||||
45
ass1-doc/src/test/java/dst/ass1/doc/DocumentTestData.java
Normal file
45
ass1-doc/src/test/java/dst/ass1/doc/DocumentTestData.java
Normal file
@ -0,0 +1,45 @@
|
||||
package dst.ass1.doc;
|
||||
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.bson.Document;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class DocumentTestData implements IDocumentTestData {
|
||||
|
||||
private String documentResource;
|
||||
|
||||
public DocumentTestData() {
|
||||
this("documents.json");
|
||||
}
|
||||
|
||||
public DocumentTestData(String documentResource) {
|
||||
this.documentResource = documentResource;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void insertTestData(MongoDatabase db) throws IOException {
|
||||
URL resource = Objects.requireNonNull(getDocumentsResource());
|
||||
|
||||
String testDataJson = readFully(resource);
|
||||
List<Document> documents = Document.parse(testDataJson).get("documents", List.class);
|
||||
db.getCollection(Constants.COLL_LOCATION_DATA).insertMany(documents);
|
||||
}
|
||||
|
||||
private URL getDocumentsResource() {
|
||||
return getClass().getClassLoader().getResource(documentResource);
|
||||
}
|
||||
|
||||
private String readFully(URL resource) throws IOException {
|
||||
try (Scanner scanner = new Scanner(resource.openStream())) {
|
||||
return scanner.useDelimiter("\\Z").next();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
56
ass1-doc/src/test/java/dst/ass1/doc/EmbeddedMongo.java
Normal file
56
ass1-doc/src/test/java/dst/ass1/doc/EmbeddedMongo.java
Normal file
@ -0,0 +1,56 @@
|
||||
package dst.ass1.doc;
|
||||
|
||||
import de.flapdoodle.embed.mongo.config.MongodConfig;
|
||||
import de.flapdoodle.embed.mongo.config.Net;
|
||||
import de.flapdoodle.embed.mongo.distribution.IFeatureAwareVersion;
|
||||
import de.flapdoodle.embed.mongo.distribution.Version;
|
||||
import de.flapdoodle.embed.mongo.tests.MongodForTestsFactory;
|
||||
import org.junit.rules.ExternalResource;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.BindException;
|
||||
import java.net.ServerSocket;
|
||||
|
||||
/**
|
||||
* JUnit rule that creates an in-memory instance of MongoDB using the flapdoodle Embedded MongoDB.
|
||||
*/
|
||||
public class EmbeddedMongo extends ExternalResource {
|
||||
|
||||
private MongodForTestsFactory mongod;
|
||||
|
||||
@Override
|
||||
protected void before() throws Throwable {
|
||||
requirePort();
|
||||
mongod = new MongodFactory(); // starts process in constructor
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void after() {
|
||||
if (mongod != null) {
|
||||
mongod.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
private void requirePort() throws IOException, IllegalStateException {
|
||||
try (ServerSocket ignore = new ServerSocket(27017)) {
|
||||
// ignore
|
||||
} catch (BindException e) {
|
||||
throw new IllegalStateException("Could not bind port 27017 which is necessary to run the MongoDB tests", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static class MongodFactory extends MongodForTestsFactory {
|
||||
|
||||
public MongodFactory() throws IOException {
|
||||
super(Version.Main.V3_5);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MongodConfig newMongodConfig(IFeatureAwareVersion version) throws IOException {
|
||||
return MongodConfig.builder()
|
||||
.net(new Net(27017, false))
|
||||
.version(version)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
18
ass1-doc/src/test/java/dst/ass1/doc/IDocumentTestData.java
Normal file
18
ass1-doc/src/test/java/dst/ass1/doc/IDocumentTestData.java
Normal file
@ -0,0 +1,18 @@
|
||||
package dst.ass1.doc;
|
||||
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
|
||||
// DO NOT MODIFY THIS CLASS.
|
||||
|
||||
/**
|
||||
* The IDocumentTestData interface works like the ITestData as introduced in ass1-jpa only for the {@link MongoService}.
|
||||
*/
|
||||
public interface IDocumentTestData {
|
||||
/**
|
||||
* Inserts the data into the given MongoDatabase instance.
|
||||
*
|
||||
* @param db the mongo database instance
|
||||
* @throws Exception if the insertion failed for some reason
|
||||
*/
|
||||
void insertTestData(MongoDatabase db) throws Exception;
|
||||
}
|
||||
41
ass1-doc/src/test/java/dst/ass1/doc/MockLocation.java
Normal file
41
ass1-doc/src/test/java/dst/ass1/doc/MockLocation.java
Normal file
@ -0,0 +1,41 @@
|
||||
package dst.ass1.doc;
|
||||
|
||||
import dst.ass1.jpa.model.ILocation;
|
||||
|
||||
public class MockLocation implements ILocation {
|
||||
|
||||
private Long id;
|
||||
private String name;
|
||||
private Long LocationId;
|
||||
|
||||
|
||||
@Override
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getLocationId() {
|
||||
return LocationId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLocationId(Long locationId) {
|
||||
LocationId = locationId;
|
||||
}
|
||||
}
|
||||
124
ass1-doc/src/test/java/dst/ass1/doc/MongoService.java
Normal file
124
ass1-doc/src/test/java/dst/ass1/doc/MongoService.java
Normal file
@ -0,0 +1,124 @@
|
||||
package dst.ass1.doc;
|
||||
|
||||
import com.mongodb.MongoClient;
|
||||
import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import dst.ass1.doc.impl.DocumentServiceFactory;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.bson.Document;
|
||||
import org.junit.rules.ExternalResource;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
// DO NOT MODIFY THIS CLASS.
|
||||
|
||||
/**
|
||||
* The MongoService class is used as a JUnit rule, that fulfills the same tasks as the ORMService in ass1-jpa, and works
|
||||
* very similarly.
|
||||
*/
|
||||
public class MongoService extends ExternalResource {
|
||||
|
||||
private IDocumentTestData testData;
|
||||
private boolean insertTestData;
|
||||
private boolean clearTestData;
|
||||
|
||||
private MongoClient mongoClient;
|
||||
private MongoDatabase mongoDatabase;
|
||||
|
||||
private IDocumentServiceFactory documentServiceFactory;
|
||||
private IDocumentRepository documentRepository;
|
||||
private IDocumentQuery documentQuery;
|
||||
|
||||
public MongoService() {
|
||||
this(null, false, true);
|
||||
}
|
||||
|
||||
public MongoService(IDocumentTestData testData) {
|
||||
this(testData, true, true);
|
||||
}
|
||||
|
||||
public MongoService(IDocumentTestData testData, boolean insertTestData, boolean clearTestData) {
|
||||
this.testData = testData;
|
||||
this.insertTestData = insertTestData;
|
||||
this.clearTestData = clearTestData;
|
||||
}
|
||||
|
||||
public static Stream<Document> stream(MongoCollection<Document> collection) {
|
||||
return StreamSupport.stream(collection.find().spliterator(), false);
|
||||
}
|
||||
|
||||
public static <T> Map<T, Document> idMap(MongoCollection<Document> collection, Function<Document, T> idFunction) {
|
||||
return stream(collection).collect(Collectors.toMap(idFunction, Function.identity()));
|
||||
}
|
||||
|
||||
public MongoClient getMongoClient() {
|
||||
return mongoClient;
|
||||
}
|
||||
|
||||
public MongoDatabase getMongoDatabase() {
|
||||
return mongoDatabase;
|
||||
}
|
||||
|
||||
public IDocumentServiceFactory getDocumentServiceFactory() {
|
||||
return documentServiceFactory;
|
||||
}
|
||||
|
||||
public IDocumentRepository getDocumentRepository() {
|
||||
return documentRepository;
|
||||
}
|
||||
|
||||
public IDocumentQuery getDocumentQuery() {
|
||||
return documentQuery;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void before() throws Throwable {
|
||||
setUpMongo();
|
||||
|
||||
if (insertTestData && testData != null) {
|
||||
insertData(testData);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void after() {
|
||||
try {
|
||||
if (clearTestData) {
|
||||
clearData();
|
||||
}
|
||||
} finally {
|
||||
tearDownMongo();
|
||||
}
|
||||
}
|
||||
|
||||
private void setUpMongo() {
|
||||
mongoClient = new MongoClient("127.0.0.1");
|
||||
mongoDatabase = mongoClient.getDatabase(Constants.MONGO_DB_NAME);
|
||||
|
||||
documentServiceFactory = new DocumentServiceFactory();
|
||||
documentRepository = documentServiceFactory.createDocumentRepository();
|
||||
|
||||
if (documentRepository == null) {
|
||||
throw new IllegalStateException("DocumentRepository returned from factory is null");
|
||||
}
|
||||
|
||||
documentQuery = documentServiceFactory.createDocumentQuery(mongoDatabase);
|
||||
}
|
||||
|
||||
private void tearDownMongo() {
|
||||
mongoClient.close();
|
||||
}
|
||||
|
||||
private void insertData(IDocumentTestData testData) throws Exception {
|
||||
testData.insertTestData(getMongoDatabase());
|
||||
}
|
||||
|
||||
private void clearData() {
|
||||
getMongoDatabase().drop();
|
||||
}
|
||||
|
||||
}
|
||||
128
ass1-doc/src/test/java/dst/ass1/doc/tests/Ass1_4_1Test.java
Normal file
128
ass1-doc/src/test/java/dst/ass1/doc/tests/Ass1_4_1Test.java
Normal file
@ -0,0 +1,128 @@
|
||||
package dst.ass1.doc.tests;
|
||||
|
||||
import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import dst.ass1.doc.EmbeddedMongo;
|
||||
import dst.ass1.doc.IDocumentRepository;
|
||||
import dst.ass1.doc.MockLocation;
|
||||
import dst.ass1.doc.MongoService;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.bson.Document;
|
||||
import org.junit.Before;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.hasItems;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_4_1Test {
|
||||
|
||||
public static final String LOCATION_NAME_1 = "testName1";
|
||||
public static final String LOCATION_NAME_2 = "testName2";
|
||||
public static final Long LOCATION_ID_1 = 1L;
|
||||
public static final Long LOCATION_ID_2 = 2L;
|
||||
public static final Double GEO_1_1 = 16.3699;
|
||||
public static final Double GEO_1_2 = 48.199;
|
||||
public static final Double GEO_2_1 = 16.368528;
|
||||
public static final Double GEO_2_2 = 48.200939;
|
||||
@ClassRule
|
||||
public static EmbeddedMongo embeddedMongo = new EmbeddedMongo();
|
||||
@Rule
|
||||
public MongoService mongo = new MongoService();
|
||||
private MockLocation l1;
|
||||
private MockLocation l2;
|
||||
private Map<String, Object> l1Properties;
|
||||
private Map<String, Object> l2Properties;
|
||||
private Map<String, Object> geo1;
|
||||
private Map<String, Object> geo2;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
l1 = new MockLocation();
|
||||
l1.setName(LOCATION_NAME_1);
|
||||
l1.setLocationId(LOCATION_ID_1);
|
||||
|
||||
l2 = new MockLocation();
|
||||
l2.setName(LOCATION_NAME_2);
|
||||
l2.setLocationId(LOCATION_ID_2);
|
||||
|
||||
|
||||
l1Properties = new HashMap<>();
|
||||
|
||||
geo1 = new HashMap<>();
|
||||
geo1.put("type", "Point");
|
||||
geo1.put("coordinates", Arrays.asList(GEO_1_1, GEO_1_2));
|
||||
l1Properties.put("type", "place");
|
||||
l1Properties.put("geo", geo1);
|
||||
l1Properties.put("1337", "7331");
|
||||
l1Properties.put("Foo", "Bar");
|
||||
l1Properties.put("Complex", Arrays.asList(1, 2, 3, 5, 8));
|
||||
|
||||
l2Properties = new HashMap<>();
|
||||
|
||||
geo2 = new HashMap<>();
|
||||
geo2.put("type", "Point");
|
||||
geo2.put("coordinates", Arrays.asList(GEO_2_1, GEO_2_2));
|
||||
l2Properties.put("type", "place");
|
||||
l2Properties.put("geo", geo2);
|
||||
l2Properties.put("123456", "654321");
|
||||
l2Properties.put("F00", "B@r");
|
||||
l2Properties.put("Complex2", Arrays.asList(4, 6, 7, 9));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insert_insertsDocumentsCorrectly() throws Exception {
|
||||
IDocumentRepository documentRepository = mongo.getDocumentRepository();
|
||||
MongoDatabase mongoDatabase = mongo.getMongoDatabase();
|
||||
|
||||
documentRepository.insert(l1, l1Properties);
|
||||
documentRepository.insert(l2, l2Properties);
|
||||
|
||||
MongoCollection<Document> collection = mongoDatabase.getCollection(Constants.COLL_LOCATION_DATA);
|
||||
Map<Long, Document> map = MongoService.idMap(collection, d -> d.getLong(Constants.I_LOCATION));
|
||||
|
||||
assertNotNull(map);
|
||||
assertEquals(2, map.size());
|
||||
|
||||
Document document1 = map.get(1L);
|
||||
assertEquals(LOCATION_ID_1, document1.get(Constants.I_LOCATION));
|
||||
assertEquals(LOCATION_NAME_1, document1.get(Constants.M_LOCATION_NAME));
|
||||
|
||||
assertEquals("7331", document1.get("1337"));
|
||||
assertEquals("Bar", document1.get("Foo"));
|
||||
assertEquals(Arrays.asList(1, 2, 3, 5, 8), document1.get("Complex"));
|
||||
|
||||
assertEquals("place", document1.get("type"));
|
||||
|
||||
Map<String, Object> geo1Retrieved = document1.get("geo", new HashMap<>());
|
||||
assertEquals(2, geo1Retrieved.size());
|
||||
assertEquals("Point", geo1Retrieved.get("type"));
|
||||
List<Double> coordinates1 = (List<Double>) geo1Retrieved.get("coordinates");
|
||||
assertEquals(2, coordinates1.size());
|
||||
assertThat(coordinates1, hasItems(GEO_1_1, GEO_1_2));
|
||||
|
||||
Document document2 = map.get(2L);
|
||||
assertEquals(LOCATION_ID_2, document2.get(Constants.I_LOCATION));
|
||||
assertEquals(LOCATION_NAME_2, document2.get(Constants.M_LOCATION_NAME));
|
||||
|
||||
assertEquals("654321", document2.get("123456"));
|
||||
assertEquals("B@r", document2.get("F00"));
|
||||
assertEquals(Arrays.asList(4, 6, 7, 9), document2.get("Complex2"));
|
||||
|
||||
assertEquals("place", document2.get("type"));
|
||||
|
||||
Map<String, Object> geo2Retrieved = document2.get("geo", new HashMap<>());
|
||||
assertEquals(2, geo2Retrieved.size());
|
||||
assertEquals("Point", geo2Retrieved.get("type"));
|
||||
List<Double> coordinates2 = (List<Double>) geo2Retrieved.get("coordinates");
|
||||
assertEquals(2, coordinates2.size());
|
||||
assertThat(coordinates2, hasItems(GEO_2_1, GEO_2_2));
|
||||
}
|
||||
}
|
||||
53
ass1-doc/src/test/java/dst/ass1/doc/tests/Ass1_4_2aTest.java
Normal file
53
ass1-doc/src/test/java/dst/ass1/doc/tests/Ass1_4_2aTest.java
Normal file
@ -0,0 +1,53 @@
|
||||
package dst.ass1.doc.tests;
|
||||
|
||||
import dst.ass1.doc.DocumentTestData;
|
||||
import dst.ass1.doc.EmbeddedMongo;
|
||||
import dst.ass1.doc.IDocumentQuery;
|
||||
import dst.ass1.doc.MongoService;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.bson.Document;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_4_2aTest {
|
||||
|
||||
@ClassRule
|
||||
public static EmbeddedMongo embeddedMongo = new EmbeddedMongo();
|
||||
|
||||
@Rule
|
||||
public MongoService mongo = new MongoService(new DocumentTestData());
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void findByLocationId_returnsCorrectDocument() {
|
||||
IDocumentQuery documentQuery = mongo.getDocumentQuery();
|
||||
|
||||
Document location = documentQuery.findLocationById(2L);
|
||||
assertNotNull(location);
|
||||
assertEquals(2L, (long) location.getLong(Constants.I_LOCATION));
|
||||
assertEquals("McDonald's", location.getString(Constants.M_LOCATION_NAME));
|
||||
assertEquals("place", location.getString("type"));
|
||||
assertEquals("Restaurant", location.getString("category"));
|
||||
|
||||
Document geo = location.get("geo", Document.class);
|
||||
assertNotNull(geo);
|
||||
List<Double> coordinates = geo.getList("coordinates", Double.class);
|
||||
assertNotNull(coordinates);
|
||||
assertEquals(2, coordinates.size());
|
||||
assertEquals("Point", geo.getString("type"));
|
||||
assertEquals(16.368528, coordinates.get(0), 0.0);
|
||||
assertEquals(48.200939, coordinates.get(1), 0.0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByLocationId_withInvalidId_returnsNull() throws Exception {
|
||||
Document material = mongo.getDocumentQuery().findLocationById(1337L);
|
||||
assertNull(material);
|
||||
}
|
||||
|
||||
}
|
||||
43
ass1-doc/src/test/java/dst/ass1/doc/tests/Ass1_4_2bTest.java
Normal file
43
ass1-doc/src/test/java/dst/ass1/doc/tests/Ass1_4_2bTest.java
Normal file
@ -0,0 +1,43 @@
|
||||
package dst.ass1.doc.tests;
|
||||
|
||||
import dst.ass1.doc.DocumentTestData;
|
||||
import dst.ass1.doc.EmbeddedMongo;
|
||||
import dst.ass1.doc.MongoService;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.Matchers.hasItems;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_4_2bTest {
|
||||
|
||||
@ClassRule
|
||||
public static EmbeddedMongo embeddedMongo = new EmbeddedMongo();
|
||||
|
||||
@Rule
|
||||
public MongoService mongo = new MongoService(new DocumentTestData());
|
||||
|
||||
@Test
|
||||
public void findIdsByNameAndRadius_returnsCorrectLocationIds() throws Exception {
|
||||
List<Long> locationIds = mongo.getDocumentQuery().findIdsByNameAndRadius("McD", 16.367873, 48.198763, 1000);
|
||||
assertFalse(locationIds.isEmpty());
|
||||
assertThat(locationIds, hasItems(2L, 3L, 4L));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findIdsByType_withNonExistingType_returnsNoLocationIds() throws Exception {
|
||||
List<Long> locationIds = mongo.getDocumentQuery().findIdsByNameAndRadius("McD", 16.367873, 48.198763, 5);
|
||||
assertNotNull(locationIds);
|
||||
assertTrue(locationIds.isEmpty());
|
||||
|
||||
locationIds = mongo.getDocumentQuery().findIdsByNameAndRadius("NONEXISTING", 16.367873, 48.198763, 2000);
|
||||
|
||||
assertNotNull(locationIds);
|
||||
assertTrue(locationIds.isEmpty());
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
package dst.ass1.doc.tests;
|
||||
|
||||
import dst.ass1.doc.EmbeddedMongo;
|
||||
import dst.ass1.doc.MongoService;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.bson.Document;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class Ass1_4_3_01Test {
|
||||
|
||||
@ClassRule
|
||||
public static EmbeddedMongo embeddedMongo = new EmbeddedMongo();
|
||||
|
||||
@Rule
|
||||
public MongoService mongo = new MongoService(db -> {
|
||||
boolean exists = StreamSupport.stream(db.listCollectionNames().spliterator(), false)
|
||||
.anyMatch(Constants.COLL_LOCATION_DATA::equalsIgnoreCase);
|
||||
|
||||
if (!exists) {
|
||||
db.createCollection(Constants.COLL_LOCATION_DATA); // make sure the empty collection exists
|
||||
}
|
||||
});
|
||||
|
||||
@Test
|
||||
public void getDocumentStatistics_withEmptyData_returnsEmptyStatistics() throws Exception {
|
||||
List<Document> documentStatistics = mongo.getDocumentQuery().getDocumentStatistics();
|
||||
assertNotNull(documentStatistics);
|
||||
assertTrue(documentStatistics.isEmpty());
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,46 @@
|
||||
package dst.ass1.doc.tests;
|
||||
|
||||
import dst.ass1.doc.DocumentTestData;
|
||||
import dst.ass1.doc.EmbeddedMongo;
|
||||
import dst.ass1.doc.MongoService;
|
||||
import org.bson.Document;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.hasItems;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_4_3_02Test {
|
||||
|
||||
@ClassRule
|
||||
public static EmbeddedMongo embeddedMongo = new EmbeddedMongo();
|
||||
|
||||
@Rule
|
||||
public MongoService mongo = new MongoService(new DocumentTestData());
|
||||
|
||||
@Test
|
||||
public void getDocumentStatistics_returnsCorrectStatistics() throws Exception {
|
||||
List<Document> documentStatistics = mongo.getDocumentQuery().getDocumentStatistics();
|
||||
assertNotNull(documentStatistics);
|
||||
assertEquals(3, documentStatistics.size());
|
||||
|
||||
List<String> types = documentStatistics.stream().map(d -> d.getString("_id")).collect(Collectors.toList());
|
||||
assertThat("expected three aggregation keys", types, hasItems("Restaurant", "Park", "University"));
|
||||
|
||||
Map<String, Double> dsMap = documentStatistics.stream().collect(Collectors.toMap(
|
||||
d -> d.getString("_id"),
|
||||
d -> d.getDouble("value"))
|
||||
);
|
||||
|
||||
assertEquals(4.0d, dsMap.get("Restaurant"), 0);
|
||||
assertEquals(1.0d, dsMap.get("Park"), 0);
|
||||
assertEquals(7.0d, dsMap.get("University"), 0);
|
||||
}
|
||||
|
||||
}
|
||||
16
ass1-doc/src/test/java/dst/ass1/doc/tests/Ass1_4_Suite.java
Normal file
16
ass1-doc/src/test/java/dst/ass1/doc/tests/Ass1_4_Suite.java
Normal file
@ -0,0 +1,16 @@
|
||||
package dst.ass1.doc.tests;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Suite;
|
||||
import org.junit.runners.Suite.SuiteClasses;
|
||||
|
||||
@RunWith(Suite.class)
|
||||
@SuiteClasses( {
|
||||
Ass1_4_1Test.class,
|
||||
Ass1_4_2aTest.class,
|
||||
Ass1_4_2bTest.class,
|
||||
Ass1_4_3_01Test.class,
|
||||
Ass1_4_3_02Test.class
|
||||
})
|
||||
public class Ass1_4_Suite {
|
||||
}
|
||||
184
ass1-doc/src/test/resources/documents.json
Normal file
184
ass1-doc/src/test/resources/documents.json
Normal file
@ -0,0 +1,184 @@
|
||||
{
|
||||
"documents": [
|
||||
{
|
||||
"location_id": NumberLong(1),
|
||||
"type": "place",
|
||||
"name": "TU Wien",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.3699,
|
||||
48.199
|
||||
]
|
||||
},
|
||||
"category": "University"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(2),
|
||||
"type": "place",
|
||||
"name": "McDonald's",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.368528,
|
||||
48.200939
|
||||
]
|
||||
},
|
||||
"category": "Restaurant"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(3),
|
||||
"type": "place",
|
||||
"name": "McDonald's",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.374138,
|
||||
48.201085
|
||||
]
|
||||
},
|
||||
"category": "Restaurant"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(4),
|
||||
"type": "place",
|
||||
"name": "McDonald's",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.371674,
|
||||
48.205241
|
||||
]
|
||||
},
|
||||
"category": "Restaurant"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(5),
|
||||
"type": "place",
|
||||
"name": "McDonald's",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.380754,
|
||||
48.219325
|
||||
]
|
||||
},
|
||||
"category": "Restaurant"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(6),
|
||||
"type": "address",
|
||||
"name": "Zirkusgasse 1",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.384230,
|
||||
48.216310
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(7),
|
||||
"type": "address",
|
||||
"name": "Handelskai 9",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.406082,
|
||||
48.225571
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(8),
|
||||
"type": "place",
|
||||
"name": "Cairngorms National Park",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
-3.562790,
|
||||
57.046944
|
||||
]
|
||||
},
|
||||
"category": "Park"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(9),
|
||||
"type": "place",
|
||||
"name": "Distributed Systems Group",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.371425,
|
||||
48.197742
|
||||
]
|
||||
},
|
||||
"category": "University"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(10),
|
||||
"type": "place",
|
||||
"name": "Computer Vision Lab",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.369572,
|
||||
48.195244
|
||||
]
|
||||
},
|
||||
"category": "University"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(11),
|
||||
"type": "place",
|
||||
"name": "Uni Wien",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.360372,
|
||||
48.213069
|
||||
]
|
||||
},
|
||||
"category": "University"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(12),
|
||||
"type": "place",
|
||||
"name": "BOKU Wien",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.337443,
|
||||
48.236530
|
||||
]
|
||||
},
|
||||
"category": "University"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(13),
|
||||
"type": "place",
|
||||
"name": "WU Wien",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.408456,
|
||||
48.213561
|
||||
]
|
||||
},
|
||||
"category": "University"
|
||||
},
|
||||
{
|
||||
"location_id": NumberLong(14),
|
||||
"type": "place",
|
||||
"name": "Audimax TU Wien",
|
||||
"geo": {
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
16.363949,
|
||||
48.200822
|
||||
]
|
||||
},
|
||||
"category": "University"
|
||||
}
|
||||
]
|
||||
}
|
||||
17
ass1-doc/src/test/resources/logback.xml
Normal file
17
ass1-doc/src/test/resources/logback.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %highlight(%5p) [%12.12thread] %cyan(%-40.40logger{39}): %m%n</pattern>
|
||||
</encoder>
|
||||
|
||||
</appender>
|
||||
|
||||
<logger name="org.mongodb.driver" level="WARN"/>
|
||||
<logger name="de.flapdoodle.embed" level="WARN"/>
|
||||
|
||||
<root level="${log.level:-INFO}">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</root>
|
||||
</configuration>
|
||||
35
ass1-jpa/pom.xml
Normal file
35
ass1-jpa/pom.xml
Normal file
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>at.ac.tuwien.infosys.dst</groupId>
|
||||
<artifactId>dst</artifactId>
|
||||
<version>2021.1</version>
|
||||
<relativePath>..</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>ass1-jpa</artifactId>
|
||||
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>DST :: Assignment 1 :: JPA</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
9
ass1-jpa/src/main/java/dst/ass1/jpa/dao/GenericDAO.java
Normal file
9
ass1-jpa/src/main/java/dst/ass1/jpa/dao/GenericDAO.java
Normal file
@ -0,0 +1,9 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface GenericDAO<T> {
|
||||
T findById(Long id);
|
||||
|
||||
List<T> findAll();
|
||||
}
|
||||
23
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IDAOFactory.java
Normal file
23
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IDAOFactory.java
Normal file
@ -0,0 +1,23 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
public interface IDAOFactory {
|
||||
|
||||
IDriverDAO createDriverDAO();
|
||||
|
||||
IEmploymentDAO createEmploymentDAO();
|
||||
|
||||
ILocationDAO createLocationDAO();
|
||||
|
||||
IMatchDAO createMatchDAO();
|
||||
|
||||
IOrganizationDAO createOrganizationDAO();
|
||||
|
||||
IRiderDAO createRiderDAO();
|
||||
|
||||
ITripDAO createTripDAO();
|
||||
|
||||
ITripInfoDAO createTripInfoDAO();
|
||||
|
||||
IVehicleDAO createVehicleDAO();
|
||||
|
||||
}
|
||||
19
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IDriverDAO.java
Normal file
19
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IDriverDAO.java
Normal file
@ -0,0 +1,19 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.IDriver;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface IDriverDAO extends GenericDAO<IDriver> {
|
||||
|
||||
|
||||
/**
|
||||
* Find all drivers that have active employments (active at least one month) in more than the given number
|
||||
* of organizations
|
||||
*
|
||||
* @param numberOfOrganizations number of organizations
|
||||
* @return a collection containing drivers
|
||||
*/
|
||||
Collection<IDriver> findActiveInMultipleOrganizationsDrivers(Long numberOfOrganizations);
|
||||
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.IEmployment;
|
||||
|
||||
public interface IEmploymentDAO extends GenericDAO<IEmployment> {
|
||||
}
|
||||
16
ass1-jpa/src/main/java/dst/ass1/jpa/dao/ILocationDAO.java
Normal file
16
ass1-jpa/src/main/java/dst/ass1/jpa/dao/ILocationDAO.java
Normal file
@ -0,0 +1,16 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.ILocation;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface ILocationDAO extends GenericDAO<ILocation> {
|
||||
|
||||
/**
|
||||
* Finds all distinct Location.locationId that have been reached as a Trip destination or additional
|
||||
* stops. Only takes completed trips in account.
|
||||
*
|
||||
* @return a list containing Location.locationIds
|
||||
*/
|
||||
Collection<Long> findReachedLocationIds();
|
||||
}
|
||||
6
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IMatchDAO.java
Normal file
6
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IMatchDAO.java
Normal file
@ -0,0 +1,6 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.IMatch;
|
||||
|
||||
public interface IMatchDAO extends GenericDAO<IMatch> {
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.IOrganization;
|
||||
|
||||
public interface IOrganizationDAO extends GenericDAO<IOrganization> {
|
||||
}
|
||||
33
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IRiderDAO.java
Normal file
33
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IRiderDAO.java
Normal file
@ -0,0 +1,33 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.IMoney;
|
||||
import dst.ass1.jpa.model.IRider;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface IRiderDAO extends GenericDAO<IRider> {
|
||||
|
||||
|
||||
/**
|
||||
* Returns the rider associated with the given email. Returns null if the email does not exist.
|
||||
*
|
||||
* @param email the email address
|
||||
* @return the rider or null
|
||||
*/
|
||||
IRider findByEmail(String email);
|
||||
|
||||
/**
|
||||
* Gets the total travel distance of the rider with the most recently completed trip
|
||||
*
|
||||
* @return the total distance the rider has travelled
|
||||
*/
|
||||
Double getTotalDistanceOfMostRecentRider();
|
||||
|
||||
/**
|
||||
* Finds for each Rider, who has completed at least one trip in the past 30 days, the sum of their total
|
||||
* spendings of the past 30 days.
|
||||
*
|
||||
* @return a map containing each rider, and the money grouped by their currency.
|
||||
*/
|
||||
Map<IRider, Map<String, IMoney>> getRecentSpending();
|
||||
}
|
||||
18
ass1-jpa/src/main/java/dst/ass1/jpa/dao/ITripDAO.java
Normal file
18
ass1-jpa/src/main/java/dst/ass1/jpa/dao/ITripDAO.java
Normal file
@ -0,0 +1,18 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.ITrip;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
|
||||
public interface ITripDAO extends GenericDAO<ITrip> {
|
||||
|
||||
/**
|
||||
* Find all canceled trips that were created in the given date range.
|
||||
*
|
||||
* @param start start of the date range
|
||||
* @param end end of the date range
|
||||
* @return the cancelled trips
|
||||
*/
|
||||
Collection<ITrip> findCancelledTrips(Date start, Date end);
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.ITripInfo;
|
||||
|
||||
public interface ITripInfoDAO extends GenericDAO<ITripInfo> {
|
||||
}
|
||||
6
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IVehicleDAO.java
Normal file
6
ass1-jpa/src/main/java/dst/ass1/jpa/dao/IVehicleDAO.java
Normal file
@ -0,0 +1,6 @@
|
||||
package dst.ass1.jpa.dao;
|
||||
|
||||
import dst.ass1.jpa.model.IVehicle;
|
||||
|
||||
public interface IVehicleDAO extends GenericDAO<IVehicle> {
|
||||
}
|
||||
74
ass1-jpa/src/main/java/dst/ass1/jpa/dao/impl/DAOFactory.java
Normal file
74
ass1-jpa/src/main/java/dst/ass1/jpa/dao/impl/DAOFactory.java
Normal file
@ -0,0 +1,74 @@
|
||||
package dst.ass1.jpa.dao.impl;
|
||||
|
||||
import dst.ass1.jpa.dao.*;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
|
||||
public class DAOFactory implements IDAOFactory {
|
||||
|
||||
/*
|
||||
* HINT: When using the org.hibernate.Session in your DAOs you can extract it from the EntityManager reference with
|
||||
* e.g., em.unwrap(org.hibernate.Session.class). Do not store this org.hibernate.Session in your DAOs, but unwrap it
|
||||
* every time you actually need it.
|
||||
*/
|
||||
|
||||
private EntityManager em;
|
||||
|
||||
public DAOFactory(EntityManager em) {
|
||||
this.em = em;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IDriverDAO createDriverDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEmploymentDAO createEmploymentDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ILocationDAO createLocationDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMatchDAO createMatchDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IOrganizationDAO createOrganizationDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IRiderDAO createRiderDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITripDAO createTripDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITripInfoDAO createTripInfoDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IVehicleDAO createVehicleDAO() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package dst.ass1.jpa.interceptor;
|
||||
|
||||
import org.hibernate.EmptyInterceptor;
|
||||
|
||||
public class SQLInterceptor extends EmptyInterceptor {
|
||||
|
||||
private static final long serialVersionUID = -3082243834965597947L;
|
||||
|
||||
public static void resetCounter() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
public static int getSelectCount() {
|
||||
// TODO
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the verbose argument is set, the interceptor prints the intercepted SQL statements to System.out.
|
||||
*
|
||||
* @param verbose whether or not to be verbose
|
||||
*/
|
||||
public static void setVerbose(boolean verbose) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onPrepareStatement(String sql) {
|
||||
// TODO
|
||||
return sql;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
package dst.ass1.jpa.listener;
|
||||
|
||||
|
||||
public class DefaultListener {
|
||||
|
||||
// TODO
|
||||
|
||||
public static int getLoadOperations() {
|
||||
// TODO
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static int getUpdateOperations() {
|
||||
// TODO
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static int getRemoveOperations() {
|
||||
// TODO
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static int getPersistOperations() {
|
||||
// TODO
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static long getOverallTimeToPersist() {
|
||||
// TODO
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static double getAverageTimeToPersist() {
|
||||
// TODO
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the internal data structures that are used for storing the operations.
|
||||
*/
|
||||
public static void clear() {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
17
ass1-jpa/src/main/java/dst/ass1/jpa/model/IDriver.java
Normal file
17
ass1-jpa/src/main/java/dst/ass1/jpa/model/IDriver.java
Normal file
@ -0,0 +1,17 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface IDriver extends IPlatformUser {
|
||||
|
||||
Collection<IEmployment> getEmployments();
|
||||
|
||||
void setEmployments(Collection<IEmployment> employments);
|
||||
|
||||
void addEmployment(IEmployment employment);
|
||||
|
||||
IVehicle getVehicle();
|
||||
|
||||
void setVehicle(IVehicle vehicle);
|
||||
|
||||
}
|
||||
18
ass1-jpa/src/main/java/dst/ass1/jpa/model/IEmployment.java
Normal file
18
ass1-jpa/src/main/java/dst/ass1/jpa/model/IEmployment.java
Normal file
@ -0,0 +1,18 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public interface IEmployment {
|
||||
|
||||
IEmploymentKey getId();
|
||||
|
||||
void setId(IEmploymentKey employmentKey);
|
||||
|
||||
Date getSince();
|
||||
|
||||
void setSince(Date since);
|
||||
|
||||
Boolean isActive();
|
||||
|
||||
void setActive(Boolean active);
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
public interface IEmploymentKey {
|
||||
|
||||
IDriver getDriver();
|
||||
|
||||
void setDriver(IDriver driver);
|
||||
|
||||
IOrganization getOrganization();
|
||||
|
||||
void setOrganization(IOrganization organization);
|
||||
}
|
||||
16
ass1-jpa/src/main/java/dst/ass1/jpa/model/ILocation.java
Normal file
16
ass1-jpa/src/main/java/dst/ass1/jpa/model/ILocation.java
Normal file
@ -0,0 +1,16 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
public interface ILocation {
|
||||
|
||||
Long getId();
|
||||
|
||||
void setId(Long id);
|
||||
|
||||
String getName();
|
||||
|
||||
void setName(String name);
|
||||
|
||||
Long getLocationId();
|
||||
|
||||
void setLocationId(Long locationId);
|
||||
}
|
||||
30
ass1-jpa/src/main/java/dst/ass1/jpa/model/IMatch.java
Normal file
30
ass1-jpa/src/main/java/dst/ass1/jpa/model/IMatch.java
Normal file
@ -0,0 +1,30 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public interface IMatch {
|
||||
|
||||
Long getId();
|
||||
|
||||
void setId(Long id);
|
||||
|
||||
Date getDate();
|
||||
|
||||
void setDate(Date date);
|
||||
|
||||
IMoney getFare();
|
||||
|
||||
void setFare(IMoney money);
|
||||
|
||||
ITrip getTrip();
|
||||
|
||||
void setTrip(ITrip trip);
|
||||
|
||||
IVehicle getVehicle();
|
||||
|
||||
void setVehicle(IVehicle vehicle);
|
||||
|
||||
IDriver getDriver();
|
||||
|
||||
void setDriver(IDriver driver);
|
||||
}
|
||||
30
ass1-jpa/src/main/java/dst/ass1/jpa/model/IModelFactory.java
Normal file
30
ass1-jpa/src/main/java/dst/ass1/jpa/model/IModelFactory.java
Normal file
@ -0,0 +1,30 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
public interface IModelFactory {
|
||||
|
||||
IModelFactory createModelFactory();
|
||||
|
||||
IDriver createDriver();
|
||||
|
||||
IEmployment createEmployment();
|
||||
|
||||
IEmploymentKey createEmploymentKey();
|
||||
|
||||
ILocation createLocation();
|
||||
|
||||
IMatch createMatch();
|
||||
|
||||
IMoney createMoney();
|
||||
|
||||
IOrganization createOrganization();
|
||||
|
||||
IRider createRider();
|
||||
|
||||
IPreferences createPreferences();
|
||||
|
||||
ITrip createTrip();
|
||||
|
||||
ITripInfo createTripInfo();
|
||||
|
||||
IVehicle createVehicle();
|
||||
}
|
||||
14
ass1-jpa/src/main/java/dst/ass1/jpa/model/IMoney.java
Normal file
14
ass1-jpa/src/main/java/dst/ass1/jpa/model/IMoney.java
Normal file
@ -0,0 +1,14 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public interface IMoney {
|
||||
|
||||
String getCurrency();
|
||||
|
||||
void setCurrency(String currency);
|
||||
|
||||
BigDecimal getValue();
|
||||
|
||||
void setValue(BigDecimal value);
|
||||
}
|
||||
38
ass1-jpa/src/main/java/dst/ass1/jpa/model/IOrganization.java
Normal file
38
ass1-jpa/src/main/java/dst/ass1/jpa/model/IOrganization.java
Normal file
@ -0,0 +1,38 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface IOrganization {
|
||||
|
||||
Long getId();
|
||||
|
||||
void setId(Long id);
|
||||
|
||||
String getName();
|
||||
|
||||
void setName(String name);
|
||||
|
||||
Collection<IOrganization> getParts();
|
||||
|
||||
void setParts(Collection<IOrganization> parts);
|
||||
|
||||
void addPart(IOrganization part);
|
||||
|
||||
Collection<IOrganization> getPartOf();
|
||||
|
||||
void setPartOf(Collection<IOrganization> partOf);
|
||||
|
||||
void addPartOf(IOrganization partOf);
|
||||
|
||||
Collection<IEmployment> getEmployments();
|
||||
|
||||
void setEmployments(Collection<IEmployment> employments);
|
||||
|
||||
void addEmployment(IEmployment employment);
|
||||
|
||||
Collection<IVehicle> getVehicles();
|
||||
|
||||
void setVehicles(Collection<IVehicle> vehicles);
|
||||
|
||||
void addVehicle(IVehicle vehicle);
|
||||
}
|
||||
20
ass1-jpa/src/main/java/dst/ass1/jpa/model/IPlatformUser.java
Normal file
20
ass1-jpa/src/main/java/dst/ass1/jpa/model/IPlatformUser.java
Normal file
@ -0,0 +1,20 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
public interface IPlatformUser {
|
||||
|
||||
Long getId();
|
||||
|
||||
void setId(Long id);
|
||||
|
||||
String getName();
|
||||
|
||||
void setName(String name);
|
||||
|
||||
String getTel();
|
||||
|
||||
void setTel(String tel);
|
||||
|
||||
Double getAvgRating();
|
||||
|
||||
void setAvgRating(Double avgRating);
|
||||
}
|
||||
16
ass1-jpa/src/main/java/dst/ass1/jpa/model/IPreferences.java
Normal file
16
ass1-jpa/src/main/java/dst/ass1/jpa/model/IPreferences.java
Normal file
@ -0,0 +1,16 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface IPreferences {
|
||||
|
||||
Long getId();
|
||||
|
||||
void setId(Long id);
|
||||
|
||||
Map<String, String> getData();
|
||||
|
||||
void setData(Map<String, String> data);
|
||||
|
||||
void putData(String key, String value);
|
||||
}
|
||||
32
ass1-jpa/src/main/java/dst/ass1/jpa/model/IRider.java
Normal file
32
ass1-jpa/src/main/java/dst/ass1/jpa/model/IRider.java
Normal file
@ -0,0 +1,32 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface IRider extends IPlatformUser {
|
||||
|
||||
String getEmail();
|
||||
|
||||
void setEmail(String email);
|
||||
|
||||
byte[] getPassword();
|
||||
|
||||
void setPassword(byte[] password);
|
||||
|
||||
String getAccountNo();
|
||||
|
||||
void setAccountNo(String accountNo);
|
||||
|
||||
String getBankCode();
|
||||
|
||||
void setBankCode(String bankCode);
|
||||
|
||||
IPreferences getPreferences();
|
||||
|
||||
void setPreferences(IPreferences preferences);
|
||||
|
||||
Collection<ITrip> getTrips();
|
||||
|
||||
void setTrips(Collection<ITrip> trips);
|
||||
|
||||
void addTrip(ITrip trip);
|
||||
}
|
||||
49
ass1-jpa/src/main/java/dst/ass1/jpa/model/ITrip.java
Normal file
49
ass1-jpa/src/main/java/dst/ass1/jpa/model/ITrip.java
Normal file
@ -0,0 +1,49 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
|
||||
public interface ITrip {
|
||||
|
||||
Long getId();
|
||||
|
||||
void setId(Long id);
|
||||
|
||||
Date getCreated();
|
||||
|
||||
void setCreated(Date created);
|
||||
|
||||
Date getUpdated();
|
||||
|
||||
void setUpdated(Date updated);
|
||||
|
||||
TripState getState();
|
||||
|
||||
void setState(TripState state);
|
||||
|
||||
ILocation getPickup();
|
||||
|
||||
void setPickup(ILocation pickup);
|
||||
|
||||
ILocation getDestination();
|
||||
|
||||
void setDestination(ILocation destination);
|
||||
|
||||
Collection<ILocation> getStops();
|
||||
|
||||
void setStops(Collection<ILocation> stops);
|
||||
|
||||
void addStop(ILocation stop);
|
||||
|
||||
ITripInfo getTripInfo();
|
||||
|
||||
void setTripInfo(ITripInfo tripInfo);
|
||||
|
||||
IMatch getMatch();
|
||||
|
||||
void setMatch(IMatch match);
|
||||
|
||||
IRider getRider();
|
||||
|
||||
void setRider(IRider rider);
|
||||
}
|
||||
35
ass1-jpa/src/main/java/dst/ass1/jpa/model/ITripInfo.java
Normal file
35
ass1-jpa/src/main/java/dst/ass1/jpa/model/ITripInfo.java
Normal file
@ -0,0 +1,35 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public interface ITripInfo {
|
||||
|
||||
Long getId();
|
||||
|
||||
void setId(Long id);
|
||||
|
||||
Date getCompleted();
|
||||
|
||||
void setCompleted(Date date);
|
||||
|
||||
Double getDistance();
|
||||
|
||||
void setDistance(Double distance);
|
||||
|
||||
IMoney getTotal();
|
||||
|
||||
void setTotal(IMoney money);
|
||||
|
||||
Integer getDriverRating();
|
||||
|
||||
void setDriverRating(Integer driverRating);
|
||||
|
||||
Integer getRiderRating();
|
||||
|
||||
void setRiderRating(Integer riderRating);
|
||||
|
||||
ITrip getTrip();
|
||||
|
||||
void setTrip(ITrip trip);
|
||||
|
||||
}
|
||||
20
ass1-jpa/src/main/java/dst/ass1/jpa/model/IVehicle.java
Normal file
20
ass1-jpa/src/main/java/dst/ass1/jpa/model/IVehicle.java
Normal file
@ -0,0 +1,20 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
public interface IVehicle {
|
||||
|
||||
Long getId();
|
||||
|
||||
void setId(Long id);
|
||||
|
||||
String getLicense();
|
||||
|
||||
void setLicense(String license);
|
||||
|
||||
String getColor();
|
||||
|
||||
void setColor(String color);
|
||||
|
||||
String getType();
|
||||
|
||||
void setType(String type);
|
||||
}
|
||||
5
ass1-jpa/src/main/java/dst/ass1/jpa/model/TripState.java
Normal file
5
ass1-jpa/src/main/java/dst/ass1/jpa/model/TripState.java
Normal file
@ -0,0 +1,5 @@
|
||||
package dst.ass1.jpa.model;
|
||||
|
||||
public enum TripState {
|
||||
CREATED, QUEUED, MATCHED, APPROACHING, IN_PROGRESS, CANCELLED, COMPLETED
|
||||
}
|
||||
@ -0,0 +1,87 @@
|
||||
package dst.ass1.jpa.model.impl;
|
||||
|
||||
import dst.ass1.jpa.model.*;
|
||||
|
||||
/**
|
||||
* Creates new instances of your model implementations.
|
||||
*/
|
||||
public class ModelFactory implements IModelFactory {
|
||||
|
||||
@Override
|
||||
public IModelFactory createModelFactory() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IDriver createDriver() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEmployment createEmployment() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEmploymentKey createEmploymentKey() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ILocation createLocation() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMatch createMatch() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMoney createMoney() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IOrganization createOrganization() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IRider createRider() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPreferences createPreferences() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITrip createTrip() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITripInfo createTripInfo() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IVehicle createVehicle() {
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
}
|
||||
121
ass1-jpa/src/main/java/dst/ass1/jpa/util/Constants.java
Normal file
121
ass1-jpa/src/main/java/dst/ass1/jpa/util/Constants.java
Normal file
@ -0,0 +1,121 @@
|
||||
package dst.ass1.jpa.util;
|
||||
|
||||
public final class Constants {
|
||||
|
||||
public static final String JPA_PERSISTENCE_UNIT = "dst_pu";
|
||||
|
||||
/* TYPES (CLASSES) */
|
||||
public static final String T_DRIVER = "Driver";
|
||||
public static final String T_EMPLOYMENT = "Employment";
|
||||
public static final String T_LOCATION = "Location";
|
||||
public static final String T_MATCH = "Match";
|
||||
public static final String T_ORGANIZATION = "Organization";
|
||||
public static final String T_PREFERENCES = "Preferences";
|
||||
public static final String T_RIDER = "Rider";
|
||||
public static final String T_TRIP = "Trip";
|
||||
public static final String T_TRIP_INFO = "TripInfo";
|
||||
public static final String T_VEHICLE = "Vehicle";
|
||||
|
||||
/* IDs (FOREIGN KEYS) */
|
||||
public static final String I_DRIVER = "driver_id";
|
||||
public static final String I_EMPLOYMENT = "employment_id";
|
||||
public static final String I_LOCATION = "location_id";
|
||||
public static final String I_MATCH = "match_id";
|
||||
public static final String I_ORGANIZATION = "organization_id";
|
||||
public static final String I_ORGANIZATION_PART_OF = "partOfOrganization_id";
|
||||
public static final String I_ORGANIZATION_PARTS = "partsOrganization_id";
|
||||
public static final String I_PREFERENCES = "preferences_id";
|
||||
public static final String I_RIDER = "rider_id";
|
||||
public static final String I_TRIP = "trip_id";
|
||||
public static final String I_TRIP_INFO = "tripInfo_id";
|
||||
public static final String I_VEHICLE = "vehicle_id";
|
||||
public static final String I_VEHICLES = "vehicles_id";
|
||||
|
||||
public static final String I_DESTINATION = "destination_id";
|
||||
public static final String I_PICKUP = "pickup_id";
|
||||
public static final String I_STOPS = "stops_id";
|
||||
|
||||
|
||||
/* MEMBER ATTRIBUTES */
|
||||
|
||||
|
||||
public static final String M_DRIVER_TEL = "tel";
|
||||
public static final String M_DRIVER_ORGANIZATIONS = "organizations";
|
||||
public static final String M_DRIVER_EMPLOYMENTS = "employments";
|
||||
public static final String M_DRIVER_VEHICLE = "vehicle";
|
||||
public static final String M_DRIVER_NAME = "name";
|
||||
public static final String M_DRIVER_AVG_RATING = "avgRating";
|
||||
public static final String M_EMPLOYMENT_SINCE = "since";
|
||||
public static final String M_EMPLOYMENT_ACTIVE = "active";
|
||||
public static final String M_LOCATION_LOCATION_ID = "locationId";
|
||||
public static final String M_LOCATION_GEO = "geo";
|
||||
public static final String M_LOCATION_NAME = "name";
|
||||
public static final String M_MATCH_DATE = "date";
|
||||
public static final String M_MATCH_FARE = "fare";
|
||||
public static final String M_MATCH_TRIP = "trip";
|
||||
public static final String M_MATCH_VEHICLE = "vehicle";
|
||||
public static final String M_MATCH_DRIVER = "driver";
|
||||
public static final String M_ORGANIZATION_NAME = "name";
|
||||
public static final String M_ORGANIZATION_EMPLOYMENTS = "employments";
|
||||
public static final String M_ORGANIZATION_PARTS = "parts";
|
||||
public static final String M_ORGANIZATION_DRIVERS = "drivers";
|
||||
public static final String M_PREFERENCES_DATA = "data";
|
||||
public static final String M_RIDER_BANK_CODE = "bankCode";
|
||||
public static final String M_RIDER_EMAIL = "email";
|
||||
public static final String M_RIDER_PASSWORD = "password";
|
||||
public static final String M_RIDER_TEL = "tel";
|
||||
public static final String M_RIDER_ACCOUNT = "accountNo";
|
||||
public static final String M_RIDER_PREFERENCES = "preferences";
|
||||
public static final String M_RIDER_TRIPS = "trips";
|
||||
public static final String M_RIDER_NAME = "name";
|
||||
public static final String M_RIDER_AVG_RATING = "avgRating";
|
||||
public static final String M_TRIP_STOPS = "stops";
|
||||
public static final String M_TRIP_STATE = "state";
|
||||
public static final String M_TRIP_CREATED = "created";
|
||||
public static final String M_TRIP_UPDATED = "updated";
|
||||
public static final String M_TRIP_PICKUP = "pickup";
|
||||
public static final String M_TRIP_DESTINATION = "destination";
|
||||
public static final String M_TRIP_TRIP_INFO = "tripInfo";
|
||||
public static final String M_TRIP_MATCH = "match";
|
||||
public static final String M_TRIP_RIDER = "rider";
|
||||
public static final String M_TRIP_INFO_COMPLETED = "completed";
|
||||
public static final String M_TRIP_INFO_TOTAL = "total";
|
||||
public static final String M_TRIP_INFO_DISTANCE = "distance";
|
||||
public static final String M_TRIP_INFO_TRIP = "trip";
|
||||
public static final String M_TRIP_INFO_DRIVER_RATING = "driverRating";
|
||||
public static final String M_TRIP_INFO_RIDER_RATING = "riderRating";
|
||||
public static final String M_VEHICLE_LICENSE = "license";
|
||||
public static final String M_VEHICLE_COLOR = "color";
|
||||
public static final String M_VEHICLE_TYPE = "type";
|
||||
|
||||
|
||||
/* ASSOCIATION NAMES (FOR QUERIES) */
|
||||
public static final String A_TRIP_INFO = "tripInfo";
|
||||
public static final String A_TRIP = "trip";
|
||||
public static final String A_RIDER = "rider";
|
||||
|
||||
/* NAMED QUERIES */
|
||||
public static final String Q_RIDER_BY_EMAIL = "riderByEmail";
|
||||
public static final String Q_ACTIVE_IN_MULITIPLE_ORGANIZATIONS_DRIVERS = "activeInMultipleOrganizationsDrivers";
|
||||
public static final String Q_REACHED_LOCATIONS = "reachedLocations";
|
||||
public static final String Q_SUM_DISTANCE_MOST_RECENT_TRIP = "sumDistanceOfRiderWithMostRecentTrip";
|
||||
|
||||
/* JOIN TABLES */
|
||||
public static final String J_ORGANIZATION_VEHICLE = "organization_vehicle";
|
||||
public static final String J_ORGANIZATION_PARTS = "organization_parts";
|
||||
public static final String J_DRIVER_ORGANIZATION = "driver_organization";
|
||||
public static final String J_PREFERENCES_DATA = "preferences_data";
|
||||
public static final String J_DRIVER_EMPLOYMENT = "driver_employment";
|
||||
public static final String J_ORGANIZATION_EMPLOYMENT = "organization_employment";
|
||||
public static final String J_TRIP_LOCATION = "trip_location";
|
||||
public static final String J_DRIVER_VEHICLE = "driver_vehicle";
|
||||
|
||||
/* MONGODB */
|
||||
public static final String MONGO_DB_NAME = "dst";
|
||||
public static final String COLL_LOCATION_DATA = "LocationData";
|
||||
|
||||
|
||||
private Constants() {
|
||||
// final
|
||||
}
|
||||
}
|
||||
9
ass1-jpa/src/main/resources/META-INF/Trip.xml
Normal file
9
ass1-jpa/src/main/resources/META-INF/Trip.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
|
||||
version="2.0">
|
||||
|
||||
<!-- TODO -->
|
||||
|
||||
</entity-mappings>
|
||||
9
ass1-jpa/src/main/resources/META-INF/orm.xml
Normal file
9
ass1-jpa/src/main/resources/META-INF/orm.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
|
||||
version="2.0">
|
||||
|
||||
<!-- TODO -->
|
||||
|
||||
</entity-mappings>
|
||||
24
ass1-jpa/src/main/resources/META-INF/persistence.xml
Normal file
24
ass1-jpa/src/main/resources/META-INF/persistence.xml
Normal file
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
|
||||
version="2.0">
|
||||
<persistence-unit name="dst_pu">
|
||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||
<mapping-file>META-INF/Trip.xml</mapping-file>
|
||||
<mapping-file>META-INF/orm.xml</mapping-file>
|
||||
<properties>
|
||||
<property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
|
||||
<property name="hibernate.connection.url" value="jdbc:h2:/tmp/database/dst;AUTO_SERVER=TRUE;"/>
|
||||
<!--<property name="hibernate.connection.username" value=""/>-->
|
||||
<!--<property name="hibernate.connection.password" value=""/>-->
|
||||
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
|
||||
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
|
||||
<property name="hibernate.show_sql" value="false"/>
|
||||
<property name="javax.persistence.validation.mode" value="NONE"/>
|
||||
|
||||
<!-- register the sql interceptor -->
|
||||
<property name="hibernate.session_factory.interceptor" value="dst.ass1.jpa.interceptor.SQLInterceptor"/>
|
||||
</properties>
|
||||
</persistence-unit>
|
||||
</persistence>
|
||||
@ -0,0 +1,52 @@
|
||||
package dst.ass1.jpa;
|
||||
|
||||
import org.hamcrest.Description;
|
||||
import org.hamcrest.Factory;
|
||||
import org.hamcrest.TypeSafeDiagnosingMatcher;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Matcher that finds items in string collections in a case-insensitive way.
|
||||
*/
|
||||
public class CaseInsensitiveStringCollectionMatcher extends TypeSafeDiagnosingMatcher<List<String>> {
|
||||
|
||||
private final String[] items;
|
||||
|
||||
public CaseInsensitiveStringCollectionMatcher(String... items) {
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
@Factory
|
||||
public static CaseInsensitiveStringCollectionMatcher hasItems(String... items) {
|
||||
return new CaseInsensitiveStringCollectionMatcher(items);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean matchesSafely(List<String> collection, Description description) {
|
||||
List<String> missing = new ArrayList<>();
|
||||
|
||||
for (String item : items) {
|
||||
if (collection.stream().noneMatch(i -> i.equalsIgnoreCase(item))) {
|
||||
missing.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (!missing.isEmpty()) {
|
||||
if (missing.size() == items.length) {
|
||||
description.appendValueList("was [", ", ", "]", collection);
|
||||
} else {
|
||||
description.appendValueList("missing [", ", ", "]", missing)
|
||||
.appendValueList(" in [", ", ", "]", collection);
|
||||
}
|
||||
}
|
||||
|
||||
return missing.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void describeTo(Description description) {
|
||||
description.appendValueList("collection containing ", " and ", "", items);
|
||||
}
|
||||
}
|
||||
284
ass1-jpa/src/test/java/dst/ass1/jpa/DatabaseGateway.java
Normal file
284
ass1-jpa/src/test/java/dst/ass1/jpa/DatabaseGateway.java
Normal file
@ -0,0 +1,284 @@
|
||||
package dst.ass1.jpa;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.jdbc.ReturningWork;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.metamodel.Type;
|
||||
import java.sql.*;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
// DO NOT MODIFY THIS CLASS.
|
||||
|
||||
/**
|
||||
* Contains various methods for accessing the database underlying an EntityManager.
|
||||
* <p>
|
||||
* Note that the caller is responsible for dealing with possible exceptions as well as doing the connection handling. A
|
||||
* connection will not be closed even if a fatal error occurs. However, other SQL resources i.e.,
|
||||
* {@link Statement Statements} and {@link ResultSet ResultSets} created within the methods, which are not returned to
|
||||
* the caller, are closed before the method returns.
|
||||
*/
|
||||
public class DatabaseGateway {
|
||||
|
||||
private final EntityManager em;
|
||||
|
||||
public DatabaseGateway(EntityManager em) {
|
||||
this.em = em;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of all table-names for the given database/connection.
|
||||
*
|
||||
* @return List of table names
|
||||
*/
|
||||
public List<String> getTables() {
|
||||
return getSession().doReturningWork(new CollectionWork<>("show tables", rs -> rs.getString(1)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of all column names in the given table.
|
||||
*
|
||||
* @param tableName the table
|
||||
* @return a list of column names
|
||||
*/
|
||||
public List<String> getColumns(String tableName) {
|
||||
return getColumnsDefinitions(tableName).stream().map(m -> m.get("COLUMN_NAME")).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public List<Map<String, String>> getColumnsDefinitions(String tableName) {
|
||||
String sql = String.format("SELECT * FROM information_schema.columns "
|
||||
+ "WHERE table_name='%s'", tableName.toUpperCase());
|
||||
|
||||
return getSession().doReturningWork(new QueryWork<List<Map<String, String>>>(sql) {
|
||||
@Override
|
||||
protected List<Map<String, String>> execute(ResultSet rs) throws SQLException {
|
||||
List<Map<String, String>> list = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
ResultSetMetaData meta = rs.getMetaData();
|
||||
Map<String, String> map = new HashMap<>();
|
||||
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||
String key = meta.getColumnName(i);
|
||||
String value = rs.getString(key);
|
||||
map.put(key, value);
|
||||
}
|
||||
list.add(map);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the java types of all managed entity types.
|
||||
*
|
||||
* @return a list of java types
|
||||
*/
|
||||
public List<Class<?>> getManagedJavaTypes() {
|
||||
return em.getMetamodel()
|
||||
.getManagedTypes().stream()
|
||||
.map(Type::getJavaType)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the named table can be accessed via the given EntityManager.
|
||||
*
|
||||
* @param tableName the name of the table to find
|
||||
* @return {@code true} if the database schema contains a table with the given name, {@code false} otherwise
|
||||
*/
|
||||
public boolean isTable(final String tableName) {
|
||||
return getSession().doReturningWork(new QueryWork<Boolean>("show tables") {
|
||||
@Override
|
||||
public Boolean execute(ResultSet rs) throws SQLException {
|
||||
while (rs.next()) {
|
||||
String tbl = rs.getString(1);
|
||||
if (tbl.equalsIgnoreCase(tableName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a certain database table contains a column with the given
|
||||
* name.
|
||||
*
|
||||
* @param tableName the name of the table to check
|
||||
* @param column the name of the column to find
|
||||
* @return {@code true} if the table contains the column, {@code false} otherwise
|
||||
*/
|
||||
public boolean isColumnInTable(String tableName, String column) {
|
||||
String sql = String.format(
|
||||
"SELECT * FROM information_schema.columns WHERE table_name='%s' and column_name='%s'",
|
||||
tableName.toUpperCase(), column.toUpperCase()
|
||||
);
|
||||
|
||||
return getSession().doReturningWork(new HasAtLeastOneEntry(sql));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a table contains a column of the given type and length.
|
||||
*
|
||||
* @param tableName the table to look for
|
||||
* @param column the expected column name
|
||||
* @param type the expected column type
|
||||
* @param length the expected column length
|
||||
* @return true if the information schema has at least one such column
|
||||
*/
|
||||
public boolean isColumnInTableWithType(String tableName, String column, String type, String length) {
|
||||
String sql = String.format("SELECT * FROM information_schema.columns "
|
||||
+ "WHERE table_name='%s' and column_name='%s' and "
|
||||
+ "type_name='%s' and character_maximum_length='%s'",
|
||||
tableName.toUpperCase(), column.toUpperCase(), type.toUpperCase(), length);
|
||||
|
||||
return getSession().doReturningWork(new HasAtLeastOneEntry(sql));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a certain table contains an index for the given column
|
||||
* name.
|
||||
*
|
||||
* @param tableName the name of the table to check
|
||||
* @param indexName the name of the column the index is created for
|
||||
* @param nonUnique {@code true} if the index is non unique, {@code false} otherwise
|
||||
* @return {@code true} if the index exists, {@code false} otherwise
|
||||
*/
|
||||
public boolean isIndex(String tableName, String indexName, boolean nonUnique) {
|
||||
|
||||
String sql = String.format(
|
||||
"SELECT * FROM information_schema.indexes WHERE table_name='%s' and column_name='%s' and non_unique='%s'",
|
||||
tableName.toUpperCase(), indexName.toUpperCase(), nonUnique ? "1" : "0"
|
||||
);
|
||||
|
||||
return getSession().doReturningWork(new HasAtLeastOneEntry(sql));
|
||||
}
|
||||
|
||||
public boolean isComposedIndex(String tableName, String columnName1, String columnName2) {
|
||||
String indexName1 = getIndexName(tableName, columnName1);
|
||||
String indexName2 = getIndexName(tableName, columnName2);
|
||||
|
||||
return Objects.nonNull(indexName1) && Objects.equals(indexName1, indexName2);
|
||||
}
|
||||
|
||||
private String getIndexName(String tableName, String columnName) {
|
||||
String sql = String.format(
|
||||
"SELECT index_name FROM information_schema.indexes WHERE table_name='%s' and column_name='%s'",
|
||||
tableName.toUpperCase(), columnName.toUpperCase()
|
||||
);
|
||||
|
||||
return getSession().doReturningWork(new QueryWork<String>(sql) {
|
||||
@Override
|
||||
protected String execute(ResultSet rs) throws SQLException {
|
||||
return (rs.next()) ? rs.getString(1) : null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given column of a certain table can contain {@code NULL} values.
|
||||
*
|
||||
* @param tableName the name of the table to check
|
||||
* @param columnName the name of the column to check
|
||||
* @return {@code true} if the column is nullable, {@code false} otherwise
|
||||
*/
|
||||
public boolean isNullable(String tableName, String columnName) {
|
||||
String sql = String.format(
|
||||
"SELECT * FROM information_schema.columns " +
|
||||
"WHERE table_name='%s' and column_name='%s' and IS_NULLABLE=true",
|
||||
tableName.toUpperCase(), columnName.toUpperCase()
|
||||
);
|
||||
|
||||
return getSession().doReturningWork(new HasAtLeastOneEntry(sql));
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes all data from all tables that can be accessed via the given EntityManager.
|
||||
*/
|
||||
public void truncateTables() {
|
||||
List<String> tables = getTables();
|
||||
tables.removeIf(t -> t.toLowerCase().startsWith("hibernate"));
|
||||
|
||||
getSession().doWork(connection -> {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
stmt.addBatch("SET FOREIGN_KEY_CHECKS=0");
|
||||
for (String table : tables) {
|
||||
stmt.addBatch("TRUNCATE TABLE " + table);
|
||||
}
|
||||
stmt.addBatch("SET FOREIGN_KEY_CHECKS=1");
|
||||
stmt.executeBatch();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Session getSession() {
|
||||
return em.unwrap(Session.class);
|
||||
}
|
||||
|
||||
public interface StatementWork<T> extends ReturningWork<T> {
|
||||
|
||||
default T execute(Connection connection) throws SQLException {
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
return execute(stmt);
|
||||
}
|
||||
}
|
||||
|
||||
T execute(Statement stmt) throws SQLException;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface CheckedFunction<T, R, E extends Exception> {
|
||||
R apply(T t) throws E;
|
||||
}
|
||||
|
||||
public static abstract class QueryWork<T> implements StatementWork<T> {
|
||||
private final String sql;
|
||||
|
||||
public QueryWork(String sql) {
|
||||
this.sql = sql;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T execute(Statement stmt) throws SQLException {
|
||||
try (ResultSet rs = stmt.executeQuery(sql)) {
|
||||
return execute(rs);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract T execute(ResultSet rs) throws SQLException;
|
||||
}
|
||||
|
||||
public static class HasAtLeastOneEntry extends QueryWork<Boolean> {
|
||||
|
||||
public HasAtLeastOneEntry(String sql) {
|
||||
super(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Boolean execute(ResultSet rs) throws SQLException {
|
||||
return rs.next();
|
||||
}
|
||||
}
|
||||
|
||||
public static class CollectionWork<T> extends QueryWork<List<T>> {
|
||||
|
||||
private final CheckedFunction<ResultSet, T, SQLException> extractor;
|
||||
|
||||
public CollectionWork(String sql, CheckedFunction<ResultSet, T, SQLException> extractor) {
|
||||
super(sql);
|
||||
this.extractor = extractor;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<T> execute(ResultSet rs) throws SQLException {
|
||||
List<T> list = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
list.add(extractor.apply(rs));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
}
|
||||
21
ass1-jpa/src/test/java/dst/ass1/jpa/ITestData.java
Normal file
21
ass1-jpa/src/test/java/dst/ass1/jpa/ITestData.java
Normal file
@ -0,0 +1,21 @@
|
||||
package dst.ass1.jpa;
|
||||
|
||||
import dst.ass1.jpa.model.IModelFactory;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
|
||||
// DO NOT MODIFY THIS CLASS.
|
||||
|
||||
/**
|
||||
* The ITestData interface is used by the {@link ORMService} to insert test data before each test run. You can pass
|
||||
* custom implementation of {@link ITestData} to the constructor of {@link ORMService} to create your own test fixture.
|
||||
*/
|
||||
public interface ITestData {
|
||||
/**
|
||||
* Creates test data using the model factory and inserts them into the entity manager.
|
||||
*
|
||||
* @param modelFactory the model factory
|
||||
* @param em the entity manager
|
||||
*/
|
||||
void insert(IModelFactory modelFactory, EntityManager em);
|
||||
}
|
||||
172
ass1-jpa/src/test/java/dst/ass1/jpa/ORMService.java
Normal file
172
ass1-jpa/src/test/java/dst/ass1/jpa/ORMService.java
Normal file
@ -0,0 +1,172 @@
|
||||
package dst.ass1.jpa;
|
||||
|
||||
import dst.ass1.jpa.dao.IDAOFactory;
|
||||
import dst.ass1.jpa.dao.impl.DAOFactory;
|
||||
import dst.ass1.jpa.model.IModelFactory;
|
||||
import dst.ass1.jpa.model.impl.ModelFactory;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.rules.ExternalResource;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.EntityManagerFactory;
|
||||
import javax.persistence.EntityTransaction;
|
||||
import javax.persistence.Persistence;
|
||||
|
||||
// DO NOT MODIFY THIS CLASS.
|
||||
|
||||
/**
|
||||
* The ORMService class is used as a JUnit rule that, before each test run,
|
||||
* a) creates an entity manager factory from the persistence unit referenced in {@link Constants#JPA_PERSISTENCE_UNIT},
|
||||
* b) creates an entity manager using the factory,
|
||||
* c) creates dao and model factory instances, and
|
||||
* d) creates a database gateway for the entity manager.
|
||||
* <p>
|
||||
* It provides methods to access these services, and it closes the entity manager and corresponding factory after each
|
||||
* test run. If you pass an {@link ITestData} instance to the constructor, the {@link ORMService} will also insert test
|
||||
* data via a transaction before each run, and truncate tables after each run.
|
||||
*/
|
||||
public class ORMService extends ExternalResource {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ORMService.class);
|
||||
|
||||
private static EntityManagerFactory emf;
|
||||
private EntityManager em;
|
||||
|
||||
private DatabaseGateway databaseGateway;
|
||||
|
||||
private IModelFactory modelFactory;
|
||||
private IDAOFactory daoFactory;
|
||||
|
||||
private ITestData testData;
|
||||
private boolean insertTestData;
|
||||
private boolean truncateTables;
|
||||
|
||||
/**
|
||||
* Creates a new ORMService. By default, the ORMService rule only creates the database connection and other
|
||||
* ORM facilities. If you want to also insert a test fixture, use {@link #ORMService(ITestData)}.
|
||||
*/
|
||||
public ORMService() {
|
||||
this(null, false, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new ORMService that also inserts the given {@link ITestData} before each run and truncates the tables
|
||||
* afterwards.
|
||||
*
|
||||
* @param testData the test data to insert
|
||||
*/
|
||||
public ORMService(ITestData testData) {
|
||||
this(testData, true, true);
|
||||
}
|
||||
|
||||
public ORMService(ITestData testData, boolean insertTestData, boolean truncateTables) {
|
||||
this.testData = testData;
|
||||
this.insertTestData = insertTestData;
|
||||
this.truncateTables = truncateTables;
|
||||
}
|
||||
|
||||
private static EntityManagerFactory createEntityManagerFactory() {
|
||||
return Persistence.createEntityManagerFactory(Constants.JPA_PERSISTENCE_UNIT);
|
||||
}
|
||||
|
||||
public EntityManager getEntityManager() {
|
||||
return em;
|
||||
}
|
||||
|
||||
public EntityManager createEntityManager() {
|
||||
return emf.createEntityManager();
|
||||
}
|
||||
|
||||
public IModelFactory getModelFactory() {
|
||||
return modelFactory;
|
||||
}
|
||||
|
||||
public IDAOFactory getDaoFactory() {
|
||||
return daoFactory;
|
||||
}
|
||||
|
||||
public DatabaseGateway getDatabaseGateway() {
|
||||
return databaseGateway;
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for {@link #getEntityManager()}.
|
||||
*
|
||||
* @return an entity manager
|
||||
*/
|
||||
public EntityManager em() {
|
||||
return getEntityManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void before() throws Throwable {
|
||||
LOG.debug("Creating EntityManagerFactory");
|
||||
emf = createEntityManagerFactory();
|
||||
|
||||
LOG.debug("Creating EntityManager");
|
||||
em = emf.createEntityManager();
|
||||
databaseGateway = new DatabaseGateway(em);
|
||||
|
||||
LOG.debug("Initializing factories");
|
||||
// initialize factories
|
||||
modelFactory = new ModelFactory();
|
||||
daoFactory = new DAOFactory(em);
|
||||
|
||||
if (testData != null && insertTestData) {
|
||||
insertTestData(testData);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void after() {
|
||||
if (truncateTables) {
|
||||
truncateTables();
|
||||
}
|
||||
|
||||
try {
|
||||
LOG.debug("Closing EntityManager");
|
||||
em.close();
|
||||
} catch (Exception e) {
|
||||
LOG.error("Error while closing entity manager", e);
|
||||
}
|
||||
|
||||
try {
|
||||
LOG.debug("Closing EntityManagerFactory");
|
||||
emf.close();
|
||||
} catch (Exception e) {
|
||||
LOG.error("Error while closing entity manager factory", e);
|
||||
}
|
||||
}
|
||||
|
||||
protected void insertTestData(ITestData data) {
|
||||
EntityTransaction tx = getEntityManager().getTransaction();
|
||||
|
||||
tx.begin();
|
||||
try {
|
||||
data.insert(getModelFactory(), getEntityManager());
|
||||
tx.commit();
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
if (tx.isActive()) {
|
||||
tx.rollback();
|
||||
}
|
||||
} catch (Exception rollbackException) {
|
||||
LOG.error("Error while rolling back transaction after exception", rollbackException);
|
||||
} finally {
|
||||
throw new IllegalStateException("Couldn't insert fixture. Can't proceed with tests", e); // rethrow original exception
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void truncateTables() {
|
||||
try {
|
||||
LOG.debug("Truncating database tables");
|
||||
getDatabaseGateway().truncateTables();
|
||||
} catch (Exception e) {
|
||||
LOG.error("Error while trying to truncate tables after test", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,69 @@
|
||||
package dst.ass1.jpa.examples;
|
||||
|
||||
import dst.ass1.jpa.ITestData;
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.dao.IVehicleDAO;
|
||||
import dst.ass1.jpa.model.IModelFactory;
|
||||
import dst.ass1.jpa.model.IVehicle;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
|
||||
/**
|
||||
* This examples shows how you can write your own tests with custom fixtures that are injected it into the
|
||||
* {@link ORMService} rule. Using rules instead of abstract tests is considered good practice as it follows the
|
||||
* principle of composition over inheritance.
|
||||
*/
|
||||
public class ExampleTestWithCustomTestData {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService(new MyTestData());
|
||||
|
||||
@Test
|
||||
public void vehicleDAO_findAll_returnsCorrectValues() throws Exception {
|
||||
IVehicleDAO vehicleDAO = orm.getDaoFactory().createVehicleDAO();
|
||||
|
||||
List<IVehicle> all = vehicleDAO.findAll();
|
||||
|
||||
assertThat(all.isEmpty(), is(false));
|
||||
assertThat(all.size(), is(2));
|
||||
|
||||
System.out.println(all);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void vehicleDAO_findById_returnsCorrectValue() throws Exception {
|
||||
IVehicleDAO vehicleDAO = orm.getDaoFactory().createVehicleDAO();
|
||||
|
||||
IVehicle actual = vehicleDAO.findById(1L);
|
||||
|
||||
assertThat(actual.getColor(), is("red"));
|
||||
}
|
||||
|
||||
public static class MyTestData implements ITestData {
|
||||
|
||||
@Override
|
||||
public void insert(IModelFactory modelFactory, EntityManager em) {
|
||||
IVehicle vehicle1 = modelFactory.createVehicle();
|
||||
IVehicle vehicle2 = modelFactory.createVehicle();
|
||||
|
||||
vehicle1.setColor("red");
|
||||
vehicle1.setLicense("license1");
|
||||
vehicle1.setType("type_1");
|
||||
|
||||
vehicle2.setColor("blue");
|
||||
vehicle2.setLicense("license2");
|
||||
vehicle2.setType("type_2");
|
||||
|
||||
em.persist(vehicle1);
|
||||
em.persist(vehicle2);
|
||||
|
||||
em.flush(); // transaction is done through the ORMTestFixture
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
package dst.ass1.jpa.examples;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.dao.IDAOFactory;
|
||||
import dst.ass1.jpa.dao.IVehicleDAO;
|
||||
import dst.ass1.jpa.model.IModelFactory;
|
||||
import dst.ass1.jpa.model.IVehicle;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.FixMethodOrder;
|
||||
import org.junit.Test;
|
||||
import org.junit.runners.MethodSorters;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.CoreMatchers.notNullValue;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
|
||||
/**
|
||||
* This test has no test fixture and dependencies between tests. This is possible by declaring {@link ORMService} as a
|
||||
* static class-level rule via {@link ClassRule}.
|
||||
*/
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
public class ExampleTestWithDependencies {
|
||||
|
||||
@ClassRule
|
||||
public static ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void t01_insert() throws Exception {
|
||||
EntityManager em = orm.getEntityManager();
|
||||
IModelFactory modelFactory = orm.getModelFactory();
|
||||
|
||||
IVehicle vehicle1 = modelFactory.createVehicle();
|
||||
IVehicle vehicle2 = modelFactory.createVehicle();
|
||||
|
||||
vehicle1.setColor("red");
|
||||
vehicle1.setLicense("license1");
|
||||
vehicle1.setType("type_1");
|
||||
|
||||
vehicle2.setColor("blue");
|
||||
vehicle2.setLicense("license2");
|
||||
vehicle2.setType("type_2");
|
||||
|
||||
em.persist(vehicle1);
|
||||
em.persist(vehicle2);
|
||||
|
||||
|
||||
em.getTransaction().begin();
|
||||
em.flush();
|
||||
em.getTransaction().commit();
|
||||
|
||||
assertThat(vehicle1.getId(), notNullValue());
|
||||
assertThat(vehicle2.getId(), notNullValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void t02_query() throws Exception {
|
||||
IDAOFactory daoFactory = orm.getDaoFactory();
|
||||
IVehicleDAO vehicleDAO = daoFactory.createVehicleDAO();
|
||||
|
||||
List<IVehicle> all = vehicleDAO.findAll();
|
||||
|
||||
assertThat(all.isEmpty(), is(false));
|
||||
assertThat(all.size(), is(2));
|
||||
|
||||
System.out.println(all);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
/**
|
||||
* This package contains a couple of examples of how you can use JUnit and our simple ORM test framework to create your
|
||||
* own tests.
|
||||
*/
|
||||
|
||||
package dst.ass1.jpa.examples;
|
||||
103
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_1_1_00Test.java
Normal file
103
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_1_1_00Test.java
Normal file
@ -0,0 +1,103 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ITestData;
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.dao.*;
|
||||
import dst.ass1.jpa.model.*;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.FixMethodOrder;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ErrorCollector;
|
||||
import org.junit.runners.MethodSorters;
|
||||
|
||||
import javax.persistence.EntityTransaction;
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.hamcrest.object.IsCompatibleType.typeCompatibleWith;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
|
||||
/**
|
||||
* Tests the basic setup of the model and dao factory (makes sure they don't return null), and also tests whether all
|
||||
* relevant entities have been mapped at all and test data can be inserted.
|
||||
*/
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
public class Ass1_1_1_00Test {
|
||||
|
||||
|
||||
@ClassRule
|
||||
public static ORMService orm = new ORMService();
|
||||
|
||||
@Rule
|
||||
public ErrorCollector err = new ErrorCollector();
|
||||
|
||||
@Test
|
||||
public void test01_modelFactoryReturnsThings() {
|
||||
IModelFactory modelFactory = orm.getModelFactory();
|
||||
|
||||
err.checkThat(modelFactory.createDriver(), isA(IDriver.class));
|
||||
err.checkThat(modelFactory.createEmployment(), isA(IEmployment.class));
|
||||
err.checkThat(modelFactory.createEmploymentKey(), isA(IEmploymentKey.class));
|
||||
err.checkThat(modelFactory.createLocation(), isA(ILocation.class));
|
||||
err.checkThat(modelFactory.createMatch(), isA(IMatch.class));
|
||||
err.checkThat(modelFactory.createMoney(), isA(IMoney.class));
|
||||
err.checkThat(modelFactory.createOrganization(), isA(IOrganization.class));
|
||||
err.checkThat(modelFactory.createRider(), isA(IRider.class));
|
||||
err.checkThat(modelFactory.createPreferences(), isA(IPreferences.class));
|
||||
err.checkThat(modelFactory.createTrip(), isA(ITrip.class));
|
||||
err.checkThat(modelFactory.createTripInfo(), isA(ITripInfo.class));
|
||||
err.checkThat(modelFactory.createVehicle(), isA(IVehicle.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test02_daoFactoryReturnsThings() {
|
||||
IDAOFactory daoFactory = orm.getDaoFactory();
|
||||
|
||||
err.checkThat(daoFactory.createDriverDAO(), isA(IDriverDAO.class));
|
||||
err.checkThat(daoFactory.createEmploymentDAO(), isA(IEmploymentDAO.class));
|
||||
err.checkThat(daoFactory.createLocationDAO(), isA(ILocationDAO.class));
|
||||
err.checkThat(daoFactory.createMatchDAO(), isA(IMatchDAO.class));
|
||||
err.checkThat(daoFactory.createOrganizationDAO(), isA(IOrganizationDAO.class));
|
||||
err.checkThat(daoFactory.createRiderDAO(), isA(IRiderDAO.class));
|
||||
err.checkThat(daoFactory.createTripDAO(), isA(ITripDAO.class));
|
||||
err.checkThat(daoFactory.createTripInfoDAO(), isA(ITripInfoDAO.class));
|
||||
err.checkThat(daoFactory.createVehicleDAO(), isA(IVehicleDAO.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test03_entityTypesManagedCorrectly() throws Exception {
|
||||
List<Class<?>> types = orm.getDatabaseGateway().getManagedJavaTypes();
|
||||
|
||||
assertThat("No managed types found", types.isEmpty(), is(false));
|
||||
System.out.println("Managed types: " + types);
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(IDriver.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(IEmployment.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(IEmploymentKey.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(ILocation.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(IMoney.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(IOrganization.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(IRider.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(IPreferences.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(ITrip.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(ITripInfo.class)));
|
||||
err.checkThat(types, hasItem(typeCompatibleWith(IVehicle.class)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test04_canInsertTestFixture() throws Exception {
|
||||
ITestData testData = new TestData();
|
||||
|
||||
EntityTransaction tx = orm.em().getTransaction();
|
||||
tx.begin();
|
||||
try {
|
||||
testData.insert(orm.getModelFactory(), orm.em());
|
||||
} catch (Exception e) {
|
||||
throw new AssertionError("Exception while inserting test fixture.", e);
|
||||
} finally {
|
||||
tx.rollback();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
179
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_1_1_01Test.java
Normal file
179
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_1_1_01Test.java
Normal file
@ -0,0 +1,179 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.DatabaseGateway;
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import org.junit.*;
|
||||
import org.junit.rules.ErrorCollector;
|
||||
import org.junit.runners.MethodSorters;
|
||||
|
||||
import static dst.ass1.jpa.CaseInsensitiveStringCollectionMatcher.hasItems;
|
||||
import static dst.ass1.jpa.util.Constants.*;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.CoreMatchers.not;
|
||||
|
||||
/**
|
||||
* Tests the basic object-relational mapping by examining the created database tables and constraints.
|
||||
*/
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
public class Ass1_1_1_01Test {
|
||||
|
||||
@ClassRule
|
||||
public static ORMService orm = new ORMService();
|
||||
|
||||
@Rule
|
||||
public ErrorCollector err = new ErrorCollector();
|
||||
|
||||
private DatabaseGateway db;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
db = orm.getDatabaseGateway();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void printTables() throws Exception {
|
||||
// not a test, just some systout output that may help you to gain insight into the created database schema
|
||||
for (String table : db.getTables()) {
|
||||
System.out.printf("%-30s %s%n", table, db.getColumns(table));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBasicTablesJdbc() throws Exception {
|
||||
// checks that all basic tables exist
|
||||
err.checkThat(db.getTables(), hasItems(
|
||||
T_RIDER,
|
||||
T_TRIP,
|
||||
T_LOCATION,
|
||||
T_TRIP_INFO,
|
||||
T_DRIVER,
|
||||
T_EMPLOYMENT,
|
||||
T_ORGANIZATION,
|
||||
T_VEHICLE,
|
||||
T_MATCH,
|
||||
T_PREFERENCES
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation01Jdbc() throws Exception {
|
||||
// driver -> vehicle
|
||||
err.checkThat(db.getColumns(T_DRIVER), hasItems(I_VEHICLE));
|
||||
err.checkThat(db.isNullable(T_DRIVER, I_VEHICLE), is(false));
|
||||
|
||||
err.checkThat(db.getTables(), not(hasItems(J_DRIVER_VEHICLE)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation02Jdbc() throws Exception {
|
||||
// rider <-> trip
|
||||
err.checkThat(db.getColumns(T_TRIP), hasItems(I_RIDER));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation03Jdbc() throws Exception {
|
||||
// driver <- employment -> organization
|
||||
|
||||
err.checkThat(db.getColumns(T_EMPLOYMENT), hasItems(
|
||||
I_DRIVER,
|
||||
I_ORGANIZATION
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation04Jdbc() throws Exception {
|
||||
// trip <-> match -> vehicle
|
||||
// |
|
||||
// v
|
||||
// driver
|
||||
|
||||
err.checkThat(db.getColumns(T_MATCH), hasItems(
|
||||
I_DRIVER,
|
||||
I_TRIP,
|
||||
I_VEHICLE
|
||||
));
|
||||
err.checkThat(db.getColumns(T_DRIVER), not(hasItems(I_MATCH)));
|
||||
err.checkThat(db.getColumns(T_TRIP), not(hasItems(I_MATCH)));
|
||||
err.checkThat(db.getColumns(T_VEHICLE), not(hasItems(I_MATCH)));
|
||||
|
||||
err.checkThat(db.getColumns(T_MATCH), hasItems(I_TRIP));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation05Jdbc() throws Exception {
|
||||
// organization <-> organization
|
||||
|
||||
err.checkThat("join table should be explicitly renamed!", db.getTables(), not(hasItems(
|
||||
T_ORGANIZATION + "_" + T_ORGANIZATION
|
||||
)));
|
||||
err.checkThat(db.getTables(), hasItems(
|
||||
J_ORGANIZATION_PARTS
|
||||
));
|
||||
err.checkThat(db.getColumns(J_ORGANIZATION_PARTS), hasItems(
|
||||
I_ORGANIZATION_PARTS,
|
||||
I_ORGANIZATION_PART_OF
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation06Jdbc() throws Exception {
|
||||
// trip -> location (stops)
|
||||
err.checkThat(db.getTables(), hasItems(J_TRIP_LOCATION));
|
||||
err.checkThat(db.getColumns(J_TRIP_LOCATION), hasItems(I_TRIP));
|
||||
err.checkThat(db.getColumns(J_TRIP_LOCATION), hasItems(I_STOPS));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation07Jdbc() throws Exception {
|
||||
// trip -> location (pickup)
|
||||
|
||||
err.checkThat(db.getColumns(T_TRIP), hasItems(I_PICKUP));
|
||||
err.checkThat(db.isIndex(T_TRIP, I_PICKUP, true), is(true));
|
||||
err.checkThat(db.isNullable(T_TRIP, I_PICKUP), is(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation08Jdbc() throws Exception {
|
||||
// trip -> location (destination)
|
||||
err.checkThat(db.getColumns(T_TRIP), hasItems(I_DESTINATION));
|
||||
err.checkThat(db.isIndex(T_TRIP, I_DESTINATION, true), is(true));
|
||||
err.checkThat(db.isNullable(T_TRIP, I_DESTINATION), is(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation09Jdbc() throws Exception {
|
||||
// trip <-> tripinfo
|
||||
|
||||
err.checkThat(db.getColumns(T_TRIP_INFO), hasItems(I_TRIP));
|
||||
err.checkThat(db.isNullable(T_TRIP_INFO, I_TRIP), is(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation10Jdbc() throws Exception {
|
||||
// organization -> vehicle
|
||||
|
||||
err.checkThat(db.getTables(), hasItems(J_ORGANIZATION_VEHICLE));
|
||||
err.checkThat(db.getColumns(J_ORGANIZATION_VEHICLE), hasItems(
|
||||
I_ORGANIZATION,
|
||||
I_VEHICLES
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelation11Jdbc() throws Exception {
|
||||
// rider -> preferences
|
||||
|
||||
err.checkThat(db.getColumns(T_RIDER), hasItems(I_PREFERENCES));
|
||||
err.checkThat(db.isNullable(T_RIDER, I_PREFERENCES), is(false));
|
||||
|
||||
err.checkThat(db.getColumns(T_PREFERENCES), not(hasItems(I_RIDER)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testColumnType01Jdbc() {
|
||||
err.checkThat(db.isColumnInTableWithType(T_RIDER, M_RIDER_PASSWORD, "VARBINARY", "20"), is(true));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Tests the IVehicle license unique constraint.
|
||||
*/
|
||||
public class Ass1_1_1_02Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void testConstraint() {
|
||||
new UniqueConstraintTester<>(() -> orm.getModelFactory().createVehicle(), e -> e.setLicense("uniquevalue"))
|
||||
.run(orm.getEntityManager());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstraintJdbc() {
|
||||
assertTrue(orm.getDatabaseGateway().isIndex(Constants.T_VEHICLE, Constants.M_VEHICLE_LICENSE, false));
|
||||
assertTrue(orm.getDatabaseGateway().isNullable(Constants.T_VEHICLE, Constants.M_VEHICLE_LICENSE));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.model.IPreferences;
|
||||
import dst.ass1.jpa.model.IRider;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.hibernate.PropertyValueException;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.core.StringContains.containsString;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Tests the IRider tel not null constraint.
|
||||
*/
|
||||
public class Ass1_1_1_03Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void testConstraint() {
|
||||
IRider e1 = orm.getModelFactory().createRider();
|
||||
e1.setEmail("email@example.com");
|
||||
e1.setTel(null);
|
||||
IPreferences preferences = orm.getModelFactory().createPreferences();
|
||||
e1.setPreferences(preferences);
|
||||
var e = assertThrows(PersistenceException.class, () -> {
|
||||
orm.em().getTransaction().begin();
|
||||
orm.em().persist(preferences);
|
||||
orm.em().persist(e1);
|
||||
orm.em().flush();
|
||||
});
|
||||
assertThat(e.getMessage(), containsString("not-null property"));
|
||||
assertThat(e.getCause(), is(instanceOf(PropertyValueException.class)));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstraintJdbc() {
|
||||
assertFalse(orm.getDatabaseGateway().isNullable(Constants.T_RIDER, Constants.M_RIDER_TEL));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.model.IDriver;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.hibernate.PropertyValueException;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThrows;
|
||||
|
||||
/**
|
||||
* Tests the IDriver tel not null constraint.
|
||||
*/
|
||||
public class Ass1_1_1_04Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void testConstraint() {
|
||||
IDriver e1 = orm.getModelFactory().createDriver();
|
||||
e1.setTel(null);
|
||||
var e = assertThrows(PersistenceException.class, () -> {
|
||||
orm.em().getTransaction().begin();
|
||||
orm.em().persist(e1);
|
||||
orm.em().flush();
|
||||
});
|
||||
assertThat(e.getMessage(), containsString("not-null property"));
|
||||
assertThat(e.getCause(), is(instanceOf(PropertyValueException.class)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstraintJdbc() {
|
||||
assertFalse(orm.getDatabaseGateway().isNullable(Constants.T_DRIVER, Constants.M_DRIVER_TEL));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.model.IMoney;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.metamodel.ManagedType;
|
||||
import javax.persistence.metamodel.Type;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Tests if IMoney is implemented correctly.
|
||||
*/
|
||||
public class Ass1_1_1_05Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void moneyEntityCannotBePersisted() {
|
||||
IMoney money = orm.getModelFactory().createMoney();
|
||||
assertNotNull(money);
|
||||
|
||||
money.setValue(BigDecimal.TEN);
|
||||
money.setCurrency("EURO");
|
||||
|
||||
assertThrows(IllegalArgumentException.class, () -> {
|
||||
orm.getEntityManager().persist(money);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void moneyIsEmbeddableType() {
|
||||
IMoney money = orm.getModelFactory().createMoney();
|
||||
assertNotNull(money);
|
||||
|
||||
ManagedType<?> type = orm.getEntityManager().getMetamodel().managedType(money.getClass());
|
||||
assertNotNull(type);
|
||||
assertThat(type.getPersistenceType(), is(Type.PersistenceType.EMBEDDABLE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void moneyHasNoTable() throws Exception {
|
||||
assertFalse(orm.getDatabaseGateway().isTable("MONEY"));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,58 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.model.IPreferences;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.hasItems;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Tests that IPreferences is persisted correctly.
|
||||
*/
|
||||
public class Ass1_1_1_06Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void testPreferencesMap() {
|
||||
IPreferences pref1 = orm.getModelFactory().createPreferences();
|
||||
|
||||
pref1.putData("key1", "value1");
|
||||
pref1.putData("key2", "value2");
|
||||
|
||||
EntityManager em = orm.getEntityManager();
|
||||
em.getTransaction().begin();
|
||||
|
||||
em.persist(pref1);
|
||||
em.flush();
|
||||
em.getTransaction().commit();
|
||||
|
||||
EntityManager em2 = orm.createEntityManager();
|
||||
IPreferences md2 = em2.find(pref1.getClass(), pref1.getId());
|
||||
|
||||
Map<String, String> map = md2.getData();
|
||||
|
||||
assertThat(map.size(), is(2));
|
||||
assertThat(map.keySet(), hasItems("key1", "key2"));
|
||||
assertThat(map.get("key1"), is("value1"));
|
||||
assertThat(map.get("key2"), is("value2"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPreferencesMapJdbc() {
|
||||
assertTrue(orm.getDatabaseGateway().isTable(Constants.T_PREFERENCES));
|
||||
assertTrue(orm.getDatabaseGateway().isTable(Constants.J_PREFERENCES_DATA));
|
||||
assertTrue(orm.getDatabaseGateway().isColumnInTable(Constants.J_PREFERENCES_DATA, Constants.I_PREFERENCES));
|
||||
assertTrue(orm.getDatabaseGateway().isColumnInTable(Constants.J_PREFERENCES_DATA, Constants.M_PREFERENCES_DATA + "_KEY"));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,91 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.model.IPreferences;
|
||||
import dst.ass1.jpa.model.IRider;
|
||||
import dst.ass1.jpa.model.ITrip;
|
||||
import org.hibernate.PropertyValueException;
|
||||
import org.hibernate.exception.ConstraintViolationException;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Tests if the IRider and IPreferences relation is implemented correctly.
|
||||
*/
|
||||
public class Ass1_1_1_07Test extends Ass1_TestBase {
|
||||
|
||||
@Test
|
||||
public void testPreferencesAssociation() {
|
||||
IRider rider1 = daoFactory.createRiderDAO().findById(testData.rider1Id);
|
||||
assertNotNull(rider1);
|
||||
assertEquals(testData.preferences1Id, rider1.getPreferences().getId());
|
||||
|
||||
IRider rider2 = daoFactory.createRiderDAO().findById(testData.rider2Id);
|
||||
assertNotNull(rider2);
|
||||
assertEquals(testData.preferences2Id, rider2.getPreferences().getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPreferencesNonOptionalConstraint() {
|
||||
|
||||
IRider rider1 = daoFactory.createRiderDAO().findById(testData.rider1Id);
|
||||
assertNotNull(rider1);
|
||||
rider1.setPreferences(null);
|
||||
|
||||
var e = assertThrows(PersistenceException.class, () -> {
|
||||
em.getTransaction().begin();
|
||||
em.persist(rider1);
|
||||
em.flush();
|
||||
});
|
||||
assertThat(e.getMessage(), containsString("not-null property"));
|
||||
assertThat(e.getCause(), is(instanceOf(PropertyValueException.class)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPreferencesUniqueConstraint() throws Exception {
|
||||
IRider rider1 = daoFactory.createRiderDAO().findById(testData.rider1Id);
|
||||
IPreferences preferences1 = rider1.getPreferences();
|
||||
|
||||
IRider rider5 = modelFactory.createRider();
|
||||
rider5.setEmail("email@example.com");
|
||||
rider5.setName("rider5");
|
||||
rider5.setTel("tel");
|
||||
rider5.setPreferences(preferences1);
|
||||
|
||||
em.getTransaction().begin();
|
||||
var missingException = "Persisting the same metadata object with a different course should result in a constraint violation";
|
||||
var e = assertThrows(missingException, PersistenceException.class, () -> {
|
||||
em.persist(rider5);
|
||||
em.flush();
|
||||
});
|
||||
assertThat(missingException, e.getCause(), is(instanceOf(ConstraintViolationException.class)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRiderPreferencesDeleteCascade() throws Exception {
|
||||
IRider rider = daoFactory.createRiderDAO().findById(testData.rider4Id);
|
||||
Long preferencesId = rider.getPreferences().getId();
|
||||
|
||||
em.getTransaction().begin();
|
||||
try {
|
||||
for (ITrip trip : rider.getTrips()) {
|
||||
trip.setRider(null);
|
||||
}
|
||||
em.remove(rider);
|
||||
em.flush();
|
||||
} catch (PersistenceException e) {
|
||||
throw new AssertionError("Removing a rider should not result in a PersistenceException", e);
|
||||
}
|
||||
em.getTransaction().commit();
|
||||
|
||||
em.getTransaction().begin();
|
||||
IPreferences preferences = em.find(modelFactory.createPreferences().getClass(), preferencesId);
|
||||
assertNull("Expected preferences to be null after associated rider was deleted", preferences);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,49 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.model.IRider;
|
||||
import dst.ass1.jpa.model.ITrip;
|
||||
import dst.ass1.jpa.model.TripState;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.hasItem;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Tests the 1-N association between ITrip and IRider (its creator).
|
||||
*/
|
||||
public class Ass1_1_1_08Test extends Ass1_TestBase {
|
||||
|
||||
@Test
|
||||
public void testTripRiderAssociation() {
|
||||
|
||||
IRider rider1 = daoFactory.createRiderDAO().findById(testData.rider4Id);
|
||||
assertNotNull(rider1);
|
||||
assertNotNull(rider1.getTrips());
|
||||
|
||||
List<Long> tripIds = map(rider1.getTrips(), ITrip::getId);
|
||||
|
||||
assertEquals(1, tripIds.size());
|
||||
assertThat(tripIds, hasItem(testData.trip6Id));
|
||||
|
||||
ITrip trip1 = daoFactory.createTripDAO().findById(testData.trip6Id);
|
||||
ITrip trip2 = daoFactory.createTripDAO().findById(testData.trip1Id);
|
||||
|
||||
assertNotNull(trip1);
|
||||
assertNotNull(trip2);
|
||||
|
||||
assertEquals(testData.rider4Id, trip1.getRider().getId());
|
||||
assertEquals(testData.rider1Id, trip2.getRider().getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTripStatus() {
|
||||
ITrip trip1 = daoFactory.createTripDAO().findById(testData.trip1Id);
|
||||
assertEquals(TripState.COMPLETED, trip1.getState());
|
||||
ITrip trip2 = daoFactory.createTripDAO().findById(testData.trip6Id);
|
||||
assertEquals(TripState.CREATED, trip2.getState());
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,84 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.IOrganizationDAO;
|
||||
import dst.ass1.jpa.dao.IVehicleDAO;
|
||||
import dst.ass1.jpa.dao.impl.DAOFactory;
|
||||
import dst.ass1.jpa.model.IOrganization;
|
||||
import dst.ass1.jpa.model.IVehicle;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.hasItems;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Tests the association between IOrganization and IVehicle.
|
||||
*/
|
||||
public class Ass1_1_1_09Test extends Ass1_TestBase {
|
||||
|
||||
@Test
|
||||
public void testOrganizationVehicleAssociation() {
|
||||
EntityManager em = orm.createEntityManager();
|
||||
DAOFactory daoFactory = new DAOFactory(em);
|
||||
|
||||
IOrganizationDAO organizationDAO = daoFactory.createOrganizationDAO();
|
||||
IVehicleDAO vehicleDAO = daoFactory.createVehicleDAO();
|
||||
|
||||
List<IVehicle> vehicles = vehicleDAO.findAll();
|
||||
|
||||
assertNotNull(vehicles);
|
||||
assertEquals(4, vehicles.size());
|
||||
|
||||
IVehicle vehicle1 = vehicleDAO.findById(testData.vehicle1Id);
|
||||
IVehicle vehicle2 = vehicleDAO.findById(testData.vehicle2Id);
|
||||
IVehicle vehicle3 = vehicleDAO.findById(testData.vehicle3Id);
|
||||
IVehicle vehicle4 = vehicleDAO.findById(testData.vehicle4Id);
|
||||
|
||||
assertEquals(testData.vehicle1Id, vehicle1.getId());
|
||||
assertEquals(testData.vehicle2Id, vehicle2.getId());
|
||||
assertEquals(testData.vehicle3Id, vehicle3.getId());
|
||||
assertEquals(testData.vehicle4Id, vehicle4.getId());
|
||||
|
||||
List<IOrganization> organizations = organizationDAO.findAll();
|
||||
|
||||
assertNotNull(organizations);
|
||||
assertEquals(5, organizations.size());
|
||||
|
||||
IOrganization organization1 = organizationDAO.findById(testData.organization1Id);
|
||||
IOrganization organization2 = organizationDAO.findById(testData.organization2Id);
|
||||
IOrganization organization3 = organizationDAO.findById(testData.organization3Id);
|
||||
IOrganization organization4 = organizationDAO.findById(testData.organization4Id);
|
||||
IOrganization organization5 = organizationDAO.findById(testData.organization5Id);
|
||||
|
||||
assertEquals(testData.organization1Id, organization1.getId());
|
||||
assertNotNull(organization1.getVehicles());
|
||||
assertThat(organization1.getVehicles().size(), is(3));
|
||||
|
||||
List<Long> vehicleIds1 = map(organization1.getVehicles(), IVehicle::getId);
|
||||
assertThat(vehicleIds1, hasItems(testData.vehicle1Id, testData.vehicle2Id, testData.vehicle3Id));
|
||||
|
||||
assertEquals(testData.organization2Id, organization2.getId());
|
||||
assertNotNull(organization2.getVehicles());
|
||||
assertThat(organization2.getVehicles().size(), is(1));
|
||||
|
||||
List<Long> vehicleIds2 = map(organization2.getVehicles(), IVehicle::getId);
|
||||
assertThat(vehicleIds2, hasItems(testData.vehicle4Id));
|
||||
|
||||
assertEquals(testData.organization3Id, organization3.getId());
|
||||
assertNotNull(organization3.getVehicles());
|
||||
assertThat(organization3.getVehicles().size(), is(0));
|
||||
|
||||
assertEquals(testData.organization4Id, organization4.getId());
|
||||
assertNotNull(organization4.getVehicles());
|
||||
assertThat(organization4.getVehicles().size(), is(0));
|
||||
|
||||
assertEquals(testData.organization5Id, organization5.getId());
|
||||
assertNotNull(organization5.getVehicles());
|
||||
assertThat(organization5.getVehicles().size(), is(0));
|
||||
}
|
||||
|
||||
}
|
||||
107
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_1_1_10Test.java
Normal file
107
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_1_1_10Test.java
Normal file
@ -0,0 +1,107 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.IOrganizationDAO;
|
||||
import dst.ass1.jpa.dao.impl.DAOFactory;
|
||||
import dst.ass1.jpa.model.IOrganization;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.hibernate.Session;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.Statement;
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.core.IsCollectionContaining.hasItem;
|
||||
import static org.hamcrest.core.IsCollectionContaining.hasItems;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Tests the self reference of IOrganization.
|
||||
*/
|
||||
public class Ass1_1_1_10Test extends Ass1_TestBase {
|
||||
|
||||
@Test
|
||||
public void testOrganizationSelfAssociation() {
|
||||
EntityManager em = orm.createEntityManager();
|
||||
IOrganizationDAO dao = new DAOFactory(em).createOrganizationDAO();
|
||||
|
||||
IOrganization organization1 = dao.findById(testData.organization1Id);
|
||||
IOrganization organization2 = dao.findById(testData.organization2Id);
|
||||
IOrganization organization3 = dao.findById(testData.organization3Id);
|
||||
IOrganization organization4 = dao.findById(testData.organization4Id);
|
||||
IOrganization organization5 = dao.findById(testData.organization5Id);
|
||||
|
||||
assertNotNull(organization1.getParts());
|
||||
assertNotNull(organization1.getPartOf());
|
||||
assertNotNull(organization2.getParts());
|
||||
assertNotNull(organization2.getPartOf());
|
||||
assertNotNull(organization3.getParts());
|
||||
assertNotNull(organization3.getPartOf());
|
||||
assertNotNull(organization4.getParts());
|
||||
assertNotNull(organization4.getPartOf());
|
||||
assertNotNull(organization5.getParts());
|
||||
assertNotNull(organization5.getPartOf());
|
||||
|
||||
List<Long> organization1Parts = map(organization1.getParts(), IOrganization::getId);
|
||||
List<Long> organization1PartOf = map(organization1.getPartOf(), IOrganization::getId);
|
||||
List<Long> organization2Parts = map(organization2.getParts(), IOrganization::getId);
|
||||
List<Long> organization2PartOf = map(organization2.getPartOf(), IOrganization::getId);
|
||||
List<Long> organization3Parts = map(organization3.getParts(), IOrganization::getId);
|
||||
List<Long> organization3PartOf = map(organization3.getPartOf(), IOrganization::getId);
|
||||
List<Long> organization4Parts = map(organization4.getParts(), IOrganization::getId);
|
||||
List<Long> organization4PartOf = map(organization4.getPartOf(), IOrganization::getId);
|
||||
List<Long> organization5Parts = map(organization5.getParts(), IOrganization::getId);
|
||||
List<Long> organization5PartOf = map(organization5.getPartOf(), IOrganization::getId);
|
||||
|
||||
|
||||
assertThat(organization1Parts, hasItems(testData.organization4Id, testData.organization5Id));
|
||||
assertThat(organization1PartOf, hasItem(testData.organization2Id));
|
||||
assertThat(organization2Parts, hasItem(testData.organization1Id));
|
||||
assertThat(organization2PartOf, hasItems(testData.organization4Id));
|
||||
assertThat(organization3Parts.size(), is(0));
|
||||
assertThat(organization3PartOf.size(), is(0));
|
||||
assertThat(organization4Parts, hasItems(testData.organization2Id));
|
||||
assertThat(organization4PartOf, hasItems(testData.organization1Id));
|
||||
assertThat(organization5Parts.size(), is(0));
|
||||
assertThat(organization5PartOf, hasItems(testData.organization1Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrganizationSelfAssociationJdbc() {
|
||||
String sql = "SELECT " + Constants.I_ORGANIZATION_PARTS + ", " + Constants.I_ORGANIZATION_PART_OF +
|
||||
" FROM " + Constants.J_ORGANIZATION_PARTS +
|
||||
" ORDER BY " + Constants.I_ORGANIZATION_PARTS + ", " + Constants.I_ORGANIZATION_PART_OF;
|
||||
|
||||
em.unwrap(Session.class).doWork(connection -> {
|
||||
|
||||
try (Statement stmt = connection.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery(sql);
|
||||
assertTrue(rs.next());
|
||||
|
||||
assertEquals((long) testData.organization1Id, rs.getLong(Constants.I_ORGANIZATION_PARTS));
|
||||
assertEquals((long) testData.organization4Id, rs.getLong(Constants.I_ORGANIZATION_PART_OF));
|
||||
|
||||
assertTrue(rs.next());
|
||||
|
||||
assertEquals((long) testData.organization1Id, rs.getLong(Constants.I_ORGANIZATION_PARTS));
|
||||
assertEquals((long) testData.organization5Id, rs.getLong(Constants.I_ORGANIZATION_PART_OF));
|
||||
|
||||
assertTrue(rs.next());
|
||||
|
||||
assertEquals((long) testData.organization2Id, rs.getLong(Constants.I_ORGANIZATION_PARTS));
|
||||
assertEquals((long) testData.organization1Id, rs.getLong(Constants.I_ORGANIZATION_PART_OF));
|
||||
|
||||
assertTrue(rs.next());
|
||||
|
||||
assertEquals((long) testData.organization4Id, rs.getLong(Constants.I_ORGANIZATION_PARTS));
|
||||
assertEquals((long) testData.organization2Id, rs.getLong(Constants.I_ORGANIZATION_PART_OF));
|
||||
|
||||
rs.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.model.IPreferences;
|
||||
import dst.ass1.jpa.model.IRider;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Tests the constraint for IRider bank data.
|
||||
*/
|
||||
public class Ass1_1_2_01Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void testRiderAccountNoBankCodeConstraint() {
|
||||
IRider r1 = orm.getModelFactory().createRider();
|
||||
IRider r2 = orm.getModelFactory().createRider();
|
||||
IPreferences p1 = orm.getModelFactory().createPreferences();
|
||||
IPreferences p2 = orm.getModelFactory().createPreferences();
|
||||
orm.em().persist(p1);
|
||||
orm.em().persist(p2);
|
||||
|
||||
r1.setEmail("p1@example.com");
|
||||
r2.setEmail("p2@example.com");
|
||||
r1.setPreferences(p1);
|
||||
r2.setPreferences(p2);
|
||||
r1.setTel("tel1");
|
||||
r2.setTel("tel2");
|
||||
|
||||
new UniqueConstraintTester<>(r1, r2, e -> {
|
||||
e.setAccountNo("uniqueVal1");
|
||||
e.setBankCode("uniqueVal2");
|
||||
}).run(orm.getEntityManager());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRiderAccountNoBankCodeConstraintJdbc() {
|
||||
assertTrue(orm.getDatabaseGateway().isIndex(Constants.T_RIDER, Constants.M_RIDER_ACCOUNT, false));
|
||||
assertTrue(orm.getDatabaseGateway().isIndex(Constants.T_RIDER, Constants.M_RIDER_BANK_CODE, false));
|
||||
assertTrue(orm.getDatabaseGateway().isComposedIndex(Constants.T_RIDER, Constants.M_RIDER_ACCOUNT, Constants.M_RIDER_BANK_CODE));
|
||||
|
||||
assertTrue(orm.getDatabaseGateway().isNullable(Constants.T_RIDER, Constants.M_RIDER_ACCOUNT));
|
||||
assertTrue(orm.getDatabaseGateway().isNullable(Constants.T_RIDER, Constants.M_RIDER_BANK_CODE));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.model.IPreferences;
|
||||
import dst.ass1.jpa.model.IRider;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.hibernate.PropertyValueException;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThrows;
|
||||
|
||||
/**
|
||||
* Tests the constraint for IRider email.
|
||||
*/
|
||||
public class Ass1_1_2_02Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void testUniqueConstraint() {
|
||||
new UniqueConstraintTester<>(() -> {
|
||||
IRider rider = orm.getModelFactory().createRider();
|
||||
rider.setTel("tel");
|
||||
IPreferences preferences = orm.getModelFactory().createPreferences();
|
||||
orm.getEntityManager().persist(preferences);
|
||||
rider.setPreferences(preferences);
|
||||
return rider;
|
||||
}, e -> e.setEmail("unique@example.com"))
|
||||
.run(orm.getEntityManager());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotNullConstraint() {
|
||||
IRider e1 = orm.getModelFactory().createRider();
|
||||
e1.setEmail(null);
|
||||
e1.setTel("tel");
|
||||
IPreferences preferences = orm.getModelFactory().createPreferences();
|
||||
e1.setPreferences(preferences);
|
||||
var e = assertThrows(PersistenceException.class, () -> {
|
||||
orm.em().getTransaction().begin();
|
||||
orm.em().persist(preferences);
|
||||
orm.em().persist(e1);
|
||||
orm.em().flush();
|
||||
});
|
||||
assertThat(e.getMessage(), containsString("not-null property"));
|
||||
assertThat(e.getCause(), is(instanceOf(PropertyValueException.class)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRiderEmailNotNullConstraintJdbc() throws SQLException {
|
||||
assertFalse(orm.getDatabaseGateway().isNullable(Constants.T_RIDER, Constants.M_RIDER_EMAIL));
|
||||
}
|
||||
|
||||
}
|
||||
52
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_1aTest.java
Normal file
52
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_1aTest.java
Normal file
@ -0,0 +1,52 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.IRiderDAO;
|
||||
import dst.ass1.jpa.model.IRider;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.Query;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_2_1aTest extends Ass1_TestBase {
|
||||
|
||||
private IRiderDAO dao;
|
||||
private Class<? extends IRider> entityClass;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
dao = daoFactory.createRiderDAO();
|
||||
entityClass = modelFactory.createRider().getClass();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void namedQuery_withEmailParameter_returnsNonEmptyResultSet() throws Exception {
|
||||
Query query = em.createNamedQuery(Constants.Q_RIDER_BY_EMAIL);
|
||||
|
||||
try {
|
||||
query.setParameter("email", TestData.RIDER_1_EMAIL);
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new AssertionError("Could not set parameter 'email' in named query " + Constants.Q_RIDER_BY_EMAIL, e);
|
||||
}
|
||||
|
||||
assertEquals("Expected exactly one result", 1, query.getResultList().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByEmail_returnsCorrectResult() throws Exception {
|
||||
Long riderId = testData.rider1Id;
|
||||
|
||||
IRider actual = dao.findByEmail(TestData.RIDER_1_EMAIL);
|
||||
IRider expected = em.find(entityClass, riderId);
|
||||
|
||||
assertEquals(riderId, actual.getId());
|
||||
assertSame(expected, actual); // note that they should actually be the same object due EntityManager caching!
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByEmail_withNonExistingEmail_returnsNull() throws Exception {
|
||||
assertNull(dao.findByEmail("non@existing.com"));
|
||||
}
|
||||
}
|
||||
62
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_1bTest.java
Normal file
62
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_1bTest.java
Normal file
@ -0,0 +1,62 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.IDriverDAO;
|
||||
import dst.ass1.jpa.model.IDriver;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.TypedQuery;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.hasItems;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
|
||||
public class Ass1_2_1bTest extends Ass1_TestBase {
|
||||
|
||||
@Test
|
||||
public void namedQuery_returnsCorrectResult() throws Exception {
|
||||
TypedQuery<IDriver> singleResultQuery = em.createNamedQuery(Constants.Q_ACTIVE_IN_MULITIPLE_ORGANIZATIONS_DRIVERS, IDriver.class);
|
||||
singleResultQuery.setParameter("organizations", 2L);
|
||||
|
||||
List<IDriver> resultList = singleResultQuery.getResultList();
|
||||
assertThat("Expected a single result", resultList.size(), is(1));
|
||||
|
||||
IDriver result = resultList.get(0);
|
||||
assertThat(result.getName(), is(TestData.DRIVER_1_NAME));
|
||||
|
||||
TypedQuery<IDriver> twoResultsQuery = em.createNamedQuery(Constants.Q_ACTIVE_IN_MULITIPLE_ORGANIZATIONS_DRIVERS, IDriver.class);
|
||||
twoResultsQuery.setParameter("organizations", 1L);
|
||||
|
||||
List<IDriver> twoResults = twoResultsQuery.getResultList();
|
||||
assertThat("Expected two results", twoResults.size(), is(2));
|
||||
|
||||
List<String> names = map(twoResults, IDriver::getName);
|
||||
assertThat(names, hasItems(TestData.DRIVER_1_NAME, TestData.DRIVER_2_NAME));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void daoFind_returnsCorrectResult() throws Exception {
|
||||
IDriverDAO dao = daoFactory.createDriverDAO();
|
||||
Collection<IDriver> resultList;
|
||||
|
||||
resultList = dao.findActiveInMultipleOrganizationsDrivers(3L);
|
||||
assertThat("Expected an empty result for " + 3, resultList.isEmpty(), is(true));
|
||||
|
||||
resultList = dao.findActiveInMultipleOrganizationsDrivers(4L);
|
||||
assertThat("Expected an empty result for " + 4, resultList.isEmpty(), is(true));
|
||||
|
||||
resultList = dao.findActiveInMultipleOrganizationsDrivers(2L);
|
||||
assertThat("Expected a single results for " + 2, resultList.size(), is(1));
|
||||
IDriver result = resultList.iterator().next();
|
||||
assertThat(result.getName(), is(TestData.DRIVER_1_NAME));
|
||||
|
||||
resultList = dao.findActiveInMultipleOrganizationsDrivers(1L);
|
||||
assertThat("Expected two results for " + 1, resultList.size(), is(2));
|
||||
List<String> names = map(resultList, IDriver::getName);
|
||||
assertThat(names, hasItems(TestData.DRIVER_1_NAME, TestData.DRIVER_2_NAME));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
96
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_1cTest.java
Normal file
96
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_1cTest.java
Normal file
@ -0,0 +1,96 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.IDriverDAO;
|
||||
import dst.ass1.jpa.dao.ILocationDAO;
|
||||
import dst.ass1.jpa.model.*;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityTransaction;
|
||||
import javax.persistence.TypedQuery;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
import static dst.ass1.jpa.tests.TestData.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
public class Ass1_2_1cTest extends Ass1_TestBase {
|
||||
|
||||
|
||||
@Test
|
||||
public void namedQuery_returnsCorrectResult() {
|
||||
TypedQuery<Double> q = em.createNamedQuery(Constants.Q_SUM_DISTANCE_MOST_RECENT_TRIP, Double.class);
|
||||
|
||||
Double result = q.getSingleResult();
|
||||
assertNotNull(result);
|
||||
assertEquals(TRIP_2_DISTANCE + TRIP_4_DISTANCE, result, 0.0);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void namedQuery_withAdditionalAssociation_returnsCorrectResult() throws Exception {
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
tx.begin();
|
||||
|
||||
ITrip trip = modelFactory.createTrip();
|
||||
ITripInfo tripInfo = modelFactory.createTripInfo();
|
||||
IMatch match = modelFactory.createMatch();
|
||||
IDriverDAO driverDAO = daoFactory.createDriverDAO();
|
||||
IDriver driver = driverDAO.findById(testData.driver2Id);
|
||||
IRider rider = daoFactory.createRiderDAO().findById(testData.rider1Id);
|
||||
ILocationDAO locationDAO = daoFactory.createLocationDAO();
|
||||
ILocation pickup = locationDAO.findById(testData.location1Id);
|
||||
ILocation destination = locationDAO.findById(testData.location2Id);
|
||||
IVehicle vehicle = daoFactory.createVehicleDAO().findById(testData.vehicle1Id);
|
||||
IMoney fare = modelFactory.createMoney();
|
||||
fare.setCurrency(CURRENCY_1);
|
||||
fare.setValue(BigDecimal.TEN);
|
||||
IMoney total = modelFactory.createMoney();
|
||||
total.setCurrency(CURRENCY_1);
|
||||
total.setValue(BigDecimal.TEN);
|
||||
|
||||
match.setDate(new Date());
|
||||
match.setFare(fare);
|
||||
match.setDriver(driver);
|
||||
match.setVehicle(vehicle);
|
||||
match.setTrip(trip);
|
||||
|
||||
trip.setCreated(new Date());
|
||||
trip.setUpdated(new Date());
|
||||
trip.setState(TripState.COMPLETED);
|
||||
trip.setPickup(pickup);
|
||||
trip.setDestination(destination);
|
||||
trip.setRider(rider);
|
||||
trip.setMatch(match);
|
||||
trip.setTripInfo(tripInfo);
|
||||
|
||||
double distance = 22.22;
|
||||
tripInfo.setDistance(distance);
|
||||
tripInfo.setCompleted(new Date());
|
||||
tripInfo.setTotal(total);
|
||||
tripInfo.setDriverRating(3);
|
||||
tripInfo.setRiderRating(4);
|
||||
tripInfo.setTrip(trip);
|
||||
|
||||
em.persist(trip);
|
||||
em.persist(match);
|
||||
em.persist(tripInfo);
|
||||
em.flush();
|
||||
tx.commit();
|
||||
|
||||
TypedQuery<Double> q = em.createNamedQuery(Constants.Q_SUM_DISTANCE_MOST_RECENT_TRIP, Double.class);
|
||||
|
||||
Double resultList = q.getSingleResult();
|
||||
assertNotNull(resultList);
|
||||
assertEquals(TRIP_1_DISTANCE + TRIP_5_DISTANCE + distance, resultList, 0.0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void daoFind_returnsCorrectResult() {
|
||||
double result = daoFactory.createRiderDAO().getTotalDistanceOfMostRecentRider();
|
||||
|
||||
assertEquals(TRIP_2_DISTANCE + TRIP_4_DISTANCE, result, 0.0);
|
||||
}
|
||||
|
||||
}
|
||||
132
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_2Test.java
Normal file
132
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_2Test.java
Normal file
@ -0,0 +1,132 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.IDAOFactory;
|
||||
import dst.ass1.jpa.dao.IDriverDAO;
|
||||
import dst.ass1.jpa.dao.ILocationDAO;
|
||||
import dst.ass1.jpa.dao.impl.DAOFactory;
|
||||
import dst.ass1.jpa.model.*;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.EntityTransaction;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import static dst.ass1.jpa.tests.TestData.*;
|
||||
import static org.hamcrest.CoreMatchers.hasItems;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class Ass1_2_2Test extends Ass1_TestBase {
|
||||
|
||||
private ILocationDAO locationDAO;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
// makes sure there's no cache from creating entities
|
||||
EntityManager em = orm.createEntityManager();
|
||||
IDAOFactory daoFactory = new DAOFactory(em);
|
||||
|
||||
locationDAO = daoFactory.createLocationDAO();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReachedLocationsExists() {
|
||||
em.createNamedQuery(Constants.Q_REACHED_LOCATIONS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReachedLocationsQuery() {
|
||||
Collection<Long> ids = locationDAO.findReachedLocationIds();
|
||||
assertThat(ids.size(), is(5));
|
||||
assertThat(ids, hasItems(LOCATION_1_ID, LOCATION_2_ID, LOCATION_3_ID, LOCATION_4_ID, LOCATION_5_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReachedLocationsQuery_withAdditionalAssociations() {
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
tx.begin();
|
||||
final Long ADD_REACHED_1 = 12L;
|
||||
final Long ADD_REACHED_2 = 13L;
|
||||
ILocation location1 = modelFactory.createLocation();
|
||||
location1.setLocationId(11L);
|
||||
location1.setName("location11");
|
||||
ILocation location2 = modelFactory.createLocation();
|
||||
location2.setLocationId(ADD_REACHED_1);
|
||||
location2.setName("location12");
|
||||
ILocation location3 = modelFactory.createLocation();
|
||||
location3.setLocationId(ADD_REACHED_2);
|
||||
location3.setName("location13");
|
||||
ILocation location4 = modelFactory.createLocation();
|
||||
location4.setLocationId(14L);
|
||||
location4.setName("location14");
|
||||
|
||||
ITrip trip = modelFactory.createTrip();
|
||||
ITripInfo tripInfo = modelFactory.createTripInfo();
|
||||
IMatch match = modelFactory.createMatch();
|
||||
IDriverDAO driverDAO = daoFactory.createDriverDAO();
|
||||
IDriver driver = driverDAO.findById(testData.driver2Id);
|
||||
IRider rider = daoFactory.createRiderDAO().findById(testData.rider1Id);
|
||||
IVehicle vehicle = daoFactory.createVehicleDAO().findById(testData.vehicle1Id);
|
||||
IMoney fare = modelFactory.createMoney();
|
||||
fare.setCurrency(CURRENCY_1);
|
||||
fare.setValue(BigDecimal.TEN);
|
||||
IMoney total = modelFactory.createMoney();
|
||||
total.setCurrency(CURRENCY_1);
|
||||
total.setValue(BigDecimal.TEN);
|
||||
|
||||
match.setDate(new Date());
|
||||
match.setFare(fare);
|
||||
match.setDriver(driver);
|
||||
match.setVehicle(vehicle);
|
||||
match.setTrip(trip);
|
||||
|
||||
trip.setCreated(new Date());
|
||||
trip.setUpdated(new Date());
|
||||
trip.setState(TripState.COMPLETED);
|
||||
trip.setPickup(location1);
|
||||
trip.setDestination(location2);
|
||||
trip.setRider(rider);
|
||||
trip.setMatch(match);
|
||||
trip.setTripInfo(tripInfo);
|
||||
List<ILocation> stops = new LinkedList<>();
|
||||
stops.add(location3);
|
||||
trip.setStops(stops);
|
||||
|
||||
tripInfo.setDistance(22.22);
|
||||
tripInfo.setCompleted(createDate(2016, 2, 23, 2, 2));
|
||||
tripInfo.setTotal(total);
|
||||
tripInfo.setDriverRating(3);
|
||||
tripInfo.setRiderRating(4);
|
||||
tripInfo.setTrip(trip);
|
||||
|
||||
em.persist(location1);
|
||||
em.persist(location2);
|
||||
em.persist(location3);
|
||||
em.persist(location4);
|
||||
em.persist(trip);
|
||||
em.persist(match);
|
||||
em.persist(tripInfo);
|
||||
em.flush();
|
||||
tx.commit();
|
||||
|
||||
Collection<Long> ids = locationDAO.findReachedLocationIds();
|
||||
|
||||
assertThat(ids, hasItems(LOCATION_1_ID, LOCATION_2_ID, LOCATION_3_ID, LOCATION_4_ID, LOCATION_5_ID, ADD_REACHED_1, ADD_REACHED_2));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReachedLocationsQuery_onEmptyDatabase() {
|
||||
db.truncateTables();
|
||||
Collection<Long> ids = locationDAO.findReachedLocationIds();
|
||||
assertTrue(ids.isEmpty());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,97 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.IRiderDAO;
|
||||
import dst.ass1.jpa.model.IMoney;
|
||||
import dst.ass1.jpa.model.IRider;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static dst.ass1.jpa.tests.TestData.*;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_2_3a_01Test extends Ass1_TestBase {
|
||||
|
||||
private IRiderDAO riderDAO;
|
||||
|
||||
static Map<Long, Map<String, IMoney>> convertMapKeys(Map<IRider, Map<String, IMoney>> result) {
|
||||
return result.entrySet().stream().collect(Collectors.toMap(
|
||||
kv -> kv.getKey().getId(),
|
||||
kv -> kv.getValue()
|
||||
));
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
riderDAO = daoFactory.createRiderDAO();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRecentspending() {
|
||||
final IMoney spendingCurrency1Rider1 = modelFactory.createMoney();
|
||||
spendingCurrency1Rider1.setValue(TRIP_INFO_1_MONEY_VALUE);
|
||||
spendingCurrency1Rider1.setCurrency(CURRENCY_1);
|
||||
|
||||
final IMoney spendingCurrency2Rider1 = modelFactory.createMoney();
|
||||
spendingCurrency2Rider1.setValue(TRIP_INFO_5_MONEY_VALUE);
|
||||
spendingCurrency2Rider1.setCurrency(CURRENCY_2);
|
||||
|
||||
final IMoney spendingCurrency1Rider2 = modelFactory.createMoney();
|
||||
spendingCurrency1Rider2.setValue(TRIP_INFO_4_MONEY_VALUE);
|
||||
spendingCurrency1Rider2.setCurrency(CURRENCY_1);
|
||||
|
||||
final IMoney spendingCurrency2Rider2 = modelFactory.createMoney();
|
||||
spendingCurrency2Rider2.setValue(TRIP_INFO_2_MONEY_VALUE);
|
||||
spendingCurrency2Rider2.setCurrency(CURRENCY_2);
|
||||
|
||||
final IMoney spendingCurrency3Rider3 = modelFactory.createMoney();
|
||||
spendingCurrency3Rider3.setValue(TRIP_INFO_3_MONEY_VALUE);
|
||||
spendingCurrency3Rider3.setCurrency(CURRENCY_3);
|
||||
|
||||
Map<IRider, Map<String, IMoney>> spending = riderDAO.getRecentSpending();
|
||||
|
||||
assertThat(spending.size(), is(3));
|
||||
|
||||
Map<Long, Map<String, IMoney>> mapped = convertMapKeys(spending);
|
||||
|
||||
assertTrue(mapped.containsKey(testData.rider1Id));
|
||||
assertTrue(mapped.containsKey(testData.rider2Id));
|
||||
assertTrue(mapped.containsKey(testData.rider3Id));
|
||||
|
||||
assertThat(mapped.get(testData.rider1Id).size(), is(2));
|
||||
assertThat(mapped.get(testData.rider2Id).size(), is(2));
|
||||
assertThat(mapped.get(testData.rider3Id).size(), is(1));
|
||||
|
||||
assertTrue(mapped.get(testData.rider1Id).containsKey(CURRENCY_1));
|
||||
assertTrue(mapped.get(testData.rider1Id).containsKey(CURRENCY_2));
|
||||
assertTrue(mapped.get(testData.rider2Id).containsKey(CURRENCY_1));
|
||||
assertTrue(mapped.get(testData.rider2Id).containsKey(CURRENCY_2));
|
||||
assertTrue(mapped.get(testData.rider3Id).containsKey(CURRENCY_3));
|
||||
|
||||
assertEquals(spendingCurrency1Rider1.getValue(), scaleDown(mapped.get(testData.rider1Id).get(CURRENCY_1)));
|
||||
assertEquals(spendingCurrency2Rider1.getValue(), scaleDown(mapped.get(testData.rider1Id).get(CURRENCY_2)));
|
||||
assertEquals(spendingCurrency1Rider2.getValue(), scaleDown(mapped.get(testData.rider2Id).get(CURRENCY_1)));
|
||||
assertEquals(spendingCurrency2Rider2.getValue(), scaleDown(mapped.get(testData.rider2Id).get(CURRENCY_2)));
|
||||
assertEquals(spendingCurrency3Rider3.getValue(), scaleDown(mapped.get(testData.rider3Id).get(CURRENCY_3)));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRecentSpending_onEmptyDatabase() {
|
||||
db.truncateTables();
|
||||
Map<IRider, Map<String, IMoney>> recentSpending = riderDAO.getRecentSpending();
|
||||
assertTrue(recentSpending.isEmpty());
|
||||
}
|
||||
|
||||
private BigDecimal scaleDown(IMoney money) {
|
||||
return money.getValue().setScale(0, RoundingMode.DOWN);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
122
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_3a_02Test.java
Normal file
122
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_2_3a_02Test.java
Normal file
@ -0,0 +1,122 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.IRiderDAO;
|
||||
import dst.ass1.jpa.dao.ITripDAO;
|
||||
import dst.ass1.jpa.model.*;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityTransaction;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static dst.ass1.jpa.tests.TestData.*;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_2_3a_02Test extends Ass1_TestBase {
|
||||
|
||||
private static final BigDecimal TRIP_INFO_9_VALUE = new BigDecimal(55.0);
|
||||
private ITripDAO tripDAO;
|
||||
private IRiderDAO riderDAO;
|
||||
|
||||
static Map<Long, Map<String, IMoney>> convertMapKeys(Map<IRider, Map<String, IMoney>> result) {
|
||||
return result.entrySet().stream().collect(Collectors.toMap(
|
||||
kv -> kv.getKey().getId(),
|
||||
kv -> kv.getValue()
|
||||
));
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUpDatabase() throws Exception {
|
||||
tripDAO = daoFactory.createTripDAO();
|
||||
riderDAO = daoFactory.createRiderDAO();
|
||||
|
||||
IMoney total = modelFactory.createMoney();
|
||||
total.setValue(TRIP_INFO_9_VALUE);
|
||||
total.setCurrency(CURRENCY_2);
|
||||
|
||||
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
tx.begin();
|
||||
ITrip trip = tripDAO.findById(testData.trip9Id);
|
||||
trip.setState(TripState.COMPLETED);
|
||||
ITripInfo tripInfo = modelFactory.createTripInfo();
|
||||
tripInfo.setTrip(trip);
|
||||
tripInfo.setRiderRating(3);
|
||||
tripInfo.setDriverRating(3);
|
||||
tripInfo.setTotal(total);
|
||||
tripInfo.setCompleted(new Date());
|
||||
tripInfo.setDistance(2.2);
|
||||
trip.setTripInfo(tripInfo);
|
||||
em.persist(tripInfo);
|
||||
em.flush();
|
||||
tx.commit();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRecentspending() {
|
||||
final IMoney spendingCurrency1Rider1 = modelFactory.createMoney();
|
||||
spendingCurrency1Rider1.setValue(TRIP_INFO_1_MONEY_VALUE);
|
||||
spendingCurrency1Rider1.setCurrency(CURRENCY_1);
|
||||
|
||||
final IMoney spendingCurrency2Rider1 = modelFactory.createMoney();
|
||||
spendingCurrency2Rider1.setValue(TRIP_INFO_5_MONEY_VALUE.add(TRIP_INFO_9_VALUE));
|
||||
spendingCurrency2Rider1.setCurrency(CURRENCY_2);
|
||||
|
||||
final IMoney spendingCurrency1Rider2 = modelFactory.createMoney();
|
||||
spendingCurrency1Rider2.setValue(TRIP_INFO_4_MONEY_VALUE);
|
||||
spendingCurrency1Rider2.setCurrency(CURRENCY_1);
|
||||
|
||||
final IMoney spendingCurrency2Rider2 = modelFactory.createMoney();
|
||||
spendingCurrency2Rider2.setValue(TRIP_INFO_2_MONEY_VALUE);
|
||||
spendingCurrency2Rider2.setCurrency(CURRENCY_2);
|
||||
|
||||
final IMoney spendingCurrency3Rider3 = modelFactory.createMoney();
|
||||
spendingCurrency3Rider3.setValue(TRIP_INFO_3_MONEY_VALUE);
|
||||
spendingCurrency3Rider3.setCurrency(CURRENCY_3);
|
||||
|
||||
Map<IRider, Map<String, IMoney>> spending = riderDAO.getRecentSpending();
|
||||
|
||||
assertThat(spending.size(), is(3));
|
||||
|
||||
Map<Long, Map<String, IMoney>> mapped = convertMapKeys(spending);
|
||||
|
||||
assertTrue(mapped.containsKey(testData.rider1Id));
|
||||
assertTrue(mapped.containsKey(testData.rider2Id));
|
||||
assertTrue(mapped.containsKey(testData.rider3Id));
|
||||
|
||||
assertThat(mapped.get(testData.rider1Id).size(), is(2));
|
||||
assertThat(mapped.get(testData.rider2Id).size(), is(2));
|
||||
assertThat(mapped.get(testData.rider3Id).size(), is(1));
|
||||
|
||||
assertTrue(mapped.get(testData.rider1Id).containsKey(CURRENCY_1));
|
||||
assertTrue(mapped.get(testData.rider1Id).containsKey(CURRENCY_2));
|
||||
assertTrue(mapped.get(testData.rider2Id).containsKey(CURRENCY_2));
|
||||
assertTrue(mapped.get(testData.rider2Id).containsKey(CURRENCY_2));
|
||||
assertTrue(mapped.get(testData.rider3Id).containsKey(CURRENCY_3));
|
||||
|
||||
assertEquals(spendingCurrency1Rider1.getValue(), scaleDown(mapped.get(testData.rider1Id).get(CURRENCY_1)));
|
||||
assertEquals(spendingCurrency2Rider1.getValue(), scaleDown(mapped.get(testData.rider1Id).get(CURRENCY_2)));
|
||||
assertEquals(spendingCurrency1Rider2.getValue(), scaleDown(mapped.get(testData.rider2Id).get(CURRENCY_1)));
|
||||
assertEquals(spendingCurrency2Rider2.getValue(), scaleDown(mapped.get(testData.rider2Id).get(CURRENCY_2)));
|
||||
assertEquals(spendingCurrency3Rider3.getValue(), scaleDown(mapped.get(testData.rider3Id).get(CURRENCY_3)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRecentSpending_onEmptyDatabase() {
|
||||
db.truncateTables();
|
||||
Map<IRider, Map<String, IMoney>> recentSpending = riderDAO.getRecentSpending();
|
||||
assertTrue(recentSpending.isEmpty());
|
||||
}
|
||||
|
||||
private BigDecimal scaleDown(IMoney money) {
|
||||
return money.getValue().setScale(0, RoundingMode.DOWN);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,86 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.ITripDAO;
|
||||
import dst.ass1.jpa.model.ITrip;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.core.IsCollectionContaining.hasItems;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class Ass1_2_3b_01Test extends Ass1_TestBase {
|
||||
|
||||
private ITripDAO dao;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
dao = daoFactory.createTripDAO();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledTripsBetweenStartAndFinish() {
|
||||
Collection<ITrip> trips = dao.findCancelledTrips(null, null);
|
||||
Collection<Long> ids = map(trips, ITrip::getId);
|
||||
|
||||
assertThat(ids.size(), is(7));
|
||||
assertThat(ids, hasItems(testData.trip8Id, testData.trip11Id, testData.trip12Id, testData.trip13Id, testData.trip14Id, testData.trip15Id, testData.trip16Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledTripsCreatedBetweenStartAndFinish2() {
|
||||
Date start = createDate(2019, 1, 1, 1, 1);
|
||||
Collection<ITrip> trips = dao.findCancelledTrips(start, null);
|
||||
Collection<Long> ids = map(trips, ITrip::getId);
|
||||
|
||||
assertThat(ids.size(), is(4));
|
||||
assertThat(ids, hasItems(testData.trip8Id, testData.trip13Id, testData.trip14Id, testData.trip15Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledTripsForStatusCreatedBetweenStartAndFinish3() {
|
||||
Date start = dao.findById(testData.trip15Id).getCreated();
|
||||
Collection<ITrip> trips = dao.findCancelledTrips(start, null);
|
||||
Collection<Long> ids = map(trips, ITrip::getId);
|
||||
|
||||
assertThat(ids.size(), is(1));
|
||||
assertThat(ids, hasItems(testData.trip8Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledTripsForStatusCreatedBetweenStartAndFinish4() {
|
||||
Date end = dao.findById(testData.trip11Id).getCreated();
|
||||
Collection<ITrip> trips = dao.findCancelledTrips(null, end);
|
||||
|
||||
assertThat(trips.size(), is(1));
|
||||
assertThat(map(trips, ITrip::getId), hasItems(testData.trip12Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledEventsForStatusCreatedBetweenStartAndFinish5() {
|
||||
Date start = dao.findById(testData.trip12Id).getCreated();
|
||||
Date end = dao.findById(testData.trip15Id).getCreated();
|
||||
Collection<ITrip> trips = dao.findCancelledTrips(start, end);
|
||||
|
||||
assertThat(trips.size(), is(4));
|
||||
assertThat(map(trips, ITrip::getId), hasItems(testData.trip11Id, testData.trip13Id, testData.trip14Id, testData.trip16Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledEventsForStatusCreatedBetweenStartAndFinish6() {
|
||||
Date start = dao.findById(testData.trip8Id).getCreated();
|
||||
Collection<ITrip> cancelledTrips = dao.findCancelledTrips(start, null);
|
||||
|
||||
assertTrue(cancelledTrips.isEmpty());
|
||||
}
|
||||
|
||||
private Date createDate(int year, int month, int day, int hours, int minutes) {
|
||||
return new GregorianCalendar(year, month, day, hours, minutes).getTime();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.dao.ITripDAO;
|
||||
import dst.ass1.jpa.model.ITrip;
|
||||
import dst.ass1.jpa.model.TripState;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityTransaction;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.core.IsCollectionContaining.hasItems;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class Ass1_2_3b_02Test extends Ass1_TestBase {
|
||||
|
||||
private ITripDAO dao;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
dao = daoFactory.createTripDAO();
|
||||
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
tx.begin();
|
||||
ITrip trip = dao.findById(testData.trip6Id);
|
||||
trip.setState(TripState.CANCELLED);
|
||||
em.persist(trip);
|
||||
em.flush();
|
||||
tx.commit();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledEventsForStatusCreatedBetweenStartAndFinish() {
|
||||
Collection<ITrip> trips = dao.findCancelledTrips(null, null);
|
||||
Collection<Long> ids = map(trips, ITrip::getId);
|
||||
|
||||
assertThat(ids.size(), is(8));
|
||||
assertThat(ids, hasItems(testData.trip6Id, testData.trip8Id, testData.trip11Id, testData.trip12Id, testData.trip13Id, testData.trip14Id, testData.trip15Id, testData.trip16Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledEventsForStatusCreatedBetweenStartAndFinish2() {
|
||||
Date start = createDate(2019, 1, 1, 1, 1);
|
||||
Collection<ITrip> trips = dao.findCancelledTrips(start, null);
|
||||
Collection<Long> ids = map(trips, ITrip::getId);
|
||||
|
||||
assertThat(ids.size(), is(5));
|
||||
assertThat(ids, hasItems(testData.trip6Id, testData.trip8Id, testData.trip13Id, testData.trip14Id, testData.trip15Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledEventsForStatusCreatedBetweenStartAndFinish3() {
|
||||
Date start = dao.findById(testData.trip12Id).getCreated();
|
||||
Date end = dao.findById(testData.trip15Id).getCreated();
|
||||
Collection<ITrip> trips = dao.findCancelledTrips(start, end);
|
||||
|
||||
assertThat(trips.size(), is(5));
|
||||
assertThat(map(trips, ITrip::getId), hasItems(testData.trip6Id, testData.trip11Id, testData.trip13Id, testData.trip14Id, testData.trip16Id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCanceledEventsForStatusCreatedBetweenStartAndFinish4() {
|
||||
Date start = dao.findById(testData.trip8Id).getCreated();
|
||||
Collection<ITrip> cancelledTrips = dao.findCancelledTrips(start, null);
|
||||
|
||||
assertTrue(cancelledTrips.isEmpty());
|
||||
}
|
||||
|
||||
private Date createDate(int year, int month, int day, int hours, int minutes) {
|
||||
return new GregorianCalendar(year, month, day, hours, minutes).getTime();
|
||||
}
|
||||
|
||||
}
|
||||
109
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_3_1Test.java
Normal file
109
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_3_1Test.java
Normal file
@ -0,0 +1,109 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.model.ILocation;
|
||||
import dst.ass1.jpa.model.ITrip;
|
||||
import dst.ass1.jpa.model.TripState;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.EntityTransaction;
|
||||
import java.util.Date;
|
||||
|
||||
import static org.hamcrest.Matchers.greaterThan;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
|
||||
public class Ass1_3_1Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void entityListener_prePersistSetsPropertiesCorrectly() throws InterruptedException {
|
||||
Date then = new Date();
|
||||
Thread.sleep(50);
|
||||
|
||||
EntityManager em = orm.getEntityManager();
|
||||
|
||||
ILocation pickup = orm.getModelFactory().createLocation();
|
||||
pickup.setName("name1");
|
||||
pickup.setLocationId(1L);
|
||||
|
||||
ILocation destination = orm.getModelFactory().createLocation();
|
||||
destination.setName("name2");
|
||||
destination.setLocationId(2L);
|
||||
|
||||
|
||||
ITrip trip = orm.getModelFactory().createTrip();
|
||||
trip.setState(TripState.CREATED);
|
||||
trip.setPickup(pickup);
|
||||
trip.setDestination(destination);
|
||||
|
||||
|
||||
EntityTransaction tx;
|
||||
// persist
|
||||
tx = em.getTransaction();
|
||||
tx.begin();
|
||||
em.persist(pickup);
|
||||
em.persist(destination);
|
||||
em.persist(trip);
|
||||
em.flush();
|
||||
tx.commit();
|
||||
|
||||
assertNotNull(trip.getCreated());
|
||||
assertNotNull(trip.getUpdated());
|
||||
|
||||
assertThat(trip.getCreated(), greaterThan(then));
|
||||
assertThat(trip.getUpdated(), greaterThan(then));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void entityListener_preUpdateSetsPropertiesCorrectly() throws InterruptedException {
|
||||
EntityManager em = orm.getEntityManager();
|
||||
|
||||
ILocation pickup = orm.getModelFactory().createLocation();
|
||||
pickup.setName("name1");
|
||||
pickup.setLocationId(1L);
|
||||
|
||||
ILocation destination = orm.getModelFactory().createLocation();
|
||||
destination.setName("name2");
|
||||
destination.setLocationId(2L);
|
||||
|
||||
|
||||
ITrip trip = orm.getModelFactory().createTrip();
|
||||
trip.setCreated(new Date());
|
||||
trip.setUpdated(new Date());
|
||||
trip.setState(TripState.CREATED);
|
||||
trip.setPickup(pickup);
|
||||
trip.setDestination(destination);
|
||||
|
||||
EntityTransaction tx;
|
||||
// persist
|
||||
tx = em.getTransaction();
|
||||
tx.begin();
|
||||
em.persist(pickup);
|
||||
em.persist(destination);
|
||||
em.persist(trip);
|
||||
em.flush();
|
||||
tx.commit();
|
||||
|
||||
Date then = new Date();
|
||||
|
||||
Thread.sleep(2000);
|
||||
|
||||
// update
|
||||
tx = em.getTransaction();
|
||||
tx.begin();
|
||||
trip.setState(TripState.QUEUED);
|
||||
em.persist(trip);
|
||||
em.flush();
|
||||
tx.commit();
|
||||
|
||||
assertNotNull(trip.getUpdated());
|
||||
assertThat(trip.getUpdated(), greaterThan(then));
|
||||
}
|
||||
|
||||
}
|
||||
69
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_3_2Test.java
Normal file
69
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_3_2Test.java
Normal file
@ -0,0 +1,69 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.dao.IDAOFactory;
|
||||
import dst.ass1.jpa.listener.DefaultListener;
|
||||
import dst.ass1.jpa.model.IModelFactory;
|
||||
import dst.ass1.jpa.model.IVehicle;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_3_2Test {
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService();
|
||||
|
||||
@Test
|
||||
public void testDefaultListener() {
|
||||
DefaultListener.clear();
|
||||
|
||||
IDAOFactory daoFactory = orm.getDaoFactory();
|
||||
IModelFactory modelFactory = orm.getModelFactory();
|
||||
EntityManager em = orm.getEntityManager();
|
||||
|
||||
em.getTransaction().begin();
|
||||
|
||||
// do some inserts
|
||||
IVehicle vehicle = modelFactory.createVehicle();
|
||||
vehicle.setLicense(TestData.VEHICLE_1_LICENSE);
|
||||
vehicle.setType(TestData.TYPE_1);
|
||||
vehicle.setColor(TestData.COLOR_1);
|
||||
em.persist(vehicle);
|
||||
em.flush();
|
||||
em.remove(vehicle);
|
||||
em.flush();
|
||||
|
||||
vehicle = modelFactory.createVehicle();
|
||||
vehicle.setLicense(TestData.VEHICLE_2_LICENSE);
|
||||
vehicle.setType(TestData.TYPE_2);
|
||||
vehicle.setColor(TestData.COLOR_2);
|
||||
em.persist(vehicle);
|
||||
|
||||
assertEquals(1, DefaultListener.getRemoveOperations());
|
||||
assertTrue(DefaultListener.getPersistOperations() > 0);
|
||||
assertEquals((double) DefaultListener.getOverallTimeToPersist() / DefaultListener.getPersistOperations(), DefaultListener.getAverageTimeToPersist(), 0.6);
|
||||
|
||||
List<IVehicle> vehicles = daoFactory.createVehicleDAO().findAll();
|
||||
assertNotNull(vehicles);
|
||||
assertFalse(vehicles.isEmpty());
|
||||
|
||||
int loadOperations = DefaultListener.getLoadOperations();
|
||||
em.refresh(vehicles.get(0));
|
||||
assertEquals(loadOperations + 1, DefaultListener.getLoadOperations());
|
||||
|
||||
vehicles = daoFactory.createVehicleDAO().findAll();
|
||||
assertNotNull(vehicles);
|
||||
assertFalse(vehicles.isEmpty());
|
||||
|
||||
vehicles.get(0).setLicense("updated");
|
||||
em.persist(vehicles.get(0));
|
||||
em.flush();
|
||||
|
||||
assertEquals(1, DefaultListener.getUpdateOperations());
|
||||
}
|
||||
}
|
||||
38
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_3_3Test.java
Normal file
38
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_3_3Test.java
Normal file
@ -0,0 +1,38 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.interceptor.SQLInterceptor;
|
||||
import dst.ass1.jpa.util.Constants;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.Query;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class Ass1_3_3Test extends Ass1_TestBase {
|
||||
|
||||
@Test
|
||||
public void sqlInterceptor_countsSelectsCorrectly() {
|
||||
em.getTransaction().begin();
|
||||
SQLInterceptor.resetCounter();
|
||||
assertEquals(0, SQLInterceptor.getSelectCount());
|
||||
|
||||
Query c = em.createQuery("select v from " + Constants.T_VEHICLE + " v");
|
||||
c.getResultList();
|
||||
|
||||
assertEquals(0, SQLInterceptor.getSelectCount());
|
||||
|
||||
c = em.createQuery("select distinct l from " + Constants.T_LOCATION + " l");
|
||||
c.getResultList();
|
||||
|
||||
assertEquals(1, SQLInterceptor.getSelectCount());
|
||||
|
||||
c = em.createQuery("select t from " + Constants.T_TRIP + " t");
|
||||
c.getResultList();
|
||||
assertEquals(2, SQLInterceptor.getSelectCount());
|
||||
|
||||
c = em.createQuery("select distinct t from " + Constants.T_TRIP + " t");
|
||||
c.getResultList();
|
||||
assertEquals(3, SQLInterceptor.getSelectCount());
|
||||
}
|
||||
|
||||
}
|
||||
12
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_Suite.java
Normal file
12
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_Suite.java
Normal file
@ -0,0 +1,12 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Suite;
|
||||
import org.junit.runners.Suite.SuiteClasses;
|
||||
|
||||
@RunWith(Suite.class)
|
||||
@SuiteClasses( {
|
||||
Ass1_1_1_00Test.class, Ass1_1_1_01Test.class, Ass1_1_1_02Test.class, Ass1_1_1_03Test.class, Ass1_1_1_04Test.class, Ass1_1_1_05Test.class, Ass1_1_1_06Test.class, Ass1_1_1_07Test.class, Ass1_1_1_08Test.class, Ass1_1_1_09Test.class, Ass1_1_1_10Test.class, Ass1_1_2_01Test.class, Ass1_1_2_02Test.class, Ass1_2_1aTest.class, Ass1_2_1bTest.class, Ass1_2_1cTest.class, Ass1_2_2Test.class, Ass1_2_3a_01Test.class, Ass1_2_3a_02Test.class, Ass1_2_3b_01Test.class, Ass1_2_3b_02Test.class, Ass1_3_1Test.class, Ass1_3_2Test.class, Ass1_3_3Test.class
|
||||
})
|
||||
public class Ass1_Suite {
|
||||
}
|
||||
45
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_TestBase.java
Normal file
45
ass1-jpa/src/test/java/dst/ass1/jpa/tests/Ass1_TestBase.java
Normal file
@ -0,0 +1,45 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import dst.ass1.jpa.DatabaseGateway;
|
||||
import dst.ass1.jpa.ORMService;
|
||||
import dst.ass1.jpa.dao.IDAOFactory;
|
||||
import dst.ass1.jpa.model.IModelFactory;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.rules.ErrorCollector;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class Ass1_TestBase {
|
||||
|
||||
protected final TestData testData = new TestData();
|
||||
|
||||
@Rule
|
||||
public ORMService orm = new ORMService(testData);
|
||||
|
||||
@Rule
|
||||
public ErrorCollector err = new ErrorCollector();
|
||||
|
||||
// commonly used classes unwrapped from ORMService
|
||||
protected EntityManager em;
|
||||
protected IModelFactory modelFactory;
|
||||
protected IDAOFactory daoFactory;
|
||||
protected DatabaseGateway db;
|
||||
|
||||
public static <T, R> List<R> map(Collection<T> collection, Function<T, R> fn) {
|
||||
return collection.stream().map(fn).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUpBase() throws Exception {
|
||||
em = orm.getEntityManager();
|
||||
modelFactory = orm.getModelFactory();
|
||||
daoFactory = orm.getDaoFactory();
|
||||
db = orm.getDatabaseGateway();
|
||||
}
|
||||
|
||||
}
|
||||
1055
ass1-jpa/src/test/java/dst/ass1/jpa/tests/TestData.java
Normal file
1055
ass1-jpa/src/test/java/dst/ass1/jpa/tests/TestData.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,57 @@
|
||||
package dst.ass1.jpa.tests;
|
||||
|
||||
import org.hibernate.exception.ConstraintViolationException;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.EntityTransaction;
|
||||
import javax.persistence.PersistenceException;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
/**
|
||||
* Tests a unique constraint by creating two instances of an entity, calling the same value setter on each entity,
|
||||
* and finally trying to persist them.
|
||||
*
|
||||
* @param <E> the entity type
|
||||
*/
|
||||
public class UniqueConstraintTester<E> {
|
||||
|
||||
private Consumer<E> valueSetter;
|
||||
private E e1;
|
||||
private E e2;
|
||||
|
||||
public UniqueConstraintTester(E e1, E e2, Consumer<E> valueSetter) {
|
||||
this.e1 = e1;
|
||||
this.e2 = e2;
|
||||
this.valueSetter = valueSetter;
|
||||
}
|
||||
|
||||
public UniqueConstraintTester(Supplier<E> entityFactory, Consumer<E> valueSetter) {
|
||||
this(entityFactory.get(), entityFactory.get(), valueSetter);
|
||||
}
|
||||
|
||||
public void run(EntityManager em) {
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
if (!tx.isActive()) {
|
||||
tx.begin();
|
||||
}
|
||||
|
||||
valueSetter.accept(e1);
|
||||
em.persist(e1);
|
||||
em.flush();
|
||||
|
||||
try {
|
||||
valueSetter.accept(e2);
|
||||
em.persist(e2);
|
||||
em.flush();
|
||||
fail("Missing unique constraint in " + e2.getClass());
|
||||
} catch (PersistenceException e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (!(cause instanceof ConstraintViolationException)) {
|
||||
fail("Missing unique constraint in " + e2.getClass());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
16
ass1-jpa/src/test/resources/logback.xml
Normal file
16
ass1-jpa/src/test/resources/logback.xml
Normal file
@ -0,0 +1,16 @@
|
||||
<configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %highlight(%5p) [%12.12thread] %cyan(%-40.40logger{39}): %m%n</pattern>
|
||||
</encoder>
|
||||
|
||||
</appender>
|
||||
|
||||
<logger name="org.hibernate" level="WARN"/>
|
||||
|
||||
<root level="${log.level:-INFO}">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</root>
|
||||
</configuration>
|
||||
27
ass1-kv/pom.xml
Normal file
27
ass1-kv/pom.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>at.ac.tuwien.infosys.dst</groupId>
|
||||
<artifactId>dst</artifactId>
|
||||
<version>2021.1</version>
|
||||
<relativePath>..</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>ass1-kv</artifactId>
|
||||
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>DST :: Assignment 1 :: Key-Value Store</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
69
ass1-kv/src/main/java/dst/ass1/kv/ISessionManager.java
Normal file
69
ass1-kv/src/main/java/dst/ass1/kv/ISessionManager.java
Normal file
@ -0,0 +1,69 @@
|
||||
package dst.ass1.kv;
|
||||
|
||||
public interface ISessionManager {
|
||||
|
||||
/**
|
||||
* Creates a new session id and stores the userId and session timeout under the given id in the session store.
|
||||
*
|
||||
* @param userId the user to create the session for
|
||||
* @param timeToLive the session timeout after which the session expires in seconds
|
||||
* @return the session id.
|
||||
* @throws SessionCreationFailedException if the session couldn't be created, e.g., due to a failed transaction
|
||||
*/
|
||||
String createSession(Long userId, int timeToLive) throws SessionCreationFailedException;
|
||||
|
||||
/**
|
||||
* Sets a key--value pair in the given session.
|
||||
*
|
||||
* @param sessionId the session to store the variable in
|
||||
* @param key the name of the variable
|
||||
* @param value the value
|
||||
* @throws SessionNotFoundException if the session wasn't found
|
||||
*/
|
||||
void setSessionVariable(String sessionId, String key, String value) throws SessionNotFoundException;
|
||||
|
||||
/**
|
||||
* Returns the value of the given session variable.
|
||||
*
|
||||
* @param sessionId the session id
|
||||
* @param key the name of the variable
|
||||
* @return the variable value, or null if it doesn't exist
|
||||
* @throws SessionNotFoundException if the given session id has expired or doesn't exist
|
||||
*/
|
||||
String getSessionVariable(String sessionId, String key) throws SessionNotFoundException;
|
||||
|
||||
/**
|
||||
* Returns the user to whom the given session belongs.
|
||||
*
|
||||
* @param sessionId the session id
|
||||
* @return the user id
|
||||
* @throws SessionNotFoundException if the given session id has expired or doesn't exist
|
||||
*/
|
||||
Long getUserId(String sessionId) throws SessionNotFoundException;
|
||||
|
||||
/**
|
||||
* Returns the current time-to-live for the given session.
|
||||
*
|
||||
* @param sessionId the session id
|
||||
* @return the session ttl in seconds
|
||||
* @throws SessionNotFoundException if the given session id has expired or doesn't exist
|
||||
*/
|
||||
int getTimeToLive(String sessionId) throws SessionNotFoundException;
|
||||
|
||||
/**
|
||||
* Checks whether the given user has an open session, if so, the session id is returned (and the timeout
|
||||
* parameter ignored), otherwise a new session is created with the given timeout and the newly generated id is
|
||||
* returned.
|
||||
*
|
||||
* @param userId the user to require the session for
|
||||
* @param timeToLive the session timeout after which the session expires in seconds
|
||||
* @return the session id.
|
||||
* @throws SessionCreationFailedException if the session couldn't be created, e.g., due to a failed transaction
|
||||
*/
|
||||
String requireSession(Long userId, int timeToLive) throws SessionCreationFailedException;
|
||||
|
||||
/**
|
||||
* Closes whatever underlying connection is required to maintain the session manager.
|
||||
*/
|
||||
void close();
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
package dst.ass1.kv;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
public interface ISessionManagerFactory {
|
||||
/**
|
||||
* Creates an implementation of an {@link ISessionManager}.
|
||||
*
|
||||
* @param properties the properties to use for instantiation
|
||||
* @return a session manager object
|
||||
*/
|
||||
ISessionManager createSessionManager(Properties properties);
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
package dst.ass1.kv;
|
||||
|
||||
/**
|
||||
* Exception indicating that a request to create a new session could not be fulfilled.
|
||||
*/
|
||||
public class SessionCreationFailedException extends Exception {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public SessionCreationFailedException() {
|
||||
}
|
||||
|
||||
public SessionCreationFailedException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public SessionCreationFailedException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public SessionCreationFailedException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package dst.ass1.kv;
|
||||
|
||||
/**
|
||||
* Exception to indicate that <i>this is not the session you are looking for</i>.
|
||||
*/
|
||||
public class SessionNotFoundException extends Exception {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public SessionNotFoundException() {
|
||||
}
|
||||
|
||||
public SessionNotFoundException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public SessionNotFoundException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public SessionNotFoundException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
package dst.ass1.kv.impl;
|
||||
|
||||
import dst.ass1.kv.ISessionManager;
|
||||
import dst.ass1.kv.ISessionManagerFactory;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
public class SessionManagerFactory implements ISessionManagerFactory {
|
||||
|
||||
@Override
|
||||
public ISessionManager createSessionManager(Properties properties) {
|
||||
// TODO
|
||||
// read "redis.host" and "redis.port" from the properties
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
60
ass1-kv/src/test/java/dst/ass1/kv/RedisCleaner.java
Normal file
60
ass1-kv/src/test/java/dst/ass1/kv/RedisCleaner.java
Normal file
@ -0,0 +1,60 @@
|
||||
package dst.ass1.kv;
|
||||
|
||||
import org.junit.rules.ExternalResource;
|
||||
import redis.clients.jedis.Jedis;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Drops the entire key space of a redis instance before and after a test run.
|
||||
*/
|
||||
public class RedisCleaner extends ExternalResource {
|
||||
|
||||
private Properties properties;
|
||||
private Jedis jedis;
|
||||
|
||||
@Override
|
||||
protected void before() throws IOException {
|
||||
properties = loadProperties();
|
||||
|
||||
String host = properties.getProperty("redis.host");
|
||||
int port = Integer.parseInt(properties.getProperty("redis.port"));
|
||||
jedis = new Jedis(host, port);
|
||||
|
||||
// completely clear the redis instance before each test
|
||||
jedis.flushAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void after() {
|
||||
// completely clear the redis instance after each test
|
||||
try {
|
||||
jedis.flushAll();
|
||||
} finally {
|
||||
// close the connection pool
|
||||
jedis.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return loaded redis properties
|
||||
*/
|
||||
public Properties getProperties() {
|
||||
return properties;
|
||||
}
|
||||
|
||||
public Jedis getJedis() {
|
||||
return jedis;
|
||||
}
|
||||
|
||||
private Properties loadProperties() throws IOException {
|
||||
Properties properties = new Properties();
|
||||
try (InputStream in = getClass().getClassLoader().getResourceAsStream("redis.properties")) {
|
||||
properties.load(in);
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
}
|
||||
102
ass1-kv/src/test/java/dst/ass1/kv/tests/Ass1_5_1Test.java
Normal file
102
ass1-kv/src/test/java/dst/ass1/kv/tests/Ass1_5_1Test.java
Normal file
@ -0,0 +1,102 @@
|
||||
package dst.ass1.kv.tests;
|
||||
|
||||
import dst.ass1.kv.ISessionManager;
|
||||
import dst.ass1.kv.ISessionManagerFactory;
|
||||
import dst.ass1.kv.RedisCleaner;
|
||||
import dst.ass1.kv.SessionNotFoundException;
|
||||
import dst.ass1.kv.impl.SessionManagerFactory;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class Ass1_5_1Test {
|
||||
|
||||
@Rule
|
||||
public RedisCleaner redisRule = new RedisCleaner();
|
||||
|
||||
private ISessionManager sessionManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
ISessionManagerFactory sessionManagerFactory = new SessionManagerFactory();
|
||||
|
||||
sessionManager = sessionManagerFactory.createSessionManager(redisRule.getProperties());
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
sessionManager.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createSession_createsSessionId() throws Exception {
|
||||
String sessionId = sessionManager.createSession(1337L, 15000);
|
||||
assertNotNull(sessionId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAndSetSessionVariable_behavesCorrectly() throws Exception {
|
||||
String sessionId = sessionManager.createSession(1337L, 15000);
|
||||
sessionManager.setSessionVariable(sessionId, "f00", "bar");
|
||||
assertEquals("bar", sessionManager.getSessionVariable(sessionId, "f00"));
|
||||
}
|
||||
|
||||
@Test(expected = SessionNotFoundException.class)
|
||||
public void setSessionVariable_forNonExistingSession_throwsSessionNotFoundException() throws Exception {
|
||||
sessionManager.setSessionVariable("nonExistingSessionId", "f00", "bar");
|
||||
}
|
||||
|
||||
@Test(expected = SessionNotFoundException.class)
|
||||
public void getSessionVariable_forNonExistingSession_throwsSessionNotFoundException() throws Exception {
|
||||
sessionManager.getSessionVariable("nonExistingSessionId", "f00");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSessionVariable_onNonExistingVariable_returnsNull() throws Exception {
|
||||
String sessionId = sessionManager.createSession(1337L, 15000);
|
||||
String value = sessionManager.getSessionVariable(sessionId, "f00");
|
||||
assertNull(value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getUserId_returnsCorrectUserID() throws Exception {
|
||||
Long userId = 1337L;
|
||||
String sessionId = sessionManager.createSession(userId, 15000);
|
||||
assertEquals(userId, sessionManager.getUserId(sessionId));
|
||||
}
|
||||
|
||||
@Test(expected = SessionNotFoundException.class)
|
||||
public void getUserId_forNonExistingSession_throwsException() throws Exception {
|
||||
sessionManager.getUserId("nonExistingSessionId");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getTimeToLive_returnsCorrectValue() throws Exception {
|
||||
String sessionId = sessionManager.createSession(1337L, 60);
|
||||
int ttl = sessionManager.getTimeToLive(sessionId);
|
||||
assertThat(ttl, allOf(greaterThan(57), lessThan(61)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getTimeToLive_afterExpiry_throwsSessionNotFoundException() throws Exception {
|
||||
String sessionId = sessionManager.createSession(1337L, 2);
|
||||
int ttl = sessionManager.getTimeToLive(sessionId);
|
||||
assertThat(ttl, greaterThan(0));
|
||||
Thread.sleep(3000);
|
||||
|
||||
assertThrows(SessionNotFoundException.class, () -> {
|
||||
sessionManager.getTimeToLive(sessionId);
|
||||
});
|
||||
}
|
||||
|
||||
@Test(expected = SessionNotFoundException.class)
|
||||
public void getTimeToLive_forNonExistingSession_throwsSessionNotFoundException() throws Exception {
|
||||
sessionManager.getTimeToLive("nonExistingSessionId");
|
||||
}
|
||||
|
||||
}
|
||||
50
ass1-kv/src/test/java/dst/ass1/kv/tests/Ass1_5_2Test.java
Normal file
50
ass1-kv/src/test/java/dst/ass1/kv/tests/Ass1_5_2Test.java
Normal file
@ -0,0 +1,50 @@
|
||||
package dst.ass1.kv.tests;
|
||||
|
||||
import dst.ass1.kv.ISessionManager;
|
||||
import dst.ass1.kv.ISessionManagerFactory;
|
||||
import dst.ass1.kv.RedisCleaner;
|
||||
import dst.ass1.kv.impl.SessionManagerFactory;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
public class Ass1_5_2Test {
|
||||
|
||||
@Rule
|
||||
public RedisCleaner redisRule = new RedisCleaner();
|
||||
|
||||
private ISessionManager sessionManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
ISessionManagerFactory sessionManagerFactory = new SessionManagerFactory();
|
||||
|
||||
sessionManager = sessionManagerFactory.createSessionManager(redisRule.getProperties());
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
sessionManager.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequireSessionForExistingSession_existingIdReturned() throws Exception {
|
||||
String newId = sessionManager.createSession(1337L, 30000);
|
||||
assertNotNull(newId);
|
||||
|
||||
String requiredId = sessionManager.requireSession(1337L, 15000);
|
||||
assertEquals(newId, requiredId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequireSessionForNonExistingSession_newSessionCreated() throws Exception {
|
||||
String sessionId = sessionManager.requireSession(1337L, 15000);
|
||||
|
||||
assertEquals(Long.valueOf(1337L), sessionManager.getUserId(sessionId));
|
||||
}
|
||||
|
||||
}
|
||||
13
ass1-kv/src/test/java/dst/ass1/kv/tests/Ass1_5_Suite.java
Normal file
13
ass1-kv/src/test/java/dst/ass1/kv/tests/Ass1_5_Suite.java
Normal file
@ -0,0 +1,13 @@
|
||||
package dst.ass1.kv.tests;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Suite;
|
||||
import org.junit.runners.Suite.SuiteClasses;
|
||||
|
||||
@RunWith(Suite.class)
|
||||
@SuiteClasses( {
|
||||
Ass1_5_1Test.class,
|
||||
Ass1_5_2Test.class
|
||||
})
|
||||
public class Ass1_5_Suite {
|
||||
}
|
||||
14
ass1-kv/src/test/resources/logback.xml
Normal file
14
ass1-kv/src/test/resources/logback.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %highlight(%5p) [%12.12thread] %cyan(%-40.40logger{39}): %m%n</pattern>
|
||||
</encoder>
|
||||
|
||||
</appender>
|
||||
|
||||
<root level="${log.level:-INFO}">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</root>
|
||||
</configuration>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user