package com.zuehlke.camp2014.schild.siegfried.logic;
import java.util.List;
import java.util.Map;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import junit.framework.Assert;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.gson.Gson;
import com.zuehlke.camp2014.schild.siegfried.domain.Move;
import com.zuehlke.camp2014.schild.siegfried.logic.MessageListenerDoorplate;
public class ProcessingTest extends Assert {
private WebTarget target;
private MessageListenerDoorplate listener;
@Before
public void setUp() throws Exception {
Client c = ClientBuilder.newClient();
target = c.target(MessageListenerDoorplate.BASE_URI);
String testDevice1 = "{\"groups\": [{\"name\": \"Eschborn\",\"groupId\": \"1\"},{\"name\": \"2. OG\",\"groupId\": \"1.1\"}]," +
"\"productTypes\": [{\"id\": \"1\",\"name\": \"doorplate\"}]," +
"\"serialnumber\": \"42\"}";
Entity<String> json = Entity.json(testDevice1);
Response response = target.path("schild/device/1").request().put(json);
System.out.println(response);
System.out.println(target.path("schild/device/2").request().put(Entity.json("{\"groups\": [{\"name\": \"Eschborn\",\"groupId\": \"1\"},{\"name\": \"4. OG\",\"groupId\": \"1.2\"}]," +
"\"productTypes\": [{\"id\": \"1\",\"name\": \"doorplate\"}]," +
"\"serialnumber\": \"43\"}")));
System.out.println(target.path("schild/device/3").request().put(Entity.json("{\"groups\": []," +
"\"productTypes\": [{\"id\": \"2\",\"name\": \"mobile\"}]," +
"\"serialnumber\": \"mfu\"}")));
System.out.println(target.path("schild/device/4").request().put(Entity.json("{\"groups\": []," +
"\"productTypes\": [{\"id\": \"2\",\"name\": \"mobile\"}]," +
"\"serialnumber\": \"sat\"}")));
System.out.println(target.path("schild/room/42").request().put(Entity.json("{\"name\": \"Chagall\",\"plateId\":\"42\",\"persons\": [\"mfu\",\"sat\"]}")));
System.out.println(target.path("schild/room/43").request().put(Entity.json("{\"name\": \"Miro\",\"plateId\":\"43\",\"persons\": []}")));
// System.out.println(target.path("schild/telemetrymessage").queryParam("parent", "1").request().post(Entity.json("{\"payload\": \"[{'id':'mfu', 'name':'Masanori Fujita'}, {'id':'sat', 'name':'Michael Sattler'}]\"," +
// "\"senderId\": \"somebody\"," +
// "\"timestamp\": \"2014/06/25 16:10:00\"}")));
listener = new MessageListenerDoorplate();
Thread.sleep(1500L);
}
@After
public void tearDown() throws Exception {
System.out.println(target.path("schild/device/1").request().delete());
System.out.println(target.path("schild/device/2").request().delete());
System.out.println(target.path("schild/device/3").request().delete());
System.out.println(target.path("schild/device/4").request().delete());
System.out.println(target.path("schild/room/42").request().delete());
System.out.println(target.path("schild/room/43").request().delete());
// System.out.println(target.path("schild/telemetrymessage/_query").queryParam("q", "senderId:somebody").request().delete());
target = null;
listener = null;
}
@Test
public void testProcessMove() {
Move move = new Move();
move.setMoveId("1");
move.setUserId("sat");
move.setPlateId("43");
System.out.println("Processing");
listener.processMove(move);
assertPersonInRoom("mfu", "42");
assertPersonInRoom("sat", "43");
System.out.println("Feddisch");
}
private void assertPersonInRoom(String person, String doorPlateSerial) {
Response response = target.path("schild/room/_search").request().post(Entity.json("{\"query\":{\"bool\":{\"must\":[{\"term\":{\"room.persons\":\"" + person + "\"}}]}}}"));
assertPersonCheckedIn(response, person);
}
@SuppressWarnings("rawtypes")
private void assertPersonCheckedIn(Response response, String name) {
String responseBody = response.readEntity(String.class);
Gson gson = new Gson();
Map jsonMap = gson.fromJson(responseBody, Map.class);
System.out.println(jsonMap);
// System.out.println("Hits: " + ((Map) jsonMap.get("hits")).get("total"));
List hits = (List) ((Map) jsonMap.get("hits")).get("hits");
// System.out.println("Hits array: " + hits);
assertTrue(hits.size() >= 1);
Map source = (Map) ((Map) hits.get(0)).get("_source");
List personsList = (List) source.get("persons");
// System.out.println("Payload: " + payloadArray);
assertTrue(personsList.contains(name));
}
private void assertPersonCurrentlyInRoom(String person, String doorPlateSerial) {
Response response = target.path("schild/telemetrymessage/_search").request().post(Entity.json("{\"query\": {" +
"\"bool\": {\"must\": [" +
"{\"has_parent\" : {\"parent_type\" :\"device\", \"query\" : {\"match\" : {\"serialnumber\" : \"" + doorPlateSerial + "\"}}} }," +
"{\"range\" : {\"timestamp\" : {\"gt\" : \"2014/06/25 16:10:00\"}}}]}}}"));
assertPersonCheckedIn(response, person);
}
}