Version 1
[yaffs-website] / web / modules / contrib / video_embed_field / tests / src / Unit / ProviderUrlParseTest.php
diff --git a/web/modules/contrib/video_embed_field/tests/src/Unit/ProviderUrlParseTest.php b/web/modules/contrib/video_embed_field/tests/src/Unit/ProviderUrlParseTest.php
new file mode 100644 (file)
index 0000000..5790806
--- /dev/null
@@ -0,0 +1,335 @@
+<?php
+
+namespace Drupal\Tests\video_embed_field\Unit;
+
+use Drupal\Tests\UnitTestCase;
+use Drupal\Tests\video_embed_field\Kernel\MockHttpClient;
+use Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo;
+use Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube;
+
+/**
+ * Test that URL parsing for various providers is functioning.
+ *
+ * @group video_embed_field
+ */
+class ProviderUrlParseTest extends UnitTestCase {
+
+  /**
+   * Test URL parsing works as expected.
+   *
+   * @dataProvider urlsWithExpectedIds
+   */
+  public function testUrlParsing($provider, $url, $expected) {
+    $this->assertEquals($expected, $provider::getIdFromInput($url));
+  }
+
+  /**
+   * A data provider for URL parsing test cases.
+   *
+   * @return array
+   *   An array of test cases.
+   */
+  public function urlsWithExpectedIds() {
+    return [
+      // Youtube passing cases.
+      'YouTube: Standard URL' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://www.youtube.com/watch?v=fdbFVWupSsw',
+        'fdbFVWupSsw',
+      ],
+      'YouTube: Non HTTPS' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'http://www.youtube.com/watch?v=fdbFVWupSsw',
+        'fdbFVWupSsw',
+      ],
+      'YouTube: Non WWW' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://youtube.com/watch?v=fdbFVWupSsw',
+        'fdbFVWupSsw',
+      ],
+      'YouTube: Special Characters' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://youtube.com/watch?v=fdbFV_Wup-Ssw',
+        'fdbFV_Wup-Ssw',
+      ],
+      'YouTube: Short URL' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://youtu.be/fdbFVWupSsw',
+        'fdbFVWupSsw',
+      ],
+      'YouTube: With Language Preference' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://youtube.com/watch?v=fdbFV_Wup-Ssw&hl=fr-ca',
+        'fdbFV_Wup-Ssw',
+      ],
+      'YouTube: Added Query String' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://youtube.com/watch?v=fdbFVWupSsw&some_param=value&t=150',
+        'fdbFVWupSsw',
+      ],
+      'YouTube: Added Query String in first position' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://youtube.com/watch?feature=player_detailpage&v=fdbFV_Wup-Ssw',
+        'fdbFV_Wup-Ssw',
+      ],
+      'YouTube: Short URL Added Query String' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://youtu.be/fdbFVWupSsw?some_param=other&another=something&t=55',
+        'fdbFVWupSsw',
+      ],
+      // Youtube failing cases.
+      'YouTube: Non-youtube domain with ?v param' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://www.otherdomain.com/watch?v=fdbFVWupSsw',
+        FALSE,
+      ],
+      'YouTube: Malformed String' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        $this->randomMachineName(),
+        FALSE,
+      ],
+      'YouTube: Playlist URL' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://www.youtube.com/watch?v=-A2Nc3TRpi0&list=PLs4n2zZ8S1eszdZZwDSQ1G8iP95DmJHSh',
+        FALSE,
+      ],
+      'YouTube: Playlist URL (reversed params)' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTube',
+        'https://www.youtube.com/watch?list=PLs4n2zZ8S1eszdZZwDSQ1G8iP95DmJHSh&v=-A2Nc3TRpi0',
+        FALSE,
+      ],
+      // Youtube Playlists passing cases.
+      'YouTube Playlist' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'https://www.youtube.com/watch?v=xoJH3qZwsHc&list=PLpeDXSh4nHjQCIZmkxg3VSdpR5e87X5eB',
+        'PLpeDXSh4nHjQCIZmkxg3VSdpR5e87X5eB',
+      ],
+      'YouTube Playlist: Reversed param order' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'https://www.youtube.com/watch?list=PLpeDXSh4nHjQCIZmkxg3VSdpR5e87X5eB&v=xoJH3qZwsHc',
+        'PLpeDXSh4nHjQCIZmkxg3VSdpR5e87X5eB',
+      ],
+      'YouTube Playlist: Underscore in ID' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'https://www.youtube.com/watch?list=PLpeDXSh4nHjQCIZmkxg3VSdpR5e8_7X5eB&v=xoJH3qZwsHc',
+        'PLpeDXSh4nHjQCIZmkxg3VSdpR5e8_7X5eB',
+      ],
+      'YouTube Playlist: No HTTPs' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'http://www.youtube.com/watch?v=xoJH3qZwsHc&list=PLpeDXSh4nHjQCIZmkxg3VSdpR5e87X5eB',
+        'PLpeDXSh4nHjQCIZmkxg3VSdpR5e87X5eB',
+      ],
+      'YouTube Playlist: No www' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'https://youtube.com/watch?v=xoJH3qZwsHc&list=PLpeDXSh4nHjQCIZmkxg3VSdpR5e87X5eB',
+        'PLpeDXSh4nHjQCIZmkxg3VSdpR5e87X5eB',
+      ],
+      'Youtube Playlist: Hyphens' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'https://www.youtube.com/watch?list=PLg7vT2Yor-Q72v4NPNlWXWmT6iJ4t___k&v=5gdSMPaJOf4',
+        'PLg7vT2Yor-Q72v4NPNlWXWmT6iJ4t___k',
+      ],
+      // Youtube Playlists failing cases.
+      'YouTube Playlist: Invalid ID' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'https://www.youtube.com/watch?v=xoJH3qZwsHc&list=!@#123',
+        FALSE,
+      ],
+      'YouTube Playlist: No ID' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'https://www.youtube.com/watch?v=xoJH3qZwsHc&list=',
+        FALSE,
+      ],
+      'YouTube Playlist: No List' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\YouTubePlaylist',
+        'https://www.youtube.com/watch?v=xoJH3qZwsHc',
+        FALSE,
+      ],
+      // Vimeo passing cases.
+      'Vimeo: Normal URL' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo',
+        'https://vimeo.com/138627894',
+        '138627894',
+      ],
+      'Vimeo: WWW URL' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo',
+        'https://www.vimeo.com/138627894',
+        '138627894',
+      ],
+      'Vimeo: Non HTTPS' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo',
+        'http://www.vimeo.com/138627894',
+        '138627894',
+      ],
+      'Vimeo: Channel URL' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo',
+        'https://vimeo.com/channels/staffpicks/138627894',
+        '138627894',
+      ],
+      'Vimeo: Private Video' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo',
+        'https://vimeo.com/173101914/aab5894fec',
+        '173101914',
+      ],
+      'Vimeo: with timeindex' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo',
+        'https://vimeo.com/193517656#t=160s',
+        '193517656',
+      ],
+      // Vimeo failing cases.
+      'Vimeo: Malformed String' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo',
+        $this->randomMachineName(),
+        FALSE,
+      ],
+      'Vimeo: Non numeric channel page' => [
+        'Drupal\video_embed_field\Plugin\video_embed_field\Provider\Vimeo',
+        'https://vimeo.com/channels/staffpicks/some-page',
+        FALSE,
+      ],
+    ];
+  }
+
+  /**
+   * Test the langauge parsing feature.
+   *
+   * @dataProvider languageParseTestCases
+   */
+  public function testYouTubeLanguageParsing($url, $expected) {
+    $provider = new YouTube([
+      'input' => $url,
+    ], '', [], new MockHttpClient());
+    $embed = $provider->renderEmbedCode(100, 100, TRUE);
+    $language = isset($embed['#query']['cc_lang_pref']) ? $embed['#query']['cc_lang_pref'] : FALSE;
+    $this->assertEquals($expected, $language);
+  }
+
+  /**
+   * A data provider for testYouTubeLanguageParsing.
+   *
+   * @return array
+   *   An array of test cases.
+   */
+  public function languageParseTestCases() {
+    return [
+      'Simple Preference' => [
+        'https://youtube.com/watch?v=fdbFV_Wup-Ssw&hl=fr',
+        'fr',
+      ],
+      'Preference with Hyphen' => [
+        'https://youtube.com/watch?v=fdbFV_Wup-Ssw&hl=fr-ca',
+        'fr-ca',
+      ],
+      'Invalid Language' => [
+        'https://youtube.com/watch?v=fdbFV_Wup-Ssw&hl=<test>',
+        FALSE,
+      ],
+      'Multiple Parameters' => [
+        'https://youtube.com/watch?v=fdbFV_Wup-Ssw&hl=au&anotherparam=1',
+        'au',
+      ],
+    ];
+  }
+
+  /**
+   * Test the YouTube time index parsing.
+   *
+   * @dataProvider youTubeTimeIndexTestCases
+   */
+  public function testYouTubeTimeIndex($url, $expected) {
+    $provider = new YouTube([
+      'input' => $url,
+    ], '', [], new MockHttpClient());
+    $embed = $provider->renderEmbedCode(100, 100, TRUE);
+    $this->assertEquals($expected, $embed['#query']['start']);
+  }
+
+  /**
+   * A data provider for testYouTubeTimeIndex.
+   *
+   * @return array
+   *   An array of test cases.
+   */
+  public function youTubeTimeIndexTestCases() {
+    return [
+      'Simple Timeindex' => [
+        'https://www.youtube.com/watch?v=fdbFVWupSsw&t=15',
+        '15',
+      ],
+      'No Timeindex' => [
+        'https://www.youtube.com/watch?v=fdbFVWupSsw',
+        '0',
+      ],
+      'Invalid Timeindex' => [
+        'https://www.youtube.com/watch?v=fdbFVWupSsw&t=time',
+        '0',
+      ],
+    ];
+  }
+
+  /**
+   * Test the Vimeo time index integration.
+   *
+   * @dataProvider vimeoTimeIndexTestCases
+   */
+  public function testVimeoTimeIndex($url, $expected, $exception_expected = FALSE) {
+    $exception_triggered = FALSE;
+    try {
+      $provider = new Vimeo([
+        'input' => $url,
+      ], '', [], new MockHttpClient());
+    }
+    catch (\Exception $e) {
+      $exception_triggered = TRUE;
+    }
+
+    $this->assertEquals($exception_expected, $exception_triggered);
+
+    if (!$exception_triggered) {
+      $embed = $provider->renderEmbedCode(100, 100, TRUE);
+      $this->assertEquals($expected, isset($embed['#fragment']) ? $embed['#fragment'] : FALSE);
+    }
+  }
+
+  /**
+   * A data provider for testVimeoTimeIndex.
+   *
+   * @return array
+   *   An array of test cases.
+   */
+  public function vimeoTimeIndexTestCases() {
+    return [
+      'Standard time index' => [
+        'https://vimeo.com/193517656#t=150s',
+        't=150s',
+        FALSE,
+      ],
+      'Empty start time' => [
+        'https://vimeo.com/193517656#t=',
+        NULL,
+        TRUE,
+      ],
+      'Empty start time (with seconds)' => [
+        'https://vimeo.com/193517656#t=s',
+        NULL,
+        TRUE,
+      ],
+      'Non numeric start time' => [
+        'https://vimeo.com/193517656#t=STARTs',
+        NULL,
+        TRUE,
+      ],
+      'Non t fragment' => [
+        'https://vimeo.com/193517656#o=150s',
+        NULL,
+        TRUE,
+      ],
+      'No seconds' => [
+        'https://vimeo.com/193517656#t=15',
+        NULL,
+        TRUE,
+      ],
+    ];
+  }
+
+}