Skip to content

Commit dd6e56d

Browse files
committed
Add __repr__ method to Field classes
Added __repr__ methods to Field classes along with associated tests. [Resolves #19]
1 parent 4284c11 commit dd6e56d

File tree

2 files changed

+171
-4
lines changed

2 files changed

+171
-4
lines changed

robobrowser/forms/fields.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,14 @@ def __init__(self, parsed):
5252
super(Input, self).__init__(parsed)
5353
self.value = self._parsed.get('value')
5454

55+
def __repr__(self):
56+
return '<Input name={0}, value={1}>'.format(self.name, self.value)
57+
5558

5659
class Submit(Input):
57-
pass
60+
61+
def __repr__(self):
62+
return '<Submit name={0}, value={1}>'.format(self.name, self.value)
5863

5964

6065
class FileInput(BaseField):
@@ -72,6 +77,9 @@ def value(self, value):
7277
# in requests.
7378
payload_key = 'files'
7479

80+
def __repr__(self):
81+
return '<FileInput name={0}, value={1}>'.format(self.name, self.value)
82+
7583

7684
class MultiOptionField(BaseField):
7785

@@ -195,13 +203,21 @@ def __init__(self, parsed):
195203
super(Textarea, self).__init__(parsed)
196204
self.value = self._parsed.text.rstrip('\r').rstrip('\n')
197205

206+
def __repr__(self):
207+
return '<Textarea name={0}, value={1}>'.format(self.name, self.value)
208+
198209

199210
class Checkbox(FlatOptionField, MultiValueField):
200-
pass
211+
212+
def __repr__(self):
213+
values = ', '.join(value for value in self.value)
214+
return '<Checkbox name={0}, value=[{1}]>'.format(self.name, values)
201215

202216

203217
class Radio(FlatOptionField, MultiOptionField):
204-
pass
218+
219+
def __repr__(self):
220+
return '<Radio name={0}, value={1}>'.format(self.name, self.value)
205221

206222

207223
class Select(NestedOptionField, MultiOptionField):
@@ -213,6 +229,12 @@ def _set_initial(self, initial):
213229
if not self._value and self.options:
214230
self.value = self.options[0]
215231

232+
def __repr__(self):
233+
return '<Select name={0}, value={1}>'.format(self.name, self.value)
234+
216235

217236
class MultiSelect(NestedOptionField, MultiValueField):
218-
pass
237+
238+
def __repr__(self):
239+
values = ', '.join(value for value in self.value)
240+
return '<MultiSelect name={0}, value=[{1}]>'.format(self.name, values)

tests/test_forms.py

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,19 @@ def test_serialize_multi(self):
147147
assert_false('submit2' in serialized.data)
148148

149149

150+
class TestSubmit(unittest.TestCase):
151+
152+
def setUp(self):
153+
self.submit = fields.Submit(
154+
'<input type="submit" name="submit1" value="value1" />')
155+
156+
def test_repr(self):
157+
assert_equal(
158+
repr(self.submit),
159+
'<Submit name=submit1, value=value1>'
160+
)
161+
162+
150163
class TestParser(unittest.TestCase):
151164

152165
def setUp(self):
@@ -282,6 +295,12 @@ def test_invalid_name(self):
282295
html = '<input />'
283296
assert_raises(exceptions.InvalidNameError, lambda: fields.Input(html))
284297

298+
def test_repr(self):
299+
assert_equal(
300+
repr(self.input),
301+
'<Input name=brian, value=may>'
302+
)
303+
285304

286305
class TestInputBlank(unittest.TestCase):
287306

@@ -299,6 +318,12 @@ def test_serialize(self):
299318
{'blank': ''}
300319
)
301320

321+
def test_repr(self):
322+
assert_equal(
323+
repr(self.input),
324+
'<Input name=blank, value=>'
325+
)
326+
302327

303328
class TestTextarea(unittest.TestCase):
304329

@@ -324,6 +349,12 @@ def test_serialize(self):
324349
{'roger': 'taylor'}
325350
)
326351

352+
def test_repr(self):
353+
assert_equal(
354+
repr(self.input),
355+
'<Textarea name=roger, value=taylor>'
356+
)
357+
327358

328359
class TestTextareaBlank(unittest.TestCase):
329360

@@ -341,6 +372,12 @@ def test_serialize(self):
341372
{'blank': ''}
342373
)
343374

375+
def test_repr(self):
376+
assert_equal(
377+
repr(self.input),
378+
'<Textarea name=blank, value=>'
379+
)
380+
344381

345382
class TestSelect(unittest.TestCase):
346383

@@ -383,6 +420,20 @@ def test_serialize(self):
383420
{'john': "you're"}
384421
)
385422

