package com.atlassian.uwc.exporters;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Vector;

import junit.framework.TestCase;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.atlassian.uwc.exporters.mindtouch.MindtouchPage;
import com.atlassian.uwc.filters.NoSvnFilter;

public class MindtouchExporterTest extends TestCase {

	private static final String EX_MULT_FILES = "<files count=\"3\" href=\"http://192.168.2.247/@api/deki/pages/40" +
							"/files\"><file id=\"3\" href=\"http://192.168.2.247/@api/deki/files/3/" +
							"info\"><filename>abc.txt</filename><description>text file</description" +
							"><contents type=\"text/plain\" size=\"11\" href=\"http://192.168.2.247" +
							"/@api/deki/files/3/=abc.txt\" /><date.created>2009-09-30T20:20:11Z</da" +
							"te.created><user.createdby id=\"1\" href=\"http://192.168.2.247/@api/d" +
							"eki/users/1\"><nick>laura.kolker</nick><username>laura.kolker</usernam" +
							"e><email>laura.kolker@gmail.com</email><hash.email>9ed3310b0d84b37fe65" +
							"8dce82b713c08</hash.email><uri.gravatar>http://www.gravatar.com/avatar" +
							"/9ed3310b0d84b37fe658dce82b713c08</uri.gravatar></user.createdby><revi" +
							"sions count=\"1\" totalcount=\"1\" href=\"http://192.168.2.247/@api/de" +
							"ki/files/3/revisions\" /><page.parent id=\"40\" href=\"http://192.168." +
							"2.247/@api/deki/pages/40?redirects=0\"><uri.ui>http://192.168.2.247/Sa" +
							"ndbox/Test_Attachments</uri.ui><title>Test Attachments</title><path>Sa" +
							"ndbox/Test_Attachments</path><namespace>main</namespace></page.parent>" +
							"<properties count=\"1\" href=\"http://192.168.2.247/@api/deki/files/3/" +
							"properties\"><property name=\"urn:deki.mindtouch.com#description\" hre" +
							"f=\"http://192.168.2.247/@api/deki/files/3/properties/urn%253adeki.min" +
							"dtouch.com%2523description/info\" etag=\"6.r1_ts2009-09-30T20:20:11Z\"" +
							"><contents type=\"text/plain; charset=utf-8\" size=\"9\" href=\"http:" +
							"//192.168.2.247/@api/deki/files/3/properties/urn%253adeki.mindtouch.c" +
							"om%2523description\">text file</contents><date.modified>2009-09-30T20" +
							":20:11Z</date.modified><user.modified id=\"1\" href=\"http://192.168." +
							"2.247/@api/deki/users/1\"><nick>laura.kolker</nick><username>laura.ko" +
							"lker</username><email>laura.kolker@gmail.com</email><hash.email>9ed33" +
							"10b0d84b37fe658dce82b713c08</hash.email><uri.gravatar>http://www.grav" +
							"atar.com/avatar/9ed3310b0d84b37fe658dce82b713c08</uri.gravatar></user" +
							".modified></property></properties></file><file id=\"1\" href=\"http:/" +
							"/192.168.2.247/@api/deki/files/1/info\"><filename>cow.jpg</filename><" +
							"description>Cow</description><contents type=\"image/jpeg\" size=\"230" +
							"96\" width=\"450\" height=\"319\" href=\"http://192.168.2.247/@api/de" +
							"ki/files/1/=cow.jpg\" /><contents.preview rel=\"thumb\" type=\"image/" +
							"jpeg\" maxwidth=\"160\" maxheight=\"160\" href=\"http://192.168.2.247" +
							"/@api/deki/files/1/=cow.jpg?size=thumb\" /><contents.preview rel=\"we" +
							"bview\" type=\"image/jpeg\" maxwidth=\"550\" maxheight=\"550\" href=\"" +
							"http://192.168.2.247/@api/deki/files/1/=cow.jpg?size=webview\" /><dat" +
							"e.created>2009-09-30T20:18:46Z</date.created><user.createdby id=\"1\" " +
							"href=\"http://192.168.2.247/@api/deki/users/1\"><nick>laura.kolker</n" +
							"ick><username>laura.kolker</username><email>laura.kolker@gmail.com</em" +
							"ail><hash.email>9ed3310b0d84b37fe658dce82b713c08</hash.email><uri.grav" +
							"atar>http://www.gravatar.com/avatar/9ed3310b0d84b37fe658dce82b713c08</" +
							"uri.gravatar></user.createdby><revisions count=\"1\" totalcount=\"1\" " +
							"href=\"http://192.168.2.247/@api/deki/files/1/revisions\" /><page.pare" +
							"nt id=\"40\" href=\"http://192.168.2.247/@api/deki/pages/40?redirects=" +
							"0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Attachments</uri.ui><tit" +
							"le>Test Attachments</title><path>Sandbox/Test_Attachments</path><names" +
							"pace>main</namespace></page.parent><properties count=\"1\" href=\"http" +
							"://192.168.2.247/@api/deki/files/1/properties\"><property name=\"urn:d" +
							"eki.mindtouch.com#description\" href=\"http://192.168.2.247/@api/deki/" +
							"files/1/properties/urn%253adeki.mindtouch.com%2523description/info\" e" +
							"tag=\"2.r1_ts2009-09-30T20:18:47Z\"><contents type=\"text/plain; chars" +
							"et=utf-8\" size=\"3\" href=\"http://192.168.2.247/@api/deki/files/1/pr" +
							"operties/urn%253adeki.mindtouch.com%2523description\">Cow</contents><d" +
							"ate.modified>2009-09-30T20:18:47Z</date.modified><user.modified id=\"1" +
							"\" href=\"http://192.168.2.247/@api/deki/users/1\"><nick>laura.kolker<" +
							"/nick><username>laura.kolker</username><email>laura.kolker@gmail.com</" +
							"email><hash.email>9ed3310b0d84b37fe658dce82b713c08</hash.email><uri.gr" +
							"avatar>http://www.gravatar.com/avatar/9ed3310b0d84b37fe658dce82b713c08" +
							"</uri.gravatar></user.modified></property></properties></file><file id" +
							"=\"2\" href=\"http://192.168.2.247/@api/deki/files/2/info\"><filename>" +
							"hobbespounce.gif</filename><description>gif</description><contents typ" +
							"e=\"image/gif\" size=\"6536\" width=\"92\" height=\"100\" href=\"http:" +
							"//192.168.2.247/@api/deki/files/2/=hobbespounce.gif\" /><contents.prev" +
							"iew rel=\"thumb\" type=\"image/gif\" maxwidth=\"160\" maxheight=\"160" +
							"\" href=\"http://192.168.2.247/@api/deki/files/2/=hobbespounce.gif?si" +
							"ze=thumb\" /><contents.preview rel=\"webview\" type=\"image/gif\" max" +
							"width=\"550\" maxheight=\"550\" href=\"http://192.168.2.247/@api/deki" +
							"/files/2/=hobbespounce.gif?size=webview\" /><date.created>2009-09-30T" +
							"20:18:47Z</date.created><user.createdby id=\"1\" href=\"http://192.16" +
							"8.2.247/@api/deki/users/1\"><nick>laura.kolker</nick><username>laura." +
							"kolker</username><email>laura.kolker@gmail.com</email><hash.email>9ed" +
							"3310b0d84b37fe658dce82b713c08</hash.email><uri.gravatar>http://www.gr" +
							"avatar.com/avatar/9ed3310b0d84b37fe658dce82b713c08</uri.gravatar></us" +
							"er.createdby><revisions count=\"1\" totalcount=\"1\" href=\"http://19" +
							"2.168.2.247/@api/deki/files/2/revisions\" /><page.parent id=\"40\" hr" +
							"ef=\"http://192.168.2.247/@api/deki/pages/40?redirects=0\"><uri.ui>ht" +
							"tp://192.168.2.247/Sandbox/Test_Attachments</uri.ui><title>Test Attac" +
							"hments</title><path>Sandbox/Test_Attachments</path><namespace>main</n" +
							"amespace></page.parent><properties count=\"1\" href=\"http://192.168." +
							"2.247/@api/deki/files/2/properties\"><property name=\"urn:deki.mindto" +
							"uch.com#description\" href=\"http://192.168.2.247/@api/deki/files/2/p" +
							"roperties/urn%253adeki.mindtouch.com%2523description/info\" etag=\"4." +
							"r1_ts2009-09-30T20:18:48Z\"><contents type=\"text/plain; charset=utf-" +
							"8\" size=\"3\" href=\"http://192.168.2.247/@api/deki/files/2/properti" +
							"es/urn%253adeki.mindtouch.com%2523description\">gif</contents><date.m" +
							"odified>2009-09-30T20:18:48Z</date.modified><user.modified id=\"1\" h" +
							"ref=\"http://192.168.2.247/@api/deki/users/1\"><nick>laura.kolker</ni" +
							"ck><username>laura.kolker</username><email>laura.kolker@gmail.com</em" +
							"ail><hash.email>9ed3310b0d84b37fe658dce82b713c08</hash.email><uri.gra" +
							"vatar>http://www.gravatar.com/avatar/9ed3310b0d84b37fe658dce82b713c08" +
							"</uri.gravatar></user.modified></property></properties></file></files>";
	private static final String TESTDIR = "sampleData/mindtouch/junit_resources/";
	MindtouchExporter tester = null;
	Logger log = Logger.getLogger(this.getClass());
	Properties props = null;
	protected void setUp() throws Exception {
		tester = new MindtouchExporter();
		PropertyConfigurator.configure("log4j.properties");
		props = new Properties();
		props.load(new FileInputStream(TESTDIR + "exporter.mindtouch.properties"));
		tester.setProperties(props);
		tester.startRunning();
	}
	
