1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-19 03:20:21 +02:00
Gadgetbridge/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/database/EntitiesTest.java
cpfeiffer 6f02f9e350 Unit-Test and fix *Attributes sort order
When adding e.g. new DeviceAttributes, we cannot simply add them to the
attributes list, because that list is supposed to be ordered. We could
insert it at the beginning, but that would be brittle to changes in the
GBDaoGenerator, so we simply re-fetch them from the db after adding
new attributes.
2016-09-02 00:34:30 +02:00

230 lines
9.0 KiB
Java

package nodomain.freeyourgadget.gadgetbridge.database;
import android.database.sqlite.SQLiteDatabase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.BuildConfig;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.entities.ActivityDescription;
import nodomain.freeyourgadget.gadgetbridge.entities.ActivityDescriptionDao;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoMaster;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
import nodomain.freeyourgadget.gadgetbridge.entities.DeviceAttributes;
import nodomain.freeyourgadget.gadgetbridge.entities.Tag;
import nodomain.freeyourgadget.gadgetbridge.entities.User;
import nodomain.freeyourgadget.gadgetbridge.entities.UserAttributes;
import nodomain.freeyourgadget.gadgetbridge.entities.UserAttributesDao;
import nodomain.freeyourgadget.gadgetbridge.entities.UserDao;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 19)
// need sdk 19 because "WITHOUT ROWID" is not supported in robolectric/sqlite4java
public class EntitiesTest {
private DaoSession daoSession;
private UserDao userDao;
private UserAttributesDao userAttributesDao;
private DBHandler dbHandler;
private GBApplication app = (GBApplication) RuntimeEnvironment.application;
@Before
public void setUp() throws GBException {
// doesn't work with Robolectric yet
// dbHandler = GBApplication.acquireDB();
// daoSession = dbHandler.getDaoSession();
DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(app, null, null);
SQLiteDatabase db = openHelper.getWritableDatabase();
daoSession = new DaoMaster(db).newSession();
userDao = daoSession.getUserDao();
userAttributesDao = daoSession.getUserAttributesDao();
}
@After
public void tearDown() {
// GBApplication.releaseDB();
}
@Test
public void testUser() {
User user = new User();
user.setName("Peter");
user.setGender(ActivityUser.GENDER_FEMALE);
Calendar cal = GregorianCalendar.getInstance();
cal.add(Calendar.YEAR, -20);
user.setBirthday(cal.getTime());
UserAttributes attributes = new UserAttributes();
attributes.setWeightKG(55);
attributes.setHeightCM(170);
attributes.setSleepGoalHPD(8);
attributes.setStepsGoalSPD(10000);
daoSession.getUserDao().insert(user);
assertNotNull(user.getId());
attributes.setUserId(user.getId());
daoSession.getUserAttributesDao().insert(attributes);
user.getUserAttributesList().add(attributes);
assertNotNull(userDao.load(user.getId()));
assertEquals(1, userDao.count());
assertEquals(1, daoSession.loadAll(User.class).size());
assertNotNull(userAttributesDao.load(attributes.getId()));
assertEquals(1, userAttributesDao.count());
assertEquals(1, daoSession.loadAll(UserAttributes.class).size());
daoSession.getUserDao().update(user);
daoSession.delete(user);
daoSession.delete(attributes);
daoSession.delete(attributes);
assertNull(userDao.load(user.getId()));
}
@Test
public void testDBHelper() {
GBDevice dummyGBDevice = createDummyGDevice("00:00:00:00:01");
Device device = DBHelper.getDevice(dummyGBDevice, daoSession);
assertNotNull(device);
assertEquals("00:00:00:00:01", device.getIdentifier());
assertEquals("Testie", device.getName());
assertEquals("4.0", device.getModel());
assertEquals(DeviceType.TEST.getKey(), device.getType());
DeviceAttributes attributes = device.getDeviceAttributesList().get(0);
assertNotNull(attributes);
assertEquals("1.2.3", attributes.getFirmwareVersion1());
}
private GBDevice createDummyGDevice(String macAddress) {
GBDevice dummyGBDevice = new GBDevice(macAddress, "Testie", DeviceType.TEST);
dummyGBDevice.setFirmwareVersion("1.2.3");
dummyGBDevice.setModel("4.0");
return dummyGBDevice;
}
@Test
public void testActivityDescription() {
User user = DBHelper.getUser(daoSession);
assertNotNull(user);
ActivityDescriptionDao descDao = daoSession.getActivityDescriptionDao();
assertEquals(0, descDao.count());
List<ActivityDescription> list = DBHelper.findActivityDecriptions(user, 10, 100, daoSession);
assertTrue(list.isEmpty());
ActivityDescription desc = DBHelper.createActivityDescription(user, 10, 100, daoSession);
assertNotNull(desc);
assertEquals(user, desc.getUser());
assertEquals(10, desc.getTimestampFrom());
assertEquals(100, desc.getTimestampTo());
List<Tag> tagList = desc.getTagList();
assertEquals(0, tagList.size());
Tag t1 = DBHelper.getTag(user, "Table Tennis", daoSession);
assertNotNull(t1);
assertEquals("Table Tennis", t1.getName());
t1.setDescription("Table tennis training for Olympia");
tagList.add(t1);
list = DBHelper.findActivityDecriptions(user, 10, 100, daoSession);
assertEquals(1, list.size());
ActivityDescription desc1 = list.get(0);
assertEquals(desc, desc1);
assertEquals(1, desc1.getTagList().size());
// check for partial range overlaps
list = DBHelper.findActivityDecriptions(user, 20, 80, daoSession);
assertEquals(1, list.size());
list = DBHelper.findActivityDecriptions(user, 5, 120, daoSession);
assertEquals(1, list.size());
list = DBHelper.findActivityDecriptions(user, 20, 120, daoSession);
assertEquals(1, list.size());
list = DBHelper.findActivityDecriptions(user, 5, 80, daoSession);
assertEquals(1, list.size());
// Now with a second, adjacent ActivityDescription
ActivityDescription desc2 = DBHelper.createActivityDescription(user, 101, 200, daoSession);
list = DBHelper.findActivityDecriptions(user, 10, 100, daoSession);
assertEquals(1, list.size());
list = DBHelper.findActivityDecriptions(user, 20, 80, daoSession);
assertEquals(1, list.size());
list = DBHelper.findActivityDecriptions(user, 5, 120, daoSession);
assertEquals(2, list.size());
list = DBHelper.findActivityDecriptions(user, 20, 120, daoSession);
assertEquals(2, list.size());
list = DBHelper.findActivityDecriptions(user, 5, 80, daoSession);
assertEquals(1, list.size());
// Now with a third, partially overlapping ActivityDescription
ActivityDescription desc3 = DBHelper.createActivityDescription(user, 5, 15, daoSession);
list = DBHelper.findActivityDecriptions(user, 10, 100, daoSession);
assertEquals(2, list.size());
list = DBHelper.findActivityDecriptions(user, 20, 80, daoSession);
assertEquals(1, list.size());
list = DBHelper.findActivityDecriptions(user, 5, 120, daoSession);
assertEquals(3, list.size());
list = DBHelper.findActivityDecriptions(user, 20, 120, daoSession);
assertEquals(2, list.size());
list = DBHelper.findActivityDecriptions(user, 5, 80, daoSession);
assertEquals(2, list.size());
}
@Test
public void testDeviceAttributes() throws Exception {
GBDevice dummyGBDevice = createDummyGDevice("00:00:00:00:02");
dummyGBDevice.setFirmwareVersion("1.0");
Device deviceOld = DBHelper.getDevice(dummyGBDevice, daoSession);
assertNotNull(deviceOld);
List<DeviceAttributes> attrListOld = deviceOld.getDeviceAttributesList();
assertEquals(1, attrListOld.size());
assertEquals("1.0", attrListOld.get(0).getFirmwareVersion1());
// some time passes, firmware update occurs
Thread.sleep(2 * 1000);
dummyGBDevice.setFirmwareVersion("2.0");
Device deviceNew = DBHelper.getDevice(dummyGBDevice, daoSession);
assertNotNull(deviceNew);
List<DeviceAttributes> attrListNew = deviceNew.getDeviceAttributesList();
assertEquals(2, attrListNew.size());
assertEquals("2.0", attrListNew.get(0).getFirmwareVersion1());
assertEquals("1.0", attrListNew.get(1).getFirmwareVersion1());
}
}