3 namespace Drupal\Tests\media_entity_twitter\Unit;
5 use Drupal\Core\Field\Plugin\Field\FieldType\StringLongItem;
6 use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
7 use Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetEmbedCodeConstraint;
8 use Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetEmbedCodeConstraintValidator;
9 use Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraint;
10 use Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraintValidator;
11 use Drupal\Tests\UnitTestCase;
14 * Tests media_entity_twitter constraints.
18 class ConstraintsTest extends UnitTestCase {
21 * Creates a string_long FieldItemInterface wrapper around a value.
23 * @param string $value
26 * @return \Drupal\Core\Field\FieldItemInterface
27 * Mocked string field item.
29 protected function getMockFieldItem($value) {
30 $definition = $this->prophesize(ComplexDataDefinitionInterface::class);
31 $definition->getPropertyDefinitions()->willReturn([]);
33 $item = new StringLongItem($definition->reveal());
34 $item->set('value', $value);
40 * Tests TweetEmbedCode constraint.
42 * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetEmbedCodeConstraintValidator
43 * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetEmbedCodeConstraint
45 * @dataProvider embedCodeProvider
47 public function testTweetEmbedCodeConstraint($embed_code, $expected_violation_count) {
48 // Check message in constraint.
49 $constraint = new TweetEmbedCodeConstraint();
50 $this->assertEquals('Not valid Tweet URL/embed code.', $constraint->message, 'Correct constraint message found.');
52 $execution_context = $this->getMockBuilder('\Drupal\Core\TypedData\Validation\ExecutionContext')
53 ->disableOriginalConstructor()
56 if ($expected_violation_count) {
57 $execution_context->expects($this->exactly($expected_violation_count))
58 ->method('addViolation')
59 ->with($constraint->message);
62 $execution_context->expects($this->exactly($expected_violation_count))
63 ->method('addViolation');
66 $validator = new TweetEmbedCodeConstraintValidator();
67 $validator->initialize($execution_context);
69 $validator->validate($this->getMockFieldItem($embed_code), $constraint);
73 * Provides test data for testTweetEmbedCodeConstraint().
75 public function embedCodeProvider() {
77 'valid tweet URL' => ['https://twitter.com/drupal8changes/status/649167396230578176', 0],
78 'valid tweet embed code' => ['<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">EntityChangedInterface now also defines the function setChangedTime <a href="http://t.co/1Q58UcR8OY">http://t.co/1Q58UcR8OY</a></p>— Drupal 8 Changes (@drupal8changes) <a href="https://twitter.com/drupal8changes/status/649167396230578176">September 30, 2015</a></blockquote><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>', 0],
79 'invalid URL' => ['https://drupal.org/project/media_entity_twitter', 1],
80 'invalid text' => ['I want my Tweet!', 1],
81 'invalid tweet URL' => ['https://twitter.com/drupal8changes/statustypo/649167396230578176', 1],
82 'invalid tweet ID' => ['https://twitter.com/drupal8changes/status/aa64916739bb6230578176', 1],
87 * Tests TweetVisible constraint.
89 * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraintValidator
90 * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraint
92 * @dataProvider visibleProvider
94 public function testTweetVisibleConstraint($embed_code, $mocked_response, $violations) {
95 // Check message in constraint.
96 $constraint = new TweetVisibleConstraint();
97 $this->assertEquals('Referenced tweet is not publicly visible.', $constraint->message, 'Correct constraint message found.');
99 $http_client = $this->getMock('\GuzzleHttp\Client');
100 $http_client->expects($this->once())
102 ->with('get', [$embed_code, ['allow_redirects' => FALSE]])
103 ->willReturn($mocked_response);
105 // Make sure no violations are raised for visible tweet.
106 $execution_context = $this->getMockBuilder('\Drupal\Core\TypedData\Validation\ExecutionContext')
107 ->disableOriginalConstructor()
111 $execution_context->expects($this->once())
112 ->method('addViolation')
113 ->with($constraint->message);
116 $execution_context->expects($this->exactly($violations))
117 ->method('addViolation');
120 $validator = new TweetVisibleConstraintValidator($http_client);
121 $validator->initialize($execution_context);
123 $validator->validate($this->getMockFieldItem($embed_code), $constraint);
127 * Provides test data for testTweetVisibleConstraint().
129 public function visibleProvider() {
130 $visible_response = $this->getMock('\GuzzleHttp\Psr7\Response');
131 $visible_response->expects($this->any())
132 ->method('getStatusCode')
133 ->will($this->returnValue(200));
135 $invisible_response = $this->getMock('\GuzzleHttp\Psr7\Response');
136 $invisible_response->expects($this->once())
137 ->method('getStatusCode')
138 ->will($this->returnValue(302));
139 $invisible_response->expects($this->once())
140 ->method('getHeader')
142 ->will($this->returnValue(['https://twitter.com/drupal8changes?protected_redirect=true']));
146 'https://twitter.com/drupal8changes/status/649167396230578176',
151 'https://twitter.com/drupal8changes/status/649637310024273920',
159 * Tests whether the TweetVisible constraint is robust against bad URLs.
161 * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraintValidator
162 * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraint
164 * @dataProvider badUrlsProvider
166 public function testBadUrlsOnVisibleConstraint($embed_code) {
168 $http_client = $this->getMock('\GuzzleHttp\Client');
169 $http_client->expects($this->never())->method('get');
171 $execution_context = $this->getMockBuilder('\Drupal\Core\TypedData\Validation\ExecutionContext')
172 ->disableOriginalConstructor()
175 $validator = new TweetVisibleConstraintValidator($http_client);
176 $validator->initialize($execution_context);
178 $constraint = new TweetVisibleConstraint();
179 $validator->validate($this->getMockFieldItem($embed_code), $constraint);
183 * Provides test data for testBadUrlsOnVisibleConstraint().
185 public function badUrlsProvider() {
188 ['https://google.com'],
189 ['https://twitter.com/drupal/ssstatus/725771037837762561'],
190 ['https://twitter.com/drupal/status'],
191 ['https://twitter.com/drupal/status/foo'],