/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.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://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.module.sync;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import org.junit.Test;
import org.openmrs.module.sync.SyncItem;
import org.openmrs.module.sync.SyncItemKey;
import org.openmrs.module.sync.SyncItemState;
import org.openmrs.module.sync.SyncRecord;
import org.openmrs.module.sync.serialization.FilePackage;
import org.openmrs.module.sync.serialization.IItem;
import org.openmrs.module.sync.serialization.Item;
import org.openmrs.module.sync.serialization.Package;
import org.openmrs.module.sync.serialization.Record;
import org.openmrs.test.SkipBaseSetup;
import org.springframework.test.annotation.NotTransactional;
/**
* Tests sync record serialization.
*/
public class SyncRecordTest {
/**
* test serialization of syncRecord
*
* @throws Exception
*/
@Test
@NotTransactional
@SkipBaseSetup
public void shouldSerializeASyncRecord() throws Exception {
// 'normal' state
String uuid1 = UUID.randomUUID().toString();
SyncRecord syncRecord1 = new SyncRecord();
syncRecord1.setTimestamp(new Date());
syncRecord1.setUuid(uuid1);
SyncItem item11 = new SyncItem();
item11.setContent("<Person><Name>Some Person</Name></Person>");
item11.setState(SyncItemState.NEW);
item11.setKey(new SyncItemKey<String>(UUID.randomUUID().toString(),
String.class));
SyncItem item12 = new SyncItem();
item12
.setContent("<PersonAddress><Street>Some Street</Street></PersonAddress>");
item12.setState(SyncItemState.UPDATED);
item12.setKey(new SyncItemKey<String>(UUID.randomUUID().toString(),
String.class));
List<SyncItem> items1 = new ArrayList<SyncItem>();
items1.add(item11);
items1.add(item12);
syncRecord1.setItems(items1);
// 'weird' end cases start here
// no timestamp or items
SyncRecord syncRecord2 = new SyncRecord();
syncRecord2.setUuid(UUID.randomUUID().toString());
// dump out the state
Package pkg = new FilePackage();
Record record = pkg.createRecordForWrite("SyncRecordTest");
Item top = record.getRootItem();
((IItem) syncRecord1).save(record, top);
((IItem) syncRecord2).save(record, top);
List<SyncRecord> originals = new ArrayList<SyncRecord>();
originals.add(syncRecord1);
originals.add(syncRecord2);
// now Test deserialize - THIS DOES NOT WORK YET
String textDes = record.toStringAsDocumentFragement();
Package pkgDes = new FilePackage();
Record recordDes = pkgDes.createRecordFromString(textDes);
Item topDes = recordDes.getRootItem();
// get items list that holds serialized sync records
List<Item> itemsDes = recordDes.getItems(topDes);
assertTrue(itemsDes.size() == originals.size());
SyncRecord syncRecordDesc = null;
Iterator<Item> iterator = itemsDes.iterator();
Iterator<SyncRecord> iteratorOrig = originals.iterator();
while (iterator.hasNext()) {
syncRecordDesc = new SyncRecord();
syncRecordDesc.load(recordDes, iterator.next());
assertEquals(syncRecordDesc, iteratorOrig.next());
}
return;
}
/**
* Auto generated method comment
*
* @throws Exception
*/
@Test
@NotTransactional
@SkipBaseSetup
public void shouldEquality() throws Exception {
//setup instance 1
String uuid1 = UUID.randomUUID().toString();
SyncRecord syncRecord1 = new SyncRecord();
syncRecord1.setTimestamp(new Date());
syncRecord1.setUuid(uuid1);
SyncItem item11 = new SyncItem();
item11.setContent("<Person><Name>Some Person</Name></Person>");
item11.setState(SyncItemState.NEW);
item11.setKey(new SyncItemKey<String>(UUID.randomUUID().toString(),
String.class));
List<SyncItem> items1 = new ArrayList<SyncItem>();
items1.add(item11);
syncRecord1.setItems(items1);
//setup instance 2
SyncRecord syncRecord2 = new SyncRecord();
syncRecord2.setTimestamp(syncRecord1.getTimestamp());
syncRecord2.setUuid(syncRecord1.getUuid());
SyncItem item21 = new SyncItem();
item21.setContent("<Person><Name>Some Person</Name></Person>");
item21.setState(SyncItemState.NEW);
item21.setKey(item11.getKey());
List<SyncItem> items2 = new ArrayList<SyncItem>();
items2.add(item21);
syncRecord2.setItems(items2);
//assert now
assertEquals(syncRecord1,syncRecord2);
syncRecord1.setItems(null);
assertNotSame(syncRecord1,syncRecord2);
//some variations
Date date2 = new Date();
date2.setTime(syncRecord1.getTimestamp().getTime() + 1);
syncRecord2.setTimestamp(date2);
assertTrue(!syncRecord1.equals(syncRecord2));
date2.setTime(syncRecord1.getTimestamp().getTime());
assertTrue(syncRecord1.equals(syncRecord2));
item21.setContent("<Person><Name>Some Person Name</Name></Person>");
assertTrue(!syncRecord1.equals(syncRecord2));
}
}