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.domain.UpdateLocation; 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\": \"3342\"}"; Entity<String> json = Entity.json(testDevice1); Response response = target.path("db/device/2337").request().put(json); System.out.println(response); System.out.println(target.path("db/device/2338").request().put(Entity.json("{\"groups\": [{\"name\": \"Eschborn\",\"groupId\": \"1\"},{\"name\": \"4. OG\",\"groupId\": \"1.2\"}]," + "\"productTypes\": [{\"id\": \"1\",\"name\": \"doorplate\"}]," + "\"serialnumber\": \"3343\"}"))); System.out.println(target.path("db/device/2339").request().put(Entity.json("{\"groups\": []," + "\"productTypes\": [{\"id\": \"2\",\"name\": \"mobile\"}]," + "\"serialnumber\": \"hinz\"}"))); System.out.println(target.path("db/device/2340").request().put(Entity.json("{\"groups\": []," + "\"productTypes\": [{\"id\": \"2\",\"name\": \"mobile\"}]," + "\"serialnumber\": \"kunz\"}"))); System.out.println(target.path("db/room/3342").request().put(Entity.json("{\"name\": \"Chagall\",\"plateId\":\"3342\",\"persons\": [\"hinz\",\"kunz\"]}"))); System.out.println(target.path("db/room/3343").request().put(Entity.json("{\"name\": \"Miro\",\"plateId\":\"3343\",\"persons\": []}"))); listener = new MessageListenerDoorplate(); Thread.sleep(1500L); } @After public void tearDown() throws Exception { System.out.println(target.path("db/device/2337").request().delete()); System.out.println(target.path("db/device/2338").request().delete()); System.out.println(target.path("db/device/2339").request().delete()); System.out.println(target.path("db/device/2340").request().delete()); System.out.println(target.path("db/room/3342").request().delete()); System.out.println(target.path("db/room/3343").request().delete()); System.out.println(target.path("db/room/3342").request().delete()); System.out.println(target.path("db/location/3343").request().delete()); target = null; listener = null; } @Test public void testProcessMove() { Move move = new Move(); move.setMoveId("1"); move.setUserId("hinz"); move.setPlateId("3343"); System.out.println("Processing move"); listener.processMove(move); try { Thread.sleep(1500L); } catch (InterruptedException e) {} assertPersonInRoom("kunz", "3342"); assertPersonInRoom("hinz", "3343"); System.out.println("Move processed"); } private void assertPersonInRoom(String person, String doorPlateSerial) { Response response = target.path("db/room/_search").request().post(Entity.json("{\"query\":{\"bool\":{\"must\":[{\"term\":{\"room.persons\":\"" + person + "\"}}]}}}")); assertRoomNumberEquals(response, doorPlateSerial); } @SuppressWarnings("rawtypes") private void assertRoomNumberEquals(Response response, String roomNumber) { String responseBody = response.readEntity(String.class); Gson gson = new Gson(); Map jsonMap = gson.fromJson(responseBody, Map.class); System.out.println(jsonMap); List hits = (List) ((Map) jsonMap.get("hits")).get("hits"); assertTrue(hits.size() >= 1); Map source = (Map) ((Map) hits.get(0)).get("_source"); String doorPlateId = (String) source.get("plateId"); assertEquals(roomNumber, doorPlateId); } @Test public void testProcessLocationUpdate() { UpdateLocation update = new UpdateLocation(); update.setPlateId("3343"); update.setUserId("hinz"); System.out.println("Processing location update"); listener.processLocationUpdate(update); try { Thread.sleep(1500L); } catch (InterruptedException e) {} assertPersonCurrentlyInRoom(update.getUserId(), update.getPlateId()); System.out.println("Location update processed"); } private void assertPersonCurrentlyInRoom(String person, String doorPlateSerial) { Response response = target.path("db/location/_search").request().post(Entity.json("{\"query\":{\"bool\":{\"must\":[{\"term\":{\"location.persons\":\"" + person + "\"}}]}}}")); assertRoomNumberEquals(response, doorPlateSerial); } }