/*
* Copyright © 2016 TIBCO Software,Inc.All rights reserved.
* http://community.jaspersoft.com/project/jaspermobile-android
*
* Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
* the following license terms apply:
*
* This program is part of TIBCO Jaspersoft Mobile for Android.
*
* TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation,either version 3of the License,or
* (at your option)any later version.
*
* TIBCO Jaspersoft Mobile 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with TIBCO Jaspersoft Mobile for Android.If not,see
* <http://www.gnu.org/licenses/lgpl>.
*/
package com.jaspersoft.android.jaspermobile.db.migrate;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.jaspersoft.android.jaspermobile.BuildConfig;
import com.jaspersoft.android.jaspermobile.test.support.AccountUtil;
import com.jaspersoft.android.jaspermobile.test.support.db.PermanentDatabase;
import com.jaspersoft.android.jaspermobile.test.support.db.ResourceDatabase;
import com.jaspersoft.android.sdk.util.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsNull.notNullValue;
/**
* @author Tom Koptel
* @since 2.1
*/
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21, shadows = {ShadowApplicationImpl.class})
public class SavedItemsMigrationV3Test {
private static final String SHARED_DIR = "com.jaspersoft.account.none";
private ResourceDatabase resourceDatabase;
private SQLiteDatabase database;
private Migration migration;
@Before
public void setup() {
// Dirty hack in order to revert AccountSeed side effect
AccountUtil.get(RuntimeEnvironment.application).removeAllAccounts();
resourceDatabase = PermanentDatabase.create("jasper_mobile_db_1.9").prepare();
database = resourceDatabase.open();
migration = new MigrationV3.SavedItemsMigration(RuntimeEnvironment.application);
}
@After
public void teardown() {
resourceDatabase.close();
resourceDatabase.delete();
removeExternalDir();
}
@Test
public void savedItemsShouldBeMigratedToSharedDir() throws IOException {
File savedReportsDir = createSavedReportsDir();
populateSavedReportsDir(savedReportsDir);
migration.migrate(database);
File sharedSavedItemsFolder = new File(savedReportsDir, SHARED_DIR);
assertThat(sharedSavedItemsFolder.exists(), is(true));
assertThat(sharedSavedItemsFolder.listFiles().length, is(2));
}
@Test
public void savedItemsShouldBeMigratedToDatabase() throws IOException {
File savedItemsDir = createSavedReportsDir();
populateSavedReportsDir(savedItemsDir);
migration.migrate(database);
Cursor cursor = database.query("saved_items",
new String[]{"_id", "file_path", "name", "file_format", "wstype", "account_name", "creation_time"},
null, null, null, null, null);
assertThat(cursor, notNullValue());
assertThat(cursor.getCount(), is(2));
File sharedDir = new File(savedItemsDir, SHARED_DIR);
File[] savedReportsDirs = sharedDir.listFiles();
for (int i = 0; i < savedReportsDirs.length; i++) {
File reportDir = savedReportsDirs[i];
File report = new File(reportDir, reportDir.getName());
assertThat(cursor.moveToPosition(i), is(true));
String fileName = FileUtils.getBaseName(report.getName());
String fileFormat = FileUtils.getExtension(report.getName()).toUpperCase(Locale.getDefault());
long creationTime = reportDir.lastModified();
assertThat(reportDir.listFiles().length, is(2));
assertThat(cursor.getString(cursor.getColumnIndex("file_path")), is(report.getPath()));
assertThat(cursor.getString(cursor.getColumnIndex("name")), is(fileName));
assertThat(cursor.getString(cursor.getColumnIndex("file_format")), is(fileFormat));
assertThat(cursor.getString(cursor.getColumnIndex("wstype")), is("unknown"));
assertThat(cursor.getString(cursor.getColumnIndex("account_name")), is("com.jaspersoft.account.none"));
assertThat(cursor.getString(cursor.getColumnIndex("creation_time")), is(String.valueOf(creationTime)));
}
}
private void populateSavedReportsDir(File savedReportsDir) throws IOException {
File savedItemDir1 = new File(savedReportsDir, "report1.html");
File savedItem1 = new File(savedItemDir1, "report1.html");
File savedItemImage1 = new File(savedItemDir1, "image1.jpg");
assertThat(savedItemDir1.mkdir(), is(true));
assertThat(savedItem1.createNewFile(), is(true));
assertThat(savedItemImage1.createNewFile(), is(true));
File savedItemDir2 = new File(savedReportsDir, "report2.html");
File savedItem2 = new File(savedItemDir2, "report2.html");
File savedItemImage2 = new File(savedItemDir2, "image2.jpg");
assertThat(savedItemDir2.mkdir(), is(true));
assertThat(savedItem2.createNewFile(), is(true));
assertThat(savedItemImage2.createNewFile(), is(true));
}
private File createSavedReportsDir() {
File externalDir = RuntimeEnvironment.application.getExternalFilesDir(null);
File savedReportsDir = new File(externalDir, "saved.reports");
if (!savedReportsDir.exists()) {
assertThat(savedReportsDir.mkdir(), is(true));
}
return savedReportsDir;
}
private void removeExternalDir() {
File externalDir = RuntimeEnvironment.application.getExternalFilesDir(null);
try {
org.apache.commons.io.FileUtils.deleteDirectory(externalDir);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}