blob: c4a458a12b2b29c0dca862fd7466de129197a10c [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* 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 com.google.gwt.requestfactory.client.impl;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.requestfactory.shared.LoggingRequest;
import com.google.gwt.valuestore.shared.Record;
import com.google.gwt.valuestore.shared.SimpleFooRecord;
import com.google.gwt.valuestore.shared.WriteOperation;
import java.util.Date;
/**
* Tests for {@link DeltaValueStoreJsonImpl}.
*/
public class DeltaValueStoreJsonImplTest extends GWTTestCase {
/*
* sub-classed it here so that the protected constructor of {@link RecordImpl}
* can remain as such.
*/
private class MyRecordImpl extends RecordImpl {
protected MyRecordImpl(RecordJsoImpl record) {
super(record, false);
}
}
final RecordToTypeMap typeMap = new RecordToTypeMap() {
@SuppressWarnings("unchecked")
public <R extends Record> RecordSchema<R> getType(Class<R> recordClass) {
if (recordClass.equals(SimpleFooRecord.class)) {
return (RecordSchema<R>) SimpleFooRecordImpl.SCHEMA;
}
throw new IllegalArgumentException("Unknown token " + recordClass);
}
public RecordSchema<? extends Record> getType(
String recordClass) {
if (recordClass.equals("simple-foo-class-token")) {
return SimpleFooRecordImpl.SCHEMA;
}
throw new IllegalArgumentException("Unknown token " + recordClass);
}
public String getClassToken(Class<?> recordClass) {
if (recordClass.equals(SimpleFooRecord.class)) {
return "simple-foo-class-token";
}
throw new IllegalArgumentException("Unknown token " + recordClass);
}
};
ValueStoreJsonImpl valueStore = null;
RequestFactoryJsonImpl requestFactory = null;
RecordJsoImpl jso = null;
@Override
public String getModuleName() {
return "com.google.gwt.requestfactory.RequestFactorySuite";
}
@Override
public void gwtSetUp() {
valueStore = new ValueStoreJsonImpl();
requestFactory = new RequestFactoryJsonImpl() {
public <R extends Record> R create(Class<R> token) {
return create(token, typeMap);
}
@Override
public RecordSchema<?> getSchema(String token) {
return typeMap.getType(token);
}
@Override
public void init(EventBus eventBus) {
// ignore.
}
public LoggingRequest loggingRequest() {
return null; // ignore
}
public Class<? extends Record> getClass(String token) {
throw new UnsupportedOperationException("Auto-generated method stub");
}
public Record getProxy(String token) {
throw new UnsupportedOperationException("Auto-generated method stub");
}
public String getToken(Class<? extends Record> clazz) {
throw new UnsupportedOperationException("Auto-generated method stub");
}
public String getToken(Record proxy) {
throw new UnsupportedOperationException("Auto-generated method stub");
}
};
// add a record
jso = RecordJsoImpl.fromJson("{}");
jso.set(SimpleFooRecord.id, 42L);
jso.set(SimpleFooRecord.version, 1);
jso.set(SimpleFooRecord.userName, "bovik");
jso.set(SimpleFooRecord.password, "bovik");
jso.set(SimpleFooRecord.intId, 4);
jso.set(SimpleFooRecord.created, new Date());
jso.setSchema(SimpleFooRecordImpl.SCHEMA);
valueStore.setRecord(jso, requestFactory);
}
public void testCreate() {
Record created = requestFactory.create(SimpleFooRecord.class);
assertNotNull(created.getId());
assertNotNull(created.getVersion());
DeltaValueStoreJsonImpl deltaValueStore = new DeltaValueStoreJsonImpl(
valueStore, requestFactory);
String json = deltaValueStore.toJson();
JSONObject jsonObject = (JSONObject) JSONParser.parseLenient(json);
assertFalse(jsonObject.containsKey(WriteOperation.CREATE.name()));
}
public void testCreateWithSet() {
Record created = requestFactory.create(SimpleFooRecord.class);
assertNotNull(created.getId());
assertNotNull(created.getVersion());
DeltaValueStoreJsonImpl deltaValueStore = new DeltaValueStoreJsonImpl(
valueStore, requestFactory);
// DVS does not know about the created entity.
assertFalse(deltaValueStore.isChanged());
deltaValueStore.set(SimpleFooRecord.userName, created, "harry");
assertTrue(deltaValueStore.isChanged());
testAndGetChangeRecord(deltaValueStore.toJson(), WriteOperation.CREATE);
}
public void testCreateUpdate() {
Record created = requestFactory.create(SimpleFooRecord.class);
DeltaValueStoreJsonImpl deltaValueStore = new DeltaValueStoreJsonImpl(
valueStore, requestFactory);
// DVS does not know about the created entity.
assertFalse(deltaValueStore.isChanged());
deltaValueStore.set(SimpleFooRecord.userName, created, "harry");
assertTrue(deltaValueStore.isChanged());
JSONObject changeRecord = testAndGetChangeRecord(deltaValueStore.toJson(),
WriteOperation.CREATE);
assertEquals(
"harry",
changeRecord.get(SimpleFooRecord.userName.getName()).isString().stringValue());
}
public void testOperationAfterJson() {
DeltaValueStoreJsonImpl deltaValueStore = new DeltaValueStoreJsonImpl(
valueStore, requestFactory);
deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
"newHarry");
assertTrue(deltaValueStore.isChanged());
deltaValueStore.toJson();
try {
deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
"harry");
fail("Modifying DeltaValueStore after calling toJson should throw a RuntimeException");
} catch (RuntimeException ex) {
// expected.
}
deltaValueStore.clearUsed();
deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
"harry");
}
public void testSeparateIds() {
RecordImpl createRecord = (RecordImpl) requestFactory.create(SimpleFooRecord.class);
assertTrue(createRecord.isFuture());
Long futureId = createRecord.getId();
RecordImpl mockRecord = new RecordImpl(RecordJsoImpl.create(futureId, 1,
SimpleFooRecordImpl.SCHEMA), RequestFactoryJsonImpl.NOT_FUTURE);
valueStore.setRecord(mockRecord.asJso(), requestFactory); // marked as non-future..
DeltaValueStoreJsonImpl deltaValueStore = new DeltaValueStoreJsonImpl(
valueStore, requestFactory);
deltaValueStore.set(SimpleFooRecord.userName, createRecord, "harry");
deltaValueStore.set(SimpleFooRecord.userName, mockRecord, "bovik");
assertTrue(deltaValueStore.isChanged());
String jsonString = deltaValueStore.toJson();
JSONObject jsonObject = (JSONObject) JSONParser.parseLenient(jsonString);
assertFalse(jsonObject.containsKey(WriteOperation.DELETE.name()));
assertTrue(jsonObject.containsKey(WriteOperation.CREATE.name()));
assertTrue(jsonObject.containsKey(WriteOperation.UPDATE.name()));
JSONArray createOperationArray = jsonObject.get(
WriteOperation.CREATE.name()).isArray();
assertEquals(1, createOperationArray.size());
assertEquals("harry", createOperationArray.get(0).isObject().get(
SimpleFooRecord.class.getName()).isObject().get(
SimpleFooRecord.userName.getName()).isString().stringValue());
JSONArray updateOperationArray = jsonObject.get(
WriteOperation.UPDATE.name()).isArray();
assertEquals(1, updateOperationArray.size());
assertEquals("bovik", updateOperationArray.get(0).isObject().get(
SimpleFooRecord.class.getName()).isObject().get(
SimpleFooRecord.userName.getName()).isString().stringValue());
}
public void testUpdate() {
DeltaValueStoreJsonImpl deltaValueStore = new DeltaValueStoreJsonImpl(
valueStore, requestFactory);
deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
"harry");
assertTrue(deltaValueStore.isChanged());
JSONObject changeRecord = testAndGetChangeRecord(deltaValueStore.toJson(),
WriteOperation.UPDATE);
assertEquals(
"harry",
changeRecord.get(SimpleFooRecord.userName.getName()).isString().stringValue());
}
private JSONObject testAndGetChangeRecord(String jsonString,
WriteOperation currentWriteOperation) {
JSONObject jsonObject = (JSONObject) JSONParser.parseLenient(jsonString);
for (WriteOperation writeOperation : WriteOperation.values()) {
if (writeOperation != currentWriteOperation) {
assertFalse(jsonObject.containsKey(writeOperation.name()));
} else {
assertTrue(jsonObject.containsKey(writeOperation.name()));
}
}
JSONArray writeOperationArray = jsonObject.get(currentWriteOperation.name()).isArray();
assertEquals(1, writeOperationArray.size());
JSONObject recordWithName = writeOperationArray.get(0).isObject();
assertEquals(1, recordWithName.size());
assertTrue(recordWithName.containsKey(SimpleFooRecord.class.getName()));
JSONObject record = recordWithName.get(SimpleFooRecord.class.getName()).isObject();
assertTrue(record.containsKey("id"));
assertTrue(record.containsKey("version"));
return record;
}
}