	public void testCreateApiUrl() {
		String input, expected, actual;
		input = props.getProperty(MindtouchExporter.PROPKEY_URLBASE, null);
		assertNotNull(input);
		expected = "http://" + input + "/@api/deki/";
		actual = tester.createApiUrl(input);
		assertNotNull(actual);
		assertEquals(expected, actual);
	}

	public void testGetPages() {
		Vector<MindtouchPage> actual = tester.getPages();
		assertNotNull(actual);
		assertTrue(actual.size() > 0);
		
		MindtouchPage root = actual.get(0);
		assertNotNull(root);
		assertNotNull(root.title);
		assertEquals("MindTouch", root.title);
		assertNotNull(root.id);
		Vector<MindtouchPage> lvl1 = root.getSubpages();
		assertNotNull(lvl1);
		assertFalse(lvl1.isEmpty());
		assertTrue(lvl1.size() > 0);
		
		MindtouchPage sandbox = lvl1.get(2);
		assertNotNull(sandbox);
		assertNotNull(sandbox.title);
		assertEquals("Sandbox", sandbox.title);
		assertNotNull(sandbox.id);
		Vector<MindtouchPage> lvl2 = sandbox.getSubpages();
		assertNotNull(lvl2);
		assertFalse(lvl2.isEmpty());
		assertTrue(lvl2.size() > 6);
		
		int i = 0;
		for (MindtouchPage page : lvl2) {
			assertNotNull(page);
			assertNotNull(page.id);
			assertNotNull(page.title);
			String expTitle = "";
			switch(i) {
			case 0:
				expTitle = "Test Attachments"; break;
			case 1:
				expTitle = "Test Comments"; break;
			case 2:
				expTitle = "Test Headers"; break;
			case 3:
				expTitle = "Test Permissions"; break;
			case 4: 
				expTitle = "Test Syntax"; break;
			case 5: 
				expTitle = "Test Tags"; break;
			case 6:
				expTitle = "Test Titles"; break;
			default: continue;
			}
			assertEquals(expTitle, page.title);
			i++;
		}
		
	}

