Open Preprint Systems  3.3.0
FilterTest.php
1 <?php
2 
17 import('lib.pkp.tests.PKPTestCase');
18 import('lib.pkp.classes.filter.Filter');
19 import('lib.pkp.tests.classes.filter.TestClass1');
20 import('lib.pkp.tests.classes.filter.TestClass2');
21 
22 class FilterTest extends PKPTestCase {
23 
27  public function testInstantiationAndExecute() {
28  $mockFilter = $this->getFilterMock();
29 
30  // Test getters/setters that are not implicitly tested by other tests
31  self::assertEquals('Mock_Filter_', substr($mockFilter->getDisplayName(), 0, 12));
32  $mockFilter->setDisplayName('Some other display name');
33  self::assertEquals('Some other display name', $mockFilter->getDisplayName());
34  $mockFilter->setSequence(5);
35  self::assertEquals(5, $mockFilter->getSequence());
36 
37  // Test errors
38  $mockFilter->addError('some error message');
39  $mockFilter->addError('a second error message');
40  $expectedErrors = array(
41  'some error message',
42  'a second error message'
43  );
44  self::assertEquals($expectedErrors, $mockFilter->getErrors());
45  self::assertTrue($mockFilter->hasErrors());
46  $mockFilter->clearErrors();
47  self::assertEquals(array(), $mockFilter->getErrors());
48 
49  // Test type validation.
50  $typeDescriptionFactory = TypeDescriptionFactory::getInstance();
51  $inputTypeDescription = 'class::lib.pkp.tests.classes.filter.TestClass1';
52  $outputTypeDescription = 'class::lib.pkp.tests.classes.filter.TestClass2';
53  self::assertEquals($inputTypeDescription, $mockFilter->getInputType()->getTypeDescription());
54  self::assertEquals($outputTypeDescription, $mockFilter->getOutputType()->getTypeDescription());
55 
56  // Test execution without runtime requirements
57  $testInput = new TestClass1();
58  $testInput->testField = 'some filter input';
59  self::assertInstanceOf('TestClass2', $testOutput = $mockFilter->execute($testInput));
60 
61  self::assertEquals($this->getTestOutput(), $testOutput);
62  self::assertEquals($testInput, $mockFilter->getLastInput());
63  self::assertEquals($this->getTestOutput(), $mockFilter->getLastOutput());
64 
65  // Test execution without runtime requirements
66  // (We can safely use PHP 5.0.0 as a test here
67  // because this is a PHPUnit requirement anyway.)
68  $mockFilter = $this->getFilterMock();
69  $mockFilter->setData('phpVersionMin', '5.0.0');
70  $testOutput = $mockFilter->execute($testInput);
71  $runtimeEnvironment = $mockFilter->getRuntimeEnvironment();
72  self::assertEquals('5.0.0', $runtimeEnvironment->getPhpVersionMin());
73 
74  // Do the same again but this time set the runtime
75  // environment via a RuntimeEnvironment object.
76  $mockFilter = $this->getFilterMock();
77  $mockFilter->setRuntimeEnvironment($runtimeEnvironment);
78  $testOutput = $mockFilter->execute($testInput);
79  $runtimeEnvironment = $mockFilter->getRuntimeEnvironment();
80  self::assertEquals('5.0.0', $runtimeEnvironment->getPhpVersionMin());
81  self::assertEquals('5.0.0', $mockFilter->getData('phpVersionMin'));
82 
83  // Test unsupported input
84  $unsupportedInput = new TestClass2();
85  self::assertNull($mockFilter->execute($unsupportedInput));
86  self::assertNull($mockFilter->getLastInput());
87  self::assertNull($mockFilter->getLastOutput());
88 
89  // Test unsupported output
90  $mockFilter = $this->getFilterMock('class::lib.pkp.tests.classes.filter.TestClass1');
91  self::assertNull($mockFilter->execute($testInput));
92  self::assertEquals($testInput, $mockFilter->getLastInput());
93  self::assertNull($mockFilter->getLastOutput());
94  }
95 
99  public function testUnsupportedEnvironment() {
100  $mockFilter = $this->getFilterMock();
101  $mockFilter->setData('phpVersionMin', '20.0.0');
102  $this->expectError();
103  $testOutput = $mockFilter->execute($testInput);
104  }
105 
112  public function processCallback($input) {
113  return $this->getTestOutput();
114  }
115 
121  private function getTestOutput() {
122  static $output;
123  if (is_null($output)) {
124  // Create a test object as output
125  $output = new TestClass2();
126  $output->testField = 'some filter result';
127  }
128  return $output;
129  }
130 
135  private function getFilterMock($outputType = 'class::lib.pkp.tests.classes.filter.TestClass2') {
136  // Mock the abstract filter class
137  $mockFilter = $this->getMockBuilder(Filter::class)
138  ->setMethods(array('process'))
139  ->setConstructorArgs(array('class::lib.pkp.tests.classes.filter.TestClass1', $outputType))
140  ->getMock();
141 
142  // Set the filter processor.
143  $mockFilter->expects($this->any())
144  ->method('process')
145  ->will($this->returnCallback(array($this, 'processCallback')));
146 
147  return $mockFilter;
148  }
149 }
150 
FilterTest
Test class for Filter.
Definition: FilterTest.php:22
TestClass2
Test class to be used/instantiated by ClassTypeDescriptionTest.
Definition: TestClass2.inc.php:16
PKPTestCase
Class that implements functionality common to all PKP unit test cases.
Definition: PKPTestCase.inc.php:27
TestClass1
Test class to be used/instantiated by ClassTypeDescriptionTest.
Definition: TestClass1.inc.php:16
FilterTest\testInstantiationAndExecute
testInstantiationAndExecute()
Definition: FilterTest.php:27
TypeDescriptionFactory\getInstance
static getInstance()
Definition: TypeDescriptionFactory.inc.php:41
FilterTest\testUnsupportedEnvironment
testUnsupportedEnvironment()
Definition: FilterTest.php:99
FilterTest\processCallback
processCallback($input)
Definition: FilterTest.php:112