package com.example.android.tvleanback;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import com.example.android.tvleanback.data.FetchVideoService;
import com.example.android.tvleanback.data.VideoContract;
import com.example.android.tvleanback.data.VideoDbBuilder;
import com.example.android.tvleanback.data.VideoDbHelper;
import com.example.android.tvleanback.ui.MainActivity;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.util.List;
@RunWith(AndroidJUnit4.class)
public class VideoDbIntegrationTest extends ActivityInstrumentationTestCase2<MainActivity> {
public VideoDbIntegrationTest() {
super(MainActivity.class);
}
@Before
public void setUp() throws Exception {
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
getActivity();
}
@Test
public void resetAndRedownloadDatabase() throws InterruptedException {
VideoDbHelper mVideoDbHelper = new VideoDbHelper(getActivity());
// Clear database by downgrading
mVideoDbHelper.onDowngrade(mVideoDbHelper.getReadableDatabase(), 0, 0);
String[] queryColumns = new String[] {
VideoContract.VideoEntry._ID,
VideoContract.VideoEntry.COLUMN_NAME,
VideoContract.VideoEntry.COLUMN_CATEGORY,
VideoContract.VideoEntry.COLUMN_DESC,
VideoContract.VideoEntry.COLUMN_VIDEO_URL,
VideoContract.VideoEntry.COLUMN_BG_IMAGE_URL,
VideoContract.VideoEntry.COLUMN_STUDIO,
};
Cursor mCursor = mVideoDbHelper.getReadableDatabase().query(
VideoContract.VideoEntry.TABLE_NAME,
queryColumns,
null,
null,
null,
null,
null
);
assertEquals(mCursor.getCount(), 0); // Confirm database is empty
mCursor.close();
try {
getActivity().startService(new Intent(getActivity(), FetchVideoService.class));
Thread.sleep(1000*30);
mCursor = mVideoDbHelper.getReadableDatabase().query(
VideoContract.VideoEntry.TABLE_NAME,
queryColumns,
null,
null,
null,
null,
null
);
assertFalse(mCursor.getCount() == 0); // Confirm database is no longer empty
mCursor.close();
} catch (InterruptedException e) {
e.printStackTrace();
throw new InterruptedException("Thread was interrupted, cannot check download");
}
}
@Test
public void resetAndInsertLocalVideos() throws JSONException {
VideoDbHelper mVideoDbHelper = new VideoDbHelper(getActivity());
mVideoDbHelper.onDowngrade(mVideoDbHelper.getReadableDatabase(), 0, 0);
String[] queryColumns = new String[] {
VideoContract.VideoEntry._ID,
VideoContract.VideoEntry.COLUMN_NAME,
VideoContract.VideoEntry.COLUMN_CATEGORY,
VideoContract.VideoEntry.COLUMN_DESC,
VideoContract.VideoEntry.COLUMN_VIDEO_URL,
VideoContract.VideoEntry.COLUMN_BG_IMAGE_URL,
VideoContract.VideoEntry.COLUMN_STUDIO,
};
Cursor mCursor = mVideoDbHelper.getReadableDatabase().query(
VideoContract.VideoEntry.TABLE_NAME,
queryColumns,
null,
null,
null,
null,
null
);
assertEquals(mCursor.getCount(), 0); // Confirm database is empty
mCursor.close();
// Create some test videos
JSONArray mediaArray = new JSONArray();
JSONObject video1 = new JSONObject();
video1.put(VideoDbBuilder.TAG_TITLE, "New Dad")
.put(VideoDbBuilder.TAG_DESCRIPTION, "Google+ Instant Upload backs up your photos")
.put(VideoDbBuilder.TAG_STUDIO, "Google+");
JSONObject video2 = new JSONObject();
video2.put(VideoDbBuilder.TAG_TITLE, "Pet Dog")
.put(VideoDbBuilder.TAG_DESCRIPTION, "Google+ lets you share videos of your pets")
.put(VideoDbBuilder.TAG_STUDIO, "Google+");
mediaArray.put(video1);
JSONObject myMediaGooglePlus = new JSONObject();
myMediaGooglePlus.put(VideoDbBuilder.TAG_CATEGORY, "Google+")
.put(VideoDbBuilder.TAG_MEDIA, mediaArray);
JSONObject myMedia = new JSONObject();
JSONArray mediaCategories = new JSONArray();
mediaCategories.put(myMediaGooglePlus);
myMedia.put(VideoDbBuilder.TAG_GOOGLE_VIDEOS, mediaCategories);
VideoDbBuilder videoDbBuilder = new VideoDbBuilder(getActivity());
List<ContentValues> contentValuesList = videoDbBuilder.buildMedia(myMedia);
ContentValues[] downloadedVideoContentValues = contentValuesList.toArray(new ContentValues[contentValuesList.size()]);
getActivity().getContentResolver().bulkInsert(VideoContract.VideoEntry.CONTENT_URI,
downloadedVideoContentValues);
// Test our makeshift database
mCursor = mVideoDbHelper.getReadableDatabase().query(
VideoContract.VideoEntry.TABLE_NAME,
queryColumns,
null,
null,
null,
null,
null
);
assert(mCursor.getCount() == 2); // Confirm database was populated
mCursor.close();
mCursor = mVideoDbHelper.getReadableDatabase().query(
VideoContract.VideoEntry.TABLE_NAME,
queryColumns,
VideoContract.VideoEntry.COLUMN_NAME+" = ?",
new String[] {"New Dad"},
null,
null,
null
);
assert(mCursor.moveToFirst());
assert(mCursor.getString(mCursor.getColumnIndexOrThrow(VideoContract.VideoEntry.COLUMN_STUDIO)).equals("Google+"));
mCursor.close();
}
@Test
public void resetAndInsertOnlineVideos() throws JSONException, IOException {
VideoDbHelper mVideoDbHelper = new VideoDbHelper(getActivity());
mVideoDbHelper.onDowngrade(mVideoDbHelper.getReadableDatabase(), 0, 0);
String[] queryColumns = new String[] {
VideoContract.VideoEntry._ID,
VideoContract.VideoEntry.COLUMN_NAME,
VideoContract.VideoEntry.COLUMN_CATEGORY,
VideoContract.VideoEntry.COLUMN_DESC,
VideoContract.VideoEntry.COLUMN_VIDEO_URL,
VideoContract.VideoEntry.COLUMN_BG_IMAGE_URL,
VideoContract.VideoEntry.COLUMN_STUDIO,
};
Cursor mCursor = mVideoDbHelper.getReadableDatabase().query(
VideoContract.VideoEntry.TABLE_NAME,
queryColumns,
null,
null,
null,
null,
null
);
assertEquals(mCursor.getCount(), 0); // Confirm database is empty
mCursor.close();
// Create some test videos
VideoDbBuilder videoDbBuilder = new VideoDbBuilder(getActivity());
List<ContentValues> contentValuesList = videoDbBuilder.fetch(getActivity().getResources().getString(R.string.catalog_url));
// Insert into database
ContentValues[] downloadedVideoContentValues = contentValuesList.toArray(new ContentValues[contentValuesList.size()]);
getActivity().getContentResolver().bulkInsert(VideoContract.VideoEntry.CONTENT_URI,
downloadedVideoContentValues);
// Test our makeshift database
mCursor = mVideoDbHelper.getReadableDatabase().query(
VideoContract.VideoEntry.TABLE_NAME,
queryColumns,
null,
null,
null,
null,
null
);
assertFalse(mCursor.getCount() == 0); // Confirm database was populated
mCursor.close();
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
}