	public void testGetContent() {
		Vector<MindtouchPage> pages = tester.getPages();
		assertNotNull(pages);
		Vector<MindtouchPage> actual = tester.getContent(pages);
		assertNotNull(actual);
	
		MindtouchPage root = actual.get(0);
		assertNotNull(root);
		Vector<MindtouchPage> lvl1 = root.getSubpages();
		assertNotNull(lvl1);
		
		MindtouchPage sandbox = lvl1.get(2);
		assertNotNull(sandbox);
		assertNotNull(sandbox.content);
		assertEquals("<content type=\"text/html\" title=\"Sandbox\"><body>\n" + 
				"<p>Testing 123</p></body><body target=\"toc\"><em>No headers</em></body></content>", sandbox.content);
		Vector<MindtouchPage> lvl2 = sandbox.getSubpages();
		assertNotNull(lvl2);
		
		int i = 0;
		for (MindtouchPage page : lvl2) {
			assertNotNull(page);
			assertNotNull(page.content);
			String exp = "";
			switch(i) {
			case 0:
				exp = "<content type=\"text/html\" title=\"Test Attachments\"><body>\n" + 
						"<p>We\'re going to have some attachments content.</p>\n" + 
						"<p>We need an image that\'s inline, a link to an attachment, and an attached file " +
						"with no reference in the page.</p>\n" + 
						"<p>Inline:</p>\n" + 
						"<p><img alt=\"cow.jpg\" class=\"internal default\" src=\"http://192.168.2.247/@api" +
						"/deki/files/1/=cow.jpg?parent=Test Attachments\" /></p>\n" + 
						"<p>Link:</p>\n" + 
						"<p><a rel=\"internal\" href=\"http://192.168.2.247/@api/deki/files/3/=abc.txt?parent=Test Attachments\" " +
						"class=\"iconitext-16 ext-txt \">abc.txt</a></p>\n" + 
						"</body><body target=\"toc\"><em>No headers</em></body></content>"; 
				break;
			case 1:
				exp = "<content type=\"text/html\" title=\"Test Comments\"><body>\n" + 
						"<p>This page will have lots of comments, which we\'ll need to keep in order." +
						"</p></body><body target=\"toc\"><em>No headers</em></body></content>"; 
				break;
			case 2:
				exp = "<content type=\"text/html\" title=\"Test Headers\"><body>\n" + 
						"<p>Headers were a little annoying to control.</p>\n" + 
						"<div id=\"section_1\"><span id=\"Header_1\" /><h2 class=\"editable\">Header 1</h2>\n" + 
						"<p>Some text</p>\n" + 
						"<div id=\"section_2\"><span id=\"Header_2\" /><h3 class=\"editable\">Header 2</h3>\n" + 
						"<p>Tralala</p>\n" + 
						"<div id=\"section_3\"><span id=\"Header_3\" /><h4 class=\"editable\">Header 3</h4>\n" + 
						"<p>Foo bar</p>\n" + 
						"<div id=\"section_4\"><span id=\"Header_4\" /><h5 class=\"editable\">Header 4</h5>\n" + 
						"<p>Testing</p>\n" + 
						"<div id=\"section_5\"><span id=\"Header_5\" /><h6 class=\"editable\">Header 5</h6>\n" + 
						"<p>Lorem Ipsum</p>\n" + 
						"<p>Ê</p>\n" + 
						"<p>What about Fonts?</p>\n" + 
						"<p><span style=\"font-family: Courier New;\">Testing Courier</span></p>\n" + 
						"<p><span style=\"font-family: Times New Roman;\">Times</span></p>\n" + 
						"<p><span style=\"font-family: Verdana;\">Verdana</span></p>\n" + 
						"<p>Ê</p>\n" + 
						"<p>and Font size?</p>\n" + 
						"<p><span style=\"font-size: xx-small;\">xxsmall</span></p>\n" + 
						"<p><span style=\"font-size: x-small;\">xsmall</span></p>\n" + 
						"<p><span style=\"font-size: small;\">small</span></p>\n" + 
						"<p><span style=\"font-size: medium;\">medium</span></p>\n" + 
						"<p><span style=\"font-size: large;\">large</span></p>\n" + 
						"<p><span style=\"font-size: x-large;\">xlarge</span></p>\n" + 
						"<p><span style=\"font-size: xx-large;\">xxlarge</span></p>\n" + 
						"<p>Ê</p>\n" + 
						"<p>What happens when we mix and match different stuff</p>\n" + 
						"<p style=\"margin-left: 40px;\"><code><strong>bold indent code</strong></code></p>\n" + 
						"<p><span style=\"font-family: Courier New;\"><span style=\"font-size: x-large;\">Courier xlarge</span></span></p>\n" + 
						"<br />\n" + 
						"<ul> <li>  </li>\n" + 
						"</ul>\n" + 
						"</div></div></div></div></div></body><body target=\"toc\"><ol style=\"list-style-type:none; " +
						"margin-left:0px; padding-left:0px;\"><li><span>1.</span> <a href=\"#Header_1\" rel=\"internal\">" +
						"Header 1</a><ol style=\"list-style-type:none; margin-left:0px; padding-left:15px;\"><li>" +
						"<span>1.1.</span> <a href=\"#Header_2\" rel=\"internal\">Header 2</a>" +
						"<ol style=\"list-style-type:none; margin-left:0px; padding-left:15px;\">" +
						"<li><span>1.1.1.</span> <a href=\"#Header_3\" rel=\"internal\">Header 3</a>" +
						"<ol style=\"list-style-type:none; margin-left:0px; padding-left:15px;\"><li>" +
						"<span>1.1.1.1.</span> <a href=\"#Header_4\" rel=\"internal\">Header 4</a>" +
						"<ol style=\"list-style-type:none; margin-left:0px; padding-left:15px;\"><li>" +
						"<span>1.1.1.1.1.</span> <a href=\"#Header_5\" rel=\"internal\">Header 5</a></li></ol>" +
						"</li></ol></li></ol></li></ol></li></ol></body></content>"; 
				break;
			case 3:
				exp = "<content type=\"text/html\" title=\"Test Permissions\"><body>\n" + 
						"<p>This will be a restricted page, so we can test authentication, " +
						"and export thoroughness." +
						"</p></body><body target=\"toc\"><em>No headers</em></body></content>"; 
				break;
			case 4: 
				i++;
				continue; //ignore this one Dekiscript makes it complicated
			case 5: 
				exp = "<content type=\"text/html\" title=\"Test Tags\"><body>\n" + 
						"<p>This page will have tags associated with it that will need to be " +
						"turned into labels</p></body><body target=\"toc\"><em>No headers</em>" +
						"</body></content>"; 
				break;
			case 6:
				exp = "<content type=\"text/html\" title=\"Test Titles\"><body>\n" + 
						"<p>Titles seem problematic.</p>\n" + 
						"<p>Firstly, what happens if we have two titles?</p>\n" + 
						"<div id=\"section_1\"><span id=\"Title_.23_2\" /><h1 class=\"editable\">" +
						"Title # 2</h1>\n" + 
						"<p>I have no idea. Probably it\'s the first title that matters?</p>" +
						"</div></body><body target=\"toc\"><ol style=\"list-style-type:none; " +
						"margin-left:0px; padding-left:0px;\"><li><span>1.</span> " +
						"<a href=\"#Title_.23_2\" rel=\"internal\">Title # 2</a></li></ol>" +
						"</body></content>"; 
				break;
			default: continue;
			}
			assertEquals(exp, page.content);
			i++;
		}
	}

	public void testGetTags() {
		Vector<MindtouchPage> pages = tester.getPages();
		assertNotNull(pages);
		Vector<MindtouchPage> actual = tester.getTags(pages);
		assertNotNull(actual);
	
		MindtouchPage root = actual.get(0);
		assertNotNull(root);
		Vector<MindtouchPage> lvl1 = root.getSubpages();
		assertNotNull(lvl1);
		
		MindtouchPage sandbox = lvl1.get(0);
		assertNotNull(sandbox);
		assertNotNull(sandbox.tags);
		assertTrue(sandbox.tags.contains("count=\"0\""));
		Vector<MindtouchPage> lvl2 = sandbox.getSubpages();
		assertNotNull(lvl2);
		
		int i = 0;
		for (MindtouchPage page : lvl2) {
			assertNotNull(page);
			switch(i) {
			case 0:
			case 1:
			case 2:
			case 3:
			case 4: 
			case 6:
				assertNotNull(page.tags);
				assertTrue(page.tags.contains("count=\"0\""));
				break;
			case 5: //Test Tags
				assertNotNull(page.tags);
				assertEquals("<tags count=\"4\" " +
							"href=\"http://192.168.2.247/@api/deki/pages/43/tags\">" +
						"<tag value=\"test\" id=\"3\" " +
							"href=\"http://192.168.2.247/@api/deki/site/tags/3\">" +
							"<type>text</type>" +
							"<uri>http://192.168.2.247/Special:Tags?tag=test</uri>" +
							"<title>test</title>" +
						"</tag>" +
						"<tag value=\"tag with ws\" id=\"4\" " +
							"href=\"http://192.168.2.247/@api/deki/site/tags/4\">" +
							"<type>text</type>" +
							"<uri>http://192.168.2.247/Special:Tags?tag=tag+with+ws</uri>" +
							"<title>tag with ws</title>" +
						"</tag>" +
						"<tag value=\"tag,punctuation;\" " +
							"id=\"5\" href=\"http://192.168.2.247/@api/deki/site/tags/5\">" +
							"<type>text</type>" +
							"<uri>http://192.168.2.247/Special:Tags?tag=tag,punctuation;</uri>" +
							"<title>tag,punctuation;</title>" +
						"</tag>" +
						"<tag value=\"CAPS\" id=\"6\" " +
							"href=\"http://192.168.2.247/@api/deki/site/tags/6\">" +
							"<type>text</type>" +
							"<uri>http://192.168.2.247/Special:Tags?tag=CAPS</uri>" +
							"<title>CAPS</title>" +
						"</tag>" +
						"</tags>", 
						page.tags);
				break;
			}
			i++;
		}
	}

