#!/usr/bin/env python
try: True
except NameError:
True = 1
False = 0
try: bool
except NameError:
def bool(expr):
if expr: return True
else: return False
import unittest, string
from unittest import TestCase
from cStringIO import StringIO
import DOMForm as ClientForm
from DOMForm import ControlNotFoundError, ItemNotFoundError, \
ItemCountError, ParseError
# XXX
# HTMLForm.enctype
# ignore_errors
class LWPFormTests(TestCase):
"""The original tests from libwww-perl 5.64."""
def testEmptyParse(self):
window = ClientForm.ParseFile(StringIO(""), "http://localhost")
forms = window._htmlforms
self.assert_(len(forms) == 0)
def _forms(self):
file = StringIO("""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
return forms
def testParse(self):
forms = self._forms()
self.assert_(len(forms) == 1)
self.assert_(forms[0]["firstname"] == "Gisle")
def testFillForm(self):
forms = self._forms()
form = forms[0]
form["firstname"] = "Gisle Aas"
req = form.click()
def request_method(req):
if req.has_data():
return "POST"
else:
return "GET"
self.assert_(request_method(req) == "GET")
self.assert_(req.get_full_url() == "http://localhost/abc?firstname=Gisle+Aas")
class ParseTests(TestCase):
# Remember to move test for form.name somewhere else if rehash these tests
# so they don't use HTMLForm.
def testTextarea(self):
file = StringIO(
"""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
self.assert_(len(forms) == 1)
form = forms[0]
self.assert_(form.name is None)
control = form.find_control(type="textarea")
self.assert_(control.name is None)
# XXXX this is surely wrong: there should be an initial \n here
# Check DOM spec. (the old one and the new!).
self.assert_(control.value == "blah, blah,\nRhubarb.\n\n")
## self.assert_(control.value == "\nblah, blah,\nRhubarb.\n\n")
empty_control = form.find_control(type="textarea", nr=1)
self.assert_(str(empty_control) == "=)>")
self.assert_(empty_control.value == "")
def testButton(self):
file = StringIO(
"""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
self.assert_(form.name == "myform")
control = form.find_control(name="b")
self.assert_(control.type == "submitbutton")
self.assert_(control.value == "")
self.assert_(form.find_control("b2").type == "resetbutton")
self.assert_(form.find_control("b3").type == "buttonbutton")
pairs = form.click_pairs()
self.assert_(pairs == [("moo", "cow"), ("b", "")])
def testIsindex(self):
file = StringIO(
"""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
control = form.find_control(type="isindex")
self.assert_(control.type == "isindex")
self.assert_(control.name is None)
self.assert_(control.value == "")
control.value = "some stuff"
self.assert_(form.click_pairs() == [])
self.assert_(form.click_request_data() ==
("http://localhost/abc?some+stuff", None, []))
self.assert_(form.click().get_full_url() ==
"http://localhost/abc?some+stuff")
def testEmptySelect(self):
file = StringIO(
"""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
control0 = form.find_control(type="select", nr=0)
control1 = form.find_control(type="select", nr=1)
self.assert_(str(control0) == "")
self.assert_(str(control1) == "")
form.set_value([], "foo")
self.assertRaises(ItemNotFoundError, form.set_value, ["oops"], "foo")
self.assert_(form.click_pairs() == [])
# XXX figure out what to do in these sorts of cases
## def badSelect(self):
## # what objects should these generate, if any?
## # what should happen on submission of these?
## # what about similar checkboxes and radios?
## """
## """
## """
## """
##
##
## """
## """
## """
## def testBadCheckbox(self):
## # see comments above
## # split checkbox -- is it one control, or two?
## """
##
##
##
##
##
##
##
## """
def testUnnamedControl(self):
file = StringIO("""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
self.assert_(form.controls[0].name is None)
def testNamelessListControls(self):
# XXX SELECT
# these controls have no item names
file = StringIO("""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
self.assert_(form.possible_items("foo") == ["on"])
self.assert_(form.possible_items("bar") == ["on"])
#self.assert_(form.possible_items("baz") == [])
self.assert_(form["foo"] == [])
self.assert_(form["bar"] == [])
#self.assert_(form["baz"] == [])
form["foo"] = ["on"]
form["bar"] = ["on"]
pairs = form.click_pairs()
self.assert_(pairs == [("foo", "on"), ("bar", "on"), ("submit", "")])
def testBadSingleSelect(self):
# HTML 4.01 section 17.6.1: single selection SELECT controls shouldn't
# have > 1 item selected, but if they do, not more than one should end
# up selected.
file = StringIO("""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
self.assert_(form.possible_items("spam") == ["1", "2"])
nr_selected = len(form.find_control("spam").pairs())
self.assert_(nr_selected == 1)
def testSelectDefault(self):
file = StringIO(
"""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
control = form.find_control("a")
self.assert_(control.value == [])
single_control = form.find_control("b")
self.assert_(single_control.value == ["1"])
file.seek(0)
window = ClientForm.ParseFile(file, "http://localhost/",
select_default=1)
forms = window._htmlforms
form = forms[0]
# select_default only affects *multiple* selection select controls
control = form.find_control(type="select")
self.assert_(control.value == ["1"])
single_control = form.find_control(type="select", nr=1)
self.assert_(single_control.value == ["1"])
class DisabledTests(TestCase):
def testOptgroup(self):
file = StringIO(
"""""")
def get_control(name, file=file):
file.seek(0)
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
return form.find_control(name)
# can't call item_disabled with no args
control = get_control("foo")
self.assertRaises(TypeError, control.get_item_disabled)
# list controls only allow assignment to .value if no attempt is
# made to set any disabled item...
# ...multi selection
control = get_control("foo")
assert control.value == ["7"]
control.value = ["1"]
control = get_control("foo")
def assign_8(control=control): control.value = ["8"]
self.assertRaises(AttributeError, assign_8)
assert control.value == ["7"]
# even though 7 is set already, attempt to set it again fails
def assign_7(control=control): control.value = ["7"]
self.assertRaises(AttributeError, assign_7)
control.value = ["1", "3"]
control = get_control("foo")
def assign_multi(control=control): control.value = ["1", "7"]
self.assertRaises(AttributeError, assign_multi)
# enable all items
for item in control.possible_items():
control.set_item_disabled(False, item)
assign_multi()
control = get_control("foo")
for value in 7, 8, 10:
self.assert_(control.get_item_disabled(str(value)))
self.assertRaises(AttributeError, control.set, True, str(value))
control.set(False, str(value))
assert str(value) not in control.value
control.set(False, str(value))
assert str(value) not in control.value
self.assertRaises(AttributeError, control.toggle, str(value))
assert str(value) not in control.value
self.assertRaises(AttributeError, control.set, True, str(value))
assert str(value) not in control.value
control = get_control("foo")
for value in 1, 2, 3, 4, 5, 6, 9:
self.assert_(not control.get_item_disabled(str(value)))
control.set(False, str(value))
assert str(value) not in control.value
control.toggle(str(value))
assert str(value) in control.value
control.set(True, str(value))
assert str(value) in control.value
control.toggle(str(value))
assert str(value) not in control.value
control = get_control("foo")
self.assert_(control.get_item_disabled("7"))
control.toggle("7") # clearing, not setting, so no problem
self.assertRaises(AttributeError, control.set, True, "7")
control.set_item_disabled(True, "7")
self.assert_(control.get_item_disabled("7"))
self.assertRaises(AttributeError, control.set, True, "7")
control.set_item_disabled(False, "7")
self.assert_(not control.get_item_disabled("7"))
control.set(True, "7")
control.set(False, "7")
control.toggle("7")
control.toggle("7")
# ...single-selection
control = get_control("bar")
assert control.value == ["7"]
control.value = ["1"]
control = get_control("bar")
def assign_8(control=control): control.value = ["8"]
self.assertRaises(AttributeError, assign_8)
assert control.value == ["7"]
# even though 7 is set already, attempt to set it again fails
def assign_7(control=control): control.value = ["7"]
self.assertRaises(AttributeError, assign_7)
# enable all items
for item in control.possible_items():
control.set_item_disabled(False, item)
assign_7()
control = get_control("bar")
for value in 7, 8, 10:
self.assert_(control.get_item_disabled(str(value)))
self.assertRaises(AttributeError, control.set, True, str(value))
control.set(False, str(value))
assert str(value) != control.value
control.set(False, str(value))
assert str(value) != control.value
self.assertRaises(AttributeError, control.toggle, str(value))
assert str(value) != control.value
self.assertRaises(AttributeError, control.set, True, str(value))
assert str(value) != control.value
control = get_control("bar")
for value in 1, 2, 3, 4, 5, 6, 9:
self.assert_(not control.get_item_disabled(str(value)))
control.set(False, str(value))
assert str(value) not in control.value
control.toggle(str(value))
assert str(value) == control.value[0]
control.set(True, str(value))
assert str(value) == control.value[0]
control.toggle(str(value))
assert str(value) not in control.value
control = get_control("bar")
self.assert_(control.get_item_disabled("7"))
control.toggle("7") # clearing, not setting, so no problem
self.assertRaises(AttributeError, control.set, True, "7")
control.set_item_disabled(True, "7")
self.assert_(control.get_item_disabled("7"))
self.assertRaises(AttributeError, control.set, True, "7")
control.set_item_disabled(False, "7")
self.assert_(not control.get_item_disabled("7"))
control.set(True, "7")
control.set(False, "7")
control.toggle("7")
control.toggle("7")
# set_all_items_disabled
for name in "foo", "bar":
control = get_control(name)
control.set_all_items_disabled(False)
control.set(True, "7")
control.set(True, "1")
control.set_all_items_disabled(True)
self.assertRaises(AttributeError, control.set, True, "7")
self.assertRaises(AttributeError, control.set, True, "1")
# XXX single select
def testDisabledSelect(self):
file = StringIO(
"""
""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
for name, control_disabled, item_disabled in [
("foo", False, False),
("bar", False, True),
("baz", True, False),
("spam", True, True)]:
control = form.find_control(name)
self.assert_(bool(control.disabled) == control_disabled)
item = control.get_item_attrs("2")
self.assert_(bool(item.has_key("disabled")) == item_disabled)
def bad_assign(value, control=control): control.value = value
if control_disabled:
for value in "1", "2", "3":
self.assertRaises(AttributeError, control.set, True, value)
self.assertRaises(AttributeError, bad_assign, [value])
elif item_disabled:
self.assertRaises(AttributeError, control.set, True, "2")
self.assertRaises(AttributeError, bad_assign, ["2"])
for value in "1", "3":
control.set(True, value)
else:
control.value = ["1", "2", "3"]
control = form.find_control("foo")
# missing disabled arg
self.assertRaises(TypeError, control.set_item_disabled, "1")
# by_label
self.assert_(not control.get_item_disabled("a", by_label=True))
control.set_item_disabled(True, "a", by_label=True)
self.assert_(control.get_item_disabled("a", by_label=True))
def testDisabledCheckbox(self):
file = StringIO(
"""""")
window = ClientForm.ParseFile(file, "http://localhost/")
forms = window._htmlforms
form = forms[0]
for name, control_disabled, item_disabled in [
("foo", False, False),
("bar", False, True),
("baz", False, True)]:
control = form.find_control(name)
self.assert_(bool(control.disabled) == control_disabled)
item = control.get_item_attrs("2")
self.assert_(bool(item.has_key("disabled")) == item_disabled)
self.assert_(control.get_item_disabled("2") == item_disabled)
def bad_assign(value, control=control): control.value = value
if item_disabled:
self.assertRaises(AttributeError, control.set, True, "2")
self.assertRaises(AttributeError, bad_assign, ["2"])
if not control.get_item_disabled("1"):
control.set(True, "1")
else:
control.value = ["1", "2", "3"]
control = form.find_control("foo")
control.set_item_disabled(False, "1")
# missing disabled arg
self.assertRaises(TypeError, control.set_item_disabled, "1")
# by_label
self.assertRaises(NotImplementedError,
control.get_item_disabled, "a", by_label=True)
self.assert_(not control.get_item_disabled("1"))
self.assertRaises(NotImplementedError,
control.set_item_disabled, True, "a",
by_label=True)
self.assert_(not control.get_item_disabled("1"))
class ControlTests(TestCase):
def testTextControl(self):
attrs = {"name": "ath_Uname",
"value": "",
"maxlength": "20",
"id": "foo"}
def make_dom_control(type, attrs):
from DOMForm.dom.html.HTMLDocument import HTMLDocument
doc = HTMLDocument()
if type == "text":
node = doc.createElement("INPUT")
node.setAttribute("type", "TEXT")
else:
node = doc.createElement("TEXTAREA")
for key, value in attrs.items():
node.setAttribute(key.upper(), value)
klass = ClientForm.HTMLForm.type2class[type.lower()]
return klass(node)
for type in "text", "textarea":
c = make_dom_control(type, attrs)
self._testTextControl(c, type)
def _testTextControl(self, c, type):
captype = type.capitalize()
self.assert_(c.type == type)
self.assert_(c.name == "ath_Uname")
self.assert_(c.id == "foo")
self.assert_(c.value == "")
self.assert_(str(c) == "<%sControl(ath_Uname=)>" % captype)
self.assert_(c.pairs() == [("ath_Uname", "")])
def bad_assign(c=c): c.type = "sometype"
self.assertRaises(AttributeError, bad_assign)
self.assert_(c.type == type)
def bad_assign(c=c): c.name = "somename"
self.assertRaises(AttributeError, bad_assign)
self.assert_(c.name == "ath_Uname")
c.value = "2"
self.assert_(c.value == "2")
self.assert_(str(c) == "<%sControl(ath_Uname=2)>" % captype)
def bad_assign(c=c): c.value = ["foo"]
self.assertRaises(TypeError, bad_assign)
self.assert_(c.value == "2")
self.assert_(not c.readonly)
c.readonly = True
def bad_assign(c=c): c.value = "foo"
self.assertRaises(AttributeError, bad_assign)
self.assert_(c.value == "2")
c.disabled = True
self.assert_(str(c) ==
"<%sControl(ath_Uname=2) (disabled, readonly)>" % captype)
c.readonly = False
self.assert_(str(c) == "<%sControl(ath_Uname=2) (disabled)>" % captype)
self.assertRaises(AttributeError, bad_assign)
self.assert_(c.value == "2")
self.assert_(c.pairs() == [])
c.disabled = False
self.assert_(str(c) == "<%sControl(ath_Uname=2)>" % captype)
for key in "name", "value", "maxlength":
self.assert_(c.attrs.has_key(key))
def testIsindexControl(self):
## attrs = {"prompt": ">>>"}
## def make_control(type, attrs):
## from DOMForm.dom.html.HTMLDocument import HTMLDocument
## doc = HTMLDocument()
## node = doc.createElement("ISINDEX")
## for key, value in attrs.items():
## node.setAttribute(key.upper(), value)
## klass = ClientForm.HTMLForm.type2class[type.lower()]
## return klass(node)
## c = make_control("isIndex", attrs)
f = StringIO('')
window = ClientForm.ParseFile(f, "http://localhost/")
form = window._htmlforms[0]
c = form.find_control(nr=0)
self.assert_(c.type == "isindex")
self.assert_(c.name is None)
self.assert_(c.value == "")
self.assert_(str(c) == "")
self.assert_(c.pairs() == [])
def set_type(c=c): c.type = "sometype"
self.assertRaises(AttributeError, set_type)
self.assert_(c.type == "isindex")
def set_name(c=c): c.name = "somename"
self.assertRaises(AttributeError, set_name)
def set_value(value, c=c): c.value = value
self.assertRaises(TypeError, set_value, [None])
self.assert_(c.name is None)
c.value = "2"
self.assert_(c.value == "2")
self.assert_(str(c) == "")
c.disabled = True
self.assert_(str(c) == "")
self.assertRaises(AttributeError, set_value, "foo")
self.assert_(c.value == "2")
self.assert_(c.pairs() == [])
c.readonly = True
self.assert_(str(c) == "")
self.assertRaises(AttributeError, set_value, "foo")
c.disabled = False
self.assert_(str(c) == "")
self.assertRaises(AttributeError, set_value, "foo")
c.readonly = False
self.assert_(str(c) == "")
self.assert_(c.attrs.has_key("prompt"))
# XXXX sgmlop needs fixing to recognise entities in attribute values
#self.assert_(c.attrs["prompt"] == ">>>")
self.assert_(c.attrs["prompt"] == ">>>")
for key in "name", "value":
self.assert_(not c.attrs.has_key(key))
c.value = "foo 1 bar 2"
#class FakeForm: action = "http://localhost/"
#form = FakeForm()
self.assert_(c._click(form, (1,1), "request_data") ==
("http://localhost/?foo+1+bar+2", None, []))
def testSubmitControl(self):
## attrs = {"name": "name_value",
## "value": "value_value",
## "img": "foo.gif"}
## def make_dom_control(type, attrs):
## from DOMForm.dom.html.HTMLDocument import HTMLDocument
## doc = HTMLDocument()
## if type == "submit":
## node = doc.createElement("INPUT")
## node.setAttribute("type", "SUBMIT")
## else:
## node = doc.createElement("BUTTON")
## node.setAttribute("type", "SUBMIT")
## for key, value in attrs.items():
## node.setAttribute(key.upper(), value)
## klass = ClientForm.HTMLForm.type2class[type.lower()]
## return klass(node)
for type in "submit", "button":
f = StringIO("""
""" % type)
window = ClientForm.ParseFile(f, "http://foo.bar.com/")
self._testSubmitControl(type, window)
def _testSubmitControl(self, type, window):
form = window._htmlforms[0]
c = form.find_control(nr=0)
if type == "button": ctype = "buttonbutton"
else: ctype = type
self.assert_(c.type == ctype)
self.assert_(c.name == "name_value")
self.assert_(c.value == "value_value")
self.assert_(str(c) == "<%sControl(name_value=value_value) "
"(readonly)>" % type.capitalize())
def set_value(value, c=c): c.value = value
self.assertRaises(TypeError, set_value, ["foo"])
c.disabled = True
self.assertRaises(AttributeError, set_value, "value_value")
self.assert_(str(c) == "<%sControl(name_value=value_value) "
"(disabled, readonly)>" % type.capitalize())
c.disabled = False
c.readonly = False
set_value("value_value")
self.assert_(str(c) == "<%sControl(name_value=value_value)>" %
type.capitalize())
c.readonly = True
# click on button
#form = ClientForm.HTMLForm("http://foo.bar.com/")
#c.add_to_form(form)
self.assert_(c.pairs() == [])
pairs = c._click(form, (1,1), "pairs")
request = c._click(form, (1,1), "request")
data = c._click(form, (1,1), "request_data")
self.assert_(c.pairs() == [])
self.assert_(pairs == [("name_value", "value_value")])
self.assert_(request.get_full_url() ==
"http://foo.bar.com/?name_value=value_value")
self.assert_(data ==
("http://foo.bar.com/?name_value=value_value", None, []))
c.disabled = True
pairs = c._click(form, (1,1), "pairs")
request = c._click(form, (1,1), "request")
data = c._click(form, (1,1), "request_data")
self.assert_(pairs == [])
self.assert_(request.get_full_url() == "http://foo.bar.com/?")
self.assert_(data == ("http://foo.bar.com/?", None, []))
def testImageControl(self):
f = StringIO(
"""""")
window = ClientForm.ParseFile(f, "http://foo.bar.com/")
form = window._htmlforms[0]
c = form.find_control(nr=0)
self.assert_(c.type == "image")
self.assert_(c.name == "name_value")
self.assert_(c.value is None)
self.assert_(str(c) == ")>")
def set_value(value, c=c): c.value = value
self.assertRaises(AttributeError, set_value, "blah")
# click, at coordinate (0, 55), on image
self.assert_(c.pairs() == [])
request = c._click(form, (0, 55), "request")
self.assert_(c.pairs() == [])
self.assert_(request.get_full_url() ==
"http://foo.bar.com/?name_value.x=0&name_value.y=55")
self.assert_(c._click(form, (0,55), return_type="request_data") ==
("http://foo.bar.com/?name_value.x=0&name_value.y=55",
None, []))
c.disabled = True
self.assert_(str(c) == ") (disabled)>")
self.assertRaises(AttributeError, set_value, "blah")
self.assert_(c._click(form, (1,1), return_type="pairs") == [])
c.readonly = True
self.assert_(str(c) == ") "
"(disabled, readonly)>")
self.assertRaises(AttributeError, set_value, "blah")
self.assert_(c._click(form, (1,1), return_type="pairs") == [])
def testCheckboxControl(self):
attrs = {"name": "name_value",
"value": "value_value",
"alt": "some string"}
def make_dom_control(type, attrs_seq):
from DOMForm.dom.html.HTMLDocument import HTMLDocument
doc = HTMLDocument()
frag = doc.createDocumentFragment()
for attrs in attrs_seq:
node = doc.createElement("INPUT")
frag.appendChild(node)
for key, value in attrs.items():
node.setAttribute(key.upper(), value)
node.setAttribute("TYPE", type.upper())
klass = ClientForm.HTMLForm.type2class[type.lower()]
return klass(frag)
c = make_dom_control("checkbox", [attrs])
self.assert_(c.type == "checkbox")
self.assert_(c.name == "name_value")
self.assert_(c.value == [])
self.assert_(c.possible_items() == ["value_value"])
def set_type(c=c): c.type = "sometype"
self.assertRaises(AttributeError, set_type)
self.assert_(c.type == "checkbox")
def set_name(c=c): c.name = "somename"
self.assertRaises(AttributeError, set_name)
self.assert_(c.name == "name_value")
attrs2 = attrs.copy()
attrs2["value"] = "value_value2"
c = make_dom_control("checkbox", [attrs, attrs2])
self.assert_(str(c) == "")
self.assert_(c.possible_items() == ["value_value", "value_value2"])
attrs = c.get_item_attrs("value_value")
for key in "alt", "name", "value":
self.assert_(attrs.has_key(key))
self.assertRaises(ItemNotFoundError, c.get_item_attrs, "oops")
def set_value(value, c=c): c.value = value
c.value = ["value_value", "value_value2"]
self.assert_(c.value == ["value_value", "value_value2"])
c.value = ["value_value"]
self.assert_(c.value == ["value_value"])
self.assertRaises(ItemNotFoundError, set_value, ["oops"])
self.assertRaises(TypeError, set_value, "value_value")
c.value = ["value_value2"]
self.assert_(c.value == ["value_value2"])
c.toggle("value_value")
self.assert_(c.value == ["value_value", "value_value2"])
c.toggle("value_value2")
self.assert_(c.value == ["value_value"])
self.assertRaises(ItemNotFoundError, c.toggle, "oops")
# set
self.assert_(c.value == ["value_value"])
c.set(True, "value_value")
self.assert_(c.value == ["value_value"])
c.set(True, "value_value2")
self.assert_(c.value == ["value_value", "value_value2"])
c.set(True, "value_value2")
self.assert_(c.value == ["value_value", "value_value2"])
c.set(False, "value_value2")
self.assert_(c.value == ["value_value"])
c.set(False, "value_value2")
self.assert_(c.value == ["value_value"])
self.assertRaises(ItemNotFoundError, c.set, True, "oops")
self.assertRaises(TypeError, c.set, True, ["value_value"])
self.assertRaises(ItemNotFoundError, c.set, False, "oops")
self.assertRaises(TypeError, c.set, False, ["value_value"])
self.assert_(str(c) == "")
c.disabled = True
self.assertRaises(AttributeError, set_value, ["value_value"])
self.assert_(str(c) == "")
self.assert_(c.value == ["value_value"])
self.assert_(c.pairs() == [])
c.readonly = True
self.assertRaises(AttributeError, set_value, ["value_value"])
self.assert_(str(c) == "")
self.assert_(c.value == ["value_value"])
self.assert_(c.pairs() == [])
c.disabled = False
self.assert_(str(c) == "")
self.assertRaises(AttributeError, set_value, ["value_value"])
self.assert_(c.value == ["value_value"])
self.assert_(c.pairs() == [("name_value", "value_value")])
c.readonly = False
c.value = []
self.assert_(c.value == [])
def testSelectControlMultiple(self):
attrs = {"name": "name_value",
"value": "value_value",
"alt": "some string",
"label": "contents_value",
"contents": "contents_value"}
select_attrs = {"type": "select",
"name": "select_name",
"multiple": "",
"alt": "alt_text"}
def make_dom_control(type, attrs, select_attrs, select_default,
value=[]):
from DOMForm.dom.html.HTMLDocument import HTMLDocument
doc = HTMLDocument()
node = doc.createElement("SELECT")
for item_name in value:
o = doc.createElement("OPTION")
for key, value in attrs.items():
o.setAttribute(key.upper(), value)
o.value = item_name
node.appendChild(o)
for key, value in select_attrs.items():
node.setAttribute(key.upper(), value)
node._fixup(select_default)
klass = ClientForm.HTMLForm.type2class[type.lower()]
return klass(node)
# with Netscape / IE default selection...
c = make_dom_control("select", attrs, select_attrs, False,
["value_value"])
self.assert_(c.type == "select")
self.assert_(c.name == "select_name")
self.assert_(c.value == [])
self.assert_(c.possible_items() == ["value_value"])
self.assert_(c.attrs.has_key("name"))
self.assert_(c.attrs.has_key("type"))
self.assert_(c.attrs["alt"] == "alt_text")
# ... and with RFC 1866 default selection
c = make_dom_control("select", attrs, select_attrs, True,
["value_value", "value_value2"])
self.assert_(c.value == ["value_value"])
# get_item_attrs
attrs3 = c.get_item_attrs("value_value")
self.assert_(attrs3.has_key("alt"))
self.assert_(not attrs3.has_key("multiple"))
self.assertRaises(ItemNotFoundError, c.get_item_attrs, "oops")
c.value = ["value_value", "value_value2"]
self.assert_(c.value == ["value_value", "value_value2"])
c.value = ["value_value"]
self.assert_(c.value == ["value_value"])
def set_value(value, c=c): c.value = value
self.assertRaises(ItemNotFoundError, set_value, ["oops"])
self.assertRaises(TypeError, set_value, "value_value")
self.assertRaises(TypeError, set_value, None)
c.value = ["value_value2"]
self.assert_(c.value == ["value_value2"])
c.toggle("value_value")
self.assert_(c.value == ["value_value", "value_value2"])
c.toggle("value_value2")
self.assert_(c.value == ["value_value"])
self.assertRaises(ItemNotFoundError, c.toggle, "oops")
self.assert_(c.value == ["value_value"])
# test ordering of items
c.value = ["value_value2", "value_value"]
self.assert_(c.value == ["value_value", "value_value2"])
# set
c.set(True, "value_value")
self.assert_(c.value == ["value_value", "value_value2"])
c.set(True, "value_value2")
self.assert_(c.value == ["value_value", "value_value2"])
c.set(False, "value_value")
self.assert_(c.value == ["value_value2"])
c.set(False, "value_value")
self.assert_(c.value == ["value_value2"])
self.assertRaises(ItemNotFoundError, c.set, True, "oops")
self.assertRaises(TypeError, c.set, True, ["value_value"])
self.assertRaises(ItemNotFoundError, c.set, False, "oops")
self.assertRaises(TypeError, c.set, False, ["value_value"])
c.value = []
self.assert_(c.value == [])
def testSelectControlMultiple_label(self):
def make_dom_control(type, attrs_seq, select_attrs):
from DOMForm.dom.html.HTMLDocument import HTMLDocument
doc = HTMLDocument()
node = doc.createElement("SELECT")
for attrs in attrs_seq:
o = doc.createElement("OPTION")
for key, value in attrs.items():
o.setAttribute(key.upper(), value)
node.appendChild(o)
for key, value in select_attrs.items():
node.setAttribute(key.upper(), value)
klass = ClientForm.HTMLForm.type2class[type.lower()]
return klass(node)
##
select_attrs = {"type": "select",
"name": "select_name",
"multiple": ""}
attrs = {"name": "year",
"value": "0",
"label": "2002"}
attrs2 = {"name": "year",
"value": "1",
"label": "2001"} # label defaults to contents
attrs3 = {"name": "year",
"value": "2000", # value defaults to contents
"label": "2000"} # label defaults to contents
c = make_dom_control("select", [attrs, attrs2, attrs3],
select_attrs)
self.assert_(c.possible_items() == ["0", "1", "2000"])
self.assert_(c.possible_items(by_label=True) ==
["2002", "2001", "2000"])
self.assert_(c.value == [])
c.toggle("2002", by_label=True)
self.assert_(c.value == ["0"])
c.toggle("0")
self.assert_(c.value == [])
c.toggle("0")
self.assert_(c.value == ["0"])
self.assert_(c.get_value_by_label() == ["2002"])
c.toggle("2002", by_label=True)
self.assertRaises(ItemNotFoundError, c.toggle, "blah", by_label=True)
self.assert_(c.value == [])
c.toggle("2000")
self.assert_(c.value == ["2000"])
self.assert_(c.get_value_by_label() == ["2000"])
def set_value(value, c=c): c.value = value
self.assertRaises(ItemNotFoundError, set_value, ["2002"])
self.assertRaises(TypeError, set_value, "1")
self.assertRaises(TypeError, set_value, None)
self.assert_(c.value == ["2000"])
c.value = ["0"]
self.assert_(c.value == ["0"])
c.value = []
self.assertRaises(TypeError, c.set_value_by_label, "2002")
c.set_value_by_label(["2002"])
self.assert_(c.value == ["0"])
self.assert_(c.get_value_by_label() == ["2002"])
c.set_value_by_label(["2000"])
self.assert_(c.value == ["2000"])
self.assert_(c.get_value_by_label() == ["2000"])
c.set_value_by_label(["2000", "2002"])
self.assert_(c.value == ["0", "2000"])
self.assert_(c.get_value_by_label() == ["2002", "2000"])
c.set(False, "2002", by_label=True)
self.assert_(c.get_value_by_label() == c.value == ["2000"])
c.set(False, "2002", by_label=True)
self.assert_(c.get_value_by_label() == c.value == ["2000"])
c.set(True, "2002", by_label=True)
self.assert_(c.get_value_by_label() == ["2002", "2000"])
self.assert_(c.value == ["0", "2000"])
c.set(False, "2000", by_label=True)
self.assert_(c.get_value_by_label() == ["2002"])
self.assert_(c.value == ["0"])
c.set(True, "2001", by_label=True)
self.assert_(c.get_value_by_label() == ["2002", "2001"])
self.assert_(c.value == ["0", "1"])
self.assertRaises(ItemNotFoundError, c.set, True, "blah",
by_label=True)
self.assertRaises(ItemNotFoundError, c.set,
False, "blah", by_label=True)
def testSelectControlSingle_label(self):
def make_dom_control(type, attrs_seq, select_attrs):
from DOMForm.dom.html.HTMLDocument import HTMLDocument
doc = HTMLDocument()
node = doc.createElement("SELECT")
for attrs in attrs_seq:
o = doc.createElement("OPTION")
for key, value in attrs.items():
o.setAttribute(key.upper(), value)
node.appendChild(o)
for key, value in select_attrs.items():
node.setAttribute(key.upper(), value)
node._fixup(False)
klass = ClientForm.HTMLForm.type2class[type.lower()]
return klass(node)
##
select_attrs = {"type": "select",
"name": "select_name"}
attrs = {"name": "year",
"value": "0",
"label": "2002"}
attrs2 = {"name": "year",
"value": "1",
"label": "2001"} # label defaults to contents
attrs3 = {"name": "year",
"value": "2000", # value defaults to contents
"label": "2000"} # label defaults to contents
c = make_dom_control("select", [attrs, attrs2, attrs3],
select_attrs)
self.assert_(c.possible_items() == ["0", "1", "2000"])
self.assert_(c.possible_items(by_label=True) ==
["2002", "2001", "2000"])
def set_value(value, c=c): c.value = value
self.assertRaises(ItemNotFoundError, set_value, ["2002"])
self.assertRaises(TypeError, set_value, "1")
self.assertRaises(TypeError, set_value, None)
self.assert_(c.value == ["0"])
c.value = []
self.assert_(c.value == [])
c.value = ["0"]
self.assert_(c.value == ["0"])
c.value = []
self.assertRaises(TypeError, c.set_value_by_label, "2002")
self.assertRaises(ItemNotFoundError, c.set_value_by_label, ["foo"])
c.set_value_by_label(["2002"])
self.assert_(c.value == ["0"])
self.assert_(c.get_value_by_label() == ["2002"])
c.set_value_by_label(["2000"])
self.assert_(c.value == ["2000"])
self.assert_(c.get_value_by_label() == ["2000"])
def testSelectControlSingle(self):
attrs = {"name": "name_value",
"value": "value_value",
"label": "contents_value",
"contents": "contents_value"}
select_attrs = {"type": "select",
"name": "select_name",
"alt": "alt_text"}
def make_dom_control(type, attrs, select_attrs, select_default,
value=[]):
from DOMForm.dom.html.HTMLDocument import HTMLDocument
doc = HTMLDocument()
node = doc.createElement("select")
for item_name in value:
o = doc.createElement("OPTION")
for key, value in attrs.items():
o.setAttribute(key.upper(), value)
o.value = item_name
node.appendChild(o)
for key, value in select_attrs.items():
node.setAttribute(key.upper(), value)
node._fixup(select_default)
klass = ClientForm.HTMLForm.type2class[type.lower()]
return klass(node)
# Netscape and IE behaviour...
c = make_dom_control("select", attrs, select_attrs, False,
["value_value"])
self.assert_(c.type == "select")
self.assert_(c.name == "select_name")
self.assert_(c.value == ["value_value"])
self.assert_(c.possible_items() == ["value_value"])
self.assert_(c.attrs.has_key("name"))
self.assert_(c.attrs.has_key("type"))
self.assert_(c.attrs["alt"] == "alt_text")
# ...and RFC 1866 behaviour are identical (unlike multiple SELECT).
c = make_dom_control("select", attrs, select_attrs, True,
["value_value", "value_value2"])
self.assert_(c.value == ["value_value"])
self.assert_(str(c) == "")
c.value = []
self.assert_(c.value == [])
self.assert_(str(c) == "")
c.value = ["value_value"]
self.assert_(c.value == ["value_value"])
self.assert_(str(c) == "")
self.assert_(c.possible_items() == ["value_value", "value_value2"])
def set_value(value, c=c): c.value = value
self.assertRaises(ItemCountError, set_value,
["value_value", "value_value2"])
self.assertRaises(TypeError, set_value, "value_value")
self.assertRaises(TypeError, set_value, None)
c.value = ["value_value2"]
self.assert_(c.value == ["value_value2"])
c.value = ["value_value"]
self.assert_(c.value == ["value_value"])
self.assertRaises(ItemNotFoundError, set_value, ["oops"])
self.assert_(c.value == ["value_value"])
c.toggle("value_value")
self.assertRaises(ItemNotFoundError, c.toggle, "oops")
self.assertRaises(TypeError, c.toggle, ["oops"])
self.assert_(c.value == [])
c.value = ["value_value"]
self.assert_(c.value == ["value_value"])
# nothing selected is allowed
c.value = []
self.assert_(c.value == [])
# set
c.set(True, "value_value")
self.assert_(c.value == ["value_value"])
c.set(True, "value_value")
self.assert_(c.value == ["value_value"])
c.set(True, "value_value2")
self.assert_(c.value == ["value_value2"])
c.set(False, "value_value")
self.assert_("value_value2")
c.set(False, "value_value2")
self.assert_(c.value == [])
c.set(False, "value_value2")
self.assert_(c.value == [])
self.assertRaises(ItemNotFoundError, c.set, True, "oops")
self.assertRaises(TypeError, c.set, True, ["value_value"])
self.assertRaises(ItemNotFoundError, c.set, False, "oops")
self.assertRaises(TypeError, c.set, False, ["value_value"])
def testRadioControl(self):
attrs = {"name": "name_value",
"value": "value_value",
"id": "blah"}
def make_dom_control(type, attrs_seq, select_default=False):
from DOMForm.dom.html.HTMLDocument import HTMLDocument
doc = HTMLDocument()
frag = doc.createDocumentFragment()
for attrs in attrs_seq:
node = doc.createElement("INPUT")
frag.appendChild(node)
for key, value in attrs.items():
node.setAttribute(key.upper(), value)
node.setAttribute("TYPE", type.upper())
# node._fixup() # XXXX implement me -- needs subclass of
# DocumentFragment with this method
klass = ClientForm.HTMLForm.type2class[type.lower()]
c = klass(frag)
# XXXX while _fixup is still not implemented, hack it:
if select_default:
c.set(True, c.possible_items()[0])
return c
# Netscape and IE behaviour...
c = make_dom_control("radio", [attrs])
self.assert_(c.type == "radio")
self.assert_(c.name == "name_value")
self.assert_(c.id == "blah")
self.assert_(c.value == [])
self.assert_(c.possible_items() == ["value_value"])
attrs2 = attrs.copy()
attrs2["value"] = "value_value2"
# ...and RFC 1866 behaviour
c = make_dom_control("radio", [attrs, attrs2], True)
self.assert_(c.value == ["value_value"])
self.assert_(str(c) == "")
self.assert_(c.possible_items() == ["value_value", "value_value2"])
def set_value(value, c=c): c.value = value
self.assertRaises(ItemCountError, set_value,
["value_value", "value_value2"])
self.assertRaises(TypeError, set_value, "value_value")
self.assert_(c.value == ["value_value"])
c.value = ["value_value2"]
self.assert_(c.value == ["value_value2"])
c.value = ["value_value"]
self.assert_(c.value == ["value_value"])
self.assertRaises(ItemNotFoundError, set_value, ["oops"])
self.assert_(c.value == ["value_value"])
c.toggle("value_value")
self.assert_(c.value == [])
c.toggle("value_value")
self.assert_(c.value == ["value_value"])
self.assertRaises(TypeError, c.toggle, ["value_value"])
self.assert_(c.value == ["value_value"])
# nothing selected is allowed
c.value = []
self.assert_(c.value == [])
# set
c.set(True, "value_value")
self.assert_(c.value == ["value_value"])
c.set(True, "value_value")
self.assert_(c.value == ["value_value"])
c.set(True, "value_value2")
self.assert_(c.value == ["value_value2"])
c.set(False, "value_value")
self.assert_("value_value2")
c.set(False, "value_value2")
self.assert_(c.value == [])
c.set(False, "value_value2")
self.assert_(c.value == [])
self.assertRaises(ItemNotFoundError, c.set, True, "oops")
self.assertRaises(TypeError, c.set, True, ["value_value"])
self.assertRaises(ItemNotFoundError, c.set, False, "oops")
self.assertRaises(TypeError, c.set, False, ["value_value"])
class FormTests(TestCase):
base_uri = "http://auth.athensams.net/"
## def test_click(self):
## file = StringIO(
## """
## """)
## window = ClientForm.ParseFile(file, "http://blah/")
## forms = window._htmlforms
## form = forms[0]
## self.assertRaises(ControlNotFoundError, form.click, nr=1)
def test_click(self):
file = StringIO(
"""
""")
form = ClientForm.ParseFile(file, "http://blah/")._htmlforms[0]
self.assertRaises(ControlNotFoundError, form.click, nr=2)
self.assert_(form.click().get_full_url() == "http://blah/abc?foo=")
self.assert_(form.click(name="bar").get_full_url() == "http://blah/abc?bar=")
file = StringIO(
"""
""")
form = ClientForm.ParseFile(file, "http://blah/")._htmlforms[0]
self.assert_(form.click().get_full_url() == "http://blah/abc?bang=whizz&foo=")
def testAuth(self):
file = open("./testdata/Auth.html", "r")
window = ClientForm.ParseFile(file, self.base_uri)
forms = window._htmlforms
self.assert_(len(forms) == 1)
form = forms[0]
base = "http://auth.athensams.net/"
action = ("/?ath_returl=%22http%3A%2F%2Ftame.mimas.ac.uk%2Fisicgi"
"%2FWOS-login.cgi%22&ath_dspid=MIMAS.WOS")
self.assert_(form.base_uri == base)
self.assert_(form.action == action)
self.assertRaises(ControlNotFoundError,
lambda form=form: form.toggle("d'oh", "oops"))
self.assertRaises(ControlNotFoundError, lambda form=form: form["oops"])
def bad_assign(form=form): form["oops"] = ["d'oh"]
self.assertRaises(ControlNotFoundError, bad_assign)
self.assertRaises(ValueError, form.find_control)
keys = ["ath_uname", "ath_passwd"]
values = ["", ""]
types = ["text", "password"]
for i in range(len(keys)):
key = keys[i]
c = form.find_control(key)
self.assert_(c.value == values[i])
self.assert_(c.type == types[i])
c = form.find_control(type="image")
self.assert_(c.name is None)
self.assert_(c.value is None)
self.assert_(c.type == "image")
form["ath_uname"] = "jbloggs"
form["ath_passwd"] = "foobar"
self.assert_(form.click_pairs() ==
[("ath_uname", "jbloggs"),
("ath_passwd", "foobar")])
def testSearchType(self):
file = open("./testdata/SearchType.html", "r")
window = ClientForm.ParseFile(file, self.base_uri)
forms = window._htmlforms
self.assert_(len(forms) == 1)
form = forms[0]
keys = ["SID", "SESSION_DIR", "Full Search", "Easy Search",
"New Session", "Log off", "Form", "JavaScript"]
values = ["PMrU0IJYy4MAAELSXic_E2011300_PMrU0IJYy4MAAELSXic-0",
"", None, None, None, None, "Welcome", "No"]
types = ["hidden", "hidden", "image", "image", "image", "image",
"hidden", "hidden"]
for i in range(len(keys)):
key = keys[i]
self.assert_(form.find_control(key).value == values[i])
self.assert_(form.find_control(key).type == types[i])
pairs = form.click_pairs("Full Search")
self.assert_(pairs == [
("SID", "PMrU0IJYy4MAAELSXic_E2011300_PMrU0IJYy4MAAELSXic-0"),
("SESSION_DIR", ""), ("Full Search.x", 1), ("Full Search.y", 1),
("Form", "Welcome"), ("JavaScript", "No")])
def testFullSearch(self):
pass # XXX
def testGeneralSearch(self):
file = open("./testdata/GeneralSearch.html", "r")
window = ClientForm.ParseFile(file, self.base_uri)
forms = window._htmlforms
self.assert_(len(forms) == 1)
form = forms[0]
keys = ["SID", "SESSION_DIR",
"Home", "Date & Database Limits", "Cited Ref Search",
"Log off", "Search",
"topic", "titleonly", "author", "journal", "address",
"Search", "Save query", "Clear",
"languagetype", "doctype", "Sort",
"Form", "Func"]
values = ["PMrU0IJYy4MAAELSXic_E2011300_PMrU0IJYy4MAAELSXic-0", "",
None, None, None, None, None,
"", [], "", "", "",
None, None, None,
["All languages"], ["All document types"], ["Latest date"],
"General", "Search"]
types = ["hidden", "hidden",
"image", "image", "image", "image", "image",
"text", "checkbox", "text", "text", "text",
"image", "image", "image",
"select", "select", "select",
"hidden", "hidden"]
fc = form.find_control
for i in range(len(keys)):
name = keys[i]
type = types[i]
self.assert_(fc(name).value == form.get_value(name) == values[i])
self.assert_(fc(name).type == type)
self.assert_(fc(name, type).name == name)
self.assert_(fc(type="hidden").name == "SID")
self.assert_(fc(type="image").name == "Home")
self.assert_(fc(nr=6).name == "Search")
self.assertRaises(ControlNotFoundError, fc, nr=50)
self.assertRaises(ValueError, fc, nr=-1)
self.assert_(fc("Search", "image").name == "Search")
self.assertRaises(ControlNotFoundError, fc, "Search", "hidden")
s0 = fc("Search", "image", nr=0)
s0b = fc("Search", "image", nr=0)
s1 = fc("Search", "image", nr=1)
self.assert_(s0.name == s1.name == "Search")
self.assert_(s0 is s0b)
self.assert_(s0 is not s1)
self.assertRaises(ControlNotFoundError, fc, "Search", "image", nr=2)
self.assert_(fc(type="text", nr=2).name == "journal")
self.assert_(fc("Search", nr=0) is not fc("Search", nr=1))
form["topic"] = "foo"
self.assert_(form["topic"] == "foo")
form["author"] = "bar"
form["journal"] = ""
form["address"] = "baz"
form["languagetype"] = ["English", "Catalan"]
self.assert_(form["languagetype"] == ["English", "Catalan"])
form["titleonly"] = ["on"]
self.assert_(form["titleonly"] == ["on"])
pairs = form.click_pairs("Search")
self.assert_(pairs == [
("SID", "PMrU0IJYy4MAAELSXic_E2011300_PMrU0IJYy4MAAELSXic-0"),
("SESSION_DIR", ""),
("Search.x", 1), ("Search.y", 1),
("topic", "foo"),
("titleonly", "on"),
("author", "bar"),
("journal", ""), ("address", "baz"),
("languagetype", "English"), ("languagetype", "Catalan"),
("doctype", "All document types"), ("Sort", "Latest date"),
("Form", "General"), ("Func", "Search")])
pvs = form.possible_items("languagetype")
self.assert_(pvs[0] == "All languages")
self.assert_(len(pvs) == 47)
self.assertRaises(
ItemNotFoundError,
lambda form=form: form.toggle("d'oh", "languagetype"))
form.toggle("English", "languagetype")
self.assert_(form["languagetype"] == ["Catalan"])
self.assertRaises(TypeError, form.toggle, ["Catalan"], "languagetype")
self.assertRaises(TypeError, form.toggle, "Catalan", ["languagetype"])
# XXX type, nr, by_label args
self.assertRaises(ControlNotFoundError, form.set, True, "blah", "SID")
# multiple select
form["languagetype"] = []
self.assert_(form["languagetype"] == [])
form.set(True, "Catalan", "languagetype")
self.assert_(form["languagetype"] == ["Catalan"])
form.set(True, "English", "languagetype")
self.assert_(form["languagetype"] == ["English", "Catalan"])
form.set(False, "English", "languagetype")
self.assert_(form["languagetype"] == ["Catalan"])
form.set(False, "Catalan", "languagetype")
self.assert_(form["languagetype"] == [])
self.assertRaises(ItemNotFoundError, form.set, True, "doh", "languagetype")
self.assertRaises(ItemNotFoundError, form.set, False, "doh", "languagetype")
self.assertRaises(ControlNotFoundError, form.set, True, "blah", "oops")
self.assertRaises(TypeError, form.set, True, ["Catalan"], "languagetype")
self.assertRaises(TypeError, form.set, False, ["Catalan"], "languagetype")
self.assertRaises(TypeError, form.set, True, "Catalan", ["languagetype"])
self.assertRaises(TypeError, form.set, False, "Catalan", ["languagetype"])
def setitem(name, value, form=form): form[name] = value
form["languagetype"] = ["Catalan"]
self.assert_(form["languagetype"] == ["Catalan"])
self.assertRaises(ItemNotFoundError,
setitem, "languagetype", ["doh"])
self.assertRaises(ControlNotFoundError, setitem, "oops", ["blah"])
self.assertRaises(TypeError, setitem, ["languagetype"], "Catalan")
# single select
form["Sort"] = []
self.assert_(form["Sort"] == [])
form.set(True, "Relevance", "Sort")
self.assert_(form["Sort"] == ["Relevance"])
form.set(True, "Times Cited", "Sort")
self.assert_(form["Sort"] == ["Times Cited"])
form.set(False, "Times Cited", "Sort")
self.assert_(form["Sort"] == [])
self.assertRaises(ItemNotFoundError, form.set, True, "doh", "Sort")
self.assertRaises(ItemNotFoundError, form.set, False, "doh", "Sort")
self.assertRaises(ControlNotFoundError, form.set, True, "blah", "oops")
self.assertRaises(TypeError, form.set, True, ["Relevance"], "Sort")
self.assertRaises(TypeError, form.set, False, ["Relevance"], "Sort")
self.assertRaises(TypeError, form.set, True, "Relevance", ["Sort"])
self.assertRaises(TypeError, form.set, False, "Relevance", ["Sort"])
form["Sort"] = ["Relevance"]
self.assert_(form["Sort"] == ["Relevance"])
self.assertRaises(ItemNotFoundError,
setitem, "Sort", ["doh"])
self.assertRaises(ControlNotFoundError, setitem, "oops", ["blah"])
self.assertRaises(TypeError, setitem, ["Sort"], ["Relevance"])
def testResults(self):
file = open("./testdata/Results.html", "r")
window = ClientForm.ParseFile(file, self.base_uri)
forms = window._htmlforms
self.assert_(len(forms) == 1)
form = forms[0]
pvs = form.possible_items("marked_list_candidates")
self.assert_(pvs == [
"000174872000059/1", "000174858300003/2", "000174827900006/3"])
def bad_setitem(form=form):
form["marked_list_candidates"] = ["blah"]
self.assertRaises(ItemNotFoundError, bad_setitem)
form["marked_list_candidates"] = [pvs[0]]
# I've removed most of the INPUT elements from this page, and
# corrected an HTML error
keys = ["Add marked records to list",
"Add records on page to list",
"Add all records retrieved to list",
"marked_list_candidates",
"Add marked records to list",
"Add records on page to list",
"Add all records retrieved to list"
]
types = ["image", "image", "image",
"checkbox",
"image", "image", "image"]
values = [None, None, None,
[pvs[0]],
None, None, None
]
for i in range(len(keys)):
key = keys[i]
control = form.find_control(key)
self.assert_(control.value == values[i])
self.assert_(control.type == types[i])
pairs = form.click_pairs("Add all records retrieved to list")
self.assert_(pairs == [
("Add all records retrieved to list.x", 1),
("Add all records retrieved to list.y", 1),
("marked_list_candidates", pvs[0])])
def testMarkedResults(self):
file = open("./testdata/MarkedResults.html", "r")
window = ClientForm.ParseFile(file, self.base_uri)
forms = window._htmlforms
self.assert_(len(forms) == 1)
form = forms[0]
pairs = form.click_pairs()
# I've removed most of the INPUT elements from this page, and
# corrected an HTML error
self.assert_(pairs == [
("Add marked records to list.x", 1),
("Add marked records to list.y", 1),
("marked_list_candidates", "000174872000059/1"),
("marked_list_candidates", "000174858300003/2"),
("marked_list_candidates", "000174827900006/3")
])
def testMarkedRecords(self):
pass # XXX
class MoreFormTests(TestCase):
def make_form(self):
f = StringIO("""\
""")
window = ClientForm.ParseFile(f, "http://blah/")
return window._htmlforms[0]
def test_value(self):
form = self.make_form()
form.set_value(["v3"], type="select", kind="multilist")
self.assert_(form.get_value("d") == ["v3"])
form.set_value(["l2"], type="select", kind="multilist", by_label=True)
self.assert_(form.get_value("d", by_label=True) == ["l2"])
self.assert_(form.get_value(
"b", "radio", "singlelist", None, 0, False) == [])
self.assertRaises(NotImplementedError,
form.set_value, ["1"], "b", by_label=True)
def test_id(self):
form = self.make_form()
self.assert_(form.find_control("c").id == "cselect")
self.assert_(form.find_control("a").id == "1a")
self.assert_(form.find_control("b").id is None)
self.assert_(form.find_control(id="cselect").id == "cselect")
self.assertRaises(ControlNotFoundError, form.find_control,
id="coption1")
self.assert_(form.find_control(id="1a").id == "1a")
self.assertRaises(ControlNotFoundError, form.find_control, id="1")
def test_single(self):
form = self.make_form()
self.assertRaises(ItemCountError, form.set_single, True, "d")
self.assertRaises(NotImplementedError,
form.set_single, True, "e", by_label=True)
form.toggle_single("e", "checkbox", "list", nr=0)
self.assert_("1" in form.get_value("e"))
form.set_single(False, "e", "checkbox", "list", nr=0)
self.assert_("1" not in form.get_value("e"))
form.set_single(True, "e", "checkbox", "list", nr=0)
self.assert_("1" in form.get_value("e"))
def test_possible_items(self):
form = self.make_form()
self.assert_(form.possible_items("c") == ["1", "2", "3"])
self.assert_(form.possible_items("d", by_label=True) ==
["l1", "l2", "l3"])
self.assert_(form.possible_items("a") == ["1", "2", "3"])
self.assertRaises(NotImplementedError,
form.possible_items, "a", by_label=True)
def test_set_all_readonly(self):
form = self.make_form()
form.set_all_readonly(True)
for c in form.controls:
self.assert_(c.readonly)
form.set_all_readonly(False)
for c in form.controls:
self.assert_(not c.readonly)
def test_attrs(self):
form = self.make_form()
self.assert_(form.attrs["blah"] == "nonsense")
a = form.find_control("a")
self.assert_(not hasattr(a, "attrs"))
self.assert_(a.get_item_attrs("1")["blah"] == "spam")
self.assert_(a.get_item_attrs("2")["blah"] == "eggs")
self.assert_(not a.get_item_attrs("3").has_key("blah"))
c = form.find_control("c")
self.assert_(c.attrs["blah"] == "foo")
self.assert_(c.get_item_attrs("1")["blah"] == "bar")
self.assert_(c.get_item_attrs("2")["blah"] == "baz")
self.assert_(not c.get_item_attrs("3").has_key("blah"))
def startswith(string, initial):
if len(initial) > len(string): return False
return string[:len(initial)] == initial
class CaseInsensitiveDict:
def __init__(self, dict):
self._dict = {}
for key, val in dict.items():
self._dict[string.lower(key)] = val
def __getitem__(self, key): return self._dict[key]
def __getattr__(self, name): return getattr(self._dict, name)
class UploadTests(TestCase):
def make_form(self):
html = """\
"""
window = ClientForm.ParseFile(StringIO(html),
"http://localhost/cgi-bin/upload.cgi")
return window._htmlforms[0]
def test_file_request(self):
import cgi
# fill in a file upload form...
form = self.make_form()
form["user"] = "john"
data_control = form.find_control("data")
data = "blah\nbaz\n"
data_control.add_file(StringIO(data))
req = form.click()
self.assert_(startswith(req.headers["Content-type"],
'multipart/form-data; boundary="'))
# ...and check the resulting request is understood by cgi module
fs = cgi.FieldStorage(StringIO(req.get_data()),
CaseInsensitiveDict(req.headers),
environ={"REQUEST_METHOD": "POST"})
self.assert_(fs["user"].value == "john")
self.assert_(fs["data"].value == data)
self.assert_(fs["data"].filename is None)
def test_file_request_with_filename(self):
import cgi
# fill in a file upload form...
form = self.make_form()
form["user"] = "john"
data_control = form.find_control("data")
data = "blah\nbaz\n"
data_control.add_file(StringIO(data), filename="afilename")
req = form.click()
self.assert_(startswith(req.headers["Content-type"],
'multipart/form-data; boundary="'))
# ...and check the resulting request is understood by cgi module
fs = cgi.FieldStorage(StringIO(req.get_data()),
CaseInsensitiveDict(req.headers),
environ={"REQUEST_METHOD": "POST"})
self.assert_(fs["user"].value == "john")
self.assert_(fs["data"].value == data)
self.assert_(fs["data"].filename == "afilename")
def test_multipart_file_request(self):
import cgi
# fill in a file upload form...
form = self.make_form()
form["user"] = "john"
data_control = form.find_control("data")
data = "blah\nbaz\n"
data_control.add_file(StringIO(data), filename="filenamea")
more_data = "rhubarb\nrhubarb\n"
data_control.add_file(StringIO(more_data), filename="filenameb")
yet_more_data = "rheum\nrhaponicum\n"
data_control.add_file(StringIO(yet_more_data), filename="filenamec")
req = form.click()
self.assert_(startswith(req.headers["Content-type"],
'multipart/form-data; boundary="'))
# ...and check the resulting request is understood by cgi module
fs = cgi.FieldStorage(StringIO(req.get_data()),
CaseInsensitiveDict(req.headers),
environ={"REQUEST_METHOD": "POST"})
self.assert_(fs["user"].value == "john")
fss = fs["data"][None]
filenames = "filenamea", "filenameb", "filenamec"
datas = data, more_data, yet_more_data
for i in range(len(fss)):
fs = fss[i]
filename = filenames[i]
data = datas[i]
self.assert_(fs.filename == filename)
self.assert_(fs.value == data)
def test_upload_data(self):
form = self.make_form()
data = form.click().get_data()
self.assert_(startswith(data, "--"))
def test_empty_upload(self):
# no controls except for INPUT/SUBMIT
window = ClientForm.ParseFile(StringIO("""
"""), ".")
form = window._htmlforms[0]
data = form.click().get_data()
lines = string.split(data, "\r\n")
self.assert_(startswith(lines[0], "--"))
self.assert_(lines[1] ==
'Content-disposition: form-data; name="submit"')
self.assert_(lines[2] == lines[3] == "")
self.assert_(startswith(lines[4], "--"))
if __name__ == "__main__":
unittest.main()