diff --git a/tests/src/Kernel/EntityEmbedFilterMediaTest.php b/tests/src/Kernel/EntityEmbedFilterMediaTest.php
new file mode 100644
index 0000000..c9156d9
--- /dev/null
+++ b/tests/src/Kernel/EntityEmbedFilterMediaTest.php
@@ -0,0 +1,164 @@
+<?php
+
+namespace Drupal\Tests\entity_embed\Kernel;
+
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Render\RenderContext;
+use Drupal\filter\FilterPluginCollection;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\media\Entity\Media;
+use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
+use Drupal\user\Entity\Role;
+use Drupal\user\Entity\User;
+
+/**
+ * Tests the entity embed text filter, especially when embedding Media.
+ *
+ * @group filter
+ */
+class EntityEmbedFilterMediaTest extends KernelTestBase {
+
+  use MediaTypeCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'filter',
+    'media',
+    'media_test_source',
+    'image',
+    'user',
+    'field',
+    'system',
+    'file',
+    'language',
+    'entity_embed',
+    // \Drupal\entity_embed\EntityEmbedDisplay\FieldFormatterEntityEmbedDisplayBase::build()
+    // has an undeclared dependency on the "Node" module.
+    'node',
+    'text',
+  ];
+
+  /**
+   * The test media type.
+   *
+   * @var \Drupal\media\MediaTypeInterface
+   */
+  protected $testMediaType;
+
+  /**
+   * An admin user.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * A non-admin user.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $nonAdminUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('file');
+    $this->installSchema('file', 'file_usage');
+    $this->installSchema('system', 'sequences');
+    $this->installEntitySchema('media');
+    // This is not really necessary for this test, entity_embed needs the node
+    // module enabled.
+    $this->installEntitySchema('node');
+    $this->installConfig(['field', 'system', 'image', 'file', 'media', 'text', 'node']);
+
+    // Create a test media type.
+    $this->testMediaType = $this->createMediaType('test');
+
+    // Make its default display show only the source field.
+    $display = entity_get_display('media', $this->testMediaType->id(), 'default');
+    $display->removeComponent('uid')
+      ->removeComponent('label')
+      ->removeComponent('thumbnail')
+      ->removeComponent('created')
+      ->setComponent('field_media_test');
+    $display->save();
+
+    // Just by being created first, this user this will be user 1.
+    $this->adminUser = User::create([
+      'name' => 'super_admin',
+      'status' => 1,
+    ]);
+    $this->adminUser->save();
+
+    $non_admin_role = Role::create([
+      'id' => 'non_admin_role',
+      'permissions' => [
+        'view media',
+      ],
+    ]);
+    $non_admin_role->save();
+
+    $this->nonAdminUser = User::create([
+      'name' => 'non_admin',
+      'status' => 1,
+      'roles' => [$non_admin_role->id()],
+    ]);
+    $this->nonAdminUser->save();
+
+    // Start as admin.
+    $this->container->get('current_user')->setAccount($this->adminUser);
+  }
+
+  /**
+   * Test the entity embed text filter.
+   */
+  public function testEntityEmbedFilter() {
+    $manager = $this->container->get('plugin.manager.filter');
+    $bag = new FilterPluginCollection($manager, []);
+    $filter = $bag->get('entity_embed');
+
+    $renderer = $this->container->get('renderer');
+
+    $test = function ($input, $langcode) use ($filter, $renderer) {
+      return $renderer->executeInRenderContext(new RenderContext(), function () use ($input, $langcode, $filter) {
+        return $filter->process($input, $langcode);
+      });
+    };
+
+    $media = Media::create([
+      'bundle' => $this->testMediaType->id(),
+      'name' => 'Media 1',
+      'field_media_test' => 'Media 1 source text value.',
+    ]);
+    $media->save();
+
+    // A very basic embedding, by UUID and view mode.
+    $entity_embed_code = "<drupal-entity data-entity-type='media' data-entity-uuid='{$media->uuid()}' data-entity-embed-display='view_mode:media.full'></drupal-entity>";
+    $input_text = 'before' . $entity_embed_code . 'after';
+    $processed = $test($input_text, LanguageInterface::LANGCODE_NOT_SPECIFIED)->getProcessedText();
+    $this->assertTrue((strpos($processed, 'before<div data-entity-type="media" data-entity-uuid="' . $media->uuid()) === 0));
+    $this->assertContains('Media 1 source text value.', $processed);
+
+    // Access control is respected on embedded entities.
+    $this->container->get('current_user')->setAccount($this->nonAdminUser);
+    // Published media, non-admin users can see it.
+    $processed = $test($input_text, LanguageInterface::LANGCODE_NOT_SPECIFIED)->getProcessedText();
+    $this->assertTrue((strpos($processed, 'before<div data-entity-type="media" data-entity-uuid="' . $media->uuid()) === 0));
+    $this->assertContains('Media 1 source text value.', $processed);
+    // Unpublished media, nothing is rendered.
+    $media->setUnpublished();
+    $media->save();
+    $this->container->get('plugin.cache_clearer')->clearCachedDefinitions();
+    $processed = $test($input_text, LanguageInterface::LANGCODE_NOT_SPECIFIED)->getProcessedText();
+    $this->assertEquals('beforeafter', $processed);
+
+    // @todo Finish me.
+  }
+
+}
