[#4186] ticket:63 Add test for extract_pages and load_pages. Add

docstrings. Some code refactoring.

Igor Bondarenko Igor Bondarenko 2012-06-12

Dave Brondsema Dave Brondsema 2012-08-07

removed ForgeWiki/forgewiki/tests/test_wiki2markdown_history.py
removed ForgeWiki/forgewiki/tests/test_wiki2markdown_pages.py
removed ForgeWiki/forgewiki/tests/test_wiki2markdown_talk.py
changed ForgeWiki/forgewiki/command/wiki2markdown/__init__.py
changed ForgeWiki/forgewiki/command/wiki2markdown/extractors.py
changed ForgeWiki/forgewiki/command/wiki2markdown/loaders.py
changed requirements-common.txt
copied ForgeWiki/forgewiki/tests/test_wiki2markdown_attachments.py -> ForgeWiki/forgewiki/tests/test_wiki2markdown.py
ForgeWiki/forgewiki/command/wiki2markdown/__init__.py Diff Switch to side-by-side view
Loading...
ForgeWiki/forgewiki/command/wiki2markdown/extractors.py Diff Switch to side-by-side view
Loading...
ForgeWiki/forgewiki/command/wiki2markdown/loaders.py Diff Switch to side-by-side view
Loading...
requirements-common.txt Diff Switch to side-by-side view
Loading...
ForgeWiki/forgewiki/tests/test_wiki2markdown_attachments.py to ForgeWiki/forgewiki/tests/test_wiki2markdown.py
--- a/ForgeWiki/forgewiki/tests/test_wiki2markdown_attachments.py
+++ b/ForgeWiki/forgewiki/tests/test_wiki2markdown.py
@@ -1,60 +1,83 @@
-import os
-from cStringIO import StringIO
+import mock
 
-from ming.orm.ormsession import ThreadLocalORMSession
-
-from alluratest.controller import setup_basic_test, setup_global_objects
-from forgewiki.command import wiki2markdown
+from forgewiki.command.wiki2markdown.extractors import MySQLExtractor
+from forgewiki.command.wiki2markdown.loaders import MediawikiLoader
+from alluratest.controller import setup_basic_test
 from allura import model as M
 from forgewiki import model as WM
-from pylons import c
+from allura.lib import helpers as h
 
-test_config = 'test.ini#main'
+import pylons
+pylons.c = pylons.tmpl_context
+from pylons import c as context
 
-def setUp(self):
-    """Method called by nose before running each test"""
-    setup_basic_test()
-    setup_global_objects()
 
-def test_wiki2markdown_attachments():
-    output_dir = u'/tmp/wiki2markdown'
-    projects = M.Project.query.find().all()
+class TestMySQLExtractor(object):
 
-    for p in projects:
-        wiki_app = p.app_instance('wiki')
-        if wiki_app is None:
-            continue
-        c.app = wiki_app
-        pages = WM.Page.query.find(dict(app_config_id=wiki_app.config._id)).all()
-        for p in pages:
-            p.attach('foo.text', StringIO('Hello, world!'))
-    ThreadLocalORMSession.flush_all()
-    ThreadLocalORMSession.close_all()
+    def setUp(self):
+        setup_basic_test()
+        self.options = mock.Mock()
+        self.options.dump_dir = '/tmp/w2m_test'
 
-    cmd = wiki2markdown.Wiki2MarkDownCommand('wiki2markdown')
-    cmd.run([test_config, '--extract-only', '--output-dir', output_dir, 'attachments'])
-    cmd.command()
+        # monkey-patch MySQLExtractor for test
+        def pages(self):
+            # yield (page_id, page_data)
+            yield 1, {'title': 'Test title', 'text': 'Test Text'}
+            yield 2, {'title': 'Main_Page', 'text': 'Main_page text'}
+            yield 3, {'title': 'Test', 'text': ''}
 
-    projects = M.Project.query.find().all()
-    for p in projects:
-        wiki_app = p.app_instance('wiki')
-        if wiki_app is None:
-            continue
+        MySQLExtractor._pages = pages
+        self.extractor = MySQLExtractor(self.options)
 
-        pid = "%s" % p._id
-        file_path = os.path.join(output_dir, pid, "attachments.json")
-        assert os.path.isfile(file_path)
+    def test_extract_pages(self):
+        self.extractor.extract_pages()
 
-    cmd = wiki2markdown.Wiki2MarkDownCommand('wiki2markdown')
-    cmd.run([test_config, '--load-only', '--output-dir', '/tmp/wiki2markdown', 'attachments'])
-    cmd.command()
+        with open('/tmp/w2m_test/pages/1.json', 'r') as f:
+            json_page = f.read()
+        assert json_page == '{"text": "Test Text", "title": "Test title"}'
 
-    for p in projects:
-        wiki_app = p.app_instance('wiki')
-        if wiki_app is None:
-            continue
+        with open('/tmp/w2m_test/pages/2.json', 'r') as f:
+            json_page = f.read()
+        assert json_page == '{"text": "Main_page text", "title": "Main_Page"}'
 
-        pages = WM.Page.query.find(dict(app_config_id=wiki_app.config._id)).all()
-        for p in pages:
-            assert '[foo.text](' in p.text
-            assert 'attachment/foo.text)' in p.text
+        with open('/tmp/w2m_test/pages/3.json', 'r') as f:
+            json_page = f.read()
+        assert json_page == '{"text": "", "title": "Test"}'
+
+
+class TestMediawikiLoader(object):
+
+    def setUp(self):
+        setup_basic_test()
+        self.options = mock.Mock()
+        # need test project with installed wiki app
+        self.options.nbhd = 'Adobe'
+        self.options.project = '--init--'
+
+        nbhd = M.Neighborhood.query.get(name=self.options.nbhd)
+        h.set_context(self.options.project, 'wiki', neighborhood=nbhd)
+
+        # monkey-patch MediawikiLoader for test
+        def pages(self):
+            yield {'title': 'Test title', 'text': "'''bold''' ''italics''"}
+            yield {'title': 'Main', 'text': "main"}
+            yield {'title': 'Test', 'text': 'test'}
+
+        MediawikiLoader._pages = pages
+        self.loader = MediawikiLoader(self.options)
+
+    def get_page(self, title):
+        return WM.Page.query.get(app_config_id=context.app.config._id,
+                                 title=title)
+
+    def test_load_pages(self):
+        self.loader.load_pages()
+        page = self.get_page('Test title')
+        assert '**bold** _italics_' in page.text
+
+        page = self.get_page('Main')
+        assert 'main' in page.text
+
+        page = self.get_page('Test')
+        print page.text, len(page.text)
+        assert 'test' in page.text