Esempio n. 1
0
class ShowTest(TestCase):

	def setUp(self):

		self.path = mktemp()
		self.db = Database(self.path)
		self.show = Show(u"A", url=u"a")
		self.show = self.db.add_show(self.show)

	def tearDown(self):

		unlink(self.path)

	def test_str_and_repr(self):

		self.assertEqual(str(self.show), "Show: A")
		self.assertEqual(repr(self.show), 'Show(u"A", u"a")')

	def test_equality(self):

		show = Show(u"A", url=u"b")
		self.assertNotEqual(show, self.show)

		show = Show(u"B", url=u"a")
		self.assertNotEqual(show, self.show)

		show = Show(u"A", url=u"a")
		self.assertEqual(show, self.show)

	def test_remove_episodes_before(self):

		now = date.today()
		then = now - timedelta(3)

		show2 = Show(u"B", url=u"b")
		show2 = self.db.add_show(show2)

		episode1 = Episode(u"e", 1, 1, now, u"x", 1)
		episode2 = Episode(u"e", 1, 2, then, u"x", 1)
		episode3 = Episode(u"e", 1, 3, now, u"x", 1)
		episode4 = Episode(u"e", 1, 4, then, u"x", 1)

		self.db.add_episode(episode1, self.show)
		self.db.add_episode(episode2, self.show)
		self.db.add_episode(episode3, show2)
		self.db.add_episode(episode4, show2)

		episodes = self.db.get_episodes(basedate = then, n_days=10)
		self.assertEqual(4, len(episodes))

		show2.remove_episodes_before(self.db, now)

		episodes = self.db.get_episodes(basedate = then, n_days=10)
		self.assertEqual(3, len(episodes))

		self.show.remove_episodes_before(self.db, now)

		episodes = self.db.get_episodes(basedate = then, n_days=10)
		self.assertEqual(2, len(episodes))
Esempio n. 2
0
class ShowTest(TestCase):
    def setUp(self):

        self.path = mktemp()
        self.db = Database(self.path)
        self.show = Show(u"A", url=u"a")
        self.show = self.db.add_show(self.show)

    def tearDown(self):

        unlink(self.path)

    def test_str_and_repr(self):

        self.assertEqual(str(self.show), "Show: A")
        self.assertEqual(repr(self.show), 'Show(u"A", u"a")')

    def test_equality(self):

        show = Show(u"A", url=u"b")
        self.assertNotEqual(show, self.show)

        show = Show(u"B", url=u"a")
        self.assertNotEqual(show, self.show)

        show = Show(u"A", url=u"a")
        self.assertEqual(show, self.show)

    def test_remove_episodes_before(self):

        now = date.today()
        then = now - timedelta(3)

        show2 = Show(u"B", url=u"b")
        show2 = self.db.add_show(show2)

        episode1 = Episode(u"e", 1, 1, now, u"x", 1)
        episode2 = Episode(u"e", 1, 2, then, u"x", 1)
        episode3 = Episode(u"e", 1, 3, now, u"x", 1)
        episode4 = Episode(u"e", 1, 4, then, u"x", 1)

        self.db.add_episode(episode1, self.show)
        self.db.add_episode(episode2, self.show)
        self.db.add_episode(episode3, show2)
        self.db.add_episode(episode4, show2)

        episodes = self.db.get_episodes(basedate=then, n_days=10)
        self.assertEqual(4, len(episodes))

        show2.remove_episodes_before(self.db, now)

        episodes = self.db.get_episodes(basedate=then, n_days=10)
        self.assertEqual(3, len(episodes))

        self.show.remove_episodes_before(self.db, now)

        episodes = self.db.get_episodes(basedate=then, n_days=10)
        self.assertEqual(2, len(episodes))
