/*
* Copyright 2007 Sun Microsystems, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.rometools.propono.atom.client;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.junit.Ignore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.rometools.propono.atom.common.Categories;
import com.rometools.propono.atom.common.Collection;
import com.rometools.propono.utils.ProponoException;
import com.rometools.rome.feed.atom.Category;
import com.rometools.rome.feed.atom.Content;
/**
* Simple APP test designed to run against a live Atom server.
*/
@Ignore
public class AtomClientTest extends TestCase {
private static Logger log = LoggerFactory.getLogger(AtomClientTest.class);
private static ClientAtomService service = null;
// Basic Auth example
private static String endpoint = "http://localhost:8080/sample-atomserver/app";
private static String username = "admin";
private static String password = "admin";
static {
try {
service = AtomClientFactory.getAtomService(endpoint, new BasicAuthStrategy(username, password));
} catch (final Exception e) {
log.error("ERROR creating service", e);
}
}
/*
* // Roller OAuth example private static String endpoint =
* "http://macsnoopdave:8080/roller-services/app"; private static String consumerKey =
* "55132608a2fb68816bcd3d1caeafc933"; private static String consumerSecret =
* "bb420783-fdea-4270-ab83-36445c18c307"; private static String requestUri =
* "http://macsnoopdave:8080/roller-services/oauth/requestToken"; private static String
* authorizeUri =
* "http://macsnoopdave:8080/roller-services/oauth/authorize?userId=roller&oauth_callback=none";
* private static String accessUri =
* "http://macsnoopdave:8080/roller-services/oauth/accessToken"; private static String username
* = "roller"; private static String password = "n/a"; static { try { service =
* AtomClientFactory.getAtomService(endpoint, new OAuthStrategy( username, consumerKey,
* consumerSecret, "HMAC-SHA1", requestUri, authorizeUri, accessUri)); } catch (Exception e) {
* log.error("ERROR creating service", e); } }
*/
// GData Blogger API
/*
* private static String endpoint =
* "http://www.blogger.com/feeds/default/blogs?alt=atom-service"; private static String email =
* "EMAIL"; private static String password = "PASSWORD"; private static String serviceName =
* "blogger"; static { try { service = AtomClientFactory.getAtomService(endpoint, new
* GDataAuthStrategy(email, password, serviceName)); } catch (Exception e) {
* log.error("ERROR creating service", e); } }
*/
public AtomClientTest(final String testName) {
super(testName);
}
public String getEndpoint() {
return endpoint;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
@Override
protected void setUp() throws Exception {
}
@Override
protected void tearDown() throws Exception {
}
public static Test suite() {
final TestSuite suite = new TestSuite(AtomClientTest.class);
return suite;
}
/**
* Tests that server has introspection doc with at least one workspace.
*/
public void testGetAtomService() throws Exception {
assertNotNull(service);
assertTrue(!service.getWorkspaces().isEmpty());
for (final Object element : service.getWorkspaces()) {
final ClientWorkspace space = (ClientWorkspace) element;
assertNotNull(space.getTitle());
log.debug("Workspace: " + space.getTitle());
for (final Object element2 : space.getCollections()) {
final ClientCollection col = (ClientCollection) element2;
log.debug(" Collection: " + col.getTitle() + " Accepts: " + col.getAccepts());
log.debug(" href: " + col.getHrefResolved());
assertNotNull(col.getTitle());
}
}
}
/**
* Tests that entries can be posted and removed in all collections that accept entries. Fails if
* no collections found that accept entries.
*/
public void testSimpleEntryPostAndRemove() throws Exception {
assertNotNull(service);
assertTrue(!service.getWorkspaces().isEmpty());
int count = 0;
for (final Object element : service.getWorkspaces()) {
final ClientWorkspace space = (ClientWorkspace) element;
assertNotNull(space.getTitle());
for (final Object element2 : space.getCollections()) {
final ClientCollection col = (ClientCollection) element2;
if (col.accepts(Collection.ENTRY_TYPE)) {
// we found a collection that accepts entries, so post one
final ClientEntry m1 = col.createEntry();
m1.setTitle("Test post");
final Content c = new Content();
c.setValue("This is a test post");
c.setType("html");
m1.setContent(c);
col.addEntry(m1);
// entry should now exist on server
final ClientEntry m2 = col.getEntry(m1.getEditURI());
assertNotNull(m2);
// remove entry
m2.remove();
// fetching entry now should result in exception
boolean failed = false;
try {
col.getEntry(m1.getEditURI());
} catch (final ProponoException e) {
failed = true;
}
assertTrue(failed);
count++;
}
}
}
assertTrue(count > 0);
}
/**
* Tests that entries can be posted, updated and removed in all collections that accept entries.
* Fails if no collections found that accept entries.
*/
public void testSimpleEntryPostUpdateAndRemove() throws Exception {
assertNotNull(service);
assertTrue(!service.getWorkspaces().isEmpty());
int count = 0;
for (final Object element : service.getWorkspaces()) {
final ClientWorkspace space = (ClientWorkspace) element;
assertNotNull(space.getTitle());
for (final Object element2 : space.getCollections()) {
final ClientCollection col = (ClientCollection) element2;
if (col.accepts(Collection.ENTRY_TYPE)) {
// we found a collection that accepts entries, so post one
final ClientEntry m1 = col.createEntry();
m1.setTitle(col.getTitle() + ": Test post");
final Content c = new Content();
c.setValue("This is a test post");
c.setType("html");
m1.setContent(c);
col.addEntry(m1);
// entry should now exist on server
final ClientEntry m2 = col.getEntry(m1.getEditURI());
assertNotNull(m2);
m2.setTitle(col.getTitle() + ": Updated title");
m2.update();
// entry should now be updated on server
final ClientEntry m3 = col.getEntry(m1.getEditURI());
assertEquals(col.getTitle() + ": Updated title", m3.getTitle());
// remove entry
m3.remove();
// fetching entry now should result in exception
boolean failed = false;
try {
col.getEntry(m1.getEditURI());
} catch (final ProponoException e) {
failed = true;
}
assertTrue(failed);
count++;
}
}
}
assertTrue(count > 0);
}
public void testFindWorkspace() throws Exception {
assertNotNull(service);
final ClientWorkspace ws = (ClientWorkspace) service.findWorkspace("adminblog");
if (ws != null) {
final ClientCollection col = (ClientCollection) ws.findCollection(null, "entry");
final ClientEntry entry = col.createEntry();
entry.setTitle("NPE on submitting order query");
entry.setContent("This is a <b>bad</b> one!", Content.HTML);
col.addEntry(entry);
// entry should now exist on server
final ClientEntry saved = col.getEntry(entry.getEditURI());
assertNotNull(saved);
// remove entry
saved.remove();
// fetching entry now should result in exception
boolean failed = false;
try {
col.getEntry(saved.getEditURI());
} catch (final ProponoException e) {
failed = true;
}
assertTrue(failed);
}
}
/**
* Test posting an entry to every available collection with a fixed and an unfixed category if
* server support allows, then cleanup.
*/
public void testEntryPostWithCategories() throws Exception {
assertNotNull(service);
assertTrue(!service.getWorkspaces().isEmpty());
int count = 0;
for (final Object element2 : service.getWorkspaces()) {
final ClientWorkspace space = (ClientWorkspace) element2;
assertNotNull(space.getTitle());
for (final Object element3 : space.getCollections()) {
final ClientCollection col = (ClientCollection) element3;
if (col.accepts(Collection.ENTRY_TYPE)) {
// we found a collection that accepts GIF, so post one
final ClientEntry m1 = col.createEntry();
m1.setTitle("Test post");
final Content c = new Content();
c.setValue("This is a test post");
c.setType("html");
m1.setContent(c);
// if possible, pick one fixed an un unfixed category
Category fixedCat = null;
Category unfixedCat = null;
final List<Category> entryCats = new ArrayList<Category>();
for (int i = 0; i < col.getCategories().size(); i++) {
final Categories cats = col.getCategories().get(i);
if (cats.isFixed() && fixedCat == null) {
final String scheme = cats.getScheme();
fixedCat = cats.getCategories().get(0);
if (fixedCat.getScheme() == null) {
fixedCat.setScheme(scheme);
}
entryCats.add(fixedCat);
} else if (!cats.isFixed() && unfixedCat == null) {
final String scheme = cats.getScheme();
unfixedCat = new Category();
unfixedCat.setScheme(scheme);
unfixedCat.setTerm("tagster");
entryCats.add(unfixedCat);
}
}
m1.setCategories(entryCats);
col.addEntry(m1);
// entry should now exist on server
final ClientEntry m2 = col.getEntry(m1.getEditURI());
assertNotNull(m2);
if (fixedCat != null) {
// we added a fixed category, let's make sure it's there
boolean foundCat = false;
for (final Object element : m2.getCategories()) {
final Category cat = (Category) element;
if (cat.getTerm().equals(fixedCat.getTerm())) {
foundCat = true;
}
}
assertTrue(foundCat);
}
if (unfixedCat != null) {
// we added an unfixed category, let's make sure it's there
boolean foundCat = false;
for (final Object element : m2.getCategories()) {
final Category cat = (Category) element;
if (cat.getTerm().equals(unfixedCat.getTerm())) {
foundCat = true;
}
}
assertTrue(foundCat);
}
// remove entry
m2.remove();
// fetching entry now should result in exception
boolean failed = false;
try {
col.getEntry(m1.getEditURI());
} catch (final ProponoException e) {
failed = true;
}
assertTrue(failed);
count++;
}
}
}
assertTrue(count > 0);
}
/**
* Post media entry to every media colletion avialable on server, then cleanup.
*/
public void testMediaPost() throws Exception {
assertNotNull(service);
assertTrue(!service.getWorkspaces().isEmpty());
int count = 0;
for (final Object element : service.getWorkspaces()) {
final ClientWorkspace space = (ClientWorkspace) element;
assertNotNull(space.getTitle());
for (final Object element2 : space.getCollections()) {
final ClientCollection col = (ClientCollection) element2;
if (col.accepts("image/gif")) {
// we found a collection that accepts GIF, so post one
final ClientMediaEntry m1 = col.createMediaEntry("duke" + count, "duke" + count, "image/gif", new FileInputStream(
"test/testdata/duke-wave-shadow.gif"));
col.addEntry(m1);
// entry should now exist on server
final ClientMediaEntry m2 = (ClientMediaEntry) col.getEntry(m1.getEditURI());
assertNotNull(m2);
// remove entry
m2.remove();
// fetching entry now should result in exception
boolean failed = false;
try {
col.getEntry(m1.getEditURI());
} catch (final ProponoException e) {
failed = true;
}
assertTrue(failed);
count++;
}
}
}
assertTrue(count > 0);
}
/**
* Post X media entries each media collection found, test paging, then cleanup.
*
* public void testMediaPaging() throws Exception { ClientAtomService service =
* getClientAtomService(); assertNotNull(service); assertTrue(service.getWorkspaces().size() >
* 0); int count = 0; for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) {
* ClientWorkspace space = (ClientWorkspace) it.next(); assertNotNull(space.getTitle());
*
* for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { ClientCollection
* col = (ClientCollection) colit.next(); if (col.accepts("image/gif")) {
*
* // we found a collection that accepts GIF, so post 100 of them List posted = new ArrayList();
* for (int i=0; i<maxPagingEntries; i++) { ClientMediaEntry m1 =
* col.createMediaEntry("duke"+count, "duke"+count, "image/gif", new
* FileInputStream("test/testdata/duke-wave-shadow.gif")); col.addEntry(m1); posted.add(m1); }
* int entryCount = 0; for (Iterator iter = col.getEntries(); iter.hasNext();) {
* ClientMediaEntry entry = (ClientMediaEntry) iter.next(); entryCount++; } for (Iterator delit
* = posted.iterator(); delit.hasNext();) { ClientEntry entry = (ClientEntry) delit.next();
* entry.remove(); } assertTrue(entryCount >= maxPagingEntries); count++; break; } } }
* assertTrue(count > 0); }
*/
}