From 743431ef6798a1df27bfd77818a5a76d968f81da Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 24 Mar 2016 06:59:41 -0400 Subject: [PATCH] Refactor DatabaseHelper; write tests for data import --- app/src/androidTest/assets/habitbull.csv | 19 ++ app/src/androidTest/assets/loop.db | Bin 0 -> 53248 bytes app/src/androidTest/assets/rewire.db | Bin 0 -> 57344 bytes app/src/androidTest/assets/tickmate.db | Bin 0 -> 32768 bytes .../isoron/uhabits/unit/io/ImportTest.java | 173 ++++++++++++++++++ .../uhabits/unit/models/HabitFixtures.java | 6 +- .../org/isoron/uhabits/HabitsApplication.java | 18 +- .../uhabits/helpers/DatabaseHelper.java | 74 ++++++-- .../org/isoron/uhabits/io/LoopDBImporter.java | 7 +- .../isoron/uhabits/tasks/ExportDBTask.java | 2 +- 10 files changed, 268 insertions(+), 31 deletions(-) create mode 100644 app/src/androidTest/assets/habitbull.csv create mode 100644 app/src/androidTest/assets/loop.db create mode 100644 app/src/androidTest/assets/rewire.db create mode 100644 app/src/androidTest/assets/tickmate.db create mode 100644 app/src/androidTest/java/org/isoron/uhabits/unit/io/ImportTest.java diff --git a/app/src/androidTest/assets/habitbull.csv b/app/src/androidTest/assets/habitbull.csv new file mode 100644 index 000000000..977a8e8df --- /dev/null +++ b/app/src/androidTest/assets/habitbull.csv @@ -0,0 +1,19 @@ +HabitName,HabitDescription,HabitCategory,CalendarDate,Value,CommentText +Breed dragons,with love and fire,Diet & Food,2016-03-18,1, +Breed dragons,with love and fire,Diet & Food,2016-03-19,1, +Breed dragons,with love and fire,Diet & Food,2016-03-21,1, +Reduce sleep,only 2 hours per day,Time Management,2016-03-15,1, +Reduce sleep,only 2 hours per day,Time Management,2016-03-16,1, +Reduce sleep,only 2 hours per day,Time Management,2016-03-17,1, +Reduce sleep,only 2 hours per day,Time Management,2016-03-21,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-15,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-16,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-18,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-21,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-15,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-16,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-18,1, +No-arms pushup,Become like water my friend!,Fitness,2016-03-21,1, +Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-15,1, +Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-17,1, +Grow spiritually,"transcend ego, practice compassion, smile and breath",Meditation,2016-03-21,1, diff --git a/app/src/androidTest/assets/loop.db b/app/src/androidTest/assets/loop.db new file mode 100644 index 0000000000000000000000000000000000000000..25f0f32cd9471930dac3dc90ec784e8a69f73588 GIT binary patch literal 53248 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 + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.unit.io; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; +import android.test.suitebuilder.annotation.SmallTest; + +import org.isoron.uhabits.helpers.DatabaseHelper; +import org.isoron.uhabits.helpers.DateHelper; +import org.isoron.uhabits.io.GenericImporter; +import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.unit.models.HabitFixtures; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.GregorianCalendar; +import java.util.List; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ImportTest +{ + private File baseDir; + private Context context; + private Context targetContext; + + @Before + public void setup() + { + HabitFixtures.purgeHabits(); + + context = InstrumentationRegistry.getInstrumentation().getContext(); + targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + baseDir = DatabaseHelper.getFilesDir(targetContext, "Backups"); + if(baseDir == null) fail("baseDir should not be null"); + } + + private void copyAssetToFile(String assetPath, File dst) throws IOException + { + InputStream in = context.getAssets().open(assetPath); + DatabaseHelper.copy(in, dst); + } + + private void importFromFile(String assetFilename) throws IOException + { + File file = new File(String.format("%s/%s", baseDir.getPath(), assetFilename)); + copyAssetToFile(assetFilename, file); + assertTrue(file.exists()); + assertTrue(file.canRead()); + + GenericImporter importer = new GenericImporter(); + assertThat(importer.canHandle(file), is(true)); + + importer.importHabitsFromFile(file); + } + + private boolean containsRepetition(Habit h, int year, int month, int day) + { + GregorianCalendar date = DateHelper.getStartOfTodayCalendar(); + date.set(year, month - 1, day); + return h.repetitions.contains(date.getTimeInMillis()); + } + + @Test + public void tickmateDB() throws IOException + { + importFromFile("tickmate.db"); + + List habits = Habit.getAll(true); + assertThat(habits.size(), equalTo(3)); + + Habit h = habits.get(0); + assertThat(h.name, equalTo("Vegan")); + assertTrue(containsRepetition(h, 2016, 1, 24)); + assertTrue(containsRepetition(h, 2016, 2, 5)); + assertTrue(containsRepetition(h, 2016, 3, 18)); + assertFalse(containsRepetition(h, 2016, 3, 14)); + } + + @Test + public void rewireDB() throws IOException + { + importFromFile("rewire.db"); + + List habits = Habit.getAll(true); + assertThat(habits.size(), equalTo(3)); + + Habit habit = habits.get(0); + assertThat(habit.name, equalTo("Wake up early")); + assertThat(habit.freqNum, equalTo(3)); + assertThat(habit.freqDen, equalTo(7)); + assertFalse(habit.hasReminder()); + assertFalse(containsRepetition(habit, 2015, 12, 31)); + assertTrue(containsRepetition(habit, 2016, 1, 18)); + assertTrue(containsRepetition(habit, 2016, 1, 28)); + assertFalse(containsRepetition(habit, 2016, 3, 10)); + + habit = habits.get(1); + assertThat(habit.name, equalTo("brush teeth")); + assertThat(habit.freqNum, equalTo(3)); + assertThat(habit.freqDen, equalTo(7)); + assertThat(habit.reminderHour, equalTo(8)); + assertThat(habit.reminderMin, equalTo(0)); + boolean[] reminderDays = {false, true, true, true, true, true, false}; + assertThat(habit.reminderDays, equalTo(DateHelper.packWeekdayList(reminderDays))); + } + + @Test + public void habitbullCSV() throws IOException + { + importFromFile("habitbull.csv"); + + List habits = Habit.getAll(true); + assertThat(habits.size(), equalTo(4)); + + Habit habit = habits.get(0); + assertThat(habit.name, equalTo("Breed dragons")); + assertThat(habit.description, equalTo("with love and fire")); + assertThat(habit.freqNum, equalTo(1)); + assertThat(habit.freqDen, equalTo(1)); + assertTrue(containsRepetition(habit, 2016, 3, 18)); + assertTrue(containsRepetition(habit, 2016, 3, 19)); + assertFalse(containsRepetition(habit, 2016, 3, 20)); + } + + @Test + public void loopDB() throws IOException + { + importFromFile("loop.db"); + + List habits = Habit.getAll(true); + assertThat(habits.size(), equalTo(9)); + + Habit habit = habits.get(0); + assertThat(habit.name, equalTo("Wake up early")); + assertThat(habit.freqNum, equalTo(3)); + assertThat(habit.freqDen, equalTo(7)); + assertTrue(containsRepetition(habit, 2016, 3, 14)); + assertTrue(containsRepetition(habit, 2016, 3, 16)); + assertFalse(containsRepetition(habit, 2016, 3, 17)); + } +} diff --git a/app/src/androidTest/java/org/isoron/uhabits/unit/models/HabitFixtures.java b/app/src/androidTest/java/org/isoron/uhabits/unit/models/HabitFixtures.java index bb2559cb8..1a15249ff 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/unit/models/HabitFixtures.java +++ b/app/src/androidTest/java/org/isoron/uhabits/unit/models/HabitFixtures.java @@ -28,7 +28,7 @@ public class HabitFixtures public static boolean NON_DAILY_HABIT_CHECKS[] = { true, false, false, true, true, true, false, false, true, true }; - static Habit createNonDailyHabit() + public static Habit createNonDailyHabit() { Habit habit = new Habit(); habit.freqNum = 2; @@ -45,7 +45,7 @@ public class HabitFixtures return habit; } - static Habit createEmptyHabit() + public static Habit createEmptyHabit() { Habit habit = new Habit(); habit.freqNum = 1; @@ -54,7 +54,7 @@ public class HabitFixtures return habit; } - static void purgeHabits() + public static void purgeHabits() { for(Habit h : Habit.getAll(true)) h.cascadeDelete(); diff --git a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java b/app/src/main/java/org/isoron/uhabits/HabitsApplication.java index 78eefa30a..810620465 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java +++ b/app/src/main/java/org/isoron/uhabits/HabitsApplication.java @@ -21,20 +21,25 @@ package org.isoron.uhabits; import android.app.Application; import android.content.Context; +import android.support.annotation.Nullable; import com.activeandroid.ActiveAndroid; import org.isoron.uhabits.helpers.DatabaseHelper; +import java.io.File; + public class HabitsApplication extends Application { + @Nullable private static Context context; - private boolean isTestMode() + public static boolean isTestMode() { try { - getClassLoader().loadClass("org.isoron.uhabits.unit.models.HabitTest"); + if(context != null) + context.getClassLoader().loadClass("org.isoron.uhabits.unit.models.HabitTest"); return true; } catch (final Exception e) @@ -43,6 +48,7 @@ public class HabitsApplication extends Application } } + @Nullable public static Context getContext() { return context; @@ -54,15 +60,13 @@ public class HabitsApplication extends Application super.onCreate(); HabitsApplication.context = this; - String databaseFilename = BuildConfig.databaseFilename; - if (isTestMode()) { - databaseFilename = "test.db"; - DatabaseHelper.deleteDatabase(this, databaseFilename); + File db = DatabaseHelper.getDatabaseFile(); + if(db.exists()) db.delete(); } - DatabaseHelper.initializeActiveAndroid(this, databaseFilename); + DatabaseHelper.initializeActiveAndroid(this); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/helpers/DatabaseHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/DatabaseHelper.java index 901e9d218..476d6e2aa 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/DatabaseHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/DatabaseHelper.java @@ -1,3 +1,22 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + package org.isoron.uhabits.helpers; import android.content.Context; @@ -8,6 +27,7 @@ import com.activeandroid.ActiveAndroid; import com.activeandroid.Configuration; import org.isoron.uhabits.BuildConfig; +import org.isoron.uhabits.HabitsApplication; import org.isoron.uhabits.models.Checkmark; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.models.Repetition; @@ -18,7 +38,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.nio.channels.FileChannel; +import java.io.InputStream; +import java.io.OutputStream; import java.text.SimpleDateFormat; public class DatabaseHelper @@ -27,11 +48,22 @@ public class DatabaseHelper { FileInputStream inStream = new FileInputStream(src); FileOutputStream outStream = new FileOutputStream(dst); - FileChannel inChannel = inStream.getChannel(); - FileChannel outChannel = outStream.getChannel(); - inChannel.transferTo(0, inChannel.size(), outChannel); - inStream.close(); - outStream.close(); + copy(inStream, outStream); + } + + public static void copy(InputStream inStream, File dst) throws IOException + { + FileOutputStream outStream = new FileOutputStream(dst); + copy(inStream, outStream); + } + + public static void copy(InputStream in, OutputStream out) throws IOException + { + int numBytes; + byte[] buffer = new byte[1024]; + + while ((numBytes = in.read(buffer)) != -1) + out.write(buffer, 0, numBytes); } public interface Command @@ -54,9 +86,9 @@ public class DatabaseHelper } @SuppressWarnings("ResultOfMethodCallIgnored") - public static String saveDatabaseCopy(Context context, File dir) throws IOException + public static String saveDatabaseCopy(File dir) throws IOException { - File db = getDatabaseFile(context, BuildConfig.databaseFilename); + File db = getDatabaseFile(); SimpleDateFormat dateFormat = DateHelper.getBackupDateFormat(); String date = dateFormat.format(DateHelper.getLocalTime()); @@ -67,17 +99,27 @@ public class DatabaseHelper return dbCopy.getAbsolutePath(); } - public static void deleteDatabase(Context context, String databaseFilename) + @NonNull + public static File getDatabaseFile() { - File db = getDatabaseFile(context, databaseFilename); - if(db.exists()) db.delete(); + Context context = HabitsApplication.getContext(); + if(context == null) throw new RuntimeException("No application context found"); + + String databaseFilename = getDatabaseFilename(); + + return new File(String.format("%s/../databases/%s", + context.getApplicationContext().getFilesDir().getPath(), databaseFilename)); } @NonNull - public static File getDatabaseFile(Context context, String databaseFilename) + public static String getDatabaseFilename() { - return new File(String.format("%s/../databases/%s", - context.getApplicationContext().getFilesDir().getPath(), databaseFilename)); + String databaseFilename = BuildConfig.databaseFilename; + + if (HabitsApplication.isTestMode()) + databaseFilename = "test.db"; + + return databaseFilename; } @Nullable @@ -93,10 +135,10 @@ public class DatabaseHelper } @SuppressWarnings("unchecked") - public static void initializeActiveAndroid(Context context, String databaseFilename) + public static void initializeActiveAndroid(Context context) { Configuration dbConfig = new Configuration.Builder(context) - .setDatabaseName(databaseFilename) + .setDatabaseName(getDatabaseFilename()) .setDatabaseVersion(BuildConfig.databaseVersion) .addModelClasses(Checkmark.class, Habit.class, Repetition.class, Score.class, Streak.class) diff --git a/app/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java b/app/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java index 66bd80dd2..5ae993d73 100644 --- a/app/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java +++ b/app/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java @@ -57,12 +57,11 @@ public class LoopDBImporter extends AbstractImporter { ActiveAndroid.dispose(); Context context = HabitsApplication.getContext(); - - File originalDB = DatabaseHelper.getDatabaseFile(context, BuildConfig.databaseFilename); + File originalDB = DatabaseHelper.getDatabaseFile(); File backupDir = DatabaseHelper.getFilesDir(context, "Backups"); - DatabaseHelper.saveDatabaseCopy(context, backupDir); + DatabaseHelper.saveDatabaseCopy(backupDir); DatabaseHelper.copy(file, originalDB); - DatabaseHelper.initializeActiveAndroid(context, BuildConfig.databaseFilename); + DatabaseHelper.initializeActiveAndroid(context); } } diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java b/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java index 02b8e5720..f5f70809f 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java +++ b/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java @@ -85,7 +85,7 @@ public class ExportDBTask extends AsyncTask File dir = DatabaseHelper.getFilesDir(activity, "Backups"); if(dir == null) return null; - filename = DatabaseHelper.saveDatabaseCopy(activity, dir); + filename = DatabaseHelper.saveDatabaseCopy(dir); } catch(IOException e) {