423+
def test_repr(self):
424+
# Test default for given html.
425+
assert_equal(
426+
repr(self.input),
427+
"<Select name=john, value=you're>"
428+
)
429+
430+
# Test a different value.
431+
self.input.value = 'tie'
432+
assert_equal(
433+
repr(self.input),
434+
'<Select name=john, value=tie>'
435+
)
436+
386437

387438
class TestSelectBlank(unittest.TestCase):
388439

@@ -409,6 +460,12 @@ def test_serialize(self):
409460
{'john': 'tie'}
410461
)
411462

463+
def test_repr(self):
464+
assert_equal(
465+
repr(self.input),
466+
'<Select name=john, value=tie>'
467+
)
468+
412469

413470
class TestMultiSelect(unittest.TestCase):
414471

@@ -422,6 +479,39 @@ def setUp(self):
422479
'''
423480
self.input = fields.MultiSelect(BeautifulSoup(self.html).find('select'))
424481

482+
def test_repr(self):
483+
# Test default for given html.
484+
assert_equal(
485+
repr(self.input),
486+
"<MultiSelect name=john, value=[you're]>"
487+
)
488+
489+
# Test after selecting different options.
490+
self.input.value = ['tie', "you're", 'the']
491+
assert_equal(
492+
repr(self.input),
493+
"<MultiSelect name=john, value=[tie, you're, the]>"
494+
)
495+
496+
497+
class TestMultiSelectBlank(unittest.TestCase):
498+
499+
def setUp(self):
500+
self.html = '''
501+
<select name="john" multiple>
502+
<option value="tie">your mother down</option>
503+
<option value="you're">my best friend</option>
504+
<option value="the">millionaire waltz</option>
505+
</select>
506+
'''
507+
self.input = fields.MultiSelect(BeautifulSoup(self.html).find('select'))
508+
509+
def test_repr(self):
510+
assert_equal(
511+
repr(self.input),
512+
"<MultiSelect name=john, value=[]>"
513+
)
514+
425515

426516
class TestMixedCase(unittest.TestCase):
427517

@@ -491,6 +581,20 @@ def test_serialize(self):
491581
{'members': 'mercury'}
492582
)
493583

584+
def test_repr(self):
585+
# Test default for given html.
586+
assert_equal(
587+
repr(self.input),
588+
'<Radio name=members, value=mercury>'
589+
)
590+
591+
# Test after selecting a different option.
592+
self.input.value = 'may'
593+
assert_equal(
594+
repr(self.input),
595+
'<Radio name=members, value=may>'
596+
)
597+
494598

495599
class TestRadioBlank(unittest.TestCase):
496600

@@ -512,6 +616,12 @@ def test_serialize(self):
512616
{'member': ''}
513617
)
514618

619+
def test_repr(self):
620+
assert_equal(
621+
repr(self.input),
622+
'<Radio name=member, value=>'
623+
)
624+
515625

516626
class TestCheckbox(unittest.TestCase):
517627

@@ -560,6 +670,20 @@ def test_serialize(self):
560670
{'member': ['mercury', 'deacon']}
561671
)
562672

673+
def test_repr(self):
674+
# Test default for given html.
675+
assert_equal(
676+
repr(self.input),
677+
"<Checkbox name=member, value=[mercury, deacon]>"
678+
)
679+
680+
# Test after selecting different inputs.
681+
self.input.value = ['mercury']
682+
assert_equal(
683+
repr(self.input),
684+
"<Checkbox name=member, value=[mercury]>"
685+
)
686+
563687

564688
class TestCheckboxBlank(unittest.TestCase):
565689

@@ -583,6 +707,12 @@ def test_serialize(self):
583707
{'member': []}
584708
)
585709

710+
def test_repr(self):
711+
assert_equal(
712+
repr(self.input),
713+
'<Checkbox name=member, value=[]>'
714+
)
715+
586716

587717
class TestFileInput(unittest.TestCase):
588718

@@ -615,6 +745,21 @@ def test_serialize(self):
615745
{'song': file}
616746
)
617747

748+
def test_repr(self):
749+
# Test with no file.
750+
assert_equal(
751+
repr(self.input),
752+
'<FileInput name=song, value=>'
753+
)
754+
755+
# Test with given temporary file.
756+
temp_file = tempfile.TemporaryFile('r')
757+
self.input.value = temp_file
758+
assert_equal(
759+
repr(self.input),
760+
"<FileInput name=song, value={0}>".format(temp_file)
761+
)
762+
618763

619764
class TestDisabledValues(unittest.TestCase):
620765

0 commit comments

Comments
 (0)