import org.apache.http.HttpStatus;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import kidozen.client.KZApplication;
import kidozen.client.ServiceEvent;
import kidozen.client.ServiceEventListener;
import kidozen.client.ServiceResponseHandler;
import kidozen.client.ServiceResponseListener;
import kidozen.client.Storage;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsEqual.equalTo;
/**
* Created with IntelliJ IDEA.
* User: christian
* Date: 5/20/13
* Time: 2:30 PM
* To change this template use File | Settings | File Templates.
*/
@RunWith(RobolectricTestRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Config(manifest= Config.NONE)
public class StorageSvcResponseTest {
private static final String KZ_STORAGE_SERVICE_ID = "StorageWithServiceResponseTestCollection";
public static final int TEST_TIMEOUT_IN_SECONDS = 20;
public static final String DATA_VALUE_KEY = "value";
KZApplication kidozen = null;
JSONObject mDefaultObjectToInsert;
Storage _storage;
@Before
public void Setup()
{
try {
mDefaultObjectToInsert = new JSONObject().put(DATA_VALUE_KEY, AppSettings.CreateRandomValue());
final CountDownLatch signalInit = new CountDownLatch(1);
kidozen = new KZApplication(AppSettings.KZ_TENANT, AppSettings.KZ_APP, AppSettings.KZ_KEY, false);
signalInit.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
final CountDownLatch signalAuth = new CountDownLatch(1);
kidozen.Authenticate(AppSettings.KZ_USER, AppSettings.KZ_PASS,AppSettings.KZ_PROVIDER, kidoAuthCallback(signalAuth));
signalAuth.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
_storage = kidozen.Storage(KZ_STORAGE_SERVICE_ID);
}
catch (Exception e)
{
System.out.println("ERROR");
System.out.println(e.getMessage());
fail();
}
}
private ServiceEventListener kidoAuthCallback(final CountDownLatch signal) {
return new ServiceEventListener() {
@Override
public void onFinish(ServiceEvent e) {
signal.countDown();
assertThat(e.StatusCode, equalTo(HttpStatus.SC_OK));
}
};
}
@Test
public void ShouldCreateMessage() throws Exception {
final CountDownLatch lcd = new CountDownLatch(2);
JSONObject data = new JSONObject().put(DATA_VALUE_KEY,"ShouldCreateMessage");
Storage storage= kidozen.Storage(KZ_STORAGE_SERVICE_ID);
storage.Create(data, defaultCreateListenerAsJObject(lcd));
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldCreatePrivateMessage() throws Exception {
final CountDownLatch lcd = new CountDownLatch(2);
JSONObject data = new JSONObject().put(DATA_VALUE_KEY,"ShouldCreateMessage");
Storage storage= kidozen.Storage(KZ_STORAGE_SERVICE_ID);
storage.Create(data,true, defaultCreateListenerAsJObject(lcd));
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldCreatePublicMessage() throws Exception {
final CountDownLatch lcd = new CountDownLatch(2);
JSONObject data = new JSONObject().put(DATA_VALUE_KEY,"ShouldCreateMessage");
Storage storage= kidozen.Storage(KZ_STORAGE_SERVICE_ID);
storage.Create(data, false, defaultCreateListenerAsJObject(lcd));
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldDeleteMessage() throws Exception {
final CountDownLatch lcd = new CountDownLatch(2);
final CountDownLatch createCdl = new CountDownLatch(1);
createDefaultObjectToInsert(createCdl);
_storage.Delete(mDefaultObjectToInsert.getString("_id"),new ServiceResponseHandler() {
@Override
public void onStart() {
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, String response) {
assertThat(statusCode, equalTo( HttpStatus.SC_OK));
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, JSONObject response) {
fail();
}
@Override
public void onSuccess(int statusCode, JSONArray response) {
fail();
}
@Override
public void onError(int statusCode, String response) {
fail();
}
});
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldGetMessage() throws Exception {
final CountDownLatch lcd = new CountDownLatch(2);
final CountDownLatch createCdl = new CountDownLatch(1);
createDefaultObjectToInsert(createCdl);
String id = mDefaultObjectToInsert.getString("_id");
_storage.Get(id, new ServiceResponseHandler() {
@Override
public void onStart() {
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, String response) {
fail();
}
@Override
public void onSuccess(int statusCode, JSONObject response) {
assertThat(statusCode, equalTo(HttpStatus.SC_OK));
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, JSONArray response) {
fail();
}
@Override
public void onError(int statusCode, String response) {
fail();
}
});
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldDropCollection() throws Exception
{
final CountDownLatch lcd = new CountDownLatch(2);
JSONObject mDefaultObjectToInsert = new JSONObject().put(DATA_VALUE_KEY, AppSettings.CreateRandomValue());
Storage toDrop = kidozen.Storage("toDrop");
toDrop.Create(mDefaultObjectToInsert,defaultCreateListenerAsJObject(lcd));
//Assert
toDrop.Drop(new ServiceResponseHandler() {
@Override
public void onStart() {
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, String response) {
assertThat(statusCode,equalTo(HttpStatus.SC_OK));
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, JSONObject response) {
fail();
}
@Override
public void onSuccess(int statusCode, JSONArray response) {
fail();
}
@Override
public void onError(int statusCode, String response) {
fail();
}
});
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldGetAllObjects() throws Exception
{
final CountDownLatch lcd = new CountDownLatch(2);
final CountDownLatch createCdl = new CountDownLatch(1);
createDefaultObjectToInsert(createCdl);
_storage.All(defaultCreateListenerAsJArray(lcd));
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Ignore
public void ShouldUpdateObject() throws Exception {
final CountDownLatch createCdl = new CountDownLatch(1);
final String expected = "updated";
createDefaultObjectToInsert(createCdl);
createCdl.await(TEST_TIMEOUT_IN_SECONDS,TimeUnit.SECONDS);
mDefaultObjectToInsert.put(DATA_VALUE_KEY, expected);
//Assert
final CountDownLatch lcd = new CountDownLatch(1);
_storage.Update(mDefaultObjectToInsert.getString("_id"), mDefaultObjectToInsert, new ServiceResponseListener() {
@Override
public void onSuccess(int statusCode, JSONObject response) {
lcd.countDown();
assertThat(statusCode, equalTo(HttpStatus.SC_OK));
}
});
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void UpdateObjectShouldReturnConflict() throws Exception {
final CountDownLatch createCdl = new CountDownLatch(1);
final String expected = "updated";
createDefaultObjectToInsert(createCdl);
createCdl.await(TEST_TIMEOUT_IN_SECONDS,TimeUnit.SECONDS);
mDefaultObjectToInsert.put(DATA_VALUE_KEY, expected);
JSONObject updatedObject = new JSONObject(mDefaultObjectToInsert.toString());
updatedObject.put(DATA_VALUE_KEY, expected);
JSONObject metadata = updatedObject.getJSONObject("_metadata");
metadata.put("sync","-1");
updatedObject.put("_metadata", metadata);
final CountDownLatch lcd = new CountDownLatch(1);
_storage.Update(updatedObject.getString("_id"),updatedObject, new ServiceResponseListener() {
@Override
public void onError(int statusCode, String response) {
//System.out.println(response);
assertEquals(statusCode, HttpStatus.SC_CONFLICT);
lcd.countDown();
}
});
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldQueryObject() throws Exception {
final CountDownLatch lcd = new CountDownLatch(1);
final String expected = AppSettings.CreateRandomValue();
final JSONObject data = new JSONObject().put(DATA_VALUE_KEY,expected);
_storage.Create(data, new ServiceResponseListener() {
@Override
public void onSuccess(int statusCode, JSONObject response) {
String query = data.toString();
_storage.Query(query, new ServiceResponseListener() {
@Override
public void onSuccess(int statusCode, JSONArray response)
{
assertEquals(statusCode, HttpStatus.SC_OK);
lcd.countDown();
}
@Override
public void onError(int statusCode, String response)
{
fail();
}
});
}
}
);
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldQueryObjectAndReturnOnlyRequestedValues() throws Exception
{
//Robolectric.addHttpResponseRule();
final CountDownLatch lcd = new CountDownLatch(1);
final String expected = AppSettings.CreateRandomValue();
final String KEY2="additional";
final JSONObject data = new JSONObject()
.put(DATA_VALUE_KEY, expected)
.put(KEY2, AppSettings.CreateRandomValue());
final String query = data.toString();
final String values = new JSONObject().put(DATA_VALUE_KEY,true).toString();
_storage.Create(data, new ServiceResponseListener() {
@Override
public void onSuccess(int statusCode, JSONObject response) {
_storage.Query(query, values, "{}" , new ServiceResponseListener() {
@Override
public void onSuccess(int statusCode, JSONArray response)
{
assertEquals(statusCode, HttpStatus.SC_OK);
try {
JSONObject obj = response.getJSONObject(0);
assertNotNull(obj.getString(DATA_VALUE_KEY));
// The following call should throw an JSONException, because the Query overload should only return the value for 'DATA_VALUE_KEY'
String fail = obj.getString(KEY2);
}
catch (JSONException je) {
String msg = je.getMessage();
//System.out.println("msg = " + msg);
String expectedMessage = "No value for additional";
assertEquals(expectedMessage, msg);
}
catch (Exception e) {
fail();
}
finally {
lcd.countDown();
}
}
@Override
public void onError(int statusCode, String response)
{
fail();
}
});
}
}
);
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test(expected = IllegalArgumentException.class)
public void CreateShouldThrowInvalidArgument() throws Exception
{
final CountDownLatch lcd = new CountDownLatch(1);
JSONObject data = new JSONObject()
.put(DATA_VALUE_KEY,"ShouldCreateMessage")
.put("_id","abc");
Storage storage= kidozen.Storage(KZ_STORAGE_SERVICE_ID);
storage.Create(data, new ServiceResponseListener() {
@Override
public void onError(int status, String response) {
assertThat(status, equalTo(HttpStatus.SC_CONFLICT));
lcd.countDown();
}
});
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldCreateObjectWhenCallSAVE() throws Exception
{
final CountDownLatch lcd = new CountDownLatch(1);
JSONObject data = new JSONObject()
.put(DATA_VALUE_KEY, "ShouldCreateMessage");
Storage storage= kidozen.Storage(KZ_STORAGE_SERVICE_ID);
storage.Save(data, new ServiceResponseListener() {
@Override
public void onSuccess(int status, JSONObject response) {
assertThat(status, equalTo(HttpStatus.SC_CREATED));
lcd.countDown();
}
});
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
@Test
public void ShouldUpdateObjectWhenCallSave() throws Exception {
final CountDownLatch createCdl = new CountDownLatch(1);
final String expected = "updated";
createDefaultObjectToInsert(createCdl);
createCdl.await(TEST_TIMEOUT_IN_SECONDS,TimeUnit.SECONDS);
mDefaultObjectToInsert.put(DATA_VALUE_KEY, expected);
//Assert
final CountDownLatch lcd = new CountDownLatch(1);
_storage.Save( mDefaultObjectToInsert, new ServiceResponseListener() {
@Override
public void onSuccess(int statusCode, JSONObject response) {
lcd.countDown();
assertThat(statusCode, equalTo(HttpStatus.SC_OK));
}
});
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
assertTrue(lcd.await(TEST_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
}
private ServiceResponseHandler defaultCreateListenerAsJObject(final CountDownLatch lcd) {
return new ServiceResponseHandler() {
@Override
public void onStart() {
//System.out.println("onStart");
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, String response) {
//System.out.println("onSuccess String");
fail();
}
@Override
public void onSuccess(int statusCode, JSONObject response) {
//System.out.println("onSuccess JSONObject");
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, JSONArray response) {
//System.out.println("onSuccess JSONArray");
fail();
}
@Override
public void onError(int statusCode, String response) {
//System.out.println("onError");
fail();
}
};
}
private ServiceResponseHandler defaultCreateListenerAsJArray(final CountDownLatch lcd) {
return new ServiceResponseHandler() {
@Override
public void onStart() {
//System.out.println("onStart");
lcd.countDown();
}
@Override
public void onSuccess(int statusCode, String response) {
//System.out.println("onSuccess String");
fail();
}
@Override
public void onSuccess(int statusCode, JSONObject response) {
//System.out.println("onSuccess JSONObject");
fail();
}
@Override
public void onSuccess(int statusCode, JSONArray response) {
//System.out.println("onSuccess JSONArray");
lcd.countDown();
}
@Override
public void onError(int statusCode, String response) {
//System.out.println("onError");
fail();
}
};
}
private void createDefaultObjectToInsert(final CountDownLatch createCdl) {
_storage.Create(mDefaultObjectToInsert, new ServiceResponseListener() {
@Override
public void onError(int statusCode, String response) {
fail();
}
@Override
public void onSuccess(int statusCode, JSONObject response) {
mDefaultObjectToInsert = response;
createCdl.countDown();
}
});
}
}