package com.newsrob.test.unit;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import android.test.InstrumentationTestCase;
import com.newsrob.DBQuery;
import com.newsrob.Entry;
import com.newsrob.EntryManager;
import com.newsrob.Feed;
import com.newsrob.IEntryModelUpdateListener;
import com.newsrob.jobs.ModelUpdateResult;
import com.newsrob.test.TestUtil;
public class MarkAllReadDbQueryTests extends InstrumentationTestCase {
private EntryManager entryManager;
@Override
protected void setUp() throws Exception {
super.setUp();
entryManager = EntryManager.getInstance(getInstrumentation()
.getTargetContext());
entryManager.doClearCache();
TestUtil.populateDatabaseWithDataSet1(entryManager);
}
@Override
protected void tearDown() throws Exception {
entryManager.doClearCache();
super.tearDown();
}
public void testMarkAllReadWithMoreRecordsThanLimit()
throws InterruptedException {
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setLimit(3);
executeMarkAllRead(dbq);
assertEquals(1, entryManager.getUnreadArticleCount());
}
public void testMarkAllReadWithFewerRecordsThanLimit()
throws InterruptedException {
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setLimit(44);
executeMarkAllRead(dbq);
assertEquals(0, entryManager.getUnreadArticleCount());
}
public void testMarkAllReadWithSameNoOfRecordsAsLimit()
throws InterruptedException {
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setLimit(4);
executeMarkAllRead(dbq);
assertEquals(0, entryManager.getUnreadArticleCount());
}
public void testMarkAllReadWithLimitAscending() throws InterruptedException {
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setSortOrderAscending(true);
dbq.setLimit(1);
executeMarkAllRead(dbq);
assertEquals(3, entryManager.getUnreadArticleCount());
}
public void testMarkAllReadWithLimitDescending()
throws InterruptedException {
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setSortOrderAscending(false);
dbq.setLimit(1);
executeMarkAllRead(dbq);
assertEquals(3, entryManager.getUnreadArticleCount());
}
private void executeMarkAllRead(DBQuery dbq) throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(1);
entryManager.addListener(new IEntryModelUpdateListener() {
@Override
public void statusUpdated() {
}
@Override
public void modelUpdated(String atomId) {
}
@Override
public void modelUpdated() {
latch.countDown();
}
@Override
public void modelUpdateStarted(boolean fastSyncOnly) {
}
@Override
public void modelUpdateFinished(ModelUpdateResult result) {
}
});
entryManager.requestMarkAllAsRead(dbq);
latch.await(3, TimeUnit.SECONDS);
}
public void testDateLimitSortAscendingDescending() {
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setSortOrderAscending(true);
dbq.setDateLimit(new Date(2010, 10, 16).getTime() * 1000);
assertEquals(2, entryManager.getMarkAllReadCount(dbq));
dbq.setSortOrderAscending(false);
assertEquals(3, entryManager.getMarkAllReadCount(dbq));
}
public void testOnlyUnreadArticlesAreCounted() {
DBQuery dbq = new DBQuery(entryManager, null, null);
assertEquals(4, entryManager.getMarkAllReadCount(dbq));
}
public void testMarkAllReadIgnoresHideReadItemsPreference() {
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setShouldHideReadItemsWithoutUpdatingThePreference(true);
assertEquals(4, entryManager.getMarkAllReadCount(dbq));
dbq.setShouldHideReadItemsWithoutUpdatingThePreference(false);
assertEquals(4, entryManager.getMarkAllReadCount(dbq));
}
public void testMarkAllReadWithLabel() {
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setFilterLabel("l1");
assertEquals(1, entryManager.getMarkAllReadCount(dbq));
dbq.setFilterLabel("l2");
assertEquals(3, entryManager.getMarkAllReadCount(dbq));
dbq.setFilterLabel("l3"); // non-existing
assertEquals(0, entryManager.getMarkAllReadCount(dbq));
}
public void testMarkAllReadWithFeed() {
Feed f1 = findFeedByArticleAtomId("atomid1");
Feed f2 = findFeedByArticleAtomId("atomid2");
DBQuery dbq = new DBQuery(entryManager, null, null);
dbq.setFilterFeedId(f1.getId());
assertEquals(4, entryManager.getMarkAllReadCount(dbq));
// one read and two unread articles in this feed
dbq.setFilterFeedId(f2.getId());
assertEquals(0, entryManager.getMarkAllReadCount(dbq));
// non-existent feed
dbq.setFilterFeedId(999l);
assertEquals(0, entryManager.getMarkAllReadCount(dbq));
}
public void testIsMarkAllReadPossibleNegative() {
Feed f2 = findFeedByArticleAtomId("atomid2");
DBQuery dbq = new DBQuery(entryManager, null, f2.getId());
assertFalse(entryManager.isMarkAllReadPossible(dbq));
}
public void testIsMarkAllReadPossible() {
Feed f1 = findFeedByArticleAtomId("atomid1");
DBQuery dbq = new DBQuery(entryManager, null, f1.getId());
assertTrue(entryManager.isMarkAllReadPossible(dbq));
}
public void testIsMarkAllReadPossibleWithLimit() {
Feed f1 = findFeedByArticleAtomId("atomid1");
DBQuery dbq = new DBQuery(entryManager, null, f1.getId());
dbq.setLimit(4);
assertTrue(entryManager.isMarkAllReadPossible(dbq));
}
private Feed findFeedByArticleAtomId(String atomId) {
Entry e = entryManager.findEntryByAtomId(atomId);
return entryManager.findFeedById(e.getFeedId());
}
}