From b8f00ace1ac9d7f325456fff4c99ea8a7e04b648 Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Sat, 22 Mar 2008 21:06:55 +0000 Subject: [PATCH] [3.1.0] - Add tests for the atoms. - Add Id validation for Directives git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1623 48356398-32a2-884e-a903-53898d9a118a --- library/HTMLPurifier/ConfigSchema/Validator.php | 18 ++++++- .../HTMLPurifier/ConfigSchema/ValidatorAtom.php | 11 ++-- .../ConfigSchema/ValidatorAtomTest.php | 58 ++++++++++++++++++++++ tests/HTMLPurifier/ConfigSchema/ValidatorTest.php | 30 ++++++----- 4 files changed, 98 insertions(+), 19 deletions(-) create mode 100644 tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php diff --git a/library/HTMLPurifier/ConfigSchema/Validator.php b/library/HTMLPurifier/ConfigSchema/Validator.php index ff10a93a..48c0f82a 100644 --- a/library/HTMLPurifier/ConfigSchema/Validator.php +++ b/library/HTMLPurifier/ConfigSchema/Validator.php @@ -30,7 +30,6 @@ class HTMLPurifier_ConfigSchema_Validator public function validateNamespace($n) { $this->context = "namespace '{$n->namespace}'"; $this->with($n, 'namespace') - ->assertIsString() ->assertNotEmpty() ->assertAlnum(); $this->with($n, 'description') @@ -40,12 +39,27 @@ class HTMLPurifier_ConfigSchema_Validator public function validateDirective($d) { $this->context = "directive '{$d->id}'"; + $this->validateId($d->id); + } + + public function validateId($id) { + $this->context = "id '$id'"; + $this->with($id, 'namespace') + ->assertNotEmpty() + ->assertAlnum(); + $this->with($id, 'directive') + ->assertNotEmpty() + ->assertAlnum(); } // protected helper functions protected function with($obj, $member) { - return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->interchange, $this->context, $obj, $member); + return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->context, $obj, $member); + } + + protected function error($msg) { + throw new HTMLPurifier_ConfigSchema_Exception($msg . ' in ' . $this->context); } } diff --git a/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php index 0ebacf80..b799d67b 100644 --- a/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php +++ b/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php @@ -3,15 +3,15 @@ /** * Fluent interface for validating the contents of member variables. * This should be immutable. See HTMLPurifier_ConfigSchema_Validator for - * use-cases. + * use-cases. We name this an 'atom' because it's ONLY for validations that + * are independent and usually scalar. */ class HTMLPurifier_ConfigSchema_ValidatorAtom { - protected $interchange, $context, $obj, $member, $contents; + protected $context, $obj, $member, $contents; - public function __construct($interchange, $context, $obj, $member) { - $this->interchange = $interchange; + public function __construct($context, $obj, $member) { $this->context = $context; $this->obj = $obj; $this->member = $member; @@ -24,11 +24,12 @@ class HTMLPurifier_ConfigSchema_ValidatorAtom } public function assertNotNull() { - if (is_null($this->contents)) $this->error('must not be null'); + if ($this->contents === null) $this->error('must not be null'); return $this; } public function assertAlnum() { + $this->assertIsString(); if (!ctype_alnum($this->contents)) $this->error('must be alphanumeric'); return $this; } diff --git a/tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php b/tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php new file mode 100644 index 00000000..7dc027f9 --- /dev/null +++ b/tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php @@ -0,0 +1,58 @@ +expectException(new HTMLPurifier_ConfigSchema_Exception($msg)); + } + + public function makeAtom($value) { + $obj = new stdClass(); + $obj->property = $value; + // Note that 'property' and 'context' are magic wildcard values + return new HTMLPurifier_ConfigSchema_ValidatorAtom('context', $obj, 'property'); + } + + public function testAssertIsString() { + $this->makeAtom('foo')->assertIsString(); + } + + public function testAssertIsStringFail() { + $this->expectValidationException("Member variable 'property' in context must be a string"); + $this->makeAtom(3)->assertIsString(); + } + + public function testAssertNotNull() { + $this->makeAtom('foo')->assertNotNull(); + } + + public function testAssertNotNullFail() { + $this->expectValidationException("Member variable 'property' in context must not be null"); + $this->makeAtom(null)->assertNotNull(); + } + + public function testAssertAlnum() { + $this->makeAtom('foo2')->assertAlnum(); + } + + public function testAssertAlnumFail() { + $this->expectValidationException("Member variable 'property' in context must be alphanumeric"); + $this->makeAtom('%a')->assertAlnum(); + } + + public function testAssertAlnumFailIsString() { + $this->expectValidationException("Member variable 'property' in context must be a string"); + $this->makeAtom(3)->assertAlnum(); + } + + public function testAssertNotEmpty() { + $this->makeAtom('foo')->assertNotEmpty(); + } + + public function testAssertNotEmptyFail() { + $this->expectValidationException("Member variable 'property' in context must not be empty"); + $this->makeAtom('')->assertNotEmpty(); + } + +} diff --git a/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php b/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php index 1bb5246d..11404b38 100644 --- a/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php +++ b/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php @@ -18,6 +18,20 @@ class HTMLPurifier_ConfigSchema_ValidatorTest extends UnitTestCase $obj->namespace = $namespace; $obj->description = $description; $this->interchange->addNamespace($obj); + return $obj; + } + + protected function addDirective($namespace, $directive, $type = 'string', $description = 'Description') { + $obj = new HTMLPurifier_ConfigSchema_Interchange_Directive(); + $obj->id = $this->makeId($namespace, $directive); + $obj->type = $type; + $obj->description = $description; + $this->interchange->addDirective($obj); + return $obj; // for future editing + } + + protected function makeId($namespace, $directive) { + return new HTMLPurifier_ConfigSchema_Interchange_Id($namespace, $directive); } /** @@ -36,12 +50,6 @@ class HTMLPurifier_ConfigSchema_ValidatorTest extends UnitTestCase $this->validate(); } - public function testNamespaceNamespaceString() { - $this->addNamespace(3, 'Description'); - $this->expectValidationException("Member variable 'namespace' in namespace '3' must be a string"); - $this->validate(); - } - public function testNamespaceNamespaceNotEmpty() { $this->addNamespace('0', 'Description'); $this->expectValidationException("Member variable 'namespace' in namespace '0' must not be empty"); @@ -54,16 +62,14 @@ class HTMLPurifier_ConfigSchema_ValidatorTest extends UnitTestCase $this->validate(); } - public function testNamespaceDescriptionString() { - $this->addNamespace('Ns', 3); - $this->expectValidationException("Member variable 'description' in namespace 'Ns' must be a string"); - $this->validate(); - } - public function testNamespaceDescriptionNotEmpty() { $this->addNamespace('Ns', ''); $this->expectValidationException("Member variable 'description' in namespace 'Ns' must not be empty"); $this->validate(); } + public function testDirectiveIdNamespaceNotEmpty() { + $this->addDirective('', 'Dir'); + } + } -- 2.11.4.GIT