prophesize(ComplexDataDefinitionInterface::class); $definition->getPropertyDefinitions()->willReturn([]); $item = new StringLongItem($definition->reveal()); $item->set('value', $value); return $item; } /** * Tests TweetEmbedCode constraint. * * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetEmbedCodeConstraintValidator * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetEmbedCodeConstraint * * @dataProvider embedCodeProvider */ public function testTweetEmbedCodeConstraint($embed_code, $expected_violation_count) { // Check message in constraint. $constraint = new TweetEmbedCodeConstraint(); $this->assertEquals('Not valid Tweet URL/embed code.', $constraint->message, 'Correct constraint message found.'); $execution_context = $this->getMockBuilder('\Drupal\Core\TypedData\Validation\ExecutionContext') ->disableOriginalConstructor() ->getMock(); if ($expected_violation_count) { $execution_context->expects($this->exactly($expected_violation_count)) ->method('addViolation') ->with($constraint->message); } else { $execution_context->expects($this->exactly($expected_violation_count)) ->method('addViolation'); } $validator = new TweetEmbedCodeConstraintValidator(); $validator->initialize($execution_context); $validator->validate($this->getMockFieldItem($embed_code), $constraint); } /** * Provides test data for testTweetEmbedCodeConstraint(). */ public function embedCodeProvider() { return [ 'valid tweet URL' => ['https://twitter.com/drupal8changes/status/649167396230578176', 0], 'valid tweet embed code' => ['

EntityChangedInterface now also defines the function setChangedTime http://t.co/1Q58UcR8OY

— Drupal 8 Changes (@drupal8changes) September 30, 2015
', 0], 'invalid URL' => ['https://drupal.org/project/media_entity_twitter', 1], 'invalid text' => ['I want my Tweet!', 1], 'invalid tweet URL' => ['https://twitter.com/drupal8changes/statustypo/649167396230578176', 1], 'invalid tweet ID' => ['https://twitter.com/drupal8changes/status/aa64916739bb6230578176', 1], ]; } /** * Tests TweetVisible constraint. * * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraintValidator * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraint * * @dataProvider visibleProvider */ public function testTweetVisibleConstraint($embed_code, $mocked_response, $violations) { // Check message in constraint. $constraint = new TweetVisibleConstraint(); $this->assertEquals('Referenced tweet is not publicly visible.', $constraint->message, 'Correct constraint message found.'); $http_client = $this->getMock('\GuzzleHttp\Client'); $http_client->expects($this->once()) ->method('__call') ->with('get', [$embed_code, ['allow_redirects' => FALSE]]) ->willReturn($mocked_response); // Make sure no violations are raised for visible tweet. $execution_context = $this->getMockBuilder('\Drupal\Core\TypedData\Validation\ExecutionContext') ->disableOriginalConstructor() ->getMock(); if ($violations) { $execution_context->expects($this->once()) ->method('addViolation') ->with($constraint->message); } else { $execution_context->expects($this->exactly($violations)) ->method('addViolation'); } $validator = new TweetVisibleConstraintValidator($http_client); $validator->initialize($execution_context); $validator->validate($this->getMockFieldItem($embed_code), $constraint); } /** * Provides test data for testTweetVisibleConstraint(). */ public function visibleProvider() { $visible_response = $this->getMock('\GuzzleHttp\Psr7\Response'); $visible_response->expects($this->any()) ->method('getStatusCode') ->will($this->returnValue(200)); $invisible_response = $this->getMock('\GuzzleHttp\Psr7\Response'); $invisible_response->expects($this->once()) ->method('getStatusCode') ->will($this->returnValue(302)); $invisible_response->expects($this->once()) ->method('getHeader') ->with('location') ->will($this->returnValue(['https://twitter.com/drupal8changes?protected_redirect=true'])); return [ 'valid URL' => [ 'https://twitter.com/drupal8changes/status/649167396230578176', $visible_response, 0, ], 'invalid URL' => [ 'https://twitter.com/drupal8changes/status/649637310024273920', $invisible_response, 1, ], ]; } /** * Tests whether the TweetVisible constraint is robust against bad URLs. * * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraintValidator * @covers \Drupal\media_entity_twitter\Plugin\Validation\Constraint\TweetVisibleConstraint * * @dataProvider badUrlsProvider */ public function testBadUrlsOnVisibleConstraint($embed_code) { $http_client = $this->getMock('\GuzzleHttp\Client'); $http_client->expects($this->never())->method('get'); $execution_context = $this->getMockBuilder('\Drupal\Core\TypedData\Validation\ExecutionContext') ->disableOriginalConstructor() ->getMock(); $validator = new TweetVisibleConstraintValidator($http_client); $validator->initialize($execution_context); $constraint = new TweetVisibleConstraint(); $validator->validate($this->getMockFieldItem($embed_code), $constraint); } /** * Provides test data for testBadUrlsOnVisibleConstraint(). */ public function badUrlsProvider() { return [ ['https://google.com'], ['https://twitter.com/drupal/ssstatus/725771037837762561'], ['https://twitter.com/drupal/status'], ['https://twitter.com/drupal/status/foo'], ]; } }