Esempio n. 3
0
class EpguidesTest(TestCase):
    def setUp(self):

        self.parser = Epguides()
        self.db = Database("sqlite://")

        self.req = MockRequestHandler()
        self.args = MockArgs("fake-api-key", agent="episoder/fake")

        self._get_orig = requests.get
        requests.get = self.req.get

    def tearDown(self):

        requests.get = self._get_orig

    def test_parser_name(self):

        self.assertEqual("epguides.com parser", str(self.parser))
        self.assertEqual("Epguides()", repr(self.parser))

    def test_accept(self):

        parser = self.parser
        self.assertTrue(parser.accept("http://www.epguides.com/Lost"))
        self.assertFalse(parser.accept("http://epguides2.com/Lost"))
        self.assertFalse(parser.accept("http://www.tv.com/Lost"))

    def test_guess_encoding(self):

        req = MockRequestHandler()

        res = req.get("http://epguides.com/test_iso_8859_1")
        self.assertEqual("iso-8859-1", self.parser.guess_encoding(res))

        res = req.get("http://epguides.com/bsg")
        self.assertEqual("utf8", self.parser.guess_encoding(res))

    def test_http_request(self):

        url = u"http://epguides.com/lost"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertTrue(len(self.req.requests) > 0)
        req = self.req.requests[-1]

        self.assertEqual(req.url, u"http://epguides.com/lost")
        headers = req.headers
        self.assertIn("User-Agent", headers)
        self.assertEqual(headers.get("User-Agent"), "episoder/fake")

    def test_parse(self):

        url = u"http://epguides.com/lost"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        timediff = datetime.now() - show.updated
        self.assertTrue(timediff.total_seconds() < 1)

        self.assertEqual("Lost", show.name)
        self.assertEqual(Show.ENDED, show.status)

        episodes = self.db.get_episodes(date(1996, 1, 1), 99999)
        self.assertEqual(121, len(episodes))

        ep = episodes[0]
        self.assertEqual("Pilot (1)", ep.title)
        self.assertEqual(1, ep.season)
        self.assertEqual(1, ep.episode)
        self.assertEqual(date(2004, 9, 22), ep.airdate)

        ep = episodes[9]
        self.assertEqual("Raised by Another", ep.title)
        self.assertEqual(1, ep.season)
        self.assertEqual(10, ep.episode)
        self.assertEqual(date(2004, 12, 1), ep.airdate)

        ep = episodes[25]
        self.assertEqual("Man of Science, Man of Faith", ep.title)
        self.assertEqual(2, ep.season)
        self.assertEqual(1, ep.episode)
        self.assertEqual(date(2005, 9, 21), ep.airdate)

        self.db.clear()
        url = u"http://epguides.com/bsg"
        show = self.db.add_show(Show(u"none", url=url))

        self.parser.parse(show, self.db, self.args)

        self.assertEqual("Battlestar Galactica (2003)", show.name)
        self.assertEqual(Show.ENDED, show.status)

        episodes = self.db.get_episodes(date(1996, 1, 1), 99999)
        self.assertEqual(73, len(episodes))

        ep = episodes[0]
        self.assertEqual("33", ep.title)
        self.assertEqual(1, ep.season)
        self.assertEqual(1, ep.episode)
        self.assertEqual(date(2005, 1, 14), ep.airdate)

    def test_format_2(self):

        # Another format
        url = u"http://epguides.com/eureka"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual("Eureka", show.name)
        self.assertEqual(Show.ENDED, show.status)

        episodes = self.db.get_episodes(date(1988, 1, 1), 99999)
        self.assertEqual(76, len(episodes))

        ep = episodes[0]
        self.assertEqual("Pilot", ep.title)
        self.assertEqual(1, ep.season)
        self.assertEqual(1, ep.episode)
        self.assertEqual(date(2006, 7, 18), ep.airdate)

        ep = episodes[9]
        self.assertEqual("Purple Haze", ep.title)
        self.assertEqual(1, ep.season)
        self.assertEqual(10, ep.episode)
        self.assertEqual(date(2006, 9, 19), ep.airdate)

        ep = episodes[27]
        self.assertEqual("Best in Faux", ep.title)
        self.assertEqual(3, ep.season)
        self.assertEqual(3, ep.episode)
        self.assertEqual(date(2008, 8, 12), ep.airdate)

    def test_format_3(self):

        # Yet another format
        url = u"http://epguides.com/midsomer_murders"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual("Midsomer Murders", show.name)
        self.assertEqual(Show.RUNNING, show.status)

        episodes = self.db.get_episodes(date(1988, 1, 1), 99999)
        self.assertEqual(101, len(episodes))

        episode = episodes[0]
        self.assertEqual(1, episode.season)
        self.assertEqual(1, episode.episode)
        self.assertEqual("Written in Blood", episode.title)
        self.assertEqual(date(1998, 3, 22), episode.airdate)

        episode = episodes[5]
        self.assertEqual(2, episode.season)
        self.assertEqual(2, episode.episode)
        self.assertEqual("Strangler's Wood", episode.title)
        self.assertEqual(date(1999, 2, 3), episode.airdate)

    def test_fancy_utf8_chars(self):

        # This one contains an illegal character somewhere
        url = u"http://epguides.com/american_idol"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual("American Idol", show.name)
        self.assertEqual(Show.RUNNING, show.status)

        episodes = self.db.get_episodes(date(1988, 1, 1), 99999)
        self.assertTrue(len(episodes) >= 11)

        episode = episodes[11]
        self.assertEqual(u"Pride Goeth Before The ‘Fro", episode.title)
        self.assertEqual(1, episode.season)
        self.assertEqual(12, episode.episode)

    def test_missing_season_number(self):

        # This one lacks a season number somewhere
        url = u"http://epguides.com/48_hours_mistery"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual("48 Hours Mystery", show.name)
        self.assertEqual(Show.RUNNING, show.status)

        episodes = self.db.get_episodes(date(1988, 1, 1), 99999)
        self.assertEqual(150, len(episodes))

        episode = episodes[0]
        self.assertEqual(19, episode.season)
        self.assertEqual(1, episode.episode)
        self.assertEqual("January 1988 Debut of 48 Hours", episode.title)
        self.assertEqual(date(1988, 1, 15), episode.airdate)
        self.assertEqual("01-01", episode.prodnum)

    def test_ended_show(self):

        # This one is no longer on the air
        url = u"http://epguides.com/kr2008"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual("Knight Rider (2008)", show.name)
        self.assertEqual(Show.ENDED, show.status)

        episodes = self.db.get_episodes(date(1996, 1, 1), 99999)
        self.assertEqual(17, len(episodes))

        episode = episodes[3]
        self.assertEqual(1, episode.season)
        self.assertEqual(4, episode.episode)
        self.assertEqual("A Hard Day's Knight", episode.title)
        self.assertEqual(date(2008, 10, 15), episode.airdate)
        self.assertEqual("104", episode.prodnum)

    def test_encoding(self):

        # This one has funny characters
        url = u"http://epguides.com/buzzcocks"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual(u"Never Mind the Buzzcocks", show.name)
        self.assertEqual(Show.RUNNING, show.status)

        episodes = self.db.get_episodes(date(1996, 1, 1), 99999)
        self.assertTrue(len(episodes) >= 21)
        episode = episodes[20]
        self.assertEqual(3, episode.season)
        self.assertEqual(4, episode.episode)
        title = u"Zoë Ball, Louis Eliot, Graham Norton, Keith Duffy"
        self.assertEqual(title, episode.title)
        self.assertEqual(date(1998, 3, 20), episode.airdate)

    def test_with_anchor(self):

        # This one has an anchor tag before the bullet for season 6
        url = u"http://epguides.com/futurama"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual("Futurama", show.name)
        self.assertEqual(Show.ENDED, show.status)

        episodes = self.db.get_episodes(date(1996, 1, 1), 99999)
        self.assertEqual(124, len(episodes))

        episode = episodes.pop()
        self.assertEqual(7, episode.season)
        self.assertEqual(26, episode.episode)
        self.assertEqual("Meanwhile", episode.title)
        self.assertEqual(date(2013, 9, 4), episode.airdate)

    def test_with_trailer_and_recap(self):

        # This one has [Trailer] and [Recap] in episode titles
        url = u"http://epguides.com/house"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual("House, M.D.", show.name)
        self.assertEqual(Show.ENDED, show.status)

        episodes = self.db.get_episodes(date(1996, 1, 1), 99999)
        self.assertEqual(176, len(episodes))

        episode = episodes[-3]
        self.assertEqual(8, episode.season)
        self.assertEqual(20, episode.episode)
        self.assertEqual("Post Mortem", episode.title)
        self.assertEqual(date(2012, 5, 7), episode.airdate)

        episode = episodes[-2]
        self.assertEqual("Holding On", episode.title)

    def test_encoding_iso8859_1(self):

        # Explicitly test ISO 8859-1 encoding
        url = u"http://epguides.com/test_iso_8859_1"
        show = self.db.add_show(Show(u"none", url=url))
        self.parser.parse(show, self.db, self.args)

        self.assertEqual(u"Episoder ISO-8859-1 Tëst", show.name)

        episodes = self.db.get_episodes(date(1996, 1, 1), 99999)
        self.assertEqual(len(episodes), 1)

        episode = episodes[0]
        self.assertEqual(u"äöü", episode.title)
