diff --git a/app/index.html b/app/index.html
index eca1596..83ff689 100644
--- a/app/index.html
+++ b/app/index.html
@@ -9,7 +9,7 @@
Messages stored on Google Data Store:
-
diff --git a/src/main/java/gageot/net/Messages.java b/src/main/java/gageot/net/Messages.java
new file mode 100644
index 0000000..a57a46a
--- /dev/null
+++ b/src/main/java/gageot/net/Messages.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (C) 2014 david@gageot.net
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package gageot.net;
+
+import com.google.appengine.api.datastore.Entity;
+import com.google.appengine.api.datastore.Query;
+
+import java.util.Date;
+import java.util.List;
+
+import static com.google.appengine.api.datastore.DatastoreServiceFactory.getDatastoreService;
+import static com.google.appengine.api.datastore.FetchOptions.Builder.withLimit;
+import static com.google.appengine.api.datastore.KeyFactory.createKey;
+import static com.google.appengine.api.datastore.Query.SortDirection.DESCENDING;
+import static net.codestory.Fluent.of;
+
+public class Messages {
+ public List list() {
+ Query query = new Query("Message", createKey("Messages", "list")).addSort("date", DESCENDING);
+
+ List messages = getDatastoreService().prepare(query).asList(withLimit(100));
+
+ return of(messages).map(message -> (String) message.getProperty("message")).toList();
+ }
+
+ public void create(String message) {
+ Entity entity = new Entity("Message", createKey("Messages", "list"));
+ entity.setProperty("message", message);
+ entity.setProperty("date", new Date());
+
+ getDatastoreService().put(entity);
+ }
+}
diff --git a/src/main/java/gageot/net/MessagesResource.java b/src/main/java/gageot/net/MessagesResource.java
index 8f7ecfb..c61f760 100644
--- a/src/main/java/gageot/net/MessagesResource.java
+++ b/src/main/java/gageot/net/MessagesResource.java
@@ -15,36 +15,25 @@
*/
package gageot.net;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Query;
import net.codestory.http.annotations.Get;
import net.codestory.http.annotations.Post;
-import java.util.Date;
import java.util.List;
-import static com.google.appengine.api.datastore.DatastoreServiceFactory.getDatastoreService;
-import static com.google.appengine.api.datastore.FetchOptions.Builder.withLimit;
-import static com.google.appengine.api.datastore.KeyFactory.createKey;
-import static com.google.appengine.api.datastore.Query.SortDirection.DESCENDING;
-import static net.codestory.Fluent.of;
-
public class MessagesResource {
- @Get("/message/list")
- public List list() {
- Query query = new Query("Message", createKey("Messages", "list")).addSort("date", DESCENDING);
+ private final Messages messages;
- List messages = getDatastoreService().prepare(query).asList(withLimit(100));
+ public MessagesResource(Messages messages) {
+ this.messages = messages;
+ }
- return of(messages).map(message -> (String) message.getProperty("message")).toList();
+ @Get("/message/list")
+ public List list() {
+ return messages.list();
}
@Post("/message")
public void create(String message) {
- Entity entity = new Entity("Message", createKey("Messages", "list"));
- entity.setProperty("message", message);
- entity.setProperty("date", new Date());
-
- getDatastoreService().put(entity);
+ messages.create(message);
}
}
diff --git a/src/test/java/gageot/net/MainWebTest.java b/src/test/java/gageot/net/MainWebTest.java
index 1a29a83..4d00034 100644
--- a/src/test/java/gageot/net/MainWebTest.java
+++ b/src/test/java/gageot/net/MainWebTest.java
@@ -16,11 +16,23 @@
package gageot.net;
import net.codestory.http.WebServer;
+import net.codestory.http.injection.Singletons;
+import net.codestory.http.routes.Routes;
import net.codestory.simplelenium.SeleniumTest;
import org.junit.Test;
+import java.util.ArrayList;
+import java.util.List;
+
public class MainWebTest extends SeleniumTest {
- WebServer webServer = new WebServer().configure(MainWeb.WebConfiguration.class).startOnRandomPort();
+ WebServer webServer = new WebServer().configure(new MainWeb.WebConfiguration() {
+ @Override
+ public void configure(Routes routes) {
+ super.configure(routes);
+
+ routes.setIocAdapter(new Singletons().register(Messages.class, messages)); // Install dependency mock
+ }
+ }).startOnRandomPort();
@Override
protected String getDefaultBaseUrl() {
@@ -28,9 +40,39 @@ protected String getDefaultBaseUrl() {
}
@Test
- public void index() {
+ public void show_messages() {
+ messages.create("Message01");
+ messages.create("Message02");
+
goTo("/");
find("h2").should().contain("Managed VMs Sample Project");
+ find("#messages").should().contain("Message01", "Message02");
}
+
+ @Test
+ public void add_message() {
+ messages.create("FirstMessage");
+
+ goTo("/");
+
+ find("#message").fill("SecondMessage");
+ find("#add").click();
+
+ find("#messages").should().contain("FirstMessage", "SecondMessage");
+ }
+
+ Messages messages = new Messages() {
+ private final List messages = new ArrayList<>();
+
+ @Override
+ public List list() {
+ return messages;
+ }
+
+ @Override
+ public void create(String message) {
+ messages.add(message);
+ }
+ };
}
\ No newline at end of file