Browse Source

Add StreamFactory.

ADmad 3 years ago
parent
commit
fc153b0494
2 changed files with 144 additions and 0 deletions
  1. 73 0
      src/Http/StreamFactory.php
  2. 71 0
      tests/TestCase/Http/StreamFactoryTest.php

+ 73 - 0
src/Http/StreamFactory.php

@@ -0,0 +1,73 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ * @link          https://cakephp.org CakePHP(tm) Project
+ * @since         5.0.0
+ * @license       https://opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Http;
+
+use Laminas\Diactoros\Stream;
+use Psr\Http\Message\StreamFactoryInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Factory class for creating stream instances.
+ */
+class StreamFactory implements StreamFactoryInterface
+{
+    /**
+     * Create a new stream from a string.
+     *
+     * The stream SHOULD be created with a temporary resource.
+     *
+     * @param string $content String content with which to populate the stream.
+     */
+    public function createStream(string $content = ''): StreamInterface
+    {
+        $resource = fopen('php://temp', 'r+');
+        fwrite($resource, $content);
+        rewind($resource);
+
+        return $this->createStreamFromResource($resource);
+    }
+
+    /**
+     * Create a stream from an existing file.
+     *
+     * The file MUST be opened using the given mode, which may be any mode
+     * supported by the `fopen` function.
+     *
+     * The `$filename` MAY be any string supported by `fopen()`.
+     *
+     * @param string $filename The filename or stream URI to use as basis of stream.
+     * @param string $mode The mode with which to open the underlying filename/stream.
+     * @throws \RuntimeException If the file cannot be opened.
+     * @throws \InvalidArgumentException If the mode is invalid.
+     */
+    public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface
+    {
+        return new Stream($filename, $mode);
+    }
+
+    /**
+     * Create a new stream from an existing resource.
+     *
+     * The stream MUST be readable and may be writable.
+     *
+     * @param resource $resource The PHP resource to use as the basis for the stream.
+     */
+    public function createStreamFromResource($resource): StreamInterface
+    {
+        return new Stream($resource);
+    }
+}

+ 71 - 0
tests/TestCase/Http/StreamFactoryTest.php

@@ -0,0 +1,71 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ * @link          https://cakephp.org CakePHP(tm) Project
+ * @since         5.0.0
+ * @license       https://opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Test\TestCase\Http;
+
+use Cake\Http\StreamFactory;
+use Cake\TestSuite\TestCase;
+
+/**
+ * Test case for the stream factory.
+ */
+class StreamFactoryTest extends TestCase
+{
+    protected StreamFactory $factory;
+
+    protected string $filename = TMP . 'stream-factory-file-test.txt';
+
+    protected function setUp(): void
+    {
+        parent::setUp();
+
+        $this->factory = new StreamFactory();
+    }
+
+    protected function tearDown(): void
+    {
+        parent::tearDown();
+
+        // phpcs:disable
+        @unlink($this->filename);
+        // phpcs:enable
+    }
+
+    public function testCreateStream(): void
+    {
+        $stream = $this->factory->createStream('test');
+        $this->assertSame('test', $stream->getContents());
+    }
+
+    public function testCreateStreamFile(): void
+    {
+        file_put_contents($this->filename, 'it works');
+
+        $stream = $this->factory->createStreamFromFile($this->filename);
+        $this->assertSame('it works', $stream->getContents());
+    }
+
+    public function testCreateStreamResource(): void
+    {
+        file_put_contents($this->filename, 'it works');
+        $resource = fopen($this->filename, 'r');
+
+        $stream = $this->factory->createStreamFromResource($resource);
+        $this->assertSame('it works', $stream->getContents());
+
+        fclose($resource);
+    }
+}