	public void testGetComments() {
		Vector<MindtouchPage> pages = tester.getPages();
		assertNotNull(pages);
		Vector<MindtouchPage> actual = tester.getComments(pages);
		assertNotNull(actual);

		MindtouchPage root = actual.get(0);
		assertNotNull(root);
		Vector<MindtouchPage> lvl1 = root.getSubpages();
		assertNotNull(lvl1);

		MindtouchPage sandbox = lvl1.get(0);
		assertNotNull(sandbox);
		assertNotNull(sandbox.comments);
		assertTrue(sandbox.comments.contains("count=\"0\""));
		Vector<MindtouchPage> lvl2 = sandbox.getSubpages();
		assertNotNull(lvl2);

		int i = 0;
		for (MindtouchPage page : lvl2) {
			assertNotNull(page);
			switch(i) {
			case 0:
			case 2:
			case 3:
			case 5: 
			case 4: 
			case 6:
				assertNotNull(page.comments);
				assertTrue(page.comments.contains("count=\"0\""));
				break;
			case 1: //Test Comments
				assertNotNull(page.comments);
				assertEquals("<comments sort=\"asc\" count=\"3\" totalcount=\"3\" " +
							"href=\"http://192.168.2.247/@api/deki/pages/42/comments\">" +
							"<comment id=\"1\" href=\"http://192.168.2.247/@api/deki/pages/42/" +
							"comments/1\"><user.createdby id=\"1\" href=\"http://192.168.2.247" +
							"/@api/deki/users/1\"><nick>laura.kolker</nick><username>laura.kolker" +
							"</username><email>laura.kolker@gmail.com</email><hash.email>" +
							"9ed3310b0d84b37fe658dce82b713c08</hash.email><uri.gravatar>" +
							"http://www.gravatar.com/avatar/9ed3310b0d84b37fe658dce82b713c08" +
							"</uri.gravatar></user.createdby><date.posted>2009-10-06T04:30:25Z" +
							"</date.posted><title></title><number>1</number><content " +
							"type=\"text/plain; charset=utf-8\" href=\"http://192.168.2.247/@api/" +
							"deki/pages/42/comments/1/content\">" +
						"Comment 1</content></comment>" +
							"<comment id=\"2\" href=\"http://192.168.2.247/@api/deki/pages/42/" +
							"comments/2\"><user.createdby id=\"1\" href=\"http://192.168.2.247/" +
							"@api/deki/users/1\"><nick>laura.kolker</nick><username>laura.kolker" +
							"</username><email>laura.kolker@gmail.com</email><hash.email>" +
							"9ed3310b0d84b37fe658dce82b713c08</hash.email><uri.gravatar>" +
							"http://www.gravatar.com/avatar/9ed3310b0d84b37fe658dce82b713c08" +
							"</uri.gravatar></user.createdby><date.posted>2009-10-06T04:30:32Z" +
							"</date.posted><title></title><number>2</number>" +
							"<content type=\"text/plain; charset=utf-8\" " +
							"href=\"http://192.168.2.247/@api/deki/pages/42/comments/2/content\">" +
						"Foo Bar</content></comment><comment id=\"3\" " +
							"href=\"http://192.168.2.247/@api/deki/pages/42/comments/3\">" +
							"<user.createdby id=\"1\" href=\"http://192.168.2.247/@api/deki/users/1\">" +
							"<nick>laura.kolker</nick><username>laura.kolker</username><email>" +
							"laura.kolker@gmail.com</email><hash.email>9ed3310b0d84b37fe658dce82b713c08" +
							"</hash.email><uri.gravatar>http://www.gravatar.com/avatar/" +
							"9ed3310b0d84b37fe658dce82b713c08</uri.gravatar></user.createdby>" +
							"<date.posted>2009-10-06T16:24:31Z</date.posted><title></title>" +
							"<number>3</number><content type=\"text/plain; charset=utf-8\" " +
							"href=\"http://192.168.2.247/@api/deki/pages/42/comments/3/content\">" +
						"Abcdef</content></comment></comments>", 
						page.comments);
				break;
			}
			i++;
		}
	}

	public void testGetAttachments() {
		Vector<MindtouchPage> pages = tester.getPages();
		assertNotNull(pages);
		Vector<MindtouchPage> actual = tester.getAttachments(pages);
		assertNotNull(actual);

		MindtouchPage root = actual.get(0);
		assertNotNull(root);
		Vector<MindtouchPage> lvl1 = root.getSubpages();
		assertNotNull(lvl1);

		MindtouchPage sandbox = lvl1.get(0);
		assertNotNull(sandbox);
		assertNotNull(sandbox.attachments);
		assertTrue(sandbox.attachments.contains("count=\"0\""));
		Vector<MindtouchPage> lvl2 = sandbox.getSubpages();
		assertNotNull(lvl2);

		int i = 0;
		for (MindtouchPage page : lvl2) {
			assertNotNull(page);
			switch(i) {
			case 1: 
			case 2:
			case 3:
			case 5: 
			case 4: 
			case 6:
				assertNotNull(page.attachments);
				assertTrue(page.attachments.contains("count=\"0\""));
				break;
			case 0: //Test Attachments
				assertNotNull(page.attachments);
				assertEquals(EX_MULT_FILES, 
						page.attachments);
				break;
			}
			i++;
		}
	}

	public void testCleanOutputDir() {
		File dir = new File("tmp/exported_mindtouch_pages");
		assertFalse(dir.exists());
		
		tester.cleanOutputDir(this.props.getProperty(MindtouchExporter.PROPKEY_OUTPUTDIR));
		
		assertTrue(dir.exists());
		
		tester.deleteDir(dir);
	}
	