Esempio n. 4
0
class TVDBTest(TestCase):
    def setUp(self):

        logging.disable(logging.ERROR)

        self.db = Database("sqlite://")
        self.tvdb = TVDB()
        self.req = MockRequestHandler()
        self.args = MockArgs("fake-api-key", "episoder/test")

        self.__get_orig = requests.get
        self.__post_orig = requests.post
        requests.get = self.req.get
        requests.post = self.req.post

    def tearDown(self):

        requests.get = self.__get_orig
        requests.post = self.__post_orig

    def test_parser_name(self):

        self.assertEqual("thetvdb.com parser (ready)", str(self.tvdb))
        self.assertEqual("TVDB <TVDBOffline>", repr(self.tvdb))

        self.tvdb.login(MockArgs("fake-api-key"))
        self.assertEqual("thetvdb.com parser (authorized)", str(self.tvdb))
        self.assertEqual("TVDB <TVDBOnline>", repr(self.tvdb))

    def test_need_login(self):

        with self.assertRaises(TVDBNotLoggedInError):
            self.tvdb.lookup(u"Frasier", self.args)

        self.tvdb.login(MockArgs("fake-api-key"))
        self.tvdb.lookup(u"Frasier", self.args)

        self.tvdb.login(MockArgs("fake-api-key"))
        self.tvdb.lookup(u"Frasier", self.args)

    def test_login(self):

        self.tvdb.login(MockArgs("fake-api-key"))

        reqs = len(self.req.requests)
        self.assertTrue(reqs > 0)

        req = self.req.requests[-1]
        self.assertEqual(req.url, "https://api.thetvdb.com/login")
        self.assertEqual(req.method, "POST")
        self.assertEqual(req.body.decode("utf8"), '{"apikey": "fake-api-key"}')
        headers = req.headers
        self.assertEqual(headers.get("Content-type"), "application/json")

        self.tvdb.login(MockArgs("fake-api-key"))
        self.assertEqual(reqs, len(self.req.requests))

    def test_login_failure(self):

        with self.assertRaises(InvalidLoginError):
            self.tvdb.login(MockArgs("wrong-api-key"))

        with self.assertRaises(InvalidLoginError):
            self.tvdb.login(MockArgs("wrong-api-key"))

        with self.assertRaises(InvalidLoginError):
            self.tvdb.login(MockArgs("wrong-api-key"))

        self.tvdb.login(MockArgs("fake-api-key"))

    def test_search_no_hit(self):

        self.tvdb.login(MockArgs("fake-api-key"))

        with self.assertRaises(TVDBShowNotFoundError):
            self.tvdb.lookup("NoSuchShow", self.args)

    def test_search_single(self):

        self.tvdb.login(MockArgs("fake-api-key"))

        shows = list(self.tvdb.lookup("Frasier", self.args))

        req = self.req.requests[-1]
        self.assertEqual(req.url, "https://api.thetvdb.com/search/series")
        self.assertEqual(req.params, {"name": "Frasier"})
        self.assertEqual(req.method, "GET")
        self.assertEqual(req.body, "")

        content_type = req.headers.get("Content-type")
        self.assertEqual(content_type, "application/json")

        auth = req.headers.get("Authorization")
        self.assertEqual(auth, "Bearer fake-token")

        self.assertEqual(len(shows), 1)
        show = shows[0]
        self.assertEqual(show.name, "Frasier")
        self.assertEqual(show.url, "77811")

    def test_search_multiple(self):

        self.tvdb.login(MockArgs("fake-api-key"))

        shows = list(self.tvdb.lookup("Friends", self.args))

        self.assertEqual(len(shows), 3)
        self.assertEqual(shows[0].name, "Friends")
        self.assertEqual(shows[1].name, "Friends (1979)")
        self.assertEqual(shows[2].name, "Friends of Green Valley")

    def test_accept_url(self):

        self.assertTrue(TVDB.accept("123"))
        self.assertFalse(TVDB.accept("http://www.epguides.com/test"))

    def test_encoding_utf8(self):

        self.tvdb.login(self.args)

        show = self.db.add_show(Show(u"unnamed show", url=u"73739"))
        self.assertTrue(TVDB.accept(show.url))

        self.tvdb.parse(show, self.db, self.args)

        self.assertEqual("Lost", show.name)
        self.assertEqual(Show.ENDED, show.status)

        episodes = self.db.get_episodes(date(1988, 1, 1), 99999)
        self.assertEqual(len(episodes), 1)

        episode = episodes[0]
        self.assertEqual(episode.title, u"Exposé")

    def test_null_values(self):

        self.tvdb.login(self.args)
        show = self.db.add_show(Show(u"unnamed show", url=u"268156"))
        self.assertTrue(TVDB.accept(show.url))

        # this show has some null values that can confuse the parser
        self.tvdb.parse(show, self.db, self.args)
        self.assertEqual("Sense8", show.name)

    def test_parse(self):

        show = self.db.add_show(Show(u"unnamed show", url=u"260"))
        self.assertTrue(TVDB.accept(show.url))

        with self.assertRaises(TVDBNotLoggedInError):
            self.tvdb.parse(show, None, self.args)

        self.tvdb.login(self.args)
        self.tvdb.parse(show, self.db, self.args)

        req = self.req.requests[-2]
        self.assertEqual(req.url, "https://api.thetvdb.com/series/260")
        self.assertEqual(req.params, {})
        self.assertEqual(req.method, "GET")
        self.assertEqual(req.body, "")

        content_type = req.headers.get("Content-type")
        self.assertEqual(content_type, "application/json")

        auth = req.headers.get("Authorization")
        self.assertEqual(auth, "Bearer fake-token")

        req = self.req.requests[-1]
        self.assertEqual(req.url,
                         "https://api.thetvdb.com/series/260/episodes")
        self.assertEqual(req.params, {"page": 1})
        self.assertEqual(req.method, "GET")
        self.assertEqual(req.body, "")

        content_type = req.headers.get("Content-type")
        self.assertEqual(content_type, "application/json")

        auth = req.headers.get("Authorization")
        self.assertEqual(auth, "Bearer fake-token")

        self.assertEqual(show.name, "test show")
        self.assertEqual(show.status, Show.RUNNING)

        timediff = datetime.now() - show.updated
        self.assertTrue(timediff.total_seconds() < 1)

        episodes = self.db.get_episodes(date(1988, 1, 1), 99999)
        self.assertEqual(len(episodes), 2)

        episode = episodes[0]
        self.assertEqual(episode.title, "Unnamed episode")
        self.assertEqual(episode.season, 0)
        self.assertEqual(episode.episode, 0)
        self.assertEqual(episode.airdate, date(1990, 1, 18))
        self.assertEqual(episode.prodnum, "UNK")
        self.assertEqual(episode.totalnum, 1)

        episode = episodes[1]
        self.assertEqual(episode.title, "The Good Son")
        self.assertEqual(episode.season, 1)
        self.assertEqual(episode.episode, 1)
        self.assertEqual(episode.airdate, date(1993, 9, 16))
        self.assertEqual(episode.totalnum, 2)

    def test_parse_paginated(self):

        show = self.db.add_show(Show(u"unnamed show", url=u"261"))

        self.tvdb.login(self.args)
        self.tvdb.parse(show, self.db, self.args)

        self.assertEqual(show.status, Show.ENDED)
        episodes = self.db.get_episodes(date(1988, 1, 1), 99999)
        self.assertEqual(len(episodes), 8)

        episode = episodes[0]
        self.assertEqual(episode.title, "First")

        episode = episodes[1]
        self.assertEqual(episode.title, "Second")

        episode = episodes[2]
        self.assertEqual(episode.title, "Third")

        episode = episodes[3]
        self.assertEqual(episode.title, "Fourth")

        episode = episodes[4]
        self.assertEqual(episode.title, "Fifth")

        episode = episodes[5]
        self.assertEqual(episode.title, "Sixth")

        episode = episodes[6]
        self.assertEqual(episode.title, "Seventh")

        episode = episodes[7]
        self.assertEqual(episode.title, "Eighth")

    def test_parse_invalid_show(self):

        self.tvdb.login(self.args)

        show = self.db.add_show(Show(u"test show", url=u"293"))

        with self.assertRaises(TVDBShowNotFoundError):
            self.tvdb.parse(show, None, self.args)

    def test_parse_show_with_invalid_data(self):

        self.tvdb.login(self.args)
        show = self.db.add_show(Show(u"unnamed show", url=u"262"))

        self.tvdb.parse(show, self.db, self.args)
        episodes = self.db.get_episodes(date(1988, 1, 1), 99999)
        self.assertEqual(len(episodes), 2)

    def test_user_agent(self):

        show = self.db.add_show(Show(u"unnamed show", url=u"262"))

        self.tvdb.login(self.args)
        self.tvdb.lookup("Frasier", self.args)
        self.tvdb.parse(show, self.db, self.args)

        self.assertEqual(len(self.req.requests), 4)

        req = self.req.requests[0]
        headers = req.headers
        self.assertEqual(headers.get("User-Agent"), "episoder/test")

        req = self.req.requests[1]
        headers = req.headers
        self.assertEqual(headers.get("User-Agent"), "episoder/test")

        req = self.req.requests[2]
        headers = req.headers
        self.assertEqual(headers.get("User-Agent"), "episoder/test")

        req = self.req.requests[3]
        headers = req.headers
        self.assertEqual(headers.get("User-Agent"), "episoder/test")
