package glaze.soup;
import glaze.Glaze;
import glaze.client.async.AsyncClient;
import glaze.soup.Mode;
import glaze.soup.async.SoupConsumer;
import glaze.soup.async.SoupSelectConsumer;
import glaze.soup.sync.SoupHandler;
import glaze.soup.sync.SoupSelectHandler;
import glaze.spi.Registry;
import glaze.test.http.BaseHttpTest;
import glaze.test.http.Condition;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.apache.http.client.ResponseHandler;
import org.apache.http.entity.ContentType;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestSoup extends BaseHttpTest
{
private class Article
{
public String creator;
public String content;
@Override
public String toString()
{
return "Article [creator=" + creator + ", content=" + content + "]";
}
}
@Test
public void asyncDoc() throws InterruptedException, ExecutionException
{
server.expect(Condition.when("GET").respond(readFile("src/test/resources/data/feed00.xml"), ContentType.TEXT_XML));
try {
Future<Document> fdoc = Glaze.Get(baseUrl).withConsumer(SoupConsumer.instance(Mode.XML)).executeAsync();
Document doc = fdoc.get();
Assert.assertNotNull(doc);
Assert.assertEquals(doc.getAllElements().size(), 661);
} finally {
Registry.lookup(AsyncClient.class).reset();
}
}
@Test
public void asyncSelect() throws InterruptedException, ExecutionException
{
server.expect(Condition.when("GET").respond(readFile("src/test/resources/data/feed00.xml"), ContentType.TEXT_XML));
try {
Future<Elements> fels = Glaze.Get(baseUrl).withConsumer(SoupSelectConsumer.Select("rss channel item title")).executeAsync();
Elements els = fels.get();
Assert.assertNotNull(els);
Assert.assertEquals(els.size(), 25);
} finally {
Registry.lookup(AsyncClient.class).reset();
}
}
@Test
public void syncDoc()
{
server.expect(Condition.when("GET").respond(readFile("src/test/resources/data/feed00.xml"), ContentType.TEXT_XML));
Document doc = Glaze.Get(baseUrl).withHandler(SoupHandler.instance(Mode.XML)).execute();
Assert.assertNotNull(doc);
Assert.assertEquals(doc.getAllElements().size(), 661);
}
@Test
public void syncMap()
{
server.expect(Condition.when("GET").respond(readFile("src/test/resources/data/feed01.xml"), ContentType.TEXT_XML));
ResponseHandler<List<Article>> handler = articleMapper();
List<Article> articles = Glaze.Get(baseUrl).withHandler(handler).execute();
Assert.assertEquals(articles.size(), 43);
for (Article a : articles) {
Assert.assertNotNull(a.content);
}
}
@Test
public void syncSelect()
{
server.expect(Condition.when("GET").respond(readFile("src/test/resources/data/feed00.xml"), ContentType.TEXT_XML));
Elements els = Glaze.Get(baseUrl).withHandler(SoupSelectHandler.Select("rss channel item title", Mode.XML)).execute();
Assert.assertNotNull(els);
Assert.assertEquals(els.size(), 25);
}
private SoupHandler<List<Article>> articleMapper()
{
return new SoupHandler<List<Article>>(Mode.XML)
{
private static final long serialVersionUID = -7163961642551419213L;
@Override
protected List<Article> onDocument(Document doc)
{
List<Article> articles = new ArrayList<Article>();
Elements se = doc.select("dc|creator");
for (Element el : se) {
Article a = new Article();
a.creator = el.text();
String text = el.parent().select("title").text();
a.content = text;
articles.add(a);
}
return articles;
}
};
}
}