	public void testOutputPageData() {
		File out = new File("tmp/exported_mindtouch_pages");
		assertFalse(out.exists());
		
		Vector<MindtouchPage> pages = new Vector<MindtouchPage>();
		MindtouchPage page = new MindtouchPage("39", "Sandbox", 
				"<content type=\"text/html\" title=\"Sandbox\"><body>\n" + 
					"<p>Testing 123</p></body><body target=\"toc\"><em>No headers</em></body></content>",
				"<tags count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/tags\" />",
				"<comments count=\"0\" totalcount=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/comments\" />",
				"<files count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/files\" />");
		MindtouchPage child = new MindtouchPage("43", "Test Tags", 
				"<content type=\"text/html\" title=\"Test Tags\"><body>\n" + 
					"<p>This page will have tags associated with it that will need to be turned into labels</p></body><body target=\"toc\"><em>No headers</em></body></content>",
				"<tags count=\"1\" href=\"http://192.168.2.247/@api/deki/pages/43/tags\">" +
					"<tag value=\"test\" id=\"3\" href=\"http://192.168.2.247/@api/deki/site/tags/3\">" +
					"<type>text</type><uri>http://192.168.2.247/Special:Tags?tag=test</uri><title>test</title>" +
					"</tag>" +
					"</tags>",
				"<comments count=\"0\" totalcount=\"0\" href=\"http://192.168.2.247/@api/deki/pages/43/comments\" />",
				"<files count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/43/files\" />");
		MindtouchPage attchild = new MindtouchPage("40", "Test Attachments", 
				"<content type=\"text/html\" title=\"Test Attachments\"><body>\n" + 
				"<p>We\'re going to have some attachments content.</p>\n" + 
				"<p>We need an image that\'s inline, a link to an attachment, and an attached file with no reference in the page.</p>\n" + 
				"<p>Inline:</p>\n" + 
				"<p><img alt=\"cow.jpg\" class=\"internal default\" src=\"http://192.168.2.247/@api/deki/files/1/=cow.jpg\" /></p>\n" + 
				"<p>Link:</p>\n" + 
				"<p><a rel=\"internal\" href=\"http://192.168.2.247/@api/deki/files/3/=abc.txt\" class=\"iconitext-16 ext-txt \">abc.txt</a></p>\n" + 
				"</body><body target=\"toc\"><em>No headers</em></body></content>",
			"<tags count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/40/tags\" />",
			"<comments count=\"0\" totalcount=\"0\" href=\"http://192.168.2.247/@api/deki/pages/40/comments\" />",
			"<files count=\"1\" href=\"http://192.168.2.247/@api/deki/pages/40/files\">" +
				"<file id=\"3\" href=\"http://192.168.2.247/@api/deki/files/3/info\"><filename>abc.txt</filename><description>text file" +
				"</description><contents type=\"text/plain\" size=\"11\" " +
				"href=\"http://192.168.2.247/@api/deki/files/3/=abc.txt\" /><date.created>2009-09-30T20:20:11Z" +
				"</date.created><user.createdby id=\"1\" href=\"http://192.168.2.247/@api/deki/users/1\">" +
				"<nick>laura.kolker</nick><username>laura.kolker</username><email>laura.kolker@gmail.com</email>" +
				"<hash.email>9ed3310b0d84b37fe658dce82b713c08</hash.email>" +
				"<uri.gravatar>http://www.gravatar.com/avatar/9ed3310b0d84b37fe658dce82b713c08</uri.gravatar>" +
				"</user.createdby><revisions count=\"1\" totalcount=\"1\"" +
				" href=\"http://192.168.2.247/@api/deki/files/3/revisions\" />" +
				"<page.parent id=\"40\" href=\"http://192.168.2.247/@api/deki/pages/40?redirects=0\">" +
				"<uri.ui>http://192.168.2.247/Sandbox/Test_Attachments</uri.ui><title>Test Attachments</title>" +
				"<path>Sandbox/Test_Attachments</path><namespace>main</namespace>" +
				"</page.parent><properties count=\"1\" href=\"http://192.168.2.247/@api/deki/files/3/properties\">" +
				"<property name=\"urn:deki.mindtouch.com#description\" href=\"http://192.168.2.247/@api/deki/files" +
				"/3/properties/urn%253adeki.mindtouch.com%2523description/info\" " +
				"etag=\"6.r1_ts2009-09-30T20:20:11Z\"><contents type=\"text/plain; charset=utf-8\" size=\"9\"" +
				" href=\"http://192.168.2.247/@api/deki/files/3/properties/urn%253adeki.mindtouch.com%" +
				"2523description\">text file</contents><date.modified>2009-09-30T20:20:11Z</date.modified>" +
				"<user.modified id=\"1\" href=\"http://192.168.2.247/@api/deki/users/1\">" +
				"<nick>laura.kolker</nick><username>laura.kolker</username><email>laura.kolker@gmail.com</email>" +
				"<hash.email>9ed3310b0d84b37fe658dce82b713c08</hash.email><uri.gravatar>http" +
				"://www.gravatar.com/avatar/9ed3310b0d84b37fe658dce82b713c08</uri.gravatar>" +
				"</user.modified></property></properties></file></files>");
		page.getSubpages().add(child);
		page.getSubpages().add(attchild);
		pages.add(page);
		
		try {
			tester.outputPageData(pages);
			assertTrue(out.exists());
			File[] outfiles = out.listFiles(new NoSvnFilter());
			assertNotNull(outfiles);
			assertEquals(2, outfiles.length);
			int i = 0;
			File[] children = null;
			for (File outfile : outfiles) {
				assertNotNull(outfile);
				switch(i++) {
				case 0:
					assertEquals("39_Sandbox.xml", outfile.getName());
					assertTrue(outfile.isFile());
					break;
				case 1:
					assertEquals("39_Sandbox_subpages", outfile.getName());
					assertTrue(outfile.isDirectory());
					children = outfile.listFiles(new NoSvnFilter());
					break;
				}
			}
			//subpages
			assertNotNull(children);
			assertEquals(3, children.length);
			for (File outchild : children) {
				assertNotNull(outchild);
				String name = outchild.getName();
				assertTrue(name, "43_TestTags.xml".equals(name) ||
							"40_TestAttachments.xml".equals(name) ||
							"40_TestAttachments_attachments".equals(name));
				if ("40_TestAttachments_attachments".equals(name)) {
					assertTrue(outchild.isDirectory());
					children = outchild.listFiles(new NoSvnFilter());
				}
				else assertTrue(outchild.isFile());
			}
			
			//attachments
			assertNotNull(children);
			assertEquals(1, children.length);
			File attachment = children[0];
			assertNotNull(attachment);
			assertEquals("abc.txt", attachment.getName());
		} finally {
			tester.deleteDir(out);
		}
		
		
	}

	

