+
\ No newline at end of file
diff --git a/js/test_templates/upload_input_error_template.html b/js/test_templates/upload_input_error_template.html
new file mode 100644
index 00000000..077eaeb2
--- /dev/null
+++ b/js/test_templates/upload_input_error_template.html
@@ -0,0 +1,49 @@
+
+
+
\ No newline at end of file
diff --git a/js/test_templates/upload_input_template.html b/js/test_templates/upload_input_template.html
new file mode 100644
index 00000000..2179385f
--- /dev/null
+++ b/js/test_templates/upload_input_template.html
@@ -0,0 +1,40 @@
+
+
+
\ No newline at end of file
diff --git a/js/test_utils/component_test_helpers.js b/js/test_utils/component_test_helpers.js
new file mode 100644
index 00000000..e81d9603
--- /dev/null
+++ b/js/test_utils/component_test_helpers.js
@@ -0,0 +1,40 @@
+const fs = require('fs')
+
+/*
+Jinja templates will be exported with a root node that is a custom tag mapped to a vue component
+This wrapper allows us to mount the template and provide props. Props are provided by setting
+values on in this wrapper's data function. The names returned by the data function must align
+with the field names set in the template exporter script.
+
+In the example below, initial-checked is set to a value 'initialchecked', so
+'initialchecked' must be exported as a key from from the data function in order
+to be passed as a prop to checkboxinput at mount time
+
+*/
+const makeTestWrapper = ({ components, templatePath }) => {
+ const templateString = fs.readFileSync(
+ `js/test_templates/${templatePath}`,
+ 'utf-8'
+ )
+
+ const WrapperComponent = {
+ name: 'WrapperComponent',
+ components,
+ template: templateString,
+ props: ['initialData'],
+ data: function() {
+ return {
+ initialvalue: this.initialData,
+ }
+ },
+ }
+
+ return WrapperComponent
+}
+
+export { makeTestWrapper }
diff --git a/tests/render_vue_component.py b/tests/render_vue_component.py
new file mode 100644
index 00000000..5d9f3b08
--- /dev/null
+++ b/tests/render_vue_component.py
@@ -0,0 +1,61 @@
+import pytest
+
+from wtforms.widgets import CheckboxInput
+from wtforms.fields import StringField
+from wtforms.validators import InputRequired
+from wtforms import Form
+
+
+class InitialValueForm(Form):
+ datafield = StringField(label="initialvalue value", default="initialvalue")
+
+ errorfield = StringField(
+ label="error", validators=[InputRequired(message="Test Error Message")]
+ )
+
+
+@pytest.fixture
+def env(app, scope="function"):
+ return app.jinja_env
+
+
+@pytest.fixture
+def upload_input_macro(env):
+ # override tojson as identity function to prevent
+ # wrapping strings in extra quotes
+ env.filters["tojson"] = lambda x: x
+ upload_template = env.get_template("components/upload_input.html")
+ return getattr(upload_template.module, "UploadInput")
+
+
+@pytest.fixture
+def checkbox_input_macro(env):
+ checkbox_template = env.get_template("components/checkbox_input.html")
+ return getattr(checkbox_template.module, "CheckboxInput")
+
+
+@pytest.fixture
+def initial_value_form(scope="function"):
+ return InitialValueForm()
+
+
+def write_template(content, name):
+ with open("js/test_templates/{}".format(name), "w") as fh:
+ fh.write(content)
+
+
+def test_make_checkbox_input_template(checkbox_input_macro, initial_value_form):
+ initial_value_form.datafield.widget = CheckboxInput()
+ rendered_checkbox_macro = checkbox_input_macro(initial_value_form.datafield)
+ write_template(rendered_checkbox_macro, "checkbox_input_template.html")
+
+
+def test_make_upload_input_template(upload_input_macro, initial_value_form):
+ rendered_upload_macro = upload_input_macro(initial_value_form.datafield)
+ write_template(rendered_upload_macro, "upload_input_template.html")
+
+
+def test_make_upload_input_error_template(upload_input_macro, initial_value_form):
+ initial_value_form.validate()
+ rendered_upload_macro = upload_input_macro(initial_value_form.errorfield)
+ write_template(rendered_upload_macro, "upload_input_error_template.html")