bc954b3cc46be41976de4383868e9564cb15629d
[yaffs-website] / web / core / modules / image / tests / src / Unit / ImageStyleTest.php
1 <?php
2
3 namespace Drupal\Tests\image\Unit;
4
5 use Drupal\Tests\UnitTestCase;
6 use Drupal\Component\Utility\Crypt;
7
8 /**
9  * @coversDefaultClass \Drupal\image\Entity\ImageStyle
10  *
11  * @group Image
12  */
13 class ImageStyleTest extends UnitTestCase {
14
15   /**
16    * The entity type used for testing.
17    *
18    * @var \Drupal\Core\Entity\EntityTypeInterface|\PHPUnit_Framework_MockObject_MockObject
19    */
20   protected $entityType;
21
22   /**
23    * The entity manager used for testing.
24    *
25    * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
26    */
27   protected $entityManager;
28
29   /**
30    * The ID of the type of the entity under test.
31    *
32    * @var string
33    */
34   protected $entityTypeId;
35
36   /**
37    * Gets a mocked image style for testing.
38    *
39    * @param string $image_effect_id
40    *   The image effect ID.
41    * @param \Drupal\image\ImageEffectInterface|\PHPUnit_Framework_MockObject_MockObject $image_effect
42    *   The image effect used for testing.
43    *
44    * @return \Drupal\image\ImageStyleInterface
45    *   The mocked image style.
46    */
47   protected function getImageStyleMock($image_effect_id, $image_effect, $stubs = []) {
48     $effectManager = $this->getMockBuilder('\Drupal\image\ImageEffectManager')
49       ->disableOriginalConstructor()
50       ->getMock();
51     $effectManager->expects($this->any())
52       ->method('createInstance')
53       ->with($image_effect_id)
54       ->will($this->returnValue($image_effect));
55     $default_stubs = [
56       'getImageEffectPluginManager',
57       'fileUriScheme',
58       'fileUriTarget',
59       'fileDefaultScheme',
60     ];
61     $image_style = $this->getMockBuilder('\Drupal\image\Entity\ImageStyle')
62       ->setConstructorArgs([
63         ['effects' => [$image_effect_id => ['id' => $image_effect_id]]],
64         $this->entityTypeId,
65       ])
66       ->setMethods(array_merge($default_stubs, $stubs))
67       ->getMock();
68
69     $image_style->expects($this->any())
70       ->method('getImageEffectPluginManager')
71       ->will($this->returnValue($effectManager));
72     $image_style->expects($this->any())
73       ->method('fileUriScheme')
74       ->will($this->returnCallback([$this, 'fileUriScheme']));
75     $image_style->expects($this->any())
76       ->method('fileUriTarget')
77       ->will($this->returnCallback([$this, 'fileUriTarget']));
78     $image_style->expects($this->any())
79       ->method('fileDefaultScheme')
80       ->will($this->returnCallback([$this, 'fileDefaultScheme']));
81
82     return $image_style;
83   }
84
85   /**
86    * {@inheritdoc}
87    */
88   protected function setUp() {
89     $this->entityTypeId = $this->randomMachineName();
90     $this->provider = $this->randomMachineName();
91     $this->entityType = $this->getMock('\Drupal\Core\Entity\EntityTypeInterface');
92     $this->entityType->expects($this->any())
93       ->method('getProvider')
94       ->will($this->returnValue($this->provider));
95     $this->entityManager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface');
96     $this->entityManager->expects($this->any())
97       ->method('getDefinition')
98       ->with($this->entityTypeId)
99       ->will($this->returnValue($this->entityType));
100   }
101
102   /**
103    * @covers ::getDerivativeExtension
104    */
105   public function testGetDerivativeExtension() {
106     $image_effect_id = $this->randomMachineName();
107     $logger = $this->getMockBuilder('\Psr\Log\LoggerInterface')->getMock();
108     $image_effect = $this->getMockBuilder('\Drupal\image\ImageEffectBase')
109       ->setConstructorArgs([[], $image_effect_id, [], $logger])
110       ->getMock();
111     $image_effect->expects($this->any())
112       ->method('getDerivativeExtension')
113       ->will($this->returnValue('png'));
114
115     $image_style = $this->getImageStyleMock($image_effect_id, $image_effect);
116
117     $extensions = ['jpeg', 'gif', 'png'];
118     foreach ($extensions as $extension) {
119       $extensionReturned = $image_style->getDerivativeExtension($extension);
120       $this->assertEquals($extensionReturned, 'png');
121     }
122   }
123
124   /**
125    * @covers ::buildUri
126    */
127   public function testBuildUri() {
128     // Image style that changes the extension.
129     $image_effect_id = $this->randomMachineName();
130     $logger = $this->getMockBuilder('\Psr\Log\LoggerInterface')->getMock();
131     $image_effect = $this->getMockBuilder('\Drupal\image\ImageEffectBase')
132       ->setConstructorArgs([[], $image_effect_id, [], $logger])
133       ->getMock();
134     $image_effect->expects($this->any())
135       ->method('getDerivativeExtension')
136       ->will($this->returnValue('png'));
137
138     $image_style = $this->getImageStyleMock($image_effect_id, $image_effect);
139     $this->assertEquals($image_style->buildUri('public://test.jpeg'), 'public://styles/' . $image_style->id() . '/public/test.jpeg.png');
140
141     // Image style that doesn't change the extension.
142     $image_effect_id = $this->randomMachineName();
143     $image_effect = $this->getMockBuilder('\Drupal\image\ImageEffectBase')
144       ->setConstructorArgs([[], $image_effect_id, [], $logger])
145       ->getMock();
146     $image_effect->expects($this->any())
147       ->method('getDerivativeExtension')
148       ->will($this->returnArgument(0));
149
150     $image_style = $this->getImageStyleMock($image_effect_id, $image_effect);
151     $this->assertEquals($image_style->buildUri('public://test.jpeg'), 'public://styles/' . $image_style->id() . '/public/test.jpeg');
152   }
153
154   /**
155    * @covers ::getPathToken
156    */
157   public function testGetPathToken() {
158     $logger = $this->getMockBuilder('\Psr\Log\LoggerInterface')->getMock();
159     $private_key = $this->randomMachineName();
160     $hash_salt = $this->randomMachineName();
161
162     // Image style that changes the extension.
163     $image_effect_id = $this->randomMachineName();
164     $image_effect = $this->getMockBuilder('\Drupal\image\ImageEffectBase')
165       ->setConstructorArgs([[], $image_effect_id, [], $logger])
166       ->getMock();
167     $image_effect->expects($this->any())
168       ->method('getDerivativeExtension')
169       ->will($this->returnValue('png'));
170
171     $image_style = $this->getImageStyleMock($image_effect_id, $image_effect, ['getPrivateKey', 'getHashSalt']);
172     $image_style->expects($this->any())
173       ->method('getPrivateKey')
174       ->will($this->returnValue($private_key));
175     $image_style->expects($this->any())
176       ->method('getHashSalt')
177       ->will($this->returnValue($hash_salt));
178
179     // Assert the extension has been added to the URI before creating the token.
180     $this->assertEquals($image_style->getPathToken('public://test.jpeg.png'), $image_style->getPathToken('public://test.jpeg'));
181     $this->assertEquals(substr(Crypt::hmacBase64($image_style->id() . ':' . 'public://test.jpeg.png', $private_key . $hash_salt), 0, 8), $image_style->getPathToken('public://test.jpeg'));
182     $this->assertNotEquals(substr(Crypt::hmacBase64($image_style->id() . ':' . 'public://test.jpeg', $private_key . $hash_salt), 0, 8), $image_style->getPathToken('public://test.jpeg'));
183
184     // Image style that doesn't change the extension.
185     $image_effect_id = $this->randomMachineName();
186     $image_effect = $this->getMockBuilder('\Drupal\image\ImageEffectBase')
187       ->setConstructorArgs([[], $image_effect_id, [], $logger])
188       ->getMock();
189     $image_effect->expects($this->any())
190       ->method('getDerivativeExtension')
191       ->will($this->returnArgument(0));
192
193     $image_style = $this->getImageStyleMock($image_effect_id, $image_effect, ['getPrivateKey', 'getHashSalt']);
194     $image_style->expects($this->any())
195       ->method('getPrivateKey')
196       ->will($this->returnValue($private_key));
197     $image_style->expects($this->any())
198       ->method('getHashSalt')
199       ->will($this->returnValue($hash_salt));
200     // Assert no extension has been added to the uri before creating the token.
201     $this->assertNotEquals($image_style->getPathToken('public://test.jpeg.png'), $image_style->getPathToken('public://test.jpeg'));
202     $this->assertNotEquals(substr(Crypt::hmacBase64($image_style->id() . ':' . 'public://test.jpeg.png', $private_key . $hash_salt), 0, 8), $image_style->getPathToken('public://test.jpeg'));
203     $this->assertEquals(substr(Crypt::hmacBase64($image_style->id() . ':' . 'public://test.jpeg', $private_key . $hash_salt), 0, 8), $image_style->getPathToken('public://test.jpeg'));
204   }
205
206   /**
207    * Mock function for ImageStyle::fileUriScheme().
208    */
209   public function fileUriScheme($uri) {
210     if (preg_match('/^([\w\-]+):\/\/|^(data):/', $uri, $matches)) {
211       // The scheme will always be the last element in the matches array.
212       return array_pop($matches);
213     }
214
215     return FALSE;
216   }
217
218   /**
219    * Mock function for ImageStyle::fileUriTarget().
220    */
221   public function fileUriTarget($uri) {
222     // Remove the scheme from the URI and remove erroneous leading or trailing,
223     // forward-slashes and backslashes.
224     $target = trim(preg_replace('/^[\w\-]+:\/\/|^data:/', '', $uri), '\/');
225
226     // If nothing was replaced, the URI doesn't have a valid scheme.
227     return $target !== $uri ? $target : FALSE;
228   }
229
230   /**
231    * Mock function for ImageStyle::fileDefaultScheme().
232    */
233   public function fileDefaultScheme() {
234     return 'public';
235   }
236
237 }