	public void testGetPagelistXml() {
		String input, expected, actual;
		expected = "<pages>" + 
				"<page id=\"21\" href=\"http://192.168.2.247/@api/deki/pages/21?redirects=0\"><uri.ui>http://192.168.2.247/</uri.ui><title>MindTouch</title><path></path><namespace>main</namespace><subpages>" + 
				"<page id=\"55\" href=\"http://192.168.2.247/@api/deki/pages/55?redirects=0\"><uri.ui>http://192.168.2.247/Mindtouch_Root_Page_Child</uri.ui><title>Mindtouch Root Page Child</title><path>Mindtouch_Root_Page_Child</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"51\" href=\"http://192.168.2.247/@api/deki/pages/51?redirects=0\"><uri.ui>http://192.168.2.247/NS%3aNew_Namespace</uri.ui><title>NS:New Namespace</title><path>NS:New_Namespace</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"39\" href=\"http://192.168.2.247/@api/deki/pages/39?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox</uri.ui><title>Sandbox</title><path>Sandbox</path><namespace>main</namespace><subpages>" + 
				"<page id=\"40\" href=\"http://192.168.2.247/@api/deki/pages/40?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Attachments</uri.ui><title>Test Attachments</title><path>Sandbox/Test_Attachments</path><namespace>main</namespace><subpages /></page>" + 
				"<page id=\"42\" href=\"http://192.168.2.247/@api/deki/pages/42?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Comments</uri.ui><title>Test Comments</title><path>Sandbox/Test_Comments</path><namespace>main</namespace><subpages /></page>" + 
				"<page id=\"46\" href=\"http://192.168.2.247/@api/deki/pages/46?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Headers</uri.ui><title>Test Headers</title><path>Sandbox/Test_Headers</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"41\" href=\"http://192.168.2.247/@api/deki/pages/41?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Permissions</uri.ui><title>Test Permissions</title><path>Sandbox/Test_Permissions</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"44\" href=\"http://192.168.2.247/@api/deki/pages/44?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Syntax</uri.ui><title>Test Syntax</title><path>Sandbox/Test_Syntax</path><namespace>main</namespace><subpages>" +
				"<page id=\"57\" href=\"http://192.168.2.247/@api/deki/pages/57?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Syntax/Invalid_Html</uri.ui><title>Invalid Html</title><path>Sandbox/Test_Syntax/Invalid_Html</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"56\" href=\"http://192.168.2.247/@api/deki/pages/56?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Syntax/Tables_and_Bold</uri.ui><title>Tables and Bold</title><path>Sandbox/Test_Syntax/Tables_and_Bold</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"58\" href=\"http://192.168.2.247/@api/deki/pages/58?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Syntax/Test_Dekiscript</uri.ui><title>Test Dekiscript</title><path>Sandbox/Test_Syntax/Test_Dekiscript</path><namespace>main</namespace><subpages /></page></subpages></page>" + 
				"<page id=\"43\" href=\"http://192.168.2.247/@api/deki/pages/43?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Tags</uri.ui><title>Test Tags</title><path>Sandbox/Test_Tags</path><namespace>main</namespace><subpages /></page>" + 
				"<page id=\"45\" href=\"http://192.168.2.247/@api/deki/pages/45?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Titles</uri.ui><title>Test Titles</title><path>Sandbox/Test_Titles</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"49\" href=\"http://192.168.2.247/@api/deki/pages/49?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_XYZ%3b_Bad_Chars</uri.ui><title>Test XYZ; Bad Chars</title><path>Sandbox/Test_XYZ;_Bad_Chars</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"53\" href=\"http://192.168.2.247/@api/deki/pages/53?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Z_Links</uri.ui><title>Test Z Links</title><path>Sandbox/Test_Z_Links</path><namespace>main</namespace><subpages /></page>" +
				"<page id=\"54\" href=\"http://192.168.2.247/@api/deki/pages/54?redirects=0\"><uri.ui>http://192.168.2.247/Sandbox/Test_Z_underscores</uri.ui><title>Test Z_underscores</title><path>Sandbox/Test_Z_underscores</path><namespace>main</namespace><subpages /></page>" +
				"</subpages></page></subpages></page>" +
				"</pages>" + 
				"";
		actual = tester.getPagelistXml();
		assertNotNull(actual);
		assertEquals(expected, actual);
	}

	public void testParsePageXml() {
		String input;
		input = "<pages>" + 
				"<page id=\"10\" href=\"abc\"><uri.ui>foo</uri.ui>" +
					"<title>Root Title</title>" +
					"<path></path><namespace>main</namespace>" +
					"<subpages>" + 
						"<page id=\"21\" href=\"foo\"><uri.ui>bar</uri.ui>" +
							"<title>Abc</title><path>Sandbox/Test_Attachments</path><namespace>main</namespace><subpages /></page>" + 
						"<page id=\"32\" href=\"bar\"><uri.ui>foo</uri.ui>" +
							"<title>DEF</title><path>Sandbox/Test_Comments</path><namespace>main</namespace><subpages /></page>" + 
					"</subpages>" +
				"</page>" +
				"</pages>" + 
				"";
		Vector<MindtouchPage> pages = tester.parsePageXml(input);
		assertNotNull(pages);
		assertEquals(1, pages.size());
		MindtouchPage root = pages.get(0);
		assertNotNull(root);
		assertEquals("10", root.id);
		assertEquals("Root Title", root.title);
		assertNotNull(root.getSubpages());
		assertEquals(2, root.getSubpages().size());
		Vector<MindtouchPage> subpages = root.getSubpages();
		assertNotNull(subpages);
		MindtouchPage page1 = subpages.get(0);
		assertNotNull(page1);
		assertEquals("21", page1.id);
		assertEquals("Abc", page1.title);
		assertTrue(page1.getSubpages().isEmpty());
		MindtouchPage page2 = subpages.get(1);
		assertNotNull(page2);
		assertEquals("32", page2.id);
		assertEquals("DEF", page2.title);
		assertTrue(page2.getSubpages().isEmpty());
	}
	