Esempio n. 5
0
class TVDBTest(TestCase):

	def setUp(self):

		logging.disable(logging.ERROR)

		self.db = Database("sqlite://")
		self.tvdb = TVDB()
		self.req = MockRequestHandler()
		self.args = MockArgs("fake-api-key", "episoder/test")

		self.__get_orig = requests.get
		self.__post_orig = requests.post
		requests.get = self.req.get
		requests.post = self.req.post

	def tearDown(self):

		requests.get = self.__get_orig
		requests.post = self.__post_orig

	def test_parser_name(self):

		self.assertEqual("thetvdb.com parser (ready)", str(self.tvdb))
		self.assertEqual("TVDB <TVDBOffline>", repr(self.tvdb))

		self.tvdb.login(MockArgs("fake-api-key"))
		self.assertEqual("thetvdb.com parser (authorized)",
								str(self.tvdb))
		self.assertEqual("TVDB <TVDBOnline>", repr(self.tvdb))

	def test_need_login(self):

		with self.assertRaises(TVDBNotLoggedInError):
			self.tvdb.lookup(u"Frasier", self.args)

		self.tvdb.login(MockArgs("fake-api-key"))
		self.tvdb.lookup(u"Frasier", self.args)

		self.tvdb.login(MockArgs("fake-api-key"))
		self.tvdb.lookup(u"Frasier", self.args)

	def test_login(self):

		self.tvdb.login(MockArgs("fake-api-key"))

		reqs = len(self.req.requests)
		self.assertTrue(reqs > 0)

		req = self.req.requests[-1]
		self.assertEqual(req.url, "https://api.thetvdb.com/login")
		self.assertEqual(req.method, "POST")
		self.assertEqual(req.body.decode("utf8"),
						'{"apikey": "fake-api-key"}')
		headers = req.headers
		self.assertEqual(headers.get("Content-type"),"application/json")

		self.tvdb.login(MockArgs("fake-api-key"))
		self.assertEqual(reqs, len(self.req.requests))

	def test_login_failure(self):

		with self.assertRaises(InvalidLoginError):
			self.tvdb.login(MockArgs("wrong-api-key"))

		with self.assertRaises(InvalidLoginError):
			self.tvdb.login(MockArgs("wrong-api-key"))

		with self.assertRaises(InvalidLoginError):
			self.tvdb.login(MockArgs("wrong-api-key"))

		self.tvdb.login(MockArgs("fake-api-key"))

	def test_search_no_hit(self):

		self.tvdb.login(MockArgs("fake-api-key"))

		with self.assertRaises(TVDBShowNotFoundError):
			self.tvdb.lookup("NoSuchShow", self.args)

	def test_search_single(self):

		self.tvdb.login(MockArgs("fake-api-key"))

		shows = list(self.tvdb.lookup("Frasier", self.args))

		req = self.req.requests[-1]
		self.assertEqual(req.url,
					"https://api.thetvdb.com/search/series")
		self.assertEqual(req.params, {"name": "Frasier"})
		self.assertEqual(req.method, "GET")
		self.assertEqual(req.body, "")

		content_type = req.headers.get("Content-type")
		self.assertEqual(content_type, "application/json")

		auth = req.headers.get("Authorization")
		self.assertEqual(auth, "Bearer fake-token")

		self.assertEqual(len(shows), 1)
		show = shows[0]
		self.assertEqual(show.name, "Frasier")
		self.assertEqual(show.url, "77811")

	def test_search_multiple(self):

		self.tvdb.login(MockArgs("fake-api-key"))

		shows = list(self.tvdb.lookup("Friends", self.args))

		self.assertEqual(len(shows), 3)
		self.assertEqual(shows[0].name, "Friends")
		self.assertEqual(shows[1].name, "Friends (1979)")
		self.assertEqual(shows[2].name, "Friends of Green Valley")

	def test_accept_url(self):

		self.assertTrue(TVDB.accept("123"))
		self.assertFalse(TVDB.accept("http://www.epguides.com/test"))

	def test_encoding_utf8(self):

		self.tvdb.login(self.args)

		show = self.db.add_show(Show(u"unnamed show", url=u"73739"))
		self.assertTrue(TVDB.accept(show.url))

		self.tvdb.parse(show, self.db, self.args)

		self.assertEqual("Lost", show.name)
		self.assertEqual(Show.ENDED, show.status)

		episodes = self.db.get_episodes(date(1988,1,1), 99999)
		self.assertEqual(len(episodes), 1)

		episode = episodes[0]
		self.assertEqual(episode.title, u"Exposé")

	def test_null_values(self):

		self.tvdb.login(self.args)
		show = self.db.add_show(Show(u"unnamed show", url=u"268156"))
		self.assertTrue(TVDB.accept(show.url))

		# this show has some null values that can confuse the parser
		self.tvdb.parse(show, self.db, self.args)
		self.assertEqual("Sense8", show.name)

	def test_parse(self):

		show = self.db.add_show(Show(u"unnamed show", url=u"260"))
		self.assertTrue(TVDB.accept(show.url))

		with self.assertRaises(TVDBNotLoggedInError):
			self.tvdb.parse(show, None, self.args)

		self.tvdb.login(self.args)
		self.tvdb.parse(show, self.db, self.args)

		req = self.req.requests[-2]
		self.assertEqual(req.url, "https://api.thetvdb.com/series/260")
		self.assertEqual(req.params, {})
		self.assertEqual(req.method, "GET")
		self.assertEqual(req.body, "")

		content_type = req.headers.get("Content-type")
		self.assertEqual(content_type, "application/json")

		auth = req.headers.get("Authorization")
		self.assertEqual(auth, "Bearer fake-token")

		req = self.req.requests[-1]
		self.assertEqual(req.url,
				"https://api.thetvdb.com/series/260/episodes")
		self.assertEqual(req.params, {"page": 1})
		self.assertEqual(req.method, "GET")
		self.assertEqual(req.body, "")

		content_type = req.headers.get("Content-type")
		self.assertEqual(content_type, "application/json")

		auth = req.headers.get("Authorization")
		self.assertEqual(auth, "Bearer fake-token")

		self.assertEqual(show.name, "test show")
		self.assertEqual(show.status, Show.RUNNING)

		timediff = datetime.now() - show.updated
		self.assertTrue(timediff.total_seconds() < 1)

		episodes = self.db.get_episodes(date(1988,1,1), 99999)
		self.assertEqual(len(episodes), 2)

		episode = episodes[0]
		self.assertEqual(episode.title, "Unnamed episode")
		self.assertEqual(episode.season, 0)
		self.assertEqual(episode.episode, 0)
		self.assertEqual(episode.airdate, date(1990, 1, 18))
		self.assertEqual(episode.prodnum, "UNK")
		self.assertEqual(episode.totalnum, 1)

		episode = episodes[1]
		self.assertEqual(episode.title, "The Good Son")
		self.assertEqual(episode.season, 1)
		self.assertEqual(episode.episode, 1)
		self.assertEqual(episode.airdate, date(1993, 9, 16))
		self.assertEqual(episode.totalnum, 2)

	def test_parse_paginated(self):

		show = self.db.add_show(Show(u"unnamed show", url=u"261"))

		self.tvdb.login(self.args)
		self.tvdb.parse(show, self.db, self.args)

		self.assertEqual(show.status, Show.ENDED)
		episodes = self.db.get_episodes(date(1988,1,1), 99999)
		self.assertEqual(len(episodes), 8)

		episode = episodes[0]
		self.assertEqual(episode.title, "First")

		episode = episodes[1]
		self.assertEqual(episode.title, "Second")

		episode = episodes[2]
		self.assertEqual(episode.title, "Third")

		episode = episodes[3]
		self.assertEqual(episode.title, "Fourth")

		episode = episodes[4]
		self.assertEqual(episode.title, "Fifth")

		episode = episodes[5]
		self.assertEqual(episode.title, "Sixth")

		episode = episodes[6]
		self.assertEqual(episode.title, "Seventh")

		episode = episodes[7]
		self.assertEqual(episode.title, "Eighth")

	def test_parse_invalid_show(self):

		self.tvdb.login(self.args)

		show = self.db.add_show(Show(u"test show", url=u"293"))

		with self.assertRaises(TVDBShowNotFoundError):
			self.tvdb.parse(show, None, self.args)

	def test_parse_show_with_invalid_data(self):

		self.tvdb.login(self.args)
		show = self.db.add_show(Show(u"unnamed show", url=u"262"))

		self.tvdb.parse(show, self.db, self.args)
		episodes = self.db.get_episodes(date(1988,1,1), 99999)
		self.assertEqual(len(episodes), 2)

	def test_user_agent(self):

		show = self.db.add_show(Show(u"unnamed show", url=u"262"))

		self.tvdb.login(self.args)
		self.tvdb.lookup("Frasier", self.args)
		self.tvdb.parse(show, self.db, self.args)

		self.assertEqual(len(self.req.requests), 4)

		req = self.req.requests[0]
		headers = req.headers
		self.assertEqual(headers.get("User-Agent"), "episoder/test")

		req = self.req.requests[1]
		headers = req.headers
		self.assertEqual(headers.get("User-Agent"), "episoder/test")

		req = self.req.requests[2]
		headers = req.headers
		self.assertEqual(headers.get("User-Agent"), "episoder/test")

		req = self.req.requests[3]
		headers = req.headers
		self.assertEqual(headers.get("User-Agent"), "episoder/test")
