File: test_forms.py

package info (click to toggle)
gavodachs 2.11%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 8,972 kB
  • sloc: python: 100,078; xml: 3,014; javascript: 2,360; ansic: 918; sh: 216; makefile: 31
file content (136 lines) | stat: -rw-r--r-- 3,788 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
"""
Tests form async behaviour of gavo.formal.
"""

#c Copyright 2008-2024, the GAVO project <gavo@ari.uni-heidelberg.de>
#c
#c This program is free software, covered by the GNU GPL.  See the
#c COPYING file in the source distribution.


from twisted.web import template
from twisted.web.template import tags as T

from gavo import formal
from gavo.formal import validation
from gavo.helpers import trialhelpers

FK = formal.FORMS_KEY

class FormalTestResource(formal.ResourceWithForm):
	isLeaf = True
	result = None

	def form_borken(self, request):
		if request.args.get(b"input")==[b"break early"]:
			raise ValueError("Broken")

		form = formal.Form()
		form.addField("anint", formal.Integer(),
			label="A test integer input")
		form.addField("input", formal.String(),
			label="A test text input")
		form.addAction(self.evaluateBroken)
		return form
	
	def evaluateBroken(self, request, form, data):
		if data["input"]=="break late":
			return 1/0
		if data["input"]=="invalid":
			raise validation.FieldValidationError("Don't like that input",
				fieldName="input")
		self.result = "Ok: "+data["input"]

	@template.renderer
	def insertResult(self, request, tag):
		if self.result is None:
			return ""
		else:
			return tag[self.result]

	loader = template.TagLoader(T.html[
		T.body[T.p["Before form"],
			T.p(class_="result")(render="insertResult"),
			T.transparent(render="form borken"),
			T.p["After form"]]])


class BasicFormalTests(trialhelpers.RenderTest):
	@property
	def renderer(self):
		return FormalTestResource()

	def testFormEvaluationWoks(self):
		return self.assertPOSTHasStrings("/",
			{FK: ["borken"], "input": ["123"]}, [
			'<p class="result">Ok: 123'])

	def testGETDoesNotEvaluate(self):
		return self.assertGETLacksStrings("/",
			{FK: ["borken"], "input": ["123"]}, [
			"Ok: 123"])

	def testFormEvaluationErrorReported(self):
		return self.assertPOSTHasStrings("/",
			{FK: ["borken"], "input": ["invalid"]}, [
			'<p>Please correct the following error(s):',
			"Don't like that input</li>",
			'class="field string textinput error"',
			'value="invalid"'])

	def testFormRender(self):
		return self.assertGETHasStrings("/", {}, [
			'<form',
			'class="nevow-form"',
			'id="borken"',
			'action=""', 'method="post"',
			' id="borken-input-field" ',
			'<label', 'for="borken-input">',
			'A test text input</label>',
			'id="borken-action-submit"',
			'<p>Before form</p>',
			'<p>After form</p>'])

	def testBrokenHandlerTerminates(self):
		return self.assertPOSTHasStrings("/",
			{FK: ["borken"], "input": ["break late"]}, [
			"Unhandled exception while handling the form:"])

	def testBrokenFormMakerTerminates(self):
		return self.assertPOSTHasStrings("/",
			{FK: ["borken"], "input": ["break early"]}, [
			  "\n\nBroken", "Unhandled exception while handling the form:"])

	def testGETFillsEvenBrokenValues(self):
		return self.assertGETHasStrings("/honk",
			{FK: ["borken"], "input": ["break late"]}, [
			'action="honk"', 'value="break late"'])

	def testFormErrorInline(self):
		return self.assertPOSTHasStrings("/",
			{FK: ["borken"], "anint": ["invalid"]}, [
			"<p>Please correct the following error(s):",
			'<div class="message">Not a valid number</div>',
			'value="invalid"'])


class GettableTestResource(FormalTestResource):
	processOnGET = True


class ExtraGETTests(trialhelpers.RenderTest):
	@property
	def renderer(self):
		return GettableTestResource()

	def testFormEvaluationOnGET(self):
		return self.assertPOSTHasStrings("/",
			{FK: ["borken"], "input": ["123"]}, [
			"Ok: 123"])

	def testGETErrors(self):
		return self.assertGETHasStrings("/",
			{FK: ["borken"], "anint": ["invalid"]}, [
			"<p>Please correct the following error(s):",
			'<div class="message">Not a valid number</div>',
			'value="invalid"'])