Support backups

This commit is contained in:
inorichi
2016-01-24 16:16:28 +01:00
committed by len
parent 06c63f1207
commit da44dc3fb5
17 changed files with 1361 additions and 7 deletions

View File

@@ -0,0 +1,573 @@
package eu.kanade.tachiyomi;
import android.app.Application;
import android.os.Build;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.List;
import eu.kanade.tachiyomi.data.backup.BackupManager;
import eu.kanade.tachiyomi.data.database.DatabaseHelper;
import eu.kanade.tachiyomi.data.database.models.Category;
import eu.kanade.tachiyomi.data.database.models.Chapter;
import eu.kanade.tachiyomi.data.database.models.Manga;
import eu.kanade.tachiyomi.data.database.models.MangaCategory;
import eu.kanade.tachiyomi.data.database.models.MangaSync;
import static org.assertj.core.api.Assertions.assertThat;
@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
@RunWith(CustomRobolectricGradleTestRunner.class)
public class BackupTest {
DatabaseHelper db;
BackupManager backupManager;
Gson gson;
JsonObject root;
@Before
public void setup() {
Application app = RuntimeEnvironment.application;
db = new DatabaseHelper(app);
backupManager = new BackupManager(db);
gson = new Gson();
root = new JsonObject();
}
@Test
public void testRestoreCategory() {
String catName = "cat";
root = createRootJson(null, toJson(createCategories(catName)));
backupManager.restoreFromJson(root);
List<Category> dbCats = db.getCategories().executeAsBlocking();
assertThat(dbCats).hasSize(1);
assertThat(dbCats.get(0).name).isEqualTo(catName);
}
@Test
public void testRestoreEmptyCategory() {
root = createRootJson(null, toJson(new ArrayList<>()));
backupManager.restoreFromJson(root);
List<Category> dbCats = db.getCategories().executeAsBlocking();
assertThat(dbCats).isEmpty();
}
@Test
public void testRestoreExistingCategory() {
String catName = "cat";
db.insertCategory(createCategory(catName)).executeAsBlocking();
root = createRootJson(null, toJson(createCategories(catName)));
backupManager.restoreFromJson(root);
List<Category> dbCats = db.getCategories().executeAsBlocking();
assertThat(dbCats).hasSize(1);
assertThat(dbCats.get(0).name).isEqualTo(catName);
}
@Test
public void testRestoreCategories() {
root = createRootJson(null, toJson(createCategories("cat", "cat2", "cat3")));
backupManager.restoreFromJson(root);
List<Category> dbCats = db.getCategories().executeAsBlocking();
assertThat(dbCats).hasSize(3);
}
@Test
public void testRestoreExistingCategories() {
db.insertCategories(createCategories("cat", "cat2")).executeAsBlocking();
root = createRootJson(null, toJson(createCategories("cat", "cat2", "cat3")));
backupManager.restoreFromJson(root);
List<Category> dbCats = db.getCategories().executeAsBlocking();
assertThat(dbCats).hasSize(3);
}
@Test
public void testRestoreExistingCategoriesAlt() {
db.insertCategories(createCategories("cat", "cat2", "cat3")).executeAsBlocking();
root = createRootJson(null, toJson(createCategories("cat", "cat2")));
backupManager.restoreFromJson(root);
List<Category> dbCats = db.getCategories().executeAsBlocking();
assertThat(dbCats).hasSize(3);
}
@Test
public void testRestoreManga() {
String mangaName = "title";
List<Manga> mangas = createMangas(mangaName);
List<JsonElement> elements = new ArrayList<>();
for (Manga manga : mangas) {
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
elements.add(entry);
}
root = createRootJson(toJson(elements), null);
backupManager.restoreFromJson(root);
List<Manga> dbMangas = db.getMangas().executeAsBlocking();
assertThat(dbMangas).hasSize(1);
assertThat(dbMangas.get(0).title).isEqualTo(mangaName);
}
@Test
public void testRestoreExistingManga() {
String mangaName = "title";
Manga manga = createManga(mangaName);
db.insertManga(manga).executeAsBlocking();
List<JsonElement> elements = new ArrayList<>();
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
elements.add(entry);
root = createRootJson(toJson(elements), null);
backupManager.restoreFromJson(root);
List<Manga> dbMangas = db.getMangas().executeAsBlocking();
assertThat(dbMangas).hasSize(1);
}
@Test
public void testRestoreExistingMangaWithUpdatedFields() {
// Store a manga in db
String mangaName = "title";
String updatedThumbnailUrl = "updated thumbnail url";
Manga manga = createManga(mangaName);
manga.chapter_flags = 1024;
manga.thumbnail_url = updatedThumbnailUrl;
db.insertManga(manga).executeAsBlocking();
// Add an entry for a new manga with different attributes
manga = createManga(mangaName);
manga.chapter_flags = 512;
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
// Append the entry to the backup list
List<JsonElement> elements = new ArrayList<>();
elements.add(entry);
// Restore from json
root = createRootJson(toJson(elements), null);
backupManager.restoreFromJson(root);
List<Manga> dbMangas = db.getMangas().executeAsBlocking();
assertThat(dbMangas).hasSize(1);
assertThat(dbMangas.get(0).thumbnail_url).isEqualTo(updatedThumbnailUrl);
assertThat(dbMangas.get(0).chapter_flags).isEqualTo(512);
}
@Test
public void testRestoreChaptersForManga() {
// Create a manga and 3 chapters
Manga manga = createManga("title");
manga.id = 1L;
List<Chapter> chapters = createChapters(manga, "1", "2", "3");
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("chapters", toJson(chapters));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), null);
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(1).executeAsBlocking();
assertThat(dbManga).isNotNull();
List<Chapter> dbChapters = db.getChapters(dbManga).executeAsBlocking();
assertThat(dbChapters).hasSize(3);
}
@Test
public void testRestoreChaptersForExistingManga() {
long mangaId = 3;
// Create a manga and 3 chapters
Manga manga = createManga("title");
manga.id = mangaId;
List<Chapter> chapters = createChapters(manga, "1", "2", "3");
db.insertManga(manga).executeAsBlocking();
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("chapters", toJson(chapters));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), null);
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(mangaId).executeAsBlocking();
assertThat(dbManga).isNotNull();
List<Chapter> dbChapters = db.getChapters(dbManga).executeAsBlocking();
assertThat(dbChapters).hasSize(3);
}
@Test
public void testRestoreExistingChaptersForExistingManga() {
long mangaId = 5;
// Store a manga and 3 chapters
Manga manga = createManga("title");
manga.id = mangaId;
List<Chapter> chapters = createChapters(manga, "1", "2", "3");
db.insertManga(manga).executeAsBlocking();
db.insertChapters(chapters).executeAsBlocking();
// The backup contains a existing chapter and a new one, so it should have 4 chapters
chapters = createChapters(manga, "3", "4");
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("chapters", toJson(chapters));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), null);
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(mangaId).executeAsBlocking();
assertThat(dbManga).isNotNull();
List<Chapter> dbChapters = db.getChapters(dbManga).executeAsBlocking();
assertThat(dbChapters).hasSize(4);
}
@Test
public void testRestoreCategoriesForManga() {
// Create a manga
Manga manga = createManga("title");
// Create categories
List<Category> categories = createCategories("cat1", "cat2", "cat3");
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("categories", toJson(createStringCategories("cat1")));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), toJson(categories));
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(1).executeAsBlocking();
assertThat(dbManga).isNotNull();
assertThat(db.getCategoriesForManga(dbManga).executeAsBlocking())
.hasSize(1)
.contains(Category.create("cat1"))
.doesNotContain(Category.create("cat2"));
}
@Test
public void testRestoreCategoriesForExistingManga() {
// Store a manga
Manga manga = createManga("title");
db.insertManga(manga).executeAsBlocking();
// Create categories
List<Category> categories = createCategories("cat1", "cat2", "cat3");
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("categories", toJson(createStringCategories("cat1")));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), toJson(categories));
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(1).executeAsBlocking();
assertThat(dbManga).isNotNull();
assertThat(db.getCategoriesForManga(dbManga).executeAsBlocking())
.hasSize(1)
.contains(Category.create("cat1"))
.doesNotContain(Category.create("cat2"));
}
@Test
public void testRestoreMultipleCategoriesForManga() {
// Create a manga
Manga manga = createManga("title");
// Create categories
List<Category> categories = createCategories("cat1", "cat2", "cat3");
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("categories", toJson(createStringCategories("cat1", "cat3")));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), toJson(categories));
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(1).executeAsBlocking();
assertThat(dbManga).isNotNull();
assertThat(db.getCategoriesForManga(dbManga).executeAsBlocking())
.hasSize(2)
.contains(Category.create("cat1"), Category.create("cat3"))
.doesNotContain(Category.create("cat2"));
}
@Test
public void testRestoreMultipleCategoriesForExistingMangaAndCategory() {
// Store a manga and a category
Manga manga = createManga("title");
manga.id = 1L;
db.insertManga(manga).executeAsBlocking();
Category cat = createCategory("cat1");
cat.id = 1;
db.insertCategory(cat).executeAsBlocking();
db.insertMangaCategory(MangaCategory.create(manga, cat)).executeAsBlocking();
// Create categories
List<Category> categories = createCategories("cat1", "cat2", "cat3");
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("categories", toJson(createStringCategories("cat1", "cat2")));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), toJson(categories));
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(1).executeAsBlocking();
assertThat(dbManga).isNotNull();
assertThat(db.getCategoriesForManga(dbManga).executeAsBlocking())
.hasSize(2)
.contains(Category.create("cat1"), Category.create("cat2"))
.doesNotContain(Category.create("cat3"));
}
@Test
public void testRestoreSyncForManga() {
// Create a manga and mangaSync
Manga manga = createManga("title");
manga.id = 1L;
List<MangaSync> mangaSync = createMangaSync(manga, 1, 2, 3);
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("sync", toJson(mangaSync));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), null);
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(1).executeAsBlocking();
assertThat(dbManga).isNotNull();
List<MangaSync> dbSync = db.getMangasSync(dbManga).executeAsBlocking();
assertThat(dbSync).hasSize(3);
}
@Test
public void testRestoreSyncForExistingManga() {
long mangaId = 3;
// Create a manga and 3 sync
Manga manga = createManga("title");
manga.id = mangaId;
List<MangaSync> mangaSync = createMangaSync(manga, 1, 2, 3);
db.insertManga(manga).executeAsBlocking();
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("sync", toJson(mangaSync));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), null);
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(mangaId).executeAsBlocking();
assertThat(dbManga).isNotNull();
List<MangaSync> dbSync = db.getMangasSync(dbManga).executeAsBlocking();
assertThat(dbSync).hasSize(3);
}
@Test
public void testRestoreExistingSyncForExistingManga() {
long mangaId = 5;
// Store a manga and 3 sync
Manga manga = createManga("title");
manga.id = mangaId;
List<MangaSync> mangaSync = createMangaSync(manga, 1, 2, 3);
db.insertManga(manga).executeAsBlocking();
db.insertMangasSync(mangaSync).executeAsBlocking();
// The backup contains a existing sync and a new one, so it should have 4 sync
mangaSync = createMangaSync(manga, 3, 4);
// Add an entry for the manga
JsonObject entry = new JsonObject();
entry.add("manga", toJson(manga));
entry.add("sync", toJson(mangaSync));
// Append the entry to the backup list
List<JsonElement> mangas = new ArrayList<>();
mangas.add(entry);
// Restore from json
root = createRootJson(toJson(mangas), null);
backupManager.restoreFromJson(root);
Manga dbManga = db.getManga(mangaId).executeAsBlocking();
assertThat(dbManga).isNotNull();
List<MangaSync> dbSync = db.getMangasSync(dbManga).executeAsBlocking();
assertThat(dbSync).hasSize(4);
}
private JsonObject createRootJson(JsonElement mangas, JsonElement categories) {
JsonObject root = new JsonObject();
if (mangas != null)
root.add("mangas", mangas);
if (categories != null)
root.add("categories", categories);
return root;
}
private Category createCategory(String name) {
Category c = new Category();
c.name = name;
return c;
}
private List<Category> createCategories(String... names) {
List<Category> cats = new ArrayList<>();
for (String name : names) {
cats.add(createCategory(name));
}
return cats;
}
private List<String> createStringCategories(String... names) {
List<String> cats = new ArrayList<>();
for (String name : names) {
cats.add(name);
}
return cats;
}
private Manga createManga(String title) {
Manga m = new Manga();
m.title = title;
m.author = "";
m.artist = "";
m.thumbnail_url = "";
m.genre = "a list of genres";
m.description = "long description";
m.url = "url to manga";
m.favorite = true;
m.source = 1;
return m;
}
private List<Manga> createMangas(String... titles) {
List<Manga> mangas = new ArrayList<>();
for (String title : titles) {
mangas.add(createManga(title));
}
return mangas;
}
private Chapter createChapter(Manga manga, String url) {
Chapter c = Chapter.create();
c.url = url;
c.name = url;
c.manga_id = manga.id;
return c;
}
private List<Chapter> createChapters(Manga manga, String... urls) {
List<Chapter> chapters = new ArrayList<>();
for (String url : urls) {
chapters.add(createChapter(manga, url));
}
return chapters;
}
private MangaSync createMangaSync(Manga manga, int syncId) {
MangaSync m = MangaSync.create();
m.manga_id = manga.id;
m.sync_id = syncId;
m.title = "title";
return m;
}
private List<MangaSync> createMangaSync(Manga manga, Integer... syncIds) {
List<MangaSync> ms = new ArrayList<>();
for (int title : syncIds) {
ms.add(createMangaSync(manga, title));
}
return ms;
}
private JsonElement toJson(Object element) {
return gson.toJsonTree(element);
}
}