Esempio n. 6
0
class DatabaseTest(TestCase):

	def setUp(self):

		logging.basicConfig(level=logging.ERROR)
		logging.disable(logging.ERROR)
		self.db = Database("sqlite://")
		self.tempfiles = []

	def tearDown(self):

		for f in self.tempfiles:
			unlink(f)

	def test_str_and_repr(self):

		name = str(self.db)
		self.assertEqual(name, "Episoder Database at sqlite://")

		name = repr(self.db)
		self.assertEqual(name, "Database(sqlite://)")

	def test_get_show_by_url(self):

		show1 = self.db.add_show(Show(u"test show", url=u"a"))
		show2 = self.db.add_show(Show(u"test show 2", url=u"b"))

		self.assertEqual(show1, self.db.get_show_by_url(u"a"))
		self.assertEqual(show2, self.db.get_show_by_url(u"b"))
		self.assertEqual(None, self.db.get_show_by_url(u"c"))

	def test_get_show_by_id(self):

		show1 = self.db.add_show(Show(u"test show", url=u"a"))
		show2 = self.db.add_show(Show(u"test show 2", url=u"b"))

		self.assertEqual(show1, self.db.get_show_by_id(show1.id))
		self.assertEqual(show2, self.db.get_show_by_id(show2.id))
		self.assertEqual(None, self.db.get_show_by_id(99999))

	def test_add_show(self):

		show = self.db.add_show(Show(u"test show", url=u"http://test2"))
		self.assertTrue(show.id > 0)

		shows = self.db.get_shows()
		self.assertEqual(1, len(shows))
		self.assertIn(show, shows)
		self.db.commit()

		show2 = self.db.add_show(Show(u"moo show", url=u"http://test"))
		self.assertTrue(show2.id > 0)
		self.assertNotEqual(show.id, show2.id)
		self.db.commit()

		shows = self.db.get_shows()
		self.assertEqual(2, len(shows))
		self.assertIn(show, shows)
		self.assertIn(show2, shows)

		self.db.add_show(Show(u"showA", url=u"urlA"))
		self.assertEqual(3, len(self.db.get_shows()))
		self.db.commit()

		self.db.add_show(Show(u"showA", url=u"urlB"))
		self.assertEqual(4, len(self.db.get_shows()))
		self.db.commit()

		with self.assertRaises(Exception):
			self.db.add_show(Show(u"showB", url=u"urlB"))
			self.db.commit()

		self.db.rollback()
		self.assertEqual(4, len(self.db.get_shows()))

	def test_add_episode(self):

		show = Show(u"some show", url=u"foo")
		show = self.db.add_show(show)
		self.db.commit()

		ep1 = Episode(u"Some episode", 3, 10, date.today(), u"FOO", 30)
		ep2 = Episode(u"No episode", 3, 12, date.today(), u"FOO", 32)
		self.db.add_episode(ep1, show)
		self.db.add_episode(ep2, show)
		self.db.commit()

		episodes = self.db.get_episodes()
		self.assertTrue(ep1 in episodes)
		self.assertTrue(ep2 in episodes)

	def test_search(self):

		show = self.db.add_show(Show(u"some show"))
		ep1 = Episode(u"first episode", 3, 10, date.today(), u"FOO", 30)
		ep2 = Episode(u"Second episode", 3, 12, date.today(), u"FOO", 32)

		self.db.add_episode(ep1, show)
		self.db.add_episode(ep2, show)
		self.db.commit()

		episodes = self.db.search(u"first")
		self.assertIn(ep1, episodes)
		self.assertNotIn(ep2, episodes)

		episodes = self.db.search(u"second")
		self.assertNotIn(ep1, episodes)
		self.assertIn(ep2, episodes)

		episodes = self.db.search(u"episode")
		self.assertIn(ep1, episodes)
		self.assertIn(ep2, episodes)

		episodes = self.db.search(u"some show")
		self.assertIn(ep1, episodes)
		self.assertIn(ep2, episodes)

	def test_remove_invalid_show(self):

		self.db.remove_show(0)

	def test_remove_show(self):

		show1 = self.db.add_show(Show(u"random show", url=u"z"))
		show2 = self.db.add_show(Show(u"other show", url=u"x"))
		self.db.commit()

		now = date.today()
		episode1 = Episode(u"first", 1, 1, now, u"x", 1)
		episode2 = Episode(u"second",1, 2, now, u"x", 1)
		episode3 = Episode(u"first", 1, 1, now, u"x", 1)

		self.db.add_episode(episode1, show1)
		self.db.add_episode(episode2, show1)
		self.db.add_episode(episode3, show2)
		self.db.commit()

		episodes = self.db.get_episodes()
		self.assertEqual(3, len(episodes))

		self.db.remove_show(show1.id)
		self.db.commit()

		episodes = self.db.get_episodes()
		self.assertEqual(1, len(episodes))
		self.assertIn(episode3, episodes)

	def test_rollback(self):

		show = Show(u"some show")
		show = self.db.add_show(show)
		self.db.commit()

		ep1 = Episode(u"first", 3, 10, date.today(), u"FOO", 30)
		self.db.add_episode(ep1, show)
		self.db.rollback()

		ep2 = Episode(u"Second", 3, 12, date.today(), u"FOO", 32)
		self.db.add_episode(ep2, show)
		self.db.commit()

		episodes = self.db.get_episodes()
		self.assertFalse(ep1 in episodes)
		self.assertTrue(ep2 in episodes)

	def test_get_episodes(self):

		show = self.db.add_show(Show(u"some show"))

		today = date.today()
		yesterday = today - timedelta(1)
		before = yesterday - timedelta(1)
		tomorrow = today + timedelta(1)

		episode1 = Episode(u"episode1", 1, 1, before, u"x", 1)
		episode2 = Episode(u"episode2", 1, 2, yesterday, u"x", 2)
		episode3 = Episode(u"episode3", 1, 3, today, u"x", 3)
		episode4 = Episode(u"episode4", 1, 4, tomorrow, u"x", 4)

		self.db.add_episode(episode1, show)
		self.db.add_episode(episode2, show)
		self.db.add_episode(episode3, show)
		self.db.add_episode(episode4, show)

		self.db.commit()

		episodes = self.db.get_episodes(basedate = before, n_days=1)
		self.assertIn(episode1, episodes)
		self.assertIn(episode2, episodes)
		self.assertNotIn(episode3, episodes)
		self.assertNotIn(episode4, episodes)

		episodes = self.db.get_episodes(basedate = before, n_days=0)
		self.assertIn(episode1, episodes)
		self.assertNotIn(episode2, episodes)
		self.assertNotIn(episode3, episodes)
		self.assertNotIn(episode4, episodes)

		episodes = self.db.get_episodes(basedate = today, n_days=0)
		self.assertNotIn(episode1, episodes)
		self.assertNotIn(episode2, episodes)
		self.assertIn(episode3, episodes)
		self.assertNotIn(episode4, episodes)

		episodes = self.db.get_episodes(basedate = yesterday,n_days=2)
		self.assertNotIn(episode1, episodes)
		self.assertIn(episode2, episodes)
		self.assertIn(episode3, episodes)
		self.assertIn(episode4, episodes)

	def test_remove_before(self):

		show = self.db.add_show(Show(u"some show"))

		today = date.today()
		yesterday = today - timedelta(1)
		before = yesterday - timedelta(1)
		tomorrow = today + timedelta(1)

		episode1 = Episode(u"episode1", 1, 1, before, u"x", 1)
		episode2 = Episode(u"episode2", 1, 2, yesterday, u"x", 2)
		episode3 = Episode(u"episode3", 1, 3, today, u"x", 3)
		episode4 = Episode(u"episode4", 1, 4, tomorrow, u"x", 4)

		self.db.add_episode(episode1, show)
		self.db.add_episode(episode2, show)
		self.db.add_episode(episode3, show)
		self.db.add_episode(episode4, show)
		self.db.commit()

		episodes = self.db.get_episodes(basedate = before, n_days=10)
		self.assertIn(episode1, episodes)
		self.assertIn(episode2, episodes)
		self.assertIn(episode3, episodes)
		self.assertIn(episode4, episodes)

		self.db.remove_before(today)
		episodes = self.db.get_episodes(basedate = before, n_days=10)
		self.assertNotIn(episode1, episodes)
		self.assertNotIn(episode2, episodes)
		self.assertIn(episode3, episodes)
		self.assertIn(episode4, episodes)

	def test_remove_before_with_show(self):

		show1 = self.db.add_show(Show(u"some show", url=u"a"))
		show2 = self.db.add_show(Show(u"some other show", url=u"b"))

		today = date.today()
		yesterday = today - timedelta(1)

		episode1 = Episode(u"episode1", 1, 1, yesterday, u"x", 1)
		episode2 = Episode(u"episode1", 1, 2, yesterday, u"x", 1)
		episode3 = Episode(u"episode1", 1, 2, yesterday, u"x", 1)

		self.db.add_episode(episode1, show1)
		self.db.add_episode(episode2, show1)
		self.db.add_episode(episode3, show2)

		self.db.commit()

		episodes = self.db.get_episodes(basedate = yesterday, n_days=10)
		self.assertIn(episode1, episodes)
		self.assertIn(episode2, episodes)
		self.assertIn(episode3, episodes)

		self.db.remove_before(today, show=show1)

		episodes = self.db.get_episodes(basedate = yesterday, n_days=10)
		self.assertNotIn(episode1, episodes)
		self.assertNotIn(episode2, episodes)
		self.assertIn(episode3, episodes)

	def test_duplicate_episodes(self):

		today = date.today()
		show = self.db.add_show(Show(u"some show"))
		self.assertEqual(0, len(self.db.get_episodes()))

		episode1 = Episode(u"e", 1, 1, today, u"x", 1)
		self.db.add_episode(episode1, show)
		self.db.commit()

		episodes = self.db.get_episodes()
		self.assertEqual(1, len(episodes))
		self.assertIn(episode1, episodes)

		episode2 = Episode(u"f", 1, 1, today, u"x", 1)
		self.db.add_episode(episode2, show)
		self.db.commit()

		episodes = self.db.get_episodes()
		self.assertEqual(1, len(episodes))
		self.assertIn(episode2, episodes)

	def test_clear(self):

		today = date.today()
		show = self.db.add_show(Show(u"some show", url=u"urlX"))
		self.assertEqual(0, len(self.db.get_episodes()))

		episode1 = Episode(u"e", 1, 1, today, u"x", 1)
		episode2 = Episode(u"e", 1, 2, today, u"x", 1)
		episode3 = Episode(u"e", 1, 3, today, u"x", 1)
		episode4 = Episode(u"e", 1, 3, today, u"x", 1)
		episode5 = Episode(u"e", 1, 4, today, u"x", 1)

		self.db.add_episode(episode1, show)
		self.db.add_episode(episode2, show)
		self.db.add_episode(episode3, show)
		self.db.commit()

		episodes = self.db.get_episodes()
		self.assertEqual(3, len(episodes))
		self.assertIn(episode1, episodes)
		self.assertIn(episode2, episodes)
		self.assertIn(episode3, episodes)

		self.db.clear()
		self.assertEqual(0, len(self.db.get_episodes()))

		self.db.add_episode(episode4, show)
		self.db.add_episode(episode5, show)
		self.db.commit()

		episodes = self.db.get_episodes()
		self.assertEqual(2, len(episodes))
		self.assertIn(episode4, episodes)
		self.assertIn(episode5, episodes)

	def test_using_existing_database(self):

		path = mktemp()
		self.tempfiles.append(path)

		db = Database(path)
		self.assertEqual(len(db.get_shows()), 0)
		db.close()

		db = Database(path)
		self.assertEqual(len(db.get_shows()), 0)
		db.close()

	def test_set_get_schema_version(self):

		self.assertEqual(self.db.get_schema_version(), 4)

		self.db.set_schema_version(1)
		self.assertEqual(self.db.get_schema_version(), 1)

		self.db.set_schema_version(2)
		self.assertEqual(self.db.get_schema_version(), 2)

	def test_get_expired_shows(self):

		then = date(2017, 6, 4)

		# show1 -> running
		show1 = self.db.add_show(Show(u"1", url=u"1"))
		show1.updated = then
		show1.status = Show.RUNNING

		# show2 -> paused
		show2 = self.db.add_show(Show(u"2", url=u"2"))
		show2.updated = then
		show2.status = Show.SUSPENDED

		# show3 -> ended
		show3 = self.db.add_show(Show(u"3", url=u"3"))
		show3.updated = then
		show3.status = Show.ENDED

		self.db.commit()

		# all shows updated today, nothing expired
		shows = self.db.get_expired_shows(today=then)
		self.assertNotIn(show1, shows)
		self.assertNotIn(show2, shows)
		self.assertNotIn(show3, shows)

		# all shows updated 2 days ago, still nothing expired
		shows = self.db.get_expired_shows(today=then + timedelta(2))
		self.assertNotIn(show1, shows)
		self.assertNotIn(show2, shows)
		self.assertNotIn(show3, shows)

		# all shows updated 3 days ago, show1 should be expired
		shows = self.db.get_expired_shows(today=then + timedelta(3))
		self.assertIn(show1, shows)
		self.assertNotIn(show2, shows)
		self.assertNotIn(show3, shows)

		# all shows updated 8 days ago, shows 1 and 2 should be expired
		shows = self.db.get_expired_shows(today=then + timedelta(8))
		self.assertIn(show1, shows)
		self.assertIn(show2, shows)
		self.assertNotIn(show3, shows)

		# all shows updated 15 days ago, all shows should be expired
		shows = self.db.get_expired_shows(today=then + timedelta(15))
		self.assertIn(show1, shows)
		self.assertIn(show2, shows)
		self.assertIn(show3, shows)

		# disabled shows never expire
		show1.enabled = False
		show2.enabled = False
		show3.enabled = False
		self.db.commit()

		shows = self.db.get_expired_shows(today=then + timedelta(15))
		self.assertNotIn(show1, shows)
		self.assertNotIn(show2, shows)
		self.assertNotIn(show3, shows)

	def test_get_enabled_shows(self):

		show1 = self.db.add_show(Show(u"1", url=u"1"))
		show1.enabled = False

		show2 = self.db.add_show(Show(u"2", url=u"2"))
		self.db.commit()

		shows = self.db.get_enabled_shows()
		self.assertNotIn(show1, shows)
		self.assertIn(show2, shows)
