package org.terst.feedreader.readability import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test /** * The "Add as a preferred source on Google" badge beside a byline. * * Reported live: "remove giant Google icon" on West Hawaii Today. The markup below is what the * vendored Readability.js actually leaves behind on that article -- the wrapper's class is gone * by then, which is why the link's address is what gets matched. */ class PreferredSourceBadgeTest { private val realBadge = """

""" + """Add as a preferred source on Google

""" @Test fun `strips the badge that sits beside the byline`() { val html = "

By A Reporter

$realBadge

The first real sentence.

" val cleaned = PreferredSourceBadge.strip(html)!! assertFalse("the badge is still there: $cleaned", cleaned.contains("preferred_source_badge")) assertFalse(cleaned.contains("google.com/preferences/source")) assertTrue(cleaned.contains("By A Reporter")) assertTrue(cleaned.contains("The first real sentence.")) } /** It leaves no blank gap where it used to be: the paragraph held nothing else. */ @Test fun `takes the emptied paragraph with it`() { val cleaned = PreferredSourceBadge.strip("

Real.

$realBadge")!! assertEquals("

Real.

", cleaned.trim()) } /** * The safety valve. An article may discuss the programme and link to it in a sentence, and * that sentence belongs to whoever wrote it. */ @Test fun `leaves a link alone when it has words in it`() { val html = """

You can """ + """add us as a preferred source if you like.

""" assertEquals(html, PreferredSourceBadge.strip(html)) } @Test fun `leaves an ordinary image link alone`() { val html = """

""" assertEquals(html, PreferredSourceBadge.strip(html)) } @Test fun `leaves an article with no badge exactly as it was`() { val html = "

Nothing to do here.

" assertEquals(html, PreferredSourceBadge.strip(html)) } /** * The whole article, as the app would really hold it. * * The fixture is the reported USPS story put through the vendored Readability.js exactly as * the app does -- the cases above prove the matcher against the badge on its own, this * proves it meets reality in one piece. Same arrangement as the recirculation widgets, on * the same newspaper. */ @Test fun `the real extracted article loses the badge and keeps its text`() { val extracted = checkNotNull( javaClass.getResourceAsStream("/west-hawaii-today-usps-extracted.html") ).bufferedReader().use { it.readText() } assertEquals( "fixture should carry the reported bug", 1, Regex("google_preferred_source_badge").findAll(extracted).count(), ) val cleaned = PreferredSourceBadge.strip(extracted)!! assertEquals(0, Regex("google_preferred_source_badge").findAll(cleaned).count()) assertFalse(cleaned.contains("preferences/source")) assertTrue(cleaned.contains("The U.S. Postal Service is moving to raise")) assertTrue(cleaned.contains("Cailley LaPara")) assertTrue( "barely any of the article should have gone with the badge", cleaned.length > extracted.length - 400, ) } @Test fun `copes with nothing`() { assertEquals(null, PreferredSourceBadge.strip(null)) assertEquals("", PreferredSourceBadge.strip("")) } }