diff --git a/src/BeSimple/SoapCommon/AbstractSoapBuilder.php b/src/BeSimple/SoapCommon/AbstractSoapBuilder.php new file mode 100644 index 0000000..effa9a5 --- /dev/null +++ b/src/BeSimple/SoapCommon/AbstractSoapBuilder.php @@ -0,0 +1,179 @@ + + * (c) Francis Besset + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\SoapCommon; + +use BeSimple\SoapCommon\Cache; + +/** + * @author Christian Kerl + * @author Francis Besset + */ +abstract class AbstractSoapBuilder +{ + protected $wsdl; + protected $options; + + /** + * @return AbstractSoapBuilder + */ + static public function createWithDefaults() + { + $builder = new static(); + + $builder + ->withSoapVersion12() + ->withEncoding('UTF-8') + ->withSingleElementArrays() + ; + + return $builder; + } + + public function __construct() + { + $this->options = array( + 'features' => 0, + ); + } + + public function getWsdl() + { + return $this->wsdl; + } + + public function getOptions() + { + return $this->options; + } + + /** + * @return AbstractSoapBuilder + */ + public function withWsdl($wsdl) + { + $this->wsdl = $wsdl; + + return $this; + } + + /** + * @return AbstractSoapBuilder + */ + public function withSoapVersion11() + { + $this->options['soap_version'] = SOAP_1_1; + + return $this; + } + + /** + * @return AbstractSoapBuilder + */ + public function withSoapVersion12() + { + $this->options['soap_version'] = SOAP_1_2; + + return $this; + } + + public function withEncoding($encoding) + { + $this->options['encoding'] = $encoding; + + return $this; + } + + /** + * @return AbstractSoapBuilder + */ + public function withWsdlCacheNone() + { + $this->options['cache_wsdl'] = Cache::TYPE_NONE; + + return $this; + } + + /** + * @return AbstractSoapBuilder + */ + public function withWsdlCacheDisk() + { + $this->options['cache_wsdl'] = Cache::TYPE_DISK; + + return $this; + } + + /** + * @return AbstractSoapBuilder + */ + public function withWsdlCacheMemory() + { + $this->options['cache_wsdl'] = Cache::TYPE_MEMORY; + + return $this; + } + + /** + * @return AbstractSoapBuilder + */ + public function withWsdlCacheDiskAndMemory() + { + $this->options['cache_wsdl'] = Cache::TYPE_DISK_MEMORY; + + return $this; + } + + /** + * Enables the SOAP_SINGLE_ELEMENT_ARRAYS feature. + * If enabled arrays containing only one element will be passed as arrays otherwise the single element is extracted and directly passed. + * + * @return AbstractSoapBuilder + */ + public function withSingleElementArrays() + { + $this->options['features'] |= SOAP_SINGLE_ELEMENT_ARRAYS; + + return $this; + } + + /** + * Enables the SOAP_WAIT_ONE_WAY_CALLS feature. + * + * @return AbstractSoapBuilder + */ + public function withWaitOneWayCalls() + { + $this->options['features'] |= SOAP_WAIT_ONE_WAY_CALLS; + + return $this; + } + + /** + * Enables the SOAP_USE_XSI_ARRAY_TYPE feature. + * + * @return AbstractSoapBuilder + */ + public function withUseXsiArrayType() + { + $this->options['features'] |= SOAP_USE_XSI_ARRAY_TYPE; + + return $this; + } + + protected function validateWsdl() + { + if (null === $this->wsdl) { + throw new \InvalidArgumentException('The WSDL has to be configured!'); + } + } +} \ No newline at end of file diff --git a/tests/BeSimple/Tests/SoapCommon/AbstractSoapBuilderTest.php b/tests/BeSimple/Tests/SoapCommon/AbstractSoapBuilderTest.php new file mode 100644 index 0000000..f0c3938 --- /dev/null +++ b/tests/BeSimple/Tests/SoapCommon/AbstractSoapBuilderTest.php @@ -0,0 +1,150 @@ + + * (c) Francis Besset + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\Tests\SoapCommon\Soap; + +use BeSimple\Tests\SoapCommon\Fixtures\SoapBuilder; +use BeSimple\SoapCommon\Cache; + +class AbstractSoapBuilderTest extends \PHPUnit_Framework_TestCase +{ + private $defaultOptions = array( + 'features' => 0, + ); + + public function testContruct() + { + $options = $this + ->getSoapBuilder() + ->getOptions() + ; + + $this->assertEquals($this->mergeOptions(array()), $options); + } + + public function testWithWsdl() + { + $builder = $this->getSoapBuilder(); + $this->assertNull($builder->getWsdl()); + + $builder->withWsdl('http://myWsdl/?wsdl'); + $this->assertEquals('http://myWsdl/?wsdl', $builder->getWsdl()); + } + + public function testWithSoapVersion() + { + $builder = $this->getSoapBuilder(); + + $builder->withSoapVersion11(); + $this->assertEquals($this->mergeOptions(array('soap_version' => SOAP_1_1)), $builder->getOptions()); + + $builder->withSoapVersion12(); + $this->assertEquals($this->mergeOptions(array('soap_version' => SOAP_1_2)), $builder->getOptions()); + } + + public function testWithEncoding() + { + $builder = $this + ->getSoapBuilder() + ->withEncoding('ISO 8859-15') + ; + + $this->assertEquals($this->mergeOptions(array('encoding' => 'ISO 8859-15')), $builder->getOptions()); + } + + public function testWithWsdlCache() + { + $builder = $this->getSoapBuilder(); + + $builder->withWsdlCacheNone(); + $this->assertEquals($this->mergeOptions(array('cache_wsdl' => Cache::TYPE_NONE)), $builder->getOptions()); + + $builder->withWsdlCacheDisk(); + $this->assertEquals($this->mergeOptions(array('cache_wsdl' => Cache::TYPE_DISK)), $builder->getOptions()); + + $builder->withWsdlCacheMemory(); + $this->assertEquals($this->mergeOptions(array('cache_wsdl' => Cache::TYPE_MEMORY)), $builder->getOptions()); + + $builder->withWsdlCacheDiskAndMemory(); + $this->assertEquals($this->mergeOptions(array('cache_wsdl' => Cache::TYPE_DISK_MEMORY)), $builder->getOptions()); + } + + public function testWithSingleElementArrays() + { + $options = $this + ->getSoapBuilder() + ->withSingleElementArrays() + ->getOptions() + ; + + $this->assertEquals($this->mergeOptions(array('features' => SOAP_SINGLE_ELEMENT_ARRAYS)), $options); + } + + public function testWithWaitOneWayCalls() + { + $options = $this + ->getSoapBuilder() + ->withWaitOneWayCalls() + ->getOptions() + ; + + $this->assertEquals($this->mergeOptions(array('features' => SOAP_WAIT_ONE_WAY_CALLS)), $options); + } + + public function testWithUseXsiArrayType() + { + $options = $this + ->getSoapBuilder() + ->withUseXsiArrayType() + ->getOptions() + ; + + $this->assertEquals($this->mergeOptions(array('features' => SOAP_USE_XSI_ARRAY_TYPE)), $options); + } + + public function testFeatures() + { + $builder = $this->getSoapBuilder(); + $features = 0; + + $builder->withSingleElementArrays(); + $features |= SOAP_SINGLE_ELEMENT_ARRAYS; + $this->assertEquals($this->mergeOptions(array('features' => $features)), $builder->getOptions()); + + $builder->withWaitOneWayCalls(); + $features |= SOAP_WAIT_ONE_WAY_CALLS; + $this->assertEquals($this->mergeOptions(array('features' => $features)), $builder->getOptions()); + + $builder->withUseXsiArrayType(); + $features |= SOAP_USE_XSI_ARRAY_TYPE; + $this->assertEquals($this->mergeOptions(array('features' => $features)), $builder->getOptions()); + } + + public function testCreateWithDefaults() + { + $builder = SoapBuilder::createWithDefaults(); + + $this->assertInstanceOf('BeSimple\Tests\SoapCommon\Fixtures\SoapBuilder', $builder); + + $this->assertEquals($this->mergeOptions(array('soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'features' => SOAP_SINGLE_ELEMENT_ARRAYS)), $builder->getOptions()); + } + + private function getSoapBuilder() + { + return new SoapBuilder(); + } + + private function mergeOptions(array $options) + { + return array_merge($this->defaultOptions, $options); + } +} \ No newline at end of file diff --git a/tests/BeSimple/Tests/SoapCommon/Fixtures/SoapBuilder.php b/tests/BeSimple/Tests/SoapCommon/Fixtures/SoapBuilder.php new file mode 100644 index 0000000..c3c5d5b --- /dev/null +++ b/tests/BeSimple/Tests/SoapCommon/Fixtures/SoapBuilder.php @@ -0,0 +1,9 @@ +