From 01875f452ecbe9889eafeff8ac35d163a60d9b38 Mon Sep 17 00:00:00 2001
From: Alexey Korepov <28830-murz@users.noreply.drupalcode.org>
Date: Wed, 13 Sep 2023 05:50:35 +0000
Subject: [PATCH] Issue #3386688 by maksim_matuzka: Add support for entities
 with bundles but without bundle_entity_type, like MenuLinkContent

---
 src/StubFactory/EntityStubFactory.php         |  7 ++-
 .../StubFactory/EntityStubFactoryTest.php     | 43 +++++++++++--------
 2 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/src/StubFactory/EntityStubFactory.php b/src/StubFactory/EntityStubFactory.php
index 93743064..37c8de79 100644
--- a/src/StubFactory/EntityStubFactory.php
+++ b/src/StubFactory/EntityStubFactory.php
@@ -95,9 +95,12 @@ class EntityStubFactory {
     $entityTypeId = $storage->getEntityTypeId();
     $bundleKey = $entityTypeDefinition->getKey('bundle');
 
-    if ($bundleKey && ($values[$bundleKey] ?? NULL)) {
+    if (
+      $bundleKey
+      && isset($values[$bundleKey])
+      && $bundleEntityType = $entityTypeDefinition->getBundleEntityType()
+    ) {
       $bundle = self::getFieldPlainValue($values[$bundleKey]);
-      $bundleEntityType = $entityTypeDefinition->getBundleEntityType();
       $bundleStorage = $entityTypeManager->getStorage($bundleEntityType);
       if (!$bundleEntity = $bundleStorage->load($bundle)) {
         $idKey = $bundleStorage->getEntityType()->getKey('id');
diff --git a/tests/src/Unit/StubFactory/EntityStubFactoryTest.php b/tests/src/Unit/StubFactory/EntityStubFactoryTest.php
index 90bc5478..3cf36bad 100644
--- a/tests/src/Unit/StubFactory/EntityStubFactoryTest.php
+++ b/tests/src/Unit/StubFactory/EntityStubFactoryTest.php
@@ -2,11 +2,11 @@
 
 namespace Drupal\Tests\test_helpers\Unit\Stubs;
 
-use Drupal\Core\Entity\EntityBundleListener;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\field\FieldStorageConfigStorage;
 use Drupal\media\Entity\Media;
 use Drupal\media\Entity\MediaType;
+use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\node\Entity\Node;
 use Drupal\node\Entity\NodeType;
 use Drupal\taxonomy\Entity\Term;
@@ -143,25 +143,34 @@ class EntityStubFactoryTest extends UnitTestCase {
   }
 
   /**
-   * Tests config entities.
+   * Tests MenuLinkContent entities.
    */
-  public function testConfigEntities() {
-    TestHelpers::service('entity_bundle.listener', $this->createMock(EntityBundleListener::class));
-
-    $nodeType1 = TestHelpers::createEntity(NodeType::class, [
-      'type' => 'article',
-      'name' => 'Article',
+  public function testMenuLinkContentEntities() {
+    TestHelpers::service('plugin.manager.menu.link');
+    $e1 = TestHelpers::createEntity('menu_link_content', [
+      'title' => 'Menu Item 1',
+      'bundle' => 'bundle1',
+      'menu_name' => 'menu1',
+      'link' => [
+        'uri' => 'route:<nolink>',
+      ],
     ]);
-    $nodeType1->save();
-    $nodeType2 = TestHelpers::saveEntity(NodeType::class, [
-      'type' => 'page',
-      'name' => 'Basic page',
+    $e1->save();
+    $e2 = TestHelpers::saveEntity(MenuLinkContent::class, [
+      'title' => 'Menu Item 2',
+      'menu_name' => 'menu2',
+      'link' => [
+        'title' => 'External link',
+        'uri' => 'http://example.com/page1',
+      ],
     ]);
-    $storage = \Drupal::service('entity_type.manager')->getStorage('node_type');
-    $nodeType1Loaded = $storage->load('article');
-    $this->assertEquals($nodeType1->id(), $nodeType1Loaded->id());
-    $nodeType2Loaded = $storage->load('page');
-    $this->assertEquals($nodeType2->get('name'), $nodeType2Loaded->get('name'));
+    $storage = \Drupal::service('entity_type.manager')->getStorage('menu_link_content');
+    $entitiesIds = $storage->getQuery()->execute();
+    $this->assertEquals([1 => '1', 2 => '2'], $entitiesIds);
+    $entities = $storage->loadMultiple();
+    $this->assertCount(2, $entities);
+    $this->assertEquals($e1->title->value, $entities[1]->title->value);
+    $this->assertEquals($e2->link->uri, $entities[2]->link->uri);
   }
 
   /**
-- 
GitLab