summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2015-05-12 07:26:22 -0700
committerJesse Morgan <jesse@jesterpm.net>2015-05-12 07:26:22 -0700
commitb5ad47d5b77bfc023b9d3d466f9fd9ed2c29a452 (patch)
treef7409dd2e286bc5aac64b52d69cc1a11fb608e2a
parentd4e0c770e3a79e5f36ce974f3ed4dd4834639f4f (diff)
Adding tests for TrainingRecordResource.
-rw-r--r--src/com/p4square/grow/backend/resources/TrainingRecordResource.java2
-rw-r--r--src/com/p4square/grow/model/Chapter.java29
-rw-r--r--src/com/p4square/grow/model/Playlist.java5
-rw-r--r--src/com/p4square/grow/provider/MapCollectionProvider.java74
-rw-r--r--src/com/p4square/grow/provider/MapProvider.java28
-rw-r--r--tst/com/p4square/grow/backend/resources/ResourceTestBase.java101
-rw-r--r--tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java142
7 files changed, 376 insertions, 5 deletions
diff --git a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
index b316b75..4403b12 100644
--- a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
+++ b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
@@ -69,7 +69,7 @@ public class TrainingRecordResource extends ServerResource {
mVideoId = getAttribute("videoId");
try {
- Playlist defaultPlaylist = ((GrowBackend) getApplication()).getDefaultPlaylist();
+ Playlist defaultPlaylist = ((ProvidesTrainingRecords) getApplication()).getDefaultPlaylist();
mRecord = mTrainingRecordProvider.get(mUserId);
if (mRecord == null) {
diff --git a/src/com/p4square/grow/model/Chapter.java b/src/com/p4square/grow/model/Chapter.java
index 7b6e27c..3a08e4c 100644
--- a/src/com/p4square/grow/model/Chapter.java
+++ b/src/com/p4square/grow/model/Chapter.java
@@ -17,13 +17,38 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
* @author Jesse Morgan <jesse@jesterpm.net>
*/
public class Chapter implements Cloneable {
+ private String mName;
private Map<String, VideoRecord> mVideos;
- public Chapter() {
+ public Chapter(String name) {
+ mName = name;
mVideos = new HashMap<String, VideoRecord>();
}
/**
+ * Private constructor for JSON decoding.
+ */
+ private Chapter() {
+ this(null);
+ }
+
+ /**
+ * @return The Chapter name.
+ */
+ public String getName() {
+ return mName;
+ }
+
+ /**
+ * Set the chapter name.
+ *
+ * @param name The name of the chapter.
+ */
+ public void setName(final String name) {
+ mName = name;
+ }
+
+ /**
* @return The VideoRecord for videoid or null if videoid is not in the chapter.
*/
public VideoRecord getVideoRecord(String videoid) {
@@ -78,7 +103,7 @@ public class Chapter implements Cloneable {
* @return a new Chapter object identical but independent of this one.
*/
public Chapter clone() throws CloneNotSupportedException {
- Chapter c = new Chapter();
+ Chapter c = new Chapter(mName);
for (Map.Entry<String, VideoRecord> videoEntry : mVideos.entrySet()) {
c.setVideoRecord(videoEntry.getKey(), videoEntry.getValue().clone());
}
diff --git a/src/com/p4square/grow/model/Playlist.java b/src/com/p4square/grow/model/Playlist.java
index b697e66..3e77ada 100644
--- a/src/com/p4square/grow/model/Playlist.java
+++ b/src/com/p4square/grow/model/Playlist.java
@@ -86,7 +86,7 @@ public class Playlist {
Chapter chapter = mPlaylist.get(chapterId);
if (chapter == null) {
- chapter = new Chapter();
+ chapter = new Chapter(chapterId);
mPlaylist.put(chapterId, chapter);
}
@@ -102,6 +102,7 @@ public class Playlist {
*/
@JsonAnySetter
public void addChapter(String chapterId, Chapter chapter) {
+ chapter.setName(chapterId);
mPlaylist.put(chapterId, chapter);
}
@@ -158,7 +159,7 @@ public class Playlist {
if (myChapter == null) {
// Add new chapter
- myChapter = new Chapter();
+ myChapter = new Chapter(chapterName);
addChapter(chapterName, myChapter);
}
diff --git a/src/com/p4square/grow/provider/MapCollectionProvider.java b/src/com/p4square/grow/provider/MapCollectionProvider.java
new file mode 100644
index 0000000..4c5cef6
--- /dev/null
+++ b/src/com/p4square/grow/provider/MapCollectionProvider.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015 Jesse Morgan
+ */
+
+package com.p4square.grow.provider;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * In-memory CollectionProvider implementation, useful for tests.
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class MapCollectionProvider<C, K, V> implements CollectionProvider<C, K, V> {
+ private final Map<C, Map<K, V>> mMap;
+
+ public MapCollectionProvider() {
+ mMap = new HashMap<>();
+ }
+
+ @Override
+ public synchronized V get(C collection, K key) throws IOException {
+ Map<K, V> map = mMap.get(collection);
+ if (map != null) {
+ return map.get(key);
+ }
+
+ return null;
+ }
+
+ @Override
+ public synchronized Map<K, V> query(C collection) throws IOException {
+ Map<K, V> map = mMap.get(collection);
+ if (map == null) {
+ map = new HashMap<K, V>();
+ }
+
+ return map;
+ }
+
+ @Override
+ public synchronized Map<K, V> query(C collection, int limit) throws IOException {
+ Map<K, V> map = query(collection);
+
+ if (map.size() > limit) {
+ Map<K, V> smallMap = new HashMap<>();
+
+ Iterator<Map.Entry<K, V>> iterator = map.entrySet().iterator();
+ for (int i = 0; i < limit; i++) {
+ Map.Entry<K, V> entry = iterator.next();
+ smallMap.put(entry.getKey(), entry.getValue());
+ }
+
+ return smallMap;
+
+ } else {
+ return map;
+ }
+ }
+
+ @Override
+ public synchronized void put(C collection, K key, V obj) throws IOException {
+ Map<K, V> map = mMap.get(collection);
+ if (map == null) {
+ map = new HashMap<K, V>();
+ mMap.put(collection, map);
+ }
+
+ map.put(key, obj);
+ }
+}
diff --git a/src/com/p4square/grow/provider/MapProvider.java b/src/com/p4square/grow/provider/MapProvider.java
new file mode 100644
index 0000000..40f8107
--- /dev/null
+++ b/src/com/p4square/grow/provider/MapProvider.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2015 Jesse Morgan
+ */
+
+package com.p4square.grow.provider;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * In-memory Provider implementation, useful for tests.
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class MapProvider<K, V> implements Provider<K, V> {
+ private final Map<K, V> mMap = new HashMap<K, V>();
+
+ @Override
+ public V get(K key) throws IOException {
+ return mMap.get(key);
+ }
+
+ @Override
+ public void put(K key, V obj) throws IOException {
+ mMap.put(key, obj);
+ }
+}
diff --git a/tst/com/p4square/grow/backend/resources/ResourceTestBase.java b/tst/com/p4square/grow/backend/resources/ResourceTestBase.java
new file mode 100644
index 0000000..b4d7864
--- /dev/null
+++ b/tst/com/p4square/grow/backend/resources/ResourceTestBase.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2015 Jesse Morgan
+ */
+
+package com.p4square.grow.backend.resources;
+
+import java.io.IOException;
+
+import org.restlet.Application;
+
+import com.p4square.grow.model.Playlist;
+import com.p4square.grow.model.Question;
+import com.p4square.grow.model.TrainingRecord;
+import com.p4square.grow.model.UserRecord;
+
+import com.p4square.grow.backend.feed.FeedDataProvider;
+import com.p4square.grow.provider.CollectionProvider;
+import com.p4square.grow.provider.MapCollectionProvider;
+import com.p4square.grow.provider.MapProvider;
+import com.p4square.grow.provider.Provider;
+import com.p4square.grow.provider.ProvidesAssessments;
+import com.p4square.grow.provider.ProvidesQuestions;
+import com.p4square.grow.provider.ProvidesStrings;
+import com.p4square.grow.provider.ProvidesTrainingRecords;
+import com.p4square.grow.provider.ProvidesUserRecords;
+import com.p4square.grow.provider.ProvidesVideos;
+
+import org.junit.Before;
+
+/**
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class ResourceTestBase {
+
+ protected TestApplication mApplication;
+
+ @Before
+ public void setup() throws Exception {
+ mApplication = new TestApplication();
+ Application.setCurrent(mApplication);
+ }
+
+ public static class TestApplication extends Application implements
+ ProvidesQuestions, ProvidesTrainingRecords, ProvidesUserRecords,
+ ProvidesStrings, ProvidesAssessments
+ {
+
+ private final Provider<String, UserRecord> mUserRecordProvider;
+ private final Provider<String, Question> mQuestionProvider;
+ private final Provider<String, TrainingRecord> mTrainingRecordProvider;
+ private final Provider<String, String> mStringProvider;
+ private final CollectionProvider<String, String, String> mAnswerProvider;
+
+ private Playlist mDefaultPlaylist;
+
+ public TestApplication() {
+ mStringProvider = new MapProvider<String, String>();
+ mUserRecordProvider = new MapProvider<String, UserRecord>();
+ mQuestionProvider = new MapProvider<String, Question>();
+ mTrainingRecordProvider = new MapProvider<String, TrainingRecord>();
+ mAnswerProvider = new MapCollectionProvider<String, String, String>();
+
+ mDefaultPlaylist = new Playlist();
+ }
+
+ @Override
+ public Provider<String, UserRecord> getUserRecordProvider() {
+ return mUserRecordProvider;
+ }
+
+ @Override
+ public Provider<String, Question> getQuestionProvider() {
+ return mQuestionProvider;
+ }
+
+ @Override
+ public Provider<String, TrainingRecord> getTrainingRecordProvider() {
+ return mTrainingRecordProvider;
+ }
+
+ public void setDefaultPlaylist(Playlist playlist) {
+ mDefaultPlaylist = playlist;
+ }
+
+ @Override
+ public Playlist getDefaultPlaylist() throws IOException {
+ return mDefaultPlaylist;
+ }
+
+ @Override
+ public Provider<String, String> getStringProvider() {
+ return mStringProvider;
+ }
+
+ @Override
+ public CollectionProvider<String, String, String> getAnswerProvider() {
+ return mAnswerProvider;
+ }
+ }
+}
diff --git a/tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java b/tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java
new file mode 100644
index 0000000..8fec4c8
--- /dev/null
+++ b/tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2015 Jesse Morgan
+ */
+
+package com.p4square.grow.backend.resources;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import org.restlet.data.Method;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.ext.jackson.JacksonRepresentation;
+
+import com.p4square.grow.model.Playlist;
+import com.p4square.grow.model.TrainingRecord;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests for the TrainingRecordResource
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class TrainingRecordResourceTest extends ResourceTestBase {
+
+ private final String USER_ID = "1234";
+
+ private TrainingRecordResource mResource;
+ private Request mRequest;
+ private Response mResponse;
+
+ @Before
+ public void setup() throws Exception {
+ super.setup();
+
+ mResource = new TrainingRecordResource();
+
+ mRequest = new Request(Method.GET, "/");
+ Map<String, Object> attributes = new HashMap<>();
+ attributes.put("userId", USER_ID);
+ mRequest.setAttributes(attributes);
+ mResponse = new Response(mRequest);
+
+ Playlist playlist = new Playlist();
+ playlist.add("introduction", "intro-1");
+ playlist.add("seeker", "seeker-1");
+ playlist.add("believer", "believer-1");
+ playlist.add("believer", "believer-2");
+ playlist.add("disciple", "disciple-1");
+ playlist.add("teacher", "teacher-1");
+ playlist.add("leader", "leader-1");
+ mApplication.setDefaultPlaylist(playlist);
+ }
+
+ private <T> T run(Class<T> type) throws Exception {
+ mResource.init(mApplication.getContext(), mRequest, mResponse);
+ mResource.handle();
+ mResource.release();
+
+ return new JacksonRepresentation<T>(mResponse.getEntity(), type).getObject();
+ }
+
+ @Test
+ public void testSkipAssessedChaptersLow() throws Exception {
+ // Set the User's score.
+ mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"score\": 0.0}");
+
+ // Run the test
+ TrainingRecord record = run(TrainingRecord.class);
+
+ // Assert correct videos required.
+ Playlist actualPlaylist = record.getPlaylist();
+ assertTrue(actualPlaylist.find("intro-1").getRequired()); // Always required.
+ assertTrue(actualPlaylist.find("seeker-1").getRequired()); // Required by assessment.
+ assertTrue(actualPlaylist.find("believer-1").getRequired());
+ assertTrue(actualPlaylist.find("believer-1").getRequired());
+ assertTrue(actualPlaylist.find("disciple-1").getRequired());
+ assertTrue(actualPlaylist.find("teacher-1").getRequired());
+ assertTrue(actualPlaylist.find("leader-1").getRequired());
+ }
+
+ @Test
+ public void testSkipAssessedChaptersSeeker() throws Exception {
+ // Set the User's score.
+ mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"score\": 1.0}");
+
+ // Run the test
+ TrainingRecord record = run(TrainingRecord.class);
+
+ // Assert correct videos required.
+ Playlist actualPlaylist = record.getPlaylist();
+ assertTrue(actualPlaylist.find("intro-1").getRequired()); // Always required.
+ assertTrue(actualPlaylist.find("seeker-1").getRequired()); // Required by assessment.
+ assertTrue(actualPlaylist.find("believer-1").getRequired());
+ assertTrue(actualPlaylist.find("believer-1").getRequired());
+ assertTrue(actualPlaylist.find("disciple-1").getRequired());
+ assertTrue(actualPlaylist.find("teacher-1").getRequired());
+ assertTrue(actualPlaylist.find("leader-1").getRequired());
+ }
+
+ @Test
+ public void testSkipAssessedChaptersBeliever() throws Exception {
+ // Set the User's score.
+ mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"score\": 2.0}");
+
+ // Run the test
+ TrainingRecord record = run(TrainingRecord.class);
+
+ // Assert correct videos required.
+ Playlist actualPlaylist = record.getPlaylist();
+ assertTrue(actualPlaylist.find("intro-1").getRequired()); // Always required.
+ assertFalse(actualPlaylist.find("seeker-1").getRequired()); // Not required by assessment.
+ assertTrue(actualPlaylist.find("believer-1").getRequired()); // Required by assessment.
+ assertTrue(actualPlaylist.find("believer-1").getRequired());
+ assertTrue(actualPlaylist.find("disciple-1").getRequired());
+ assertTrue(actualPlaylist.find("teacher-1").getRequired());
+ assertTrue(actualPlaylist.find("leader-1").getRequired());
+ }
+
+ @Test
+ public void testSkipAssessedChaptersHigh() throws Exception {
+ // Set the User's score.
+ mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"score\": 4.0}");
+
+ // Run the test
+ TrainingRecord record = run(TrainingRecord.class);
+
+ // Assert correct videos required.
+ Playlist actualPlaylist = record.getPlaylist();
+ assertTrue(actualPlaylist.find("intro-1").getRequired()); // Always required.
+ assertFalse(actualPlaylist.find("seeker-1").getRequired()); // Not required by assessment.
+ assertFalse(actualPlaylist.find("believer-1").getRequired());
+ assertFalse(actualPlaylist.find("believer-1").getRequired());
+ assertFalse(actualPlaylist.find("disciple-1").getRequired());
+ assertTrue(actualPlaylist.find("teacher-1").getRequired()); // Required by assessment.
+ assertTrue(actualPlaylist.find("leader-1").getRequired());
+ }
+}