package com.newsrob.test.unit;
import java.util.Date;
import java.util.List;
import android.test.InstrumentationTestCase;
import com.newsrob.ArticleDbState;
import com.newsrob.EntriesRetriever;
import com.newsrob.Entry;
import com.newsrob.EntryManager;
import com.newsrob.Label;
import com.newsrob.ReadState;
import com.newsrob.download.NewsRobHttpClient;
import com.newsrob.test.TestUtil;
import com.newsrob.util.U;
public class DifferentialUpdateTests extends InstrumentationTestCase {
private EntryManager entryManager;
@Override
protected void setUp() throws Exception {
super.setUp();
entryManager = EntryManager.getInstance(getInstrumentation()
.getTargetContext());
entryManager.doClearCache();
}
private void createTestDataSet1() {
Label l1 = new Label();
l1.setName("l1");
Label l2 = new Label();
l2.setName("l2");
// 1st article
Entry e = new Entry();
e.setAtomId(getAtomIdForArticle(1));
e.setReadState(ReadState.READ);
e.setReadStatePending(false);
e.setFeedTitle("feed_title");
e.setFeedAtomId("feed_atom_id");
e.setTitle("title");
e.setUpdated(new Date().getTime() * 1000);
entryManager.insert(e);
// 2nd article
e = new Entry();
e.setAtomId(getAtomIdForArticle(2));
e.setFeedTitle("feed_title");
e.setFeedAtomId("feed_atom_id");
e.setReadState(ReadState.UNREAD);
e.setReadStatePending(false);
e.setTitle("title");
e.setUpdated(new Date().getTime() * 1000);
entryManager.insert(e);
// 3rd article
e = new Entry();
e.setAtomId(getAtomIdForArticle(3));
e.setFeedTitle("feed_title");
e.setFeedAtomId("feed_atom_id");
e.setReadState(ReadState.PINNED);
e.setReadStatePending(false);
e.setTitle("title");
e.setUpdated(new Date().getTime() * 1000);
entryManager.insert(e);
}
private String getAtomIdForArticle(int no) {
return EntriesRetriever.TAG_GR_ITEM + U.longToHex(no);
}
private Entry findEntryNotLikedNotLikePending() {
return entryManager.findEntryByAtomId("atomid");
}
private Entry findEntryLikedNotLikePending() {
return entryManager.findEntryByAtomId("atomid2");
}
public void testDifferentialUpdateRead1() throws Exception {
createTestDataSet1();
// One pinned, one unread, one read
assertEquals(3, entryManager.getArticleCount());
assertEquals(2, entryManager.getUnreadArticleCount());
assertEquals(1, entryManager.getUnreadArticleCountExcludingPinned());
// do
final EntriesRetriever entriesRetriever = getEntriesRetriever(new String[] { getAtomIdForArticle(1) });
// First article should now be unread,
// 2nd article should now be read,
// 3rd article should now be read.
entriesRetriever.differentialUpdateOfArticlesStates(entryManager,
TestUtil.getDummyJob(entryManager),
EntriesRetriever.GOOGLE_STATE_READING_LIST,
EntriesRetriever.GOOGLE_STATE_READ, ArticleDbState.READ);
assertEquals(3, entryManager.getArticleCount()); // Unchanged
assertEquals(1, entryManager.getUnreadArticleCount());
assertEquals(1, entryManager.getUnreadArticleCountExcludingPinned());
Entry firstArticle = entryManager
.findEntryByAtomId(getAtomIdForArticle(1));
assertEquals(ReadState.UNREAD, firstArticle.getReadState());
assertFalse(firstArticle.isReadStatePending());
Entry secondArticle = entryManager
.findEntryByAtomId(getAtomIdForArticle(2));
assertEquals(ReadState.READ, secondArticle.getReadState());
assertFalse(secondArticle.isReadStatePending());
Entry thirdArticle = entryManager
.findEntryByAtomId(getAtomIdForArticle(3));
assertEquals(ReadState.READ, thirdArticle.getReadState());
assertFalse(thirdArticle.isReadStatePending());
}
/** Is the pinned state preserved */
public void testDifferentialUpdateRead2() throws Exception {
createTestDataSet1();
// One pinned, one unread, one read
assertEquals(3, entryManager.getArticleCount());
assertEquals(2, entryManager.getUnreadArticleCount());
assertEquals(1, entryManager.getUnreadArticleCountExcludingPinned());
// do
final EntriesRetriever entriesRetriever = getEntriesRetriever(new String[] { getAtomIdForArticle(3) });
// First article should still be read,
// 2nd article should now be read,
// 3rd article should still be unread and pinned.
entriesRetriever.differentialUpdateOfArticlesStates(entryManager,
TestUtil.getDummyJob(entryManager),
EntriesRetriever.GOOGLE_STATE_READING_LIST,
EntriesRetriever.GOOGLE_STATE_READ, ArticleDbState.READ);
assertEquals(3, entryManager.getArticleCount()); // Unchanged
assertEquals(1, entryManager.getUnreadArticleCount());
assertEquals(0, entryManager.getUnreadArticleCountExcludingPinned());
Entry firstArticle = entryManager
.findEntryByAtomId(getAtomIdForArticle(1));
assertEquals(ReadState.READ, firstArticle.getReadState());
assertFalse(firstArticle.isReadStatePending());
Entry secondArticle = entryManager
.findEntryByAtomId(getAtomIdForArticle(2));
assertEquals(ReadState.READ, secondArticle.getReadState());
assertFalse(secondArticle.isReadStatePending());
Entry thirdArticle = entryManager
.findEntryByAtomId(getAtomIdForArticle(3));
assertEquals(ReadState.PINNED, thirdArticle.getReadState());
assertFalse(thirdArticle.isReadStatePending());
}
private EntriesRetriever getEntriesRetriever(final String[] atomIds) {
final long[] ids = new long[atomIds.length];
for (int i = 0; i < atomIds.length; i++) {
ids[i] = entryManager.findEntryByAtomId(atomIds[i]).getId();
}
return new EntriesRetriever(entryManager.getContext()) {
@Override
protected long[] getStreamIDsFromGR(NewsRobHttpClient httpClient,
List<String> tags, String xt, int max) {
return ids;
}
};
}
public void testPendingRecordsAreIgnored() {
}
}