import unittest
from optional_django import six
import mock
from react.conf import Conf
from react.render import render_component
from react.render_server import RenderedComponent
from react.exceptions import ReactRenderingError, ComponentSourceFileNotFound
from .settings import Components
class TestRendering(unittest.TestCase):
__test__ = True
def test_can_render_a_component_in_js(self):
component = render_component(Components.HELLO_WORLD_JS, to_static_markup=True)
self.assertEqual(str(component), 'Hello ')
def test_can_render_a_component_in_jsx(self):
component = render_component(Components.HELLO_WORLD_JSX, to_static_markup=True)
self.assertEqual(str(component), 'Hello ')
def test_can_render_a_component_requiring_another_component(self):
component = render_component(
Components.HELLO_WORLD_JSX_WRAPPER,
{
'name': 'world!',
'numbers': [1, 2, 3, 4, 5],
},
to_static_markup=True
)
self.assertEqual(str(component), '
Hello world!10, 20, 30, 40, 50
')
def test_can_render_a_component_to_a_string_with_props(self):
component = render_component(
Components.HELLO_WORLD_JSX,
{'name': 'world!'},
)
markup = str(component)
self.assertNotEqual(markup, 'Hello world!')
self.assertIn('Hello ', markup)
self.assertIn('world!', markup)
def test_render_component_returns_a_rendered_component(self):
component = render_component(
Components.HELLO_WORLD_JSX,
{
'name': 'world!'
},
to_static_markup=True,
)
self.assertIsInstance(component, RenderedComponent)
self.assertEqual(component.markup, 'Hello world!')
self.assertEqual(component.markup, str(component))
if six.PY2:
self.assertEqual(component.markup, unicode(component))
def test_can_get_a_components_serialized_props(self):
component = render_component(
Components.HELLO_WORLD_JSX,
{
'name': 'world!',
},
)
self.assertEqual(component.props, '{"name": "world!"}')
def test_component_js_rendering_errors_raise_an_exception(self):
self.assertRaises(ReactRenderingError, render_component, Components.ERROR_THROWING)
self.assertRaises(ReactRenderingError, render_component, Components.ERROR_THROWING, to_static_markup=True)
def test_components_with_syntax_errors_raise_exceptions(self):
self.assertRaises(ReactRenderingError, render_component, Components.SYNTAX_ERROR)
self.assertRaises(ReactRenderingError, render_component, Components.SYNTAX_ERROR, to_static_markup=True)
def test_unserializable_props_raise_an_exception(self):
self.assertRaises(
TypeError,
render_component,
Components.HELLO_WORLD_JSX,
{'name': lambda: None}
)
self.assertRaises(
TypeError,
render_component,
Components.HELLO_WORLD_JSX,
{'name': self}
)
def test_missing_paths_throw_an_exception(self):
self.assertRaises(ComponentSourceFileNotFound, render_component, '/path/to/nothing.jsx')
# Ensure that relative paths are handled as well
self.assertRaises(ComponentSourceFileNotFound, render_component, 'path/to/nothing.jsx')
def test_render_setting_is_respected(self):
mock_settings = Conf()
mock_settings.configure(RENDER=False)
with mock.patch('react.conf.settings', mock_settings):
rendered = render_component(
Components.HELLO_WORLD_JSX,
{'name': 'world!'},
to_static_markup=True,
)
self.assertIsInstance(rendered, RenderedComponent)
self.assertEqual(rendered.markup, '')
self.assertEqual(str(rendered), '')
self.assertEqual(rendered.props, '{"name": "world!"}')