feat: basic support for WSGI app, views, templates
also docs + tests for what we have so far
This commit is contained in:
commit
977c196f47
49 changed files with 2805 additions and 0 deletions
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
50
tests/test_app.py
Normal file
50
tests/test_app.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
from wuttjamaican.testing import FileConfigTestCase
|
||||
|
||||
from pyramid.config import Configurator
|
||||
from pyramid.router import Router
|
||||
|
||||
from wuttaweb import app as mod
|
||||
|
||||
|
||||
class TestMakeWuttaConfig(FileConfigTestCase):
|
||||
|
||||
def test_config_path_required(self):
|
||||
|
||||
# settings must define config path, else error
|
||||
settings = {}
|
||||
self.assertRaises(ValueError, mod.make_wutta_config, settings)
|
||||
|
||||
def test_basic(self):
|
||||
|
||||
# mock path to config file
|
||||
myconf = self.write_file('my.conf', '')
|
||||
settings = {'wutta.config': myconf}
|
||||
|
||||
# can make a config okay
|
||||
config = mod.make_wutta_config(settings)
|
||||
|
||||
# and that config is also stored in settings
|
||||
self.assertIn('wutta_config', settings)
|
||||
self.assertIs(settings['wutta_config'], config)
|
||||
|
||||
|
||||
class TestMakePyramidConfig(TestCase):
|
||||
|
||||
def test_basic(self):
|
||||
settings = {}
|
||||
config = mod.make_pyramid_config(settings)
|
||||
self.assertIsInstance(config, Configurator)
|
||||
|
||||
|
||||
class TestMain(FileConfigTestCase):
|
||||
|
||||
def test_basic(self):
|
||||
global_config = None
|
||||
myconf = self.write_file('my.conf', '')
|
||||
settings = {'wutta.config': myconf}
|
||||
app = mod.main(global_config, **settings)
|
||||
self.assertIsInstance(app, Router)
|
4
tests/test_helpers.py
Normal file
4
tests/test_helpers.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
# nb. nothing to test yet!
|
||||
from wuttaweb import helpers
|
14
tests/test_static.py
Normal file
14
tests/test_static.py
Normal file
|
@ -0,0 +1,14 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
from pyramid import testing
|
||||
|
||||
|
||||
class TestIncludeMe(TestCase):
|
||||
|
||||
def test_basic(self):
|
||||
with testing.testConfig() as pyramid_config:
|
||||
|
||||
# just ensure no error happens when included..
|
||||
pyramid_config.include('wuttaweb.static')
|
100
tests/test_subscribers.py
Normal file
100
tests/test_subscribers.py
Normal file
|
@ -0,0 +1,100 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
import json
|
||||
from unittest import TestCase
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from wuttjamaican.conf import WuttaConfig
|
||||
|
||||
from pyramid import testing
|
||||
|
||||
from wuttaweb import subscribers
|
||||
from wuttaweb import helpers
|
||||
|
||||
|
||||
class TestNewRequest(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.config = WuttaConfig()
|
||||
|
||||
def make_request(self):
|
||||
request = testing.DummyRequest()
|
||||
request.registry.settings = {'wutta_config': self.config}
|
||||
return request
|
||||
|
||||
def test_wutta_config(self):
|
||||
request = self.make_request()
|
||||
event = MagicMock(request=request)
|
||||
|
||||
# request gets a new attr
|
||||
self.assertFalse(hasattr(request, 'wutta_config'))
|
||||
subscribers.new_request(event)
|
||||
self.assertTrue(hasattr(request, 'wutta_config'))
|
||||
self.assertIs(request.wutta_config, self.config)
|
||||
|
||||
def test_use_oruga_default(self):
|
||||
request = self.make_request()
|
||||
event = MagicMock(request=request)
|
||||
|
||||
# request gets a new attr, false by default
|
||||
self.assertFalse(hasattr(request, 'use_oruga'))
|
||||
subscribers.new_request(event)
|
||||
self.assertFalse(request.use_oruga)
|
||||
|
||||
def test_use_oruga_custom(self):
|
||||
self.config.setdefault('wuttaweb.oruga_detector.spec', 'tests.test_subscribers:custom_oruga_detector')
|
||||
request = self.make_request()
|
||||
event = MagicMock(request=request)
|
||||
|
||||
# request gets a new attr, which should be true
|
||||
self.assertFalse(hasattr(request, 'use_oruga'))
|
||||
subscribers.new_request(event)
|
||||
self.assertTrue(request.use_oruga)
|
||||
|
||||
|
||||
def custom_oruga_detector(request):
|
||||
return True
|
||||
|
||||
|
||||
class TestBeforeRender(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.config = WuttaConfig()
|
||||
|
||||
def make_request(self):
|
||||
request = testing.DummyRequest()
|
||||
request.registry.settings = {'wutta_config': self.config}
|
||||
request.wutta_config = self.config
|
||||
return request
|
||||
|
||||
def test_basic(self):
|
||||
request = self.make_request()
|
||||
event = {'request': request}
|
||||
|
||||
# event dict will get populated with more context
|
||||
subscribers.before_render(event)
|
||||
|
||||
self.assertIn('config', event)
|
||||
self.assertIs(event['config'], self.config)
|
||||
|
||||
self.assertIn('app', event)
|
||||
self.assertIs(event['app'], self.config.get_app())
|
||||
|
||||
self.assertIn('h', event)
|
||||
self.assertIs(event['h'], helpers)
|
||||
|
||||
self.assertIn('url', event)
|
||||
# TODO: not sure how to test this?
|
||||
# self.assertIs(event['url'], request.route_url)
|
||||
|
||||
self.assertIn('json', event)
|
||||
self.assertIs(event['json'], json)
|
||||
|
||||
|
||||
class TestIncludeMe(TestCase):
|
||||
|
||||
def test_basic(self):
|
||||
with testing.testConfig() as pyramid_config:
|
||||
|
||||
# just ensure no error happens when included..
|
||||
pyramid_config.include('wuttaweb.subscribers')
|
265
tests/test_util.py
Normal file
265
tests/test_util.py
Normal file
|
@ -0,0 +1,265 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
from pyramid import testing
|
||||
|
||||
from wuttjamaican.conf import WuttaConfig
|
||||
from wuttaweb import util
|
||||
|
||||
|
||||
class TestGetLibVer(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.config = WuttaConfig()
|
||||
self.request = testing.DummyRequest()
|
||||
self.request.wutta_config = self.config
|
||||
|
||||
def test_buefy_default(self):
|
||||
version = util.get_libver(self.request, 'buefy')
|
||||
self.assertEqual(version, 'latest')
|
||||
|
||||
def test_buefy_custom_old(self):
|
||||
self.config.setdefault('wuttaweb.buefy_version', '0.9.29')
|
||||
version = util.get_libver(self.request, 'buefy')
|
||||
self.assertEqual(version, '0.9.29')
|
||||
|
||||
def test_buefy_custom_new(self):
|
||||
self.config.setdefault('wuttaweb.libver.buefy', '0.9.29')
|
||||
version = util.get_libver(self.request, 'buefy')
|
||||
self.assertEqual(version, '0.9.29')
|
||||
|
||||
def test_buefy_default_only(self):
|
||||
self.config.setdefault('wuttaweb.libver.buefy', '0.9.29')
|
||||
version = util.get_libver(self.request, 'buefy', default_only=True)
|
||||
self.assertEqual(version, 'latest')
|
||||
|
||||
def test_buefy_css_default(self):
|
||||
version = util.get_libver(self.request, 'buefy.css')
|
||||
self.assertEqual(version, 'latest')
|
||||
|
||||
def test_buefy_css_custom_old(self):
|
||||
# nb. this uses same setting as buefy (js)
|
||||
self.config.setdefault('wuttaweb.buefy_version', '0.9.29')
|
||||
version = util.get_libver(self.request, 'buefy.css')
|
||||
self.assertEqual(version, '0.9.29')
|
||||
|
||||
def test_buefy_css_custom_new(self):
|
||||
# nb. this uses same setting as buefy (js)
|
||||
self.config.setdefault('wuttaweb.libver.buefy', '0.9.29')
|
||||
version = util.get_libver(self.request, 'buefy.css')
|
||||
self.assertEqual(version, '0.9.29')
|
||||
|
||||
def test_buefy_css_default_only(self):
|
||||
self.config.setdefault('wuttaweb.libver.buefy', '0.9.29')
|
||||
version = util.get_libver(self.request, 'buefy.css', default_only=True)
|
||||
self.assertEqual(version, 'latest')
|
||||
|
||||
def test_vue_default(self):
|
||||
version = util.get_libver(self.request, 'vue')
|
||||
self.assertEqual(version, '2.6.14')
|
||||
|
||||
def test_vue_custom_old(self):
|
||||
self.config.setdefault('wuttaweb.vue_version', '3.4.31')
|
||||
version = util.get_libver(self.request, 'vue')
|
||||
self.assertEqual(version, '3.4.31')
|
||||
|
||||
def test_vue_custom_new(self):
|
||||
self.config.setdefault('wuttaweb.libver.vue', '3.4.31')
|
||||
version = util.get_libver(self.request, 'vue')
|
||||
self.assertEqual(version, '3.4.31')
|
||||
|
||||
def test_vue_default_only(self):
|
||||
self.config.setdefault('wuttaweb.libver.vue', '3.4.31')
|
||||
version = util.get_libver(self.request, 'vue', default_only=True)
|
||||
self.assertEqual(version, '2.6.14')
|
||||
|
||||
def test_vue_resource_default(self):
|
||||
version = util.get_libver(self.request, 'vue_resource')
|
||||
self.assertEqual(version, 'latest')
|
||||
|
||||
def test_vue_resource_custom(self):
|
||||
self.config.setdefault('wuttaweb.libver.vue_resource', '1.5.3')
|
||||
version = util.get_libver(self.request, 'vue_resource')
|
||||
self.assertEqual(version, '1.5.3')
|
||||
|
||||
def test_fontawesome_default(self):
|
||||
version = util.get_libver(self.request, 'fontawesome')
|
||||
self.assertEqual(version, '5.3.1')
|
||||
|
||||
def test_fontawesome_custom(self):
|
||||
self.config.setdefault('wuttaweb.libver.fontawesome', '5.6.3')
|
||||
version = util.get_libver(self.request, 'fontawesome')
|
||||
self.assertEqual(version, '5.6.3')
|
||||
|
||||
def test_bb_vue_default(self):
|
||||
version = util.get_libver(self.request, 'bb_vue')
|
||||
self.assertEqual(version, '3.4.31')
|
||||
|
||||
def test_bb_vue_custom(self):
|
||||
self.config.setdefault('wuttaweb.libver.bb_vue', '3.4.30')
|
||||
version = util.get_libver(self.request, 'bb_vue')
|
||||
self.assertEqual(version, '3.4.30')
|
||||
|
||||
def test_bb_oruga_default(self):
|
||||
version = util.get_libver(self.request, 'bb_oruga')
|
||||
self.assertEqual(version, '0.8.12')
|
||||
|
||||
def test_bb_oruga_custom(self):
|
||||
self.config.setdefault('wuttaweb.libver.bb_oruga', '0.8.11')
|
||||
version = util.get_libver(self.request, 'bb_oruga')
|
||||
self.assertEqual(version, '0.8.11')
|
||||
|
||||
def test_bb_oruga_bulma_default(self):
|
||||
version = util.get_libver(self.request, 'bb_oruga_bulma')
|
||||
self.assertEqual(version, '0.3.0')
|
||||
version = util.get_libver(self.request, 'bb_oruga_bulma_css')
|
||||
self.assertEqual(version, '0.3.0')
|
||||
|
||||
def test_bb_oruga_bulma_custom(self):
|
||||
self.config.setdefault('wuttaweb.libver.bb_oruga_bulma', '0.2.11')
|
||||
version = util.get_libver(self.request, 'bb_oruga_bulma')
|
||||
self.assertEqual(version, '0.2.11')
|
||||
|
||||
def test_bb_fontawesome_svg_core_default(self):
|
||||
version = util.get_libver(self.request, 'bb_fontawesome_svg_core')
|
||||
self.assertEqual(version, '6.5.2')
|
||||
|
||||
def test_bb_fontawesome_svg_core_custom(self):
|
||||
self.config.setdefault('wuttaweb.libver.bb_fontawesome_svg_core', '6.5.1')
|
||||
version = util.get_libver(self.request, 'bb_fontawesome_svg_core')
|
||||
self.assertEqual(version, '6.5.1')
|
||||
|
||||
def test_bb_free_solid_svg_icons_default(self):
|
||||
version = util.get_libver(self.request, 'bb_free_solid_svg_icons')
|
||||
self.assertEqual(version, '6.5.2')
|
||||
|
||||
def test_bb_free_solid_svg_icons_custom(self):
|
||||
self.config.setdefault('wuttaweb.libver.bb_free_solid_svg_icons', '6.5.1')
|
||||
version = util.get_libver(self.request, 'bb_free_solid_svg_icons')
|
||||
self.assertEqual(version, '6.5.1')
|
||||
|
||||
def test_bb_vue_fontawesome_default(self):
|
||||
version = util.get_libver(self.request, 'bb_vue_fontawesome')
|
||||
self.assertEqual(version, '3.0.6')
|
||||
|
||||
def test_bb_vue_fontawesome_custom(self):
|
||||
self.config.setdefault('wuttaweb.libver.bb_vue_fontawesome', '3.0.8')
|
||||
version = util.get_libver(self.request, 'bb_vue_fontawesome')
|
||||
self.assertEqual(version, '3.0.8')
|
||||
|
||||
|
||||
class TestGetLibUrl(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.config = WuttaConfig()
|
||||
self.request = testing.DummyRequest()
|
||||
self.request.wutta_config = self.config
|
||||
|
||||
def test_buefy_default(self):
|
||||
url = util.get_liburl(self.request, 'buefy')
|
||||
self.assertEqual(url, 'https://unpkg.com/buefy@latest/dist/buefy.min.js')
|
||||
|
||||
def test_buefy_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.buefy', '/lib/buefy.js')
|
||||
url = util.get_liburl(self.request, 'buefy')
|
||||
self.assertEqual(url, '/lib/buefy.js')
|
||||
|
||||
def test_buefy_css_default(self):
|
||||
url = util.get_liburl(self.request, 'buefy.css')
|
||||
self.assertEqual(url, 'https://unpkg.com/buefy@latest/dist/buefy.min.css')
|
||||
|
||||
def test_buefy_css_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.buefy.css', '/lib/buefy.css')
|
||||
url = util.get_liburl(self.request, 'buefy.css')
|
||||
self.assertEqual(url, '/lib/buefy.css')
|
||||
|
||||
def test_vue_default(self):
|
||||
url = util.get_liburl(self.request, 'vue')
|
||||
self.assertEqual(url, 'https://unpkg.com/vue@2.6.14/dist/vue.min.js')
|
||||
|
||||
def test_vue_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.vue', '/lib/vue.js')
|
||||
url = util.get_liburl(self.request, 'vue')
|
||||
self.assertEqual(url, '/lib/vue.js')
|
||||
|
||||
def test_vue_resource_default(self):
|
||||
url = util.get_liburl(self.request, 'vue_resource')
|
||||
self.assertEqual(url, 'https://cdn.jsdelivr.net/npm/vue-resource@latest')
|
||||
|
||||
def test_vue_resource_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.vue_resource', '/lib/vue-resource.js')
|
||||
url = util.get_liburl(self.request, 'vue_resource')
|
||||
self.assertEqual(url, '/lib/vue-resource.js')
|
||||
|
||||
def test_fontawesome_default(self):
|
||||
url = util.get_liburl(self.request, 'fontawesome')
|
||||
self.assertEqual(url, 'https://use.fontawesome.com/releases/v5.3.1/js/all.js')
|
||||
|
||||
def test_fontawesome_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.fontawesome', '/lib/fontawesome.js')
|
||||
url = util.get_liburl(self.request, 'fontawesome')
|
||||
self.assertEqual(url, '/lib/fontawesome.js')
|
||||
|
||||
def test_bb_vue_default(self):
|
||||
url = util.get_liburl(self.request, 'bb_vue')
|
||||
self.assertEqual(url, 'https://unpkg.com/vue@3.4.31/dist/vue.esm-browser.prod.js')
|
||||
|
||||
def test_bb_vue_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.bb_vue', '/lib/vue.js')
|
||||
url = util.get_liburl(self.request, 'bb_vue')
|
||||
self.assertEqual(url, '/lib/vue.js')
|
||||
|
||||
def test_bb_oruga_default(self):
|
||||
url = util.get_liburl(self.request, 'bb_oruga')
|
||||
self.assertEqual(url, 'https://unpkg.com/@oruga-ui/oruga-next@0.8.12/dist/oruga.mjs')
|
||||
|
||||
def test_bb_oruga_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.bb_oruga', '/lib/oruga.js')
|
||||
url = util.get_liburl(self.request, 'bb_oruga')
|
||||
self.assertEqual(url, '/lib/oruga.js')
|
||||
|
||||
def test_bb_oruga_bulma_default(self):
|
||||
url = util.get_liburl(self.request, 'bb_oruga_bulma')
|
||||
self.assertEqual(url, 'https://unpkg.com/@oruga-ui/theme-bulma@0.3.0/dist/bulma.mjs')
|
||||
|
||||
def test_bb_oruga_bulma_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.bb_oruga_bulma', '/lib/oruga_bulma.js')
|
||||
url = util.get_liburl(self.request, 'bb_oruga_bulma')
|
||||
self.assertEqual(url, '/lib/oruga_bulma.js')
|
||||
|
||||
def test_bb_oruga_bulma_css_default(self):
|
||||
url = util.get_liburl(self.request, 'bb_oruga_bulma_css')
|
||||
self.assertEqual(url, 'https://unpkg.com/@oruga-ui/theme-bulma@0.3.0/dist/bulma.css')
|
||||
|
||||
def test_bb_oruga_bulma_css_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.bb_oruga_bulma_css', '/lib/oruga-bulma.css')
|
||||
url = util.get_liburl(self.request, 'bb_oruga_bulma_css')
|
||||
self.assertEqual(url, '/lib/oruga-bulma.css')
|
||||
|
||||
def test_bb_fontawesome_svg_core_default(self):
|
||||
url = util.get_liburl(self.request, 'bb_fontawesome_svg_core')
|
||||
self.assertEqual(url, 'https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-svg-core@6.5.2/+esm')
|
||||
|
||||
def test_bb_fontawesome_svg_core_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.bb_fontawesome_svg_core', '/lib/fontawesome-svg-core.js')
|
||||
url = util.get_liburl(self.request, 'bb_fontawesome_svg_core')
|
||||
self.assertEqual(url, '/lib/fontawesome-svg-core.js')
|
||||
|
||||
def test_bb_free_solid_svg_icons_default(self):
|
||||
url = util.get_liburl(self.request, 'bb_free_solid_svg_icons')
|
||||
self.assertEqual(url, 'https://cdn.jsdelivr.net/npm/@fortawesome/free-solid-svg-icons@6.5.2/+esm')
|
||||
|
||||
def test_bb_free_solid_svg_icons_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.bb_free_solid_svg_icons', '/lib/free-solid-svg-icons.js')
|
||||
url = util.get_liburl(self.request, 'bb_free_solid_svg_icons')
|
||||
self.assertEqual(url, '/lib/free-solid-svg-icons.js')
|
||||
|
||||
def test_bb_vue_fontawesome_default(self):
|
||||
url = util.get_liburl(self.request, 'bb_vue_fontawesome')
|
||||
self.assertEqual(url, 'https://cdn.jsdelivr.net/npm/@fortawesome/vue-fontawesome@3.0.6/+esm')
|
||||
|
||||
def test_bb_vue_fontawesome_custom(self):
|
||||
self.config.setdefault('wuttaweb.liburl.bb_vue_fontawesome', '/lib/vue-fontawesome.js')
|
||||
url = util.get_liburl(self.request, 'bb_vue_fontawesome')
|
||||
self.assertEqual(url, '/lib/vue-fontawesome.js')
|
0
tests/views/__init__.py
Normal file
0
tests/views/__init__.py
Normal file
14
tests/views/test___init__.py
Normal file
14
tests/views/test___init__.py
Normal file
|
@ -0,0 +1,14 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
from pyramid import testing
|
||||
|
||||
|
||||
class TestIncludeMe(TestCase):
|
||||
|
||||
def test_basic(self):
|
||||
with testing.testConfig() as pyramid_config:
|
||||
|
||||
# just ensure no error happens when included..
|
||||
pyramid_config.include('wuttaweb.views')
|
21
tests/views/test_base.py
Normal file
21
tests/views/test_base.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
from pyramid import testing
|
||||
|
||||
from wuttjamaican.conf import WuttaConfig
|
||||
from wuttaweb.views import base
|
||||
|
||||
|
||||
class TestView(TestCase):
|
||||
|
||||
def test_basic(self):
|
||||
config = WuttaConfig()
|
||||
request = testing.DummyRequest()
|
||||
request.wutta_config = config
|
||||
|
||||
view = base.View(request)
|
||||
self.assertIs(view.request, request)
|
||||
self.assertIs(view.config, config)
|
||||
self.assertIs(view.app, config.get_app())
|
27
tests/views/test_common.py
Normal file
27
tests/views/test_common.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest import TestCase
|
||||
|
||||
from pyramid import testing
|
||||
|
||||
from wuttjamaican.conf import WuttaConfig
|
||||
from wuttaweb.views import common
|
||||
|
||||
|
||||
class TestCommonView(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.config = WuttaConfig()
|
||||
self.app = self.config.get_app()
|
||||
self.request = testing.DummyRequest()
|
||||
self.request.wutta_config = self.config
|
||||
self.pyramid_config = testing.setUp(request=self.request)
|
||||
self.pyramid_config.include('wuttaweb.views.common')
|
||||
|
||||
def tearDown(self):
|
||||
testing.tearDown()
|
||||
|
||||
def test_home(self):
|
||||
view = common.CommonView(self.request)
|
||||
context = view.home()
|
||||
self.assertEqual(context['index_title'], self.app.get_title())
|
Loading…
Add table
Add a link
Reference in a new issue