/* ********************************************************************** ** ** Copyright notice ** ** ** ** (c) 2005-2009 RSSOwl Development Team ** ** http://www.rssowl.org/ ** ** ** ** All rights reserved ** ** ** ** This program and the accompanying materials are made available under ** ** the terms of the Eclipse Public License v1.0 which accompanies this ** ** distribution, and is available at: ** ** http://www.rssowl.org/legal/epl-v10.html ** ** ** ** A copy is found in the file epl-v10.html and important notices to the ** ** license from the team is found in the textfile LICENSE.txt distributed ** ** in this package. ** ** ** ** This copyright notice MUST APPEAR in all copies of the file! ** ** ** ** Contributors: ** ** RSSOwl Development Team - initial API and implementation ** ** ** ** ********************************************************************** */ package org.rssowl.core.tests.ui; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.viewers.StructuredSelection; import org.junit.Before; import org.junit.Test; import org.rssowl.core.Owl; import org.rssowl.core.internal.persist.BookMark; import org.rssowl.core.internal.persist.Feed; import org.rssowl.core.internal.persist.Folder; import org.rssowl.core.internal.persist.service.PersistenceServiceImpl; import org.rssowl.core.persist.IAttachment; import org.rssowl.core.persist.IBookMark; import org.rssowl.core.persist.ICategory; import org.rssowl.core.persist.IFeed; import org.rssowl.core.persist.IFolder; import org.rssowl.core.persist.ILabel; import org.rssowl.core.persist.IModelFactory; import org.rssowl.core.persist.INews; import org.rssowl.core.persist.INewsBin; import org.rssowl.core.persist.IPerson; import org.rssowl.core.persist.dao.DynamicDAO; import org.rssowl.core.persist.pref.IPreferenceScope; import org.rssowl.core.persist.reference.FeedLinkReference; import org.rssowl.core.util.URIUtils; import org.rssowl.ui.internal.ApplicationServer; import org.rssowl.ui.internal.Controller; import org.rssowl.ui.internal.LinkTransformer; import org.rssowl.ui.internal.OwlUI; import org.rssowl.ui.internal.ShareProvider; import org.rssowl.ui.internal.actions.LabelAction; import org.rssowl.ui.internal.actions.MakeNewsStickyAction; import org.rssowl.ui.internal.actions.MoveCopyNewsToBinAction; import org.rssowl.ui.internal.actions.ToggleReadStateAction; import org.rssowl.ui.internal.editors.feed.NewsColumn; import org.rssowl.ui.internal.editors.feed.NewsColumnViewModel; import org.rssowl.ui.internal.editors.feed.NewsComparator; import java.net.URI; import java.util.Date; import java.util.List; /** * Testing the <code>RSSOwlUI</code> facade. * * @author bpasero */ public class MiscUITests { private IModelFactory fFactory = Owl.getModelFactory(); /** * @throws Exception */ @Before public void setUp() throws Exception { ((PersistenceServiceImpl)Owl.getPersistenceService()).recreateSchemaForTests(); } /** * @throws Exception */ @Test public void testFavicon() throws Exception { /* Delete previously stored favicons */ for (int i = 0; i < 5; i++) OwlUI.deleteImage(i); IFeed feed = new Feed(new URI("http://www.rssowl.org/node/feed")); IFolder root = new Folder(null, null, "Root"); IBookMark bookmark = new BookMark(null, root, new FeedLinkReference(feed.getLink()), "Bookmark"); root.addMark(bookmark, null, false); feed = DynamicDAO.save(feed); DynamicDAO.save(root); assertEquals(null, OwlUI.getFavicon(bookmark)); Controller.getDefault().reload(bookmark, null, new NullProgressMonitor()); assertNotNull(OwlUI.getFavicon(bookmark)); DynamicDAO.delete(bookmark); assertEquals(null, OwlUI.getFavicon(bookmark)); } /** * @throws Exception */ @Test public void testShareProviders() throws Exception { IFolder folder = Owl.getModelFactory().createFolder(null, null, "Root"); IFeed feed = Owl.getModelFactory().createFeed(null, new URI("feed")); INews news = Owl.getModelFactory().createNews(null, feed, new Date()); news.setLink(new URI("link")); news.setTitle("My News"); DynamicDAO.save(feed); IBookMark bm1 = Owl.getModelFactory().createBookMark(null, folder, new FeedLinkReference(feed.getLink()), "My Bookmark"); IBookMark bm2 = Owl.getModelFactory().createBookMark(null, folder, new FeedLinkReference(feed.getLink()), "My <other> ? & Bo_öokmark"); folder = DynamicDAO.save(folder); List<ShareProvider> providers = Controller.getDefault().getShareProviders(); for (ShareProvider provider : providers) { try { if ("org.rssowl.ui.SendLinkAction".equals(provider.getId())) continue; assertTrue(URIUtils.looksLikeLink(provider.toShareUrl(bm1))); assertTrue(URIUtils.looksLikeLink(provider.toShareUrl(bm2))); assertTrue(URIUtils.looksLikeLink(provider.toShareUrl(news))); } catch (AssertionError e) { throw new Exception(provider.getName(), e.getCause()); } } } /** * @throws Exception */ @Test public void testLinkTransformers() throws Exception { IFeed feed = Owl.getModelFactory().createFeed(null, new URI("feed")); INews news = Owl.getModelFactory().createNews(null, feed, new Date()); news.setLink(new URI("http://www.link.org")); news.setTitle("My News"); DynamicDAO.save(feed); List<LinkTransformer> transformers = Controller.getDefault().getLinkTransformers(); for (LinkTransformer transformer : transformers) { try { assertTrue(URIUtils.looksLikeLink(transformer.toTransformedUrl(news))); } catch (AssertionError e) { throw new Exception(transformer.getName(), e.getCause()); } } } /** * @throws Exception */ @Test public void testMoveCopyToBinAction() throws Exception { IFolder folder = fFactory.createFolder(null, null, "Root"); INewsBin bin = fFactory.createNewsBin(null, folder, "Bin"); folder = DynamicDAO.save(folder); bin = (INewsBin) folder.getMarks().get(0); IFeed feed = Owl.getModelFactory().createFeed(null, new URI("feed")); INews news1 = Owl.getModelFactory().createNews(null, feed, new Date()); news1.setTitle("News 1"); INews news2 = Owl.getModelFactory().createNews(null, feed, new Date()); news2.setTitle("News 2"); INews news3 = Owl.getModelFactory().createNews(null, feed, new Date()); news3.setTitle("News 3"); DynamicDAO.save(feed); MoveCopyNewsToBinAction action = new MoveCopyNewsToBinAction(new StructuredSelection(news1), bin, false); action.run(); assertEquals(1, bin.getNews().size()); assertEquals("News 1", bin.getNews().get(0).getTitle()); action = new MoveCopyNewsToBinAction(new StructuredSelection(news2), bin, true); action.run(); assertEquals(2, bin.getNews().size()); assertEquals("News 1", bin.getNews().get(0).getTitle()); assertEquals("News 2", bin.getNews().get(1).getTitle()); } /** * @throws Exception */ @Test public void testToggleReadStateAction() throws Exception { IFeed feed = Owl.getModelFactory().createFeed(null, new URI("feed")); INews news1 = Owl.getModelFactory().createNews(null, feed, new Date()); news1.setTitle("News 1"); news1.setState(INews.State.READ); INews news2 = Owl.getModelFactory().createNews(null, feed, new Date()); news2.setTitle("News 2"); news2.setState(INews.State.READ); INews news3 = Owl.getModelFactory().createNews(null, feed, new Date()); news3.setTitle("News 3"); DynamicDAO.save(feed); ToggleReadStateAction action = new ToggleReadStateAction(new StructuredSelection(new Object[] { news1, news2 })); action.run(); assertEquals(INews.State.UNREAD, news1.getState()); assertEquals(INews.State.UNREAD, news2.getState()); } /** * @throws Exception */ @Test public void testMakeStickyAction() throws Exception { IFeed feed = Owl.getModelFactory().createFeed(null, new URI("feed")); INews news1 = Owl.getModelFactory().createNews(null, feed, new Date()); news1.setTitle("News 1"); INews news2 = Owl.getModelFactory().createNews(null, feed, new Date()); news2.setTitle("News 2"); INews news3 = Owl.getModelFactory().createNews(null, feed, new Date()); news3.setTitle("News 3"); DynamicDAO.save(feed); MakeNewsStickyAction action = new MakeNewsStickyAction(new StructuredSelection(new Object[] { news1, news2 })); action.run(); assertTrue(news1.isFlagged()); assertTrue(news2.isFlagged()); } /** * @throws Exception */ @Test public void testLabelAction() throws Exception { ILabel label1 = DynamicDAO.save(fFactory.createLabel(null, "Foo")); IFeed feed = Owl.getModelFactory().createFeed(null, new URI("feed")); INews news1 = Owl.getModelFactory().createNews(null, feed, new Date()); news1.setTitle("News 1"); INews news2 = Owl.getModelFactory().createNews(null, feed, new Date()); news2.setTitle("News 2"); INews news3 = Owl.getModelFactory().createNews(null, feed, new Date()); news3.setTitle("News 3"); DynamicDAO.save(feed); LabelAction action = new LabelAction(label1, new StructuredSelection(new Object[] { news1, news2 })); action.setChecked(true); action.run(); assertEquals(1, news1.getLabels().size()); assertEquals(1, news2.getLabels().size()); action = new LabelAction(label1, new StructuredSelection(new Object[] { news1, news2 })); action.run(); assertEquals(0, news1.getLabels().size()); assertEquals(0, news2.getLabels().size()); } /** * @throws Exception */ @Test public void testNewsColumnViewModel() throws Exception { IFolder root = DynamicDAO.save(fFactory.createFolder(null, null, "Root")); IPreferenceScope prefs = Owl.getPreferenceService().getEntityScope(root); NewsColumnViewModel model = NewsColumnViewModel.createFrom(new int[] { 5, 4, 3, 6, 1 }, 3, true); model.saveTo(prefs); NewsColumnViewModel loadedModel = NewsColumnViewModel.loadFrom(prefs); assertTrue(loadedModel.isAscending()); assertEquals(3, loadedModel.getSortColumn().ordinal()); List<NewsColumn> columns = loadedModel.getColumns(); assertEquals(NewsColumn.values()[5], columns.get(0)); assertEquals(NewsColumn.values()[4], columns.get(1)); assertEquals(NewsColumn.values()[3], columns.get(2)); assertEquals(NewsColumn.values()[6], columns.get(3)); assertEquals(NewsColumn.values()[1], columns.get(4)); } /** * Tests some modes of the {@link NewsComparator}. * * @throws Exception */ @Test public void testNewsComparator() throws Exception { IFeed feed = Owl.getModelFactory().createFeed(null, new URI("feed")); INews news1 = Owl.getModelFactory().createNews(null, feed, new Date(0)); news1.setTitle("A News"); INews news2 = Owl.getModelFactory().createNews(null, feed, new Date(100)); news2.setTitle("B News"); INews news3 = Owl.getModelFactory().createNews(null, feed, new Date()); news3.setTitle("C News"); DynamicDAO.save(feed); NewsComparator comp = new NewsComparator(); /* By Title */ comp.setSortBy(NewsColumn.TITLE); comp.setAscending(true); Object[] elements = new Object[] { news1, news2, news3 }; comp.sort(null, elements); assertEquals("A News", ((INews) elements[0]).getTitle()); assertEquals("B News", ((INews) elements[1]).getTitle()); assertEquals("C News", ((INews) elements[2]).getTitle()); /* By Date */ comp.setSortBy(NewsColumn.DATE); comp.setAscending(false); comp.sort(null, elements); assertEquals("C News", ((INews) elements[0]).getTitle()); assertEquals("B News", ((INews) elements[1]).getTitle()); assertEquals("A News", ((INews) elements[2]).getTitle()); /* By Label */ comp.setSortBy(NewsColumn.LABELS); comp.sort(null, elements); assertEquals("C News", ((INews) elements[0]).getTitle()); assertEquals("B News", ((INews) elements[1]).getTitle()); assertEquals("A News", ((INews) elements[2]).getTitle()); ILabel label1 = Owl.getModelFactory().createLabel(null, "Label 1"); label1.setOrder(0); ILabel label2 = Owl.getModelFactory().createLabel(null, "Label 2"); label2.setOrder(1); ILabel label3 = Owl.getModelFactory().createLabel(null, "Label 3"); label3.setOrder(2); news1.addLabel(label1); comp.setAscending(true); comp.sort(null, elements); /* * News 1: Label_1 News 3: - News 2: - */ assertEquals("A News", ((INews) elements[0]).getTitle()); assertEquals("C News", ((INews) elements[1]).getTitle()); assertEquals("B News", ((INews) elements[2]).getTitle()); news1.addLabel(label2); comp.sort(null, elements); /* * News 1: Label_1, Label_2 News 3: - News 2: - */ assertEquals("A News", ((INews) elements[0]).getTitle()); assertEquals("C News", ((INews) elements[1]).getTitle()); assertEquals("B News", ((INews) elements[2]).getTitle()); news2.addLabel(label1); comp.sort(null, elements); /* * News 1: Label_1, Label_2 News 2: Label_1 News 3: - */ assertEquals("A News", ((INews) elements[0]).getTitle()); assertEquals("B News", ((INews) elements[1]).getTitle()); assertEquals("C News", ((INews) elements[2]).getTitle()); comp.setAscending(false); comp.sort(null, elements); /* * News 3: - News 2: Label_1 News 1: Label_1, Label_2 */ assertEquals("C News", ((INews) elements[0]).getTitle()); assertEquals("B News", ((INews) elements[1]).getTitle()); assertEquals("A News", ((INews) elements[2]).getTitle()); news3.addLabel(label2); comp.setAscending(true); comp.sort(null, elements); /* * News 1: Label_1, Label_2 News 2: Label_1 News 3: Label_2 */ assertEquals("A News", ((INews) elements[0]).getTitle()); assertEquals("B News", ((INews) elements[1]).getTitle()); assertEquals("C News", ((INews) elements[2]).getTitle()); news3.addLabel(label1); comp.sort(null, elements); /* * News 3: Label_1, Label_2 News 1: Label_1, Label_2 News 2: Label_1 */ assertEquals("C News", ((INews) elements[0]).getTitle()); assertEquals("A News", ((INews) elements[1]).getTitle()); assertEquals("B News", ((INews) elements[2]).getTitle()); news3.addLabel(label3); comp.sort(null, elements); /* * News 3: Label_1, Label_2, Label_3 News 1: Label_1, Label_2 News 2: * Label_1 */ assertEquals("C News", ((INews) elements[0]).getTitle()); assertEquals("A News", ((INews) elements[1]).getTitle()); assertEquals("B News", ((INews) elements[2]).getTitle()); news2.addLabel(label3); comp.sort(null, elements); /* * News 3: Label_1, Label_2, Label_3 News 1: Label_1, Label_2 News 2: * Label_1, Label_3 */ assertEquals("C News", ((INews) elements[0]).getTitle()); assertEquals("A News", ((INews) elements[1]).getTitle()); assertEquals("B News", ((INews) elements[2]).getTitle()); } /** * TODO Not complete because the ApplicationServer requires a * {@link NewsBrowserViewer} instance to function. * * @throws Exception */ @Test public void testApplicationServer() throws Exception { ApplicationServer server = ApplicationServer.getDefault(); server.startup(); ILabel label = DynamicDAO.save(fFactory.createLabel(null, "Label")); IFeed feed = Owl.getModelFactory().createFeed(null, new URI("feed")); INews news1 = Owl.getModelFactory().createNews(null, feed, new Date(0)); news1.setTitle("A News"); news1.setDescription("Foo Bar"); news1.setFlagged(true); news1.addLabel(label); IPerson author = fFactory.createPerson(null, news1); author.setName("Benjamin Pasero"); author.setEmail(new URI("foo@bar.de")); news1.setAuthor(author); ICategory category = fFactory.createCategory(null, news1); category.setName("category"); news1.addCategory(category); IAttachment attachment = fFactory.createAttachment(null, news1); attachment.setLink(new URI("attachment")); news1.addAttachment(attachment); feed = DynamicDAO.save(feed); IFolder root = fFactory.createFolder(null, null, "Root"); IBookMark bm = fFactory.createBookMark(null, root, new FeedLinkReference(feed.getLink()), "Bookmark"); DynamicDAO.save(root); String newsUrl = server.toUrl("foo", news1); assertTrue(URIUtils.looksLikeLink(newsUrl)); String bmUrl = server.toUrl("foo", bm); assertTrue(URIUtils.looksLikeLink(bmUrl)); } }