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; }"))
}
}