Esempio n. 7
0
class EpguidesTest(TestCase):

	def setUp(self):

		self.parser = Epguides()
		self.db = Database("sqlite://")

		self.req = MockRequestHandler()
		self.args = MockArgs("fake-api-key", agent="episoder/fake")

		self._get_orig = requests.get
		requests.get = self.req.get

	def tearDown(self):

		requests.get = self._get_orig

	def test_parser_name(self):

		self.assertEqual("epguides.com parser", str(self.parser))
		self.assertEqual("Epguides()", repr(self.parser))

	def test_accept(self):

		parser = self.parser
		self.assertTrue(parser.accept("http://www.epguides.com/Lost"))
		self.assertFalse(parser.accept("http://epguides2.com/Lost"))
		self.assertFalse(parser.accept("http://www.tv.com/Lost"))

	def test_guess_encoding(self):

		req = MockRequestHandler()

		res = req.get("http://epguides.com/test_iso_8859_1")
		self.assertEqual("iso-8859-1", self.parser.guess_encoding(res))

		res = req.get("http://epguides.com/bsg")
		self.assertEqual("utf8", self.parser.guess_encoding(res))

	def test_http_request(self):

		url = u"http://epguides.com/lost"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertTrue(len(self.req.requests) > 0)
		req = self.req.requests[-1]

		self.assertEqual(req.url, u"http://epguides.com/lost")
		headers = req.headers
		self.assertIn("User-Agent", headers)
		self.assertEqual(headers.get("User-Agent"), "episoder/fake")

	def test_parse(self):

		url = u"http://epguides.com/lost"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		timediff = datetime.now() - show.updated
		self.assertTrue(timediff.total_seconds() < 1)

		self.assertEqual("Lost", show.name)
		self.assertEqual(Show.ENDED, show.status)

		episodes = self.db.get_episodes(date(1996,1,1), 99999)
		self.assertEqual(121, len(episodes))

		ep = episodes[0]
		self.assertEqual("Pilot (1)", ep.title)
		self.assertEqual(1, ep.season)
		self.assertEqual(1, ep.episode)
		self.assertEqual(date(2004, 9, 22), ep.airdate)

		ep = episodes[9]
		self.assertEqual("Raised by Another", ep.title)
		self.assertEqual(1, ep.season)
		self.assertEqual(10, ep.episode)
		self.assertEqual(date(2004, 12, 1), ep.airdate)

		ep = episodes[25]
		self.assertEqual("Man of Science, Man of Faith", ep.title)
		self.assertEqual(2, ep.season)
		self.assertEqual(1, ep.episode)
		self.assertEqual(date(2005, 9, 21), ep.airdate)

		self.db.clear()
		url = u"http://epguides.com/bsg"
		show = self.db.add_show(Show(u"none", url=url))

		self.parser.parse(show, self.db, self.args)

		self.assertEqual("Battlestar Galactica (2003)", show.name)
		self.assertEqual(Show.ENDED, show.status)

		episodes = self.db.get_episodes(date(1996,1,1), 99999)
		self.assertEqual(73, len(episodes))

		ep = episodes[0]
		self.assertEqual("33", ep.title)
		self.assertEqual(1, ep.season)
		self.assertEqual(1, ep.episode)
		self.assertEqual(date(2005, 1, 14), ep.airdate)

	def test_format_2(self):

		# Another format
		url = u"http://epguides.com/eureka"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual("Eureka", show.name)
		self.assertEqual(Show.ENDED, show.status)

		episodes = self.db.get_episodes(date(1988,1,1), 99999)
		self.assertEqual(76, len(episodes))

		ep = episodes[0]
		self.assertEqual("Pilot", ep.title)
		self.assertEqual(1, ep.season)
		self.assertEqual(1, ep.episode)
		self.assertEqual(date(2006, 7, 18), ep.airdate)

		ep = episodes[9]
		self.assertEqual("Purple Haze", ep.title)
		self.assertEqual(1, ep.season)
		self.assertEqual(10, ep.episode)
		self.assertEqual(date(2006, 9, 19), ep.airdate)

		ep = episodes[27]
		self.assertEqual("Best in Faux", ep.title)
		self.assertEqual(3, ep.season)
		self.assertEqual(3, ep.episode)
		self.assertEqual(date(2008, 8, 12), ep.airdate)

	def test_format_3(self):

		# Yet another format
		url = u"http://epguides.com/midsomer_murders"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual("Midsomer Murders", show.name)
		self.assertEqual(Show.RUNNING, show.status)

		episodes = self.db.get_episodes(date(1988,1,1), 99999)
		self.assertEqual(101, len(episodes))

		episode = episodes[0]
		self.assertEqual(1, episode.season)
		self.assertEqual(1, episode.episode)
		self.assertEqual("Written in Blood", episode.title)
		self.assertEqual(date(1998, 3, 22), episode.airdate)

		episode = episodes[5]
		self.assertEqual(2, episode.season)
		self.assertEqual(2, episode.episode)
		self.assertEqual("Strangler's Wood", episode.title)
		self.assertEqual(date(1999, 2, 3), episode.airdate)

	def test_fancy_utf8_chars(self):

		# This one contains an illegal character somewhere
		url = u"http://epguides.com/american_idol"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual("American Idol", show.name)
		self.assertEqual(Show.RUNNING, show.status)

		episodes = self.db.get_episodes(date(1988,1,1), 99999)
		self.assertTrue(len(episodes) >= 11)

		episode = episodes[11]
		self.assertEqual(u"Pride Goeth Before The ‘Fro", episode.title)
		self.assertEqual(1, episode.season)
		self.assertEqual(12, episode.episode)

	def test_missing_season_number(self):

		# This one lacks a season number somewhere
		url = u"http://epguides.com/48_hours_mistery"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual("48 Hours Mystery", show.name)
		self.assertEqual(Show.RUNNING, show.status)

		episodes = self.db.get_episodes(date(1988,1,1), 99999)
		self.assertEqual(150, len(episodes))

		episode = episodes[0]
		self.assertEqual(19, episode.season)
		self.assertEqual(1, episode.episode)
		self.assertEqual("January 1988 Debut of 48 Hours",episode.title)
		self.assertEqual(date(1988, 1, 15), episode.airdate)
		self.assertEqual("01-01", episode.prodnum)

	def test_ended_show(self):

		# This one is no longer on the air
		url = u"http://epguides.com/kr2008"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual("Knight Rider (2008)", show.name)
		self.assertEqual(Show.ENDED, show.status)

		episodes = self.db.get_episodes(date(1996,1,1), 99999)
		self.assertEqual(17, len(episodes))

		episode = episodes[3]
		self.assertEqual(1, episode.season)
		self.assertEqual(4, episode.episode)
		self.assertEqual("A Hard Day's Knight", episode.title)
		self.assertEqual(date(2008, 10, 15), episode.airdate)
		self.assertEqual("104", episode.prodnum)

	def test_encoding(self):

		# This one has funny characters
		url = u"http://epguides.com/buzzcocks"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual(u"Never Mind the Buzzcocks", show.name)
		self.assertEqual(Show.RUNNING, show.status)

		episodes = self.db.get_episodes(date(1996,1,1), 99999)
		self.assertTrue(len(episodes) >= 21)
		episode = episodes[20]
		self.assertEqual(3, episode.season)
		self.assertEqual(4, episode.episode)
		title = u"Zoë Ball, Louis Eliot, Graham Norton, Keith Duffy"
		self.assertEqual(title, episode.title)
		self.assertEqual(date(1998, 3, 20), episode.airdate)

	def test_with_anchor(self):

		# This one has an anchor tag before the bullet for season 6
		url = u"http://epguides.com/futurama"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual("Futurama", show.name)
		self.assertEqual(Show.ENDED, show.status)

		episodes = self.db.get_episodes(date(1996,1,1), 99999)
		self.assertEqual(124, len(episodes))

		episode = episodes.pop()
		self.assertEqual(7, episode.season)
		self.assertEqual(26, episode.episode)
		self.assertEqual("Meanwhile", episode.title)
		self.assertEqual(date(2013, 9, 4), episode.airdate)

	def test_with_trailer_and_recap(self):

		# This one has [Trailer] and [Recap] in episode titles
		url = u"http://epguides.com/house"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual("House, M.D.", show.name)
		self.assertEqual(Show.ENDED, show.status)

		episodes = self.db.get_episodes(date(1996,1,1), 99999)
		self.assertEqual(176, len(episodes))

		episode = episodes[-3]
		self.assertEqual(8, episode.season)
		self.assertEqual(20, episode.episode)
		self.assertEqual("Post Mortem", episode.title)
		self.assertEqual(date(2012, 5, 7), episode.airdate)

		episode = episodes[-2]
		self.assertEqual("Holding On", episode.title)

	def test_encoding_iso8859_1(self):

		# Explicitly test ISO 8859-1 encoding
		url = u"http://epguides.com/test_iso_8859_1"
		show = self.db.add_show(Show(u"none", url=url))
		self.parser.parse(show, self.db, self.args)

		self.assertEqual(u"Episoder ISO-8859-1 Tëst", show.name)

		episodes = self.db.get_episodes(date(1996,1,1), 99999)
		self.assertEqual(len(episodes), 1)

		episode = episodes[0]
		self.assertEqual(u"äöü", episode.title)