	//use to help people debug there pagelist parsing
	public void testPagelistParseFromFile() throws Exception {
		String path = "/Users/laura/Code/Clients/Atlassian/support/scottharman/pages.xml";//XXX change for problem data
		String filestring = "";
		String line;
		try {
			BufferedReader reader = new BufferedReader(new FileReader(path));
			while ((line = reader.readLine()) != null) {
				filestring += line + "\n";
			}
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		Vector<MindtouchPage> pages = tester.parsePageXml(filestring);
		assertNotNull(pages);
		int actualsize = countPages(pages.get(0));
		assertTrue(actualsize>10);
	}
	
	private int countPages(MindtouchPage page) {
		int total = 1;
		if (page.getSubpages() != null && page.getSubpages().size() > 0) {
			for (MindtouchPage child: page.getSubpages()) {
				total += countPages(child);
			}
		}
		return total;
	}

	
	public void testHandleError() throws FileNotFoundException, IOException { //these failures should provide useful errors to the console
		//handlerError is called in 3 methods:
		// * getFile 404
		Vector<String> ids = new Vector<String>();
		Vector<String> names = new Vector<String>();
		ids.add("1000"); // there should be no file with id 1000 (not found)
		names.add("bad");
		File attdir = tester.cleanOutputDir(this.props.getProperty(MindtouchExporter.PROPKEY_OUTPUTDIR));
		try {
			tester.outputAttachmentData(ids, names, attdir);
			assertEquals(404, tester.getError());
		} finally {
			tester.deleteDir(attdir);
		}
		// * getPagelistXml 401 (Unauthorized)
		this.props.setProperty("pass", "notvalid");
		String pagelistXml = null;
		try {
			pagelistXml = tester.getPagelistXml();
			fail();
		} catch (Exception e) {}
		assertNull(pagelistXml);
		assertEquals(401, tester.getError());
		//reset props
		props.load(new FileInputStream(TESTDIR + "exporter.mindtouch.properties"));
		
		// * getPagePart 404 (not found)
		String input, actual;
		input = "1000"; //there should be nothing with this id on the server
		actual = tester.getContent(input);
		assertNull(actual);
		assertEquals(404, tester.getError());
		
		// Permission error: 403
		this.props.setProperty("user", "notmod");
		this.props.setProperty("pass", "notmod");
		input = "41"; //we don't have access with anonymous
		actual = tester.getContent(input);
		assertNull(actual);
		assertEquals(403, tester.getError());
		//reset props
		props.load(new FileInputStream(TESTDIR + "exporter.mindtouch.properties"));

		// Bad request 400
		actual = tester.getPagePart("39", "contents", "section=abc");
		assertNull(actual);
		assertEquals(400, tester.getError());
	}
	
	public void testGetContent_id() {
		String input, expected, actual;
		input = "39";
		expected = "<content type=\"text/html\" title=\"Sandbox\"><body>\n" + 
				"<p>Testing 123</p></body><body target=\"toc\"><em>No headers</em></body></content>" +
				"";
		actual = tester.getContent(input);
		assertNotNull(actual);
		assertEquals(expected, actual);
	}
	
	public void testGetAttachmentParents() {
		String input, expected, actual;
		input = "<p><img alt=\"cow.jpg\" class=\"internal default\" " +
				"src=\"http://192.168.2.247/@api" +
				"/deki/files/1/=cow.jpg\" /></p>\n" + 
				"<p><a rel=\"internal\" " +
				"href=\"http://192.168.2.247/@api/deki/files/3/=abc.txt\" " +
				"class=\"iconitext-16 ext-txt \">abc.txt</a></p>\n"; 
		expected = "<p><img alt=\"cow.jpg\" class=\"internal default\" " +
				"src=\"http://192.168.2.247/@api" +
				"/deki/files/1/=cow.jpg?parent=Test Attachments\" /></p>\n" + 
				"<p><a rel=\"internal\" " +
				"href=\"http://192.168.2.247/@api/deki/files/3/=abc.txt?parent=Test Attachments\" " +
				"class=\"iconitext-16 ext-txt \">abc.txt</a></p>\n";
		actual = tester.getAttachmentParents(input);
		assertNotNull(actual);
		assertEquals(expected, actual);
	}
	
	public void testGetTags_id() {
		String input, expected, actual;
		input = "43"; //Test Tags
		expected = "<tags count=\"4\" " +
				"href=\"http://192.168.2.247/@api/deki/pages/43/tags\">" +
				"<tag value=\"test\" id=\"3\" " +
					"href=\"http://192.168.2.247/@api/deki/site/tags/3\">" +
					"<type>text</type>" +
					"<uri>http://192.168.2.247/Special:Tags?tag=test</uri>" +
					"<title>test</title>" +
				"</tag>" +
				"<tag value=\"tag with ws\" id=\"4\" " +
					"href=\"http://192.168.2.247/@api/deki/site/tags/4\">" +
					"<type>text</type>" +
					"<uri>http://192.168.2.247/Special:Tags?tag=tag+with+ws</uri>" +
					"<title>tag with ws</title>" +
				"</tag>" +
				"<tag value=\"tag,punctuation;\" " +
					"id=\"5\" href=\"http://192.168.2.247/@api/deki/site/tags/5\">" +
					"<type>text</type>" +
					"<uri>http://192.168.2.247/Special:Tags?tag=tag,punctuation;</uri>" +
					"<title>tag,punctuation;</title>" +
				"</tag>" +
				"<tag value=\"CAPS\" id=\"6\" " +
					"href=\"http://192.168.2.247/@api/deki/site/tags/6\">" +
					"<type>text</type>" +
					"<uri>http://192.168.2.247/Special:Tags?tag=CAPS</uri>" +
					"<title>CAPS</title>" +
				"</tag>" +
				"</tags>";
		actual = tester.getTags(input);
		assertNotNull(actual);
		assertEquals(expected, actual);
	}


	public void testGetFilename() {
		MindtouchPage page = new MindtouchPage("39", "Sandbox", 
				"<content type=\"text/html\" title=\"Sandbox\"><body>\n" + 
					"<p>Testing 123</p></body><body target=\"toc\"><em>No headers</em></body></content>",
				"<tags count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/tags\" />",
				"<comments count=\"0\" totalcount=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/comments\" />",
				"<files count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/files\" />");
		String input, expected, actual;
		expected = "39_Sandbox.xml";
		actual = tester.getFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.id = "20";
		expected = "20_Sandbox.xml";
		actual = tester.getFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.title = "Testing whitespace";
		expected = "20_Testingwhitespace.xml";
		actual = tester.getFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.title = "Testing;badchars";
		expected = "20_Testingbadchars.xml";
		actual = tester.getFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
	}
	
	public void testGetFilesystemTitle() {
		String input, expected, actual;
		input = "test";
		expected = "test";
		actual = tester.getFilesystemTitle(input);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		input = "a b";
		expected = "ab";
		actual = tester.getFilesystemTitle(input);
		assertNotNull(actual);
		assertEquals(expected, actual);
	
		input = "a;!@#$%^*&:{}b";
		actual = tester.getFilesystemTitle(input);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		input = "a_b"; //underscore is a word char \w
		expected = input;
		actual = tester.getFilesystemTitle(input);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
	}
	

	public void testGetFileContent() {
		String content = "<content type=\"text/html\" title=\"Sandbox\"><body>\n" + 
							"<p>Testing 123</p></body><body target=\"toc\"><em>No headers</em></body></content>";
		String tags = "<tags count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/tags\" />";
		String comments = "<comments count=\"0\" totalcount=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/comments\" />";
		String files = "<files count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/files\" />";
		MindtouchPage page = new MindtouchPage("39", "Sandbox", 
				content,
				tags,
				comments,
				files);
		String input, expected, actual;
		expected = "<pagedata>" + content + tags + comments + files + "</pagedata>";
		actual = tester.getFileContent(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
	}

	public void testCreateFile() {
		String filename = "testing123.txt";
		File parent = tester.cleanOutputDir(this.props.getProperty(MindtouchExporter.PROPKEY_OUTPUTDIR));
		try {
			File actual = tester.createFile(filename, parent);
			assertNotNull(actual);
			File parentFile = actual.getParentFile();
			assertEquals(parent.getAbsolutePath(), parentFile.getAbsolutePath());
			assertTrue(actual.getAbsolutePath().endsWith(File.separator + filename));
		} finally {
			tester.deleteDir(parent);
		}
	}

	public void testWrite() {
		File parent = tester.cleanOutputDir(this.props.getProperty(MindtouchExporter.PROPKEY_OUTPUTDIR));
		try {
			File file = new File(parent.getAbsolutePath() + File.separator + "test.txt");
			String content = "abcdef";
			tester.write(file , content);

			assertTrue(file.exists());
			String read = "";
			String line;
			try {
				BufferedReader reader = new BufferedReader(new FileReader(file));
				while ((line = reader.readLine()) != null) {
					read += line;
				}
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			assertEquals(content, read);
		} finally {
			tester.deleteDir(parent);
		}
	}

	public void testGetAttFilename() {
		MindtouchPage page = new MindtouchPage("39", "Sandbox", 
				"<content type=\"text/html\" title=\"Sandbox\"><body>\n" + 
					"<p>Testing 123</p></body><body target=\"toc\"><em>No headers</em></body></content>",
				"<tags count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/tags\" />",
				"<comments count=\"0\" totalcount=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/comments\" />",
				"<files count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/files\" />");
		String input, expected, actual;
		expected = "39_Sandbox_attachments";
		actual = tester.getAttFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.id = "20";
		expected = "20_Sandbox_attachments";
		actual = tester.getAttFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.title = "Testing whitespace";
		expected = "20_Testingwhitespace_attachments";
		actual = tester.getAttFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.title = "Testing;badchars";
		expected = "20_Testingbadchars_attachments";
		actual = tester.getAttFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
	}

	public void testOutputAttachmentData() {
		MindtouchPage page = new MindtouchPage("40", "Test Attachments", 
				"<content type=\"text/html\" title=\"Test Attachments\"><body>\n" + 
				"<p>We\'re going to have some attachments content.</p>\n" + 
				"<p>We need an image that\'s inline, a link to an attachment, and an attached file with no reference in the page.</p>\n" + 
				"<p>Inline:</p>\n" + 
				"<p><img alt=\"cow.jpg\" class=\"internal default\" src=\"http://192.168.2.247/@api/deki/files/1/=cow.jpg\" /></p>\n" + 
				"<p>Link:</p>\n" + 
				"<p><a rel=\"internal\" href=\"http://192.168.2.247/@api/deki/files/3/=abc.txt\" class=\"iconitext-16 ext-txt \">abc.txt</a></p>\n" + 
				"</body><body target=\"toc\"><em>No headers</em></body></content>",
			"<tags count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/40/tags\" />",
			"<comments count=\"0\" totalcount=\"0\" href=\"http://192.168.2.247/@api/deki/pages/40/comments\" />",
			EX_MULT_FILES);
		
		File attdir = tester.cleanOutputDir(this.props.getProperty(MindtouchExporter.PROPKEY_OUTPUTDIR));
		try {
			tester.outputAttachmentData(page, attdir);
			File[] files = attdir.listFiles(new NoSvnFilter());
			assertNotNull(files);
			assertEquals(3, files.length);
			int i = 0;
			for (File file : files) {
				assertNotNull(file);
				assertTrue(file.length() > 0);
				assertTrue("cow.jpg".equals(file.getName()) ||
						"abc.txt".equals(file.getName()) ||
						"hobbespounce.gif".equals(file.getName()));
			}
		} finally {
			tester.deleteDir(attdir);
		}
	}
	public void testGetSubFilename() {
		MindtouchPage page = new MindtouchPage("39", "Sandbox", 
				"<content type=\"text/html\" title=\"Sandbox\"><body>\n" + 
					"<p>Testing 123</p></body><body target=\"toc\"><em>No headers</em></body></content>",
				"<tags count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/tags\" />",
				"<comments count=\"0\" totalcount=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/comments\" />",
				"<files count=\"0\" href=\"http://192.168.2.247/@api/deki/pages/39/files\" />");
		String input, expected, actual;
		expected = "39_Sandbox_subpages";
		actual = tester.getSubFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.id = "20";
		expected = "20_Sandbox_subpages";
		actual = tester.getSubFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.title = "Testing whitespace";
		expected = "20_Testingwhitespace_subpages";
		actual = tester.getSubFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
		
		page.title = "Testing;badchars";
		expected = "20_Testingbadchars_subpages";
		actual = tester.getSubFilename(page);
		assertNotNull(actual);
		assertEquals(expected, actual);
	}

	public void testCreateDir() {
		File parent = tester.cleanOutputDir(this.props.getProperty(MindtouchExporter.PROPKEY_OUTPUTDIR));
		
		try {
			String newdir = "testing123";
			File actual = tester.createDir(newdir, parent);
			assertNotNull(actual);
			assertTrue(actual.exists());
			assertTrue(actual.isDirectory());
		}
		finally {
			tester.deleteDir(parent);
		}
	}


	public void testHasAttachments() {
		MindtouchPage pagetest = new MindtouchPage();
		assertFalse(pagetest.hasAttachments());
		pagetest.attachments = "<files count=\"0\" ...";
		assertFalse(pagetest.hasAttachments());
		pagetest.attachments = "<files count=\"3\" ...";
		assertTrue(pagetest.hasAttachments());
	}


	/* XXX Basic httpclient + Mindtouch rest api tests */
	public void testAuthenticate() throws HttpException, IOException {
		String baseurl = props.getProperty(MindtouchExporter.PROPKEY_URLBASE, null);
		String user = props.getProperty(MindtouchExporter.PROPKEY_USER, null);
		String pass = props.getProperty(MindtouchExporter.PROPKEY_PASS, null);
		int port = Integer.parseInt(props.getProperty(MindtouchExporter.PROPKEY_URLPORT, "80"));
		assertNotNull(baseurl);
		assertNotNull(user);
		assertNotNull(pass);

		HttpClient client = new HttpClient();
		client.getState().setCredentials(new AuthScope(baseurl, port),
				new UsernamePasswordCredentials(user, pass));

		String apiurl = tester.createApiUrl(baseurl);
		String url = apiurl + "users/authenticate";
		GetMethod get = new GetMethod(url);
		get.setDoAuthentication(true);

		try {
			int result = client.executeMethod(get);
			assertEquals(200, result);
		} finally {
			get.releaseConnection();
		}
	}

	public void testExportPage() throws HttpException, IOException {
		String baseurl = props.getProperty(MindtouchExporter.PROPKEY_URLBASE, null);
		assertNotNull(baseurl);
		String apiurl = tester.createApiUrl(baseurl);
		String pageid = "=Sandbox";
		String url = apiurl + "pages/" + pageid + "/contents";
		GetMethod method = new GetMethod(url);
		HttpClient client = new HttpClient();
		try {
			int result = client.executeMethod(method);
			assertEquals(200, result);
		} finally {
			method.releaseConnection();
		}

		pageid = "41"; //won't work without authentication;
		url = apiurl + "pages/" + pageid + "/contents";
		method = new GetMethod(url);
		try {
			int result = client.executeMethod(method);
			assertEquals(401, result);
		} finally {
			method.releaseConnection();
		}
	}

	public void testExportPageWithAuth() throws HttpException, IOException {
		String baseurl = props.getProperty(MindtouchExporter.PROPKEY_URLBASE, null);
		String user = props.getProperty(MindtouchExporter.PROPKEY_USER, null);
		String pass = props.getProperty(MindtouchExporter.PROPKEY_PASS, null);
		int port = Integer.parseInt(props.getProperty(MindtouchExporter.PROPKEY_URLPORT, "80"));
		assertNotNull(baseurl);
		assertNotNull(user);
		assertNotNull(pass);
		String apiurl = tester.createApiUrl(baseurl);
		String pageid = "41";
		String url = apiurl + "pages/" + pageid + "/contents";
		GetMethod method = new GetMethod(url);
		HttpClient client = new HttpClient();
		client.getState().setCredentials(new AuthScope(baseurl, port),
				new UsernamePasswordCredentials(user, pass));
		method.setDoAuthentication(true);
		try {
			int result = client.executeMethod(method);
			assertEquals(200, result);
		} finally {
			method.releaseConnection();
		}
	}

	public void testIgnoreMindtouch() throws FileNotFoundException, IOException {
		props = new Properties();
		props.load(new FileInputStream(TESTDIR + "exporter.mindtouch-ignore.properties"));
		tester.setProperties(props);
		
		Vector<MindtouchPage> actual = tester.getPages();
		assertNotNull(actual);
		assertFalse(actual.isEmpty());
		assertTrue(actual.size() > 0);
		
		MindtouchPage sandbox = actual.get(2);
		assertNotNull(sandbox);
		assertNotNull(sandbox.title);
		assertEquals("Sandbox", sandbox.title);
		assertNotNull(sandbox.id);
		Vector<MindtouchPage> lvl2 = sandbox.getSubpages();
		assertNotNull(lvl2);
		assertFalse(lvl2.isEmpty());
		assertTrue(lvl2.size() > 6);
		
		int i = 0;
		for (MindtouchPage page : lvl2) {
			assertNotNull(page);
			assertNotNull(page.id);
			assertNotNull(page.title);
			String expTitle = "";
			switch(i) {
			case 0:
				expTitle = "Test Attachments"; break;
			case 1:
				expTitle = "Test Comments"; break;
			case 2:
				expTitle = "Test Headers"; break;
			case 3:
				expTitle = "Test Permissions"; break;
			case 4: 
				expTitle = "Test Syntax"; break;
			case 5: 
				expTitle = "Test Tags"; break;
			case 6:
				expTitle = "Test Titles"; break;
			default: continue;
			}
			assertEquals(expTitle, page.title);
			i++;
		}
	}
	
}
