/**
* Copyright (C) 2009-2012 the original author or authors.
* See the notice.md file distributed with this work for additional
* information regarding copyright ownership.
*
* 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 org.fusesource.restygwt.client.event;
import org.fusesource.restygwt.client.Defaults;
import org.fusesource.restygwt.client.Method;
import org.fusesource.restygwt.client.MethodCallback;
import org.fusesource.restygwt.client.ModelChange;
import org.fusesource.restygwt.client.Resource;
import org.fusesource.restygwt.client.RestServiceProxy;
import org.fusesource.restygwt.client.cache.VolatileQueueableCacheStorage;
import org.fusesource.restygwt.client.cache.QueueableCacheStorage;
import org.fusesource.restygwt.client.callback.CachingCallbackFilter;
import org.fusesource.restygwt.client.callback.CallbackFactory;
import org.fusesource.restygwt.client.callback.FilterawareRequestCallback;
import org.fusesource.restygwt.client.callback.DefaultFilterawareRequestCallback;
import org.fusesource.restygwt.client.callback.ModelChangeCallbackFilter;
import org.fusesource.restygwt.client.dispatcher.CachingDispatcherFilter;
import org.fusesource.restygwt.client.dispatcher.FilterawareDispatcher;
import org.fusesource.restygwt.client.dispatcher.DefaultFilterawareDispatcher;
import org.fusesource.restygwt.client.event.type.Foo;
import org.fusesource.restygwt.example.client.event.ModelChangeEvent;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.junit.client.GWTTestCase;
/**
* @author <a href="mailto:andi.balke@gmail.com">andi</a>
*/
public class ModelChangeAnnotationTestGwt extends GWTTestCase {
/**
* fake response for the GET request (service.getItems)
*/
private static final String responseGetBody = "[{id:1},{id:2},{id:3}]";
@Override
public String getModuleName() {
// load Event.gwt.xml with EchoServlet configured
return "org.fusesource.restygwt.Event";
}
public void testDefaultFunction() {
/*
* configure RESTY to use cache, usually done in gin
*/
final EventBus eventBus = new SimpleEventBus();
final QueueableCacheStorage cacheStorage = new VolatileQueueableCacheStorage();
final FilterawareDispatcher dispatcher = new DefaultFilterawareDispatcher();
dispatcher.addFilter(new CachingDispatcherFilter(
cacheStorage,
new CallbackFactory() {
public FilterawareRequestCallback createCallback(Method method) {
final FilterawareRequestCallback retryingCallback = new DefaultFilterawareRequestCallback(
method);
retryingCallback.addFilter(new CachingCallbackFilter(cacheStorage));
retryingCallback.addFilter(new ModelChangeCallbackFilter(eventBus));
return retryingCallback;
}
}));
Defaults.setDispatcher(dispatcher);
/*
* setup the service, usually done in gin
*/
Resource resource = new Resource(GWT.getModuleBaseURL());
final ModelChangeAnnotatedService service = GWT.create(ModelChangeAnnotatedService.class);
((RestServiceProxy) service).setResource(resource);
final ModelChangedEventHandlerImpl handler = new ModelChangedEventHandlerImpl();
eventBus.addHandler(ModelChangeEvent.TYPE, handler);
/*
* first we create a client GET request to prepare all things as it
* would be when displaying a list of items in the client.
*
* we could imageine having some listview with cached response.
*/
service.getItems(responseGetBody, new MethodCallback<JSONValue>() {
@Override
public void onSuccess(Method method, JSONValue response) {
// cast to array and validate
JSONArray fooArray = response.isArray();
assertNotNull(fooArray);
/*
* there is no annotation for a get method on that service,
* therefore we wont find any values in the method about it.
*/
assertEquals(null, method.getData().get(ModelChange.MODEL_CHANGED_DOMAIN_KEY));
final int EVENTS_CATCHED_BEFORE_REQUEST = 0;
assertEquals(EVENTS_CATCHED_BEFORE_REQUEST, handler.getAllCatchedEvents().size());
/*
* now, as we have our list data, we want to modify it to trigger
* an update event.
*
* thus we will initiate a write request next.
*/
service.setItem(Response.SC_CREATED, 1, new MethodCallback<Void>() {
@Override
public void onSuccess(Method method, Void response) {
assertEquals(Response.SC_CREATED, method.getResponse().getStatusCode());
/*
* check the eventhandling itself
* ... check it arrived our handler
*/
assertEquals(EVENTS_CATCHED_BEFORE_REQUEST + 1,
handler.getAllCatchedEvents().size());
/*
* prove that the last event catched is for the given domain ``Foo``
*/
assertEquals(handler.getAllCatchedEvents()
.get(handler.getAllCatchedEvents().size() - 1)
.getDomain(),
Foo.class.getName());
finishTest();
}
@Override
public void onFailure(Method method, Throwable exception) {
fail("failure on write: " + exception.getMessage());
}
});
}
@Override
public void onFailure(Method method, Throwable exception) {
fail("failure on read: " + exception.getMessage());
}
});
// wait... we are in async testing...
delayTestFinish(10000);
}
}