/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.service; import java.io.IOException; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.json.JSONArray; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.RestClient; import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao.StoreObjectCriteria; import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.test.DatabaseTestCase; import com.todoroo.astrid.utility.Constants; public class UpdateMessageServiceTest extends DatabaseTestCase { @Autowired private StoreObjectDao storeObjectDao; @Autowired private GtasksPreferenceService gtasksPreferenceService; public void testNoUpdates() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { fail("should not have displayed updates"); } @Override String getUpdates(String url) throws IOException { assertTrue(url, url.contains("language=eng")); assertTrue(url.contains("version=")); return ""; } }.processUpdates(); } public void testIOException() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { fail("should not have displayed updates"); } @Override String getUpdates(String url) throws IOException { throw new IOException("yayaya"); } }.processUpdates(); } public void testNewUpdate() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertTrue(message.message.toString().contains("yo")); } @Override String getUpdates(String url) throws IOException { return "[{message:'yo'}]"; } }.processUpdates(); } public void testMultipleUpdates() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertTrue(message.message.toString().contains("yo")); assertFalse(message.message.toString().contains("cat")); // We only process the first update now } @Override String getUpdates(String url) throws IOException { return "[{message:'yo'},{message:'cat'}]"; } }.processUpdates(); } public void testExistingUpdate() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertTrue(message.message.toString().contains("yo")); } @Override String getUpdates(String url) throws IOException { return "[{message:'yo'}]"; } }.processUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { fail("should have not displayed again"); } @Override protected void onEmptyMessage() { // expected } @Override String getUpdates(String url) throws IOException { return "[{message:'yo'}]"; } }.processUpdates(); } public void testUpdateWithDate() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertTrue(message.message.toString().contains("yo")); } @Override String getUpdates(String url) throws IOException { return "[{message:'yo',date:'date'}]"; } }.processUpdates(); } public void testUpdateWithInternalPluginOn() { clearLatestUpdates(); gtasksPreferenceService.setToken("gtasks"); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertTrue(message.message.toString().contains("gtasks man")); } @Override String getUpdates(String url) throws IOException { return "[{message:'gtasks man',plugin:'gtasks'}]"; } }.processUpdates(); gtasksPreferenceService.setToken(null); } public void testUpdateWithInternalPluginOff() { clearLatestUpdates(); gtasksPreferenceService.setToken(null); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { fail("displayed update"); } @Override protected void onEmptyMessage() { // expected } @Override String getUpdates(String url) throws IOException { return "[{message:'gtasks man',plugin:'gtasks'}]"; } }.processUpdates(); } public void testUpdateWithExternalPluginOn() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertTrue(message.message.toString().contains("astrid man")); } @Override String getUpdates(String url) throws IOException { return "[{message:'astrid man',plugin:'" + Constants.PACKAGE + "'}]"; } }.processUpdates(); } public void testUpdateWithExternalPluginOff() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { fail("displayed update"); } @Override protected void onEmptyMessage() { // expected } @Override String getUpdates(String url) throws IOException { return "[{message:'astrid man',plugin:'com.bogus.package'}]"; } }.processUpdates(); } public void testUpdateWithScreenFlow() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertTrue(message.linkText.size() > 0); assertTrue(message.click.size() > 0); } @Override String getUpdates(String url) throws IOException { return "[{type:'screen',screens:['com.todoroo.astrid.activity.TaskListActivity'],message:'Screens'}]"; } }; } public void testUpdateWithPrefs() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertTrue(message.linkText.size() > 0); assertTrue(message.click.size() > 0); } @Override String getUpdates(String url) throws IOException { return "[{type:'pref',prefs:[{key:'key', type:'bool', title:'my pref'}],message:'Prefs'}]"; } }; } public void testUpdateWithLinks() { clearLatestUpdates(); new TestUpdateMessageService() { @Override void verifyMessage(MessageTuple message) { assertEquals("Message", message.message); assertEquals("link", message.linkText.get(0)); assertNotNull(message.click.get(0)); } @Override String getUpdates(String url) throws IOException { return "[{message:'Message', links:[{title:'link',url:'http://astrid.com'}]]"; } }; } // --- private void clearLatestUpdates() { storeObjectDao.deleteWhere(StoreObjectCriteria.byType(UpdateMessageService.UpdateMessage.TYPE)); } /** helper test class */ abstract public class TestUpdateMessageService extends UpdateMessageService { public TestUpdateMessageService() { super(null); restClient = new RestClient() { public String post(String url, HttpEntity data, Header... headers) throws IOException { return null; } public String get(String url) throws IOException { return getUpdates(url); } }; } abstract void verifyMessage(MessageTuple message); abstract String getUpdates(String url) throws IOException; protected void onEmptyMessage() { fail("empty update message"); } @Override protected MessageTuple buildUpdateMessage(JSONArray updates) { MessageTuple message = super.buildUpdateMessage(updates); if(message == null || message.message.length() == 0) onEmptyMessage(); return message; } @Override protected void displayUpdateDialog(MessageTuple tuple) { verifyMessage(tuple); } } }