Skip to content
Snippets Groups Projects
Verified Commit 50ddf37f authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2464041 by Mile23, quietone, andrewsuth: Test unit behavior of...

Issue #2464041 by Mile23, quietone, andrewsuth: Test unit behavior of EntityStorageBase::load(), loadMultiple() with invalid ID, UUID
parent f42a2f54
Branches
Tags
38 merge requests!12227Issue #3181946 by jonmcl, mglaman,!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!4100Issue #3249600: Add support for PHP 8.1 Enums as allowed values for list_* data types,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!3600Issue #3344629: Passing null to parameter #1 ($haystack) of type string is deprecated,!3291Issue #3336463: Rewrite rules for gzipped CSS and JavaScript aggregates never match,!3102Issue #3164428 by DonAtt, longwave, sahil.goyal, Anchal_gupta, alexpott: Use...,!2853#3274419 Makes BaseFieldOverride inherit the internal property from the base field.,!2661Issue #3295972 by Munavijayalakshmi, nitin_lama, arunkumark, cilefen,...,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2074Issue #2707689: NodeForm::actions() checks for delete access on new entities,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1254Issue #3238915: Refactor (if feasible) uses of the jQuery ready function to use VanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!957Added throwing of InvalidPluginDefinitionException from getDefinition().,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!873Issue #2875228: Site install not using batch API service,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!712Issue #2909128: Autocomplete intermittent on Chrome Android,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
<?php
namespace Drupal\Tests\Core\Entity;
use Drupal\Tests\UnitTestCase;
/**
* @coversDefaultClass \Drupal\Core\Entity\EntityStorageBase
* @group Entity
*/
class EntityStorageBaseTest extends UnitTestCase {
/**
* Generate a mocked entity object.
*
* @param string $id
* ID value for this entity.
*
* @return \Drupal\Core\Entity\EntityInterface|\PHPUnit\Framework\MockObject\MockObject
* The mocked entity.
*/
public function generateEntityInterface($id) {
$mock_entity = $this->getMockBuilder('\Drupal\Core\Entity\EntityInterface')
->onlyMethods(['id'])
->getMockForAbstractClass();
$mock_entity->expects($this->any())
->method('id')
->willReturn((string) $id);
return $mock_entity;
}
/**
* Data provider for testLoad().
*
* @return array
* - Expected output of load().
* - A fixture of entities to query against. Suitable return value for
* loadMultiple().
* - The ID we'll query.
*/
public function providerLoad() {
$data = [];
// Data set for a matching value.
$entity = $this->generateEntityInterface('1');
$data['matching-value'] = [$entity, ['1' => $entity], '1'];
// Data set for no matching value.
$data['no-matching-value'] = [NULL, [], '0'];
return $data;
}
/**
* @covers ::load
*
* @dataProvider providerLoad
*/
public function testLoad($expected, $entity_fixture, $query) {
$mock_base = $this->getMockBuilder('\Drupal\Core\Entity\EntityStorageBase')
->disableOriginalConstructor()
->onlyMethods(['loadMultiple'])
->getMockForAbstractClass();
// load() always calls loadMultiple().
$mock_base->expects($this->once())
->method('loadMultiple')
->with([$query])
->willReturn($entity_fixture);
$this->assertEquals($expected, $mock_base->load($query));
}
/**
* Data provider for testLoadMultiple.
*
* @return array
* - The expected result.
* - Results for doLoadMultiple(), called internally by loadMultiple().
* - The query, an array of IDs.
*/
public function providerLoadMultiple() {
// Create a fixture of entity objects.
$fixture = [];
foreach (range(1, 10) as $index) {
$fixture[(string) $index] = $this->generateEntityInterface($index);
}
$data = [];
// Data set for NULL ID parameter.
$data['null-id-parameter'] = [$fixture, $fixture, NULL];
// Data set for no results.
$data['no-results'] = [[], [], ['11']];
// Data set for 0 results for multiple IDs.
$data['no-results-multiple-ids'] = [[], [], ['11', '12', '13']];
// Data set for 1 result for 1 ID.
$data['1-result-for-1-id'] = [
['1' => $fixture['1']],
['1' => $fixture['1']],
['1'],
];
// Data set for results for all IDs.
$ids = ['1', '2', '3'];
foreach ($ids as $id) {
$expectation[$id] = $fixture[$id];
$load_multiple[$id] = $fixture[$id];
}
$data['results-for-all-ids'] = [$expectation, $load_multiple, $ids];
// Data set for partial results for multiple IDs.
$ids = ['1', '2', '3'];
foreach ($ids as $id) {
$expectation[$id] = $fixture[$id];
$load_multiple[$id] = $fixture[$id];
}
$ids = array_merge($ids, ['11', '12']);
$data['partial-results-for-multiple-ids'] = [
$expectation,
$load_multiple,
$ids,
];
return $data;
}
/**
* Test loadMultiple().
*
* Does not cover statically-cached results.
*
* @covers ::loadMultiple
*
* @dataProvider providerLoadMultiple
*/
public function testLoadMultiple($expected, $load_multiple, $query) {
// Make our EntityStorageBase mock.
$mock_base = $this->getMockBuilder('\Drupal\Core\Entity\EntityStorageBase')
->disableOriginalConstructor()
->onlyMethods(['doLoadMultiple', 'postLoad'])
->getMockForAbstractClass();
// For all non-cached queries, we call doLoadMultiple().
$mock_base->expects($this->once())
->method('doLoadMultiple')
->with($query)
->willReturn($load_multiple);
// Make our EntityTypeInterface mock so that we can turn off static caching.
$mock_entity_type = $this->getMockBuilder('\Drupal\Core\Entity\EntityTypeInterface')
->onlyMethods(['isStaticallyCacheable'])
->getMockForAbstractClass();
// Disallow caching.
$mock_entity_type->expects($this->any())
->method('isStaticallyCacheable')
->willReturn(FALSE);
// Add the EntityTypeInterface to the storage object.
$ref_entity_type = new \ReflectionProperty($mock_base, 'entityType');
$ref_entity_type->setAccessible(TRUE);
$ref_entity_type->setValue($mock_base, $mock_entity_type);
// Set up expectations for postLoad(), which we only call if there are
// results from loadMultiple().
$mock_base->expects($this->exactly(empty($load_multiple) ? 0 : 1))
->method('postLoad');
$this->assertEquals($expected, $mock_base->loadMultiple($query));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment