package org.terst.feedreader.ui import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Test /** * The YouTube placeholder: recognising one, and building a page its embed will actually play in. * * Both halves come from the same report: "YouTube play is misconfigured, long click on YouTube * placeholder should open the URL directly." */ class YouTubeLinksTest { /** * What a long-press on the reader's video placeholder actually reports. * * Not the link's href, which is what the first version of this assumed and got wrong on the * device: the placeholder is ``, * and for an image inside a link WebView's hit test reports SRC_IMAGE_ANCHOR_TYPE with the * *image's* URL in `extra`, not the anchor's. Long-pressing the thumbnail produced the * ordinary link menu showing `https://i.ytimg.com/vi/dQw4w9WgXcQ/hq720.jpg`. * * The thumbnail URL carries the video id, so it is resolved back to the video. */ @Test fun `a long-press on the thumbnail resolves to the video, which is what WebView reports`() { assertEquals( "https://www.youtube.com/watch?v=dQw4w9WgXcQ", youTubeTargetForLongPress("https://i.ytimg.com/vi/dQw4w9WgXcQ/hq720.jpg") ) } @Test fun `any thumbnail size resolves, since the reader has used more than one`() { assertEquals( "https://www.youtube.com/watch?v=dQw4w9WgXcQ", youTubeTargetForLongPress("https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg") ) assertEquals( "https://www.youtube.com/watch?v=dQw4w9WgXcQ", youTubeTargetForLongPress("https://i9.ytimg.com/vi_webp/dQw4w9WgXcQ/hq720.webp") ) } @Test fun `a watch link resolves to itself, for wherever one does come through`() { assertEquals( "https://www.youtube.com/watch?v=dQw4w9WgXcQ", youTubeTargetForLongPress("https://www.youtube.com/watch?v=dQw4w9WgXcQ") ) } @Test fun `a short youtu-be link resolves to the video`() { assertEquals( "https://www.youtube.com/watch?v=dQw4w9WgXcQ", youTubeTargetForLongPress("https://youtu.be/dQw4w9WgXcQ") ) } @Test fun `an ordinary article link is not a video`() { assertNull(youTubeTargetForLongPress("https://www.nytimes.com/2026/10/20/us/politics/x.html")) } @Test fun `an ordinary article image is not a video`() { assertNull(youTubeTargetForLongPress("https://www.westhawaiitoday.com/wp-content/uploads/reef.jpg")) } @Test fun `a lookalike host is not YouTube`() { assertNull(youTubeTargetForLongPress("https://notyoutube.com/watch?v=dQw4w9WgXcQ")) assertNull(youTubeTargetForLongPress("https://youtube.com.evil.example/watch?v=dQw4w9WgXcQ")) assertNull(youTubeTargetForLongPress("https://i.ytimg.com.evil.example/vi/dQw4w9WgXcQ/hq720.jpg")) } @Test fun `a YouTube link that is not one video stays on the ordinary menu`() { assertNull(youTubeTargetForLongPress("https://www.youtube.com/@someone")) assertNull(youTubeTargetForLongPress("https://www.youtube.com/playlist?list=PL123")) } @Test fun `rubbish is not a video`() { assertNull(youTubeTargetForLongPress("")) assertNull(youTubeTargetForLongPress("not a url at all")) } // --- the embed ---------------------------------------------------------------------- @Test fun `the embed url is the privacy-preserving nocookie one, playing inline`() { val url = youTubeEmbedUrl("dQw4w9WgXcQ") assertTrue(url.startsWith("https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ")) assertTrue(url.contains("autoplay=1")) assertTrue(url.contains("playsinline=1")) } @Test fun `the embed is sent a referrer, which is the whole reason it plays`() { assertTrue(YOUTUBE_EMBED_REFERRER.startsWith("https://")) } @Test fun `the referrer says nothing about what is being read`() { // A constant, so YouTube learns the app and nothing else. The article's own URL would // work just as well and would tell YouTube what he reads, which is the thing the // nocookie domain is already chosen to avoid. assertFalse(YOUTUBE_EMBED_REFERRER.contains("?")) assertTrue("a reserved TLD can never become somebody's real site", YOUTUBE_EMBED_REFERRER.contains(".invalid")) } @Test fun `a video id that could break out of the url is scrubbed`() { val url = youTubeEmbedUrl("""a">""") assertFalse("markup from the id reached the url: $url", url.contains("<")) assertTrue(url.startsWith("https://www.youtube-nocookie.com/embed/ascriptalert1script?")) } @Test fun `the watch link for a video is the one a phone can hand to the YouTube app`() { assertEquals("https://www.youtube.com/watch?v=dQw4w9WgXcQ", youTubeWatchUrl("dQw4w9WgXcQ")) } // --- giving the player a height ------------------------------------------------------- @Test fun `the fit script sizes the player from the height the page does know`() { val js = YOUTUBE_FIT_PLAYER_JS assertTrue("percentage heights are what resolve to zero: $js", js.contains("window.innerHeight")) assertTrue(js.contains("dispatchEvent")) } @Test fun `the fit script overrides YouTube's own styles, which would otherwise win`() { assertTrue(YOUTUBE_FIT_PLAYER_JS.contains("!important")) } @Test fun `the fit script covers the video element and the containers above it`() { val js = YOUTUBE_FIT_PLAYER_JS assertTrue(js.contains("html,body")) assertTrue(js.contains("#movie_player")) assertTrue(js.contains("video{height:")) } @Test fun `the fit script does nothing when the page has no height to copy`() { assertTrue("must not pin the player to zero", YOUTUBE_FIT_PLAYER_JS.contains("if (!h) { return; }")) } }