', 'views.page', endpoint='flatpage')
+
+# Register test blueprint
+app.register_blueprint(test_blueprint, url_prefix='/test')
+
+
+if __name__ == '__main__':
+ host = '0.0.0.0'
+ port = 5000
+
+ if len(sys.argv) == 2:
+ mixed = sys.argv[1]
+
+ try:
+ host, port = mixed.split(':')
+ except ValueError:
+ port = mixed
+ elif len(sys.argv) == 3:
+ host, port = sys.argv[1:]
+
+ try:
+ port = int(port)
+ except (TypeError, ValueError):
+ print >> sys.stderr, 'Please, use proper digit value to the ' \
+ '``port`` argument.\nCannot convert %r to ' \
+ 'integer.' % port
+
+ app.debug = bool(int(os.environ.get('DEBUG', 1)))
+ app.run(host=host, port=port)
diff --git a/testapp/requirements.txt b/testapp/requirements.txt
new file mode 100644
index 0000000..58f8785
--- /dev/null
+++ b/testapp/requirements.txt
@@ -0,0 +1,2 @@
+Flask>=0.8
+unittest2
diff --git a/testapp/templates/base.html b/testapp/templates/base.html
new file mode 100644
index 0000000..5f8d1ea
--- /dev/null
+++ b/testapp/templates/base.html
@@ -0,0 +1,21 @@
+
+
+
+
+ Flask-LazyViews test project
+
+ {% block extra_head %}{% endblock %}
+
+
+
+ Flask-LazyViews test project
+ {% block content %}{% endblock %}
+ {% block backlink %}
+
+ {% endblock %}
+ {% block extra_body %}{% endblock %}
+
+
+
diff --git a/testapp/templates/home.html b/testapp/templates/home.html
new file mode 100644
index 0000000..9d3c82c
--- /dev/null
+++ b/testapp/templates/home.html
@@ -0,0 +1,13 @@
+{% extends "base.html" %}
+{% block content %}
+
+ Home page
+
+
+
+{% endblock %}
+{% block backlink %}{% endblock %}
diff --git a/testapp/templates/page.html b/testapp/templates/page.html
new file mode 100644
index 0000000..bced293
--- /dev/null
+++ b/testapp/templates/page.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+{% block content %}
+
+ Page #{{ page }}
+ Dummy page content ;)
+
+{% endblock %}
diff --git a/testapp/test/__init__.py b/testapp/test/__init__.py
new file mode 100644
index 0000000..128b44b
--- /dev/null
+++ b/testapp/test/__init__.py
@@ -0,0 +1 @@
+from .blueprint import blueprint
diff --git a/testapp/test/blueprint.py b/testapp/test/blueprint.py
new file mode 100644
index 0000000..bf12ee0
--- /dev/null
+++ b/testapp/test/blueprint.py
@@ -0,0 +1,9 @@
+from flask import Blueprint
+from flask.ext.lazyviews import LazyViews
+
+
+blueprint = Blueprint('test', 'testapp.test', template_folder='templates')
+
+views = LazyViews(blueprint, '.views')
+views.add('/', 'test')
+views.add('/advanced', 'advanced', methods=('GET', 'POST'))
diff --git a/testapp/test/templates/test/advanced.html b/testapp/test/templates/test/advanced.html
new file mode 100644
index 0000000..5dc2d84
--- /dev/null
+++ b/testapp/test/templates/test/advanced.html
@@ -0,0 +1,19 @@
+{% extends "base.html" %}
+{% block content %}
+
+ Advanced test page
+
+ $REQUEST
+ {{ values }}
+
+ Make POST request
+
+
+{% endblock %}
diff --git a/testapp/test/templates/test/test.html b/testapp/test/templates/test/test.html
new file mode 100644
index 0000000..64db708
--- /dev/null
+++ b/testapp/test/templates/test/test.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+{% block content %}
+ Test page
+
+{% endblock %}
diff --git a/testapp/test/utils.py b/testapp/test/utils.py
new file mode 100644
index 0000000..8e912d8
--- /dev/null
+++ b/testapp/test/utils.py
@@ -0,0 +1,2 @@
+def compute_context(values):
+ return values.to_dict()
diff --git a/testapp/test/views.py b/testapp/test/views.py
new file mode 100644
index 0000000..9412dc6
--- /dev/null
+++ b/testapp/test/views.py
@@ -0,0 +1,9 @@
+from flask import render_template, request
+
+
+def advanced():
+ return render_template('test/advanced.html', values=request.values)
+
+
+def test():
+ return render_template('test/test.html')
diff --git a/testapp/tests.py b/testapp/tests.py
new file mode 100755
index 0000000..8dcc6b9
--- /dev/null
+++ b/testapp/tests.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python
+
+import unittest
+
+# Simple manipulation to use ``unittest2`` if current Python version is
+# less than 2.7
+if not hasattr(unittest.TestCase, 'assertIn'):
+ import unittest2 as unittest
+
+from random import choice, randint
+from string import letters
+
+from flask import Blueprint, Flask, url_for
+from flask.ext.lazyviews import LazyViews
+from werkzeug.utils import ImportStringError
+
+from app import app
+from test import blueprint
+
+
+class TestFlaskLazyViews(unittest.TestCase):
+
+ def setUp(self):
+ app.config['TESTING'] = True
+ self.app = app.test_client()
+
+ def tearDown(self):
+ app.config['TESTING'] = False
+
+ def url(self, *args, **kwargs):
+ with app.test_request_context():
+ return url_for(*args, **kwargs)
+
+ def test_app(self):
+ page = randint(1, 9999)
+
+ home_url = self.url('home')
+ page_url = self.url('flatpage', page_id=page)
+ first_page_url = self.url('flatpage', page_id=1)
+
+ response = self.app.get(home_url)
+ self.assertEqual(response.status_code, 200)
+ self.assertIn('Flask-LazyViews test project
', response.data)
+ self.assertIn('' % first_page_url, response.data)
+
+ response = self.app.get(page_url)
+ self.assertEqual(response.status_code, 200)
+ self.assertIn('Page #%d' % page, response.data)
+ self.assertIn('' % home_url, response.data)
+
+ def test_blueprint(self):
+ home_url = self.url('home')
+ test_url = self.url('test.test')
+ advanced_url = self.url('test.advanced')
+
+ response = self.app.get(home_url)
+ self.assertEqual(response.status_code, 200)
+ self.assertIn('' % test_url, response.data)
+ self.assertIn('To advanced test page' % advanced_url,
+ response.data
+ )
+
+ number = str(randint(1, 9999))
+
+ response = self.app.get('%s?q=%s' % (advanced_url, number))
+ self.assertEqual(response.status_code, 200)
+ self.assertIn('Advanced test page', response.data)
+ self.assertIn('$REQUEST', response.data)
+ self.assertIn(number, response.data)
+ self.assertIn('Make POST request', response.data)
+
+ text = ''.join([choice(letters) for i in range(16)])
+
+ response = self.app.post(advanced_url, data={'text': text})
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(text, response.data)
+
+ def test_custom_config_app(self):
+ views = LazyViews(app, 'testapp.views')
+ views.add('/default-page',
+ 'page',
+ defaults={'page_id': 1},
+ endpoint='default_page')
+
+ self.assertIn('default_page', app.view_functions)
+
+ test_app = app.test_client()
+ response = test_app.get(self.url('default_page'))
+ self.assertEqual(response.status_code, 200)
+ self.assertIn('Page #1', response.data)
+
+ def test_custom_config_blueprint(self):
+ views = LazyViews(blueprint, blueprint.import_name)
+ views.add('/more-advanced',
+ 'views.advanced',
+ endpoint='more_advanced',
+ methods=('GET', 'POST', 'PUT'))
+
+ # Don't forget to re-register blueprint
+ app.blueprints.pop('test')
+ app.register_blueprint(blueprint, url_prefix='/test')
+
+ self.assertIn('test.more_advanced', app.view_functions)
+
+ test_app = app.test_client()
+ response = test_app.put(self.url('test.more_advanced'))
+ self.assertEqual(response.status_code, 200)
+ self.assertIn('Advanced test page', response.data)
+
+ def test_error_config_app(self):
+ views = LazyViews(app, 'weird.path')
+ views.add('/default-page',
+ 'views.page',
+ defaults={'page_id': 1},
+ endpoint='default_page')
+
+ self.assertIn('default_page', app.view_functions)
+
+ test_app = app.test_client()
+ self.assertRaises(ImportStringError,
+ test_app.get,
+ self.url('default_page'))
+
+ views = LazyViews(app, 'testapp.views')
+ views.add('/another-default-page',
+ 'does_not_exist',
+ endpoint='another_default_page')
+
+ self.assertIn('another_default_page', app.view_functions)
+
+ test_app = app.test_client()
+ self.assertRaises(ImportStringError,
+ test_app.get,
+ self.url('another_default_page'))
+
+ def test_error_config_blueprint(self):
+ views = LazyViews(blueprint, 'weird.path')
+ views.add('/more-advanced',
+ 'views.advanced',
+ endpoint='more_advanced')
+
+ app.blueprints.pop('test')
+ app.register_blueprint(blueprint, url_prefix='/test')
+
+ self.assertIn('test.more_advanced', app.view_functions)
+
+ test_app = app.test_client()
+ self.assertRaises(ImportStringError,
+ test_app.get,
+ self.url('test.more_advanced'))
+
+ views = LazyViews(blueprint, blueprint.import_name)
+ views.add('/more-more-advanced',
+ 'views.does_not_exist',
+ endpoint='more_more_advanced')
+
+ app.blueprints.pop('test')
+ app.register_blueprint(blueprint, url_prefix='/test')
+
+ self.assertIn('test.more_more_advanced', app.view_functions)
+
+ test_app = app.test_client()
+ self.assertRaises(ImportStringError,
+ test_app.get,
+ self.url('test.more_more_advanced'))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/testapp/views.py b/testapp/views.py
new file mode 100644
index 0000000..6d463a7
--- /dev/null
+++ b/testapp/views.py
@@ -0,0 +1,14 @@
+from random import choice
+from string import digits, letters
+
+from flask import render_template
+
+
+def home():
+ query = u''.join([choice(letters + digits) for i in range(16)])
+ return render_template('home.html', query=query)
+
+
+def page(page_id):
+ page = int(page_id)
+ return render_template('page.html', page=page)