def test_migrate_from_v4(self): # Create version 3 database self._create_v4() # Verify engine = self._get_engine() self.assertTrue(engine.has_table("shows")) self.assertTrue(engine.has_table("episodes")) self.assertTrue(engine.has_table("meta")) columns = self._tables_dict(engine, "shows") self.assertIsNotNone(columns.get("url")) self.assertIsNotNone(columns.get("enabled")) self.assertIsNotNone(columns.get("status")) columns = self._tables_dict(engine, "episodes") self.assertIsNotNone(columns.get("notified")) engine.dispose() # Migrate to latest version (noop) self._migrate(self.path) db = Database("sqlite:///%s" % self.path) self.assertEqual(4, db.get_schema_version()) db.close()
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
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))
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))
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 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 test_migrate_from_v2(self): # Create version 2 database self._create_v2() # Verify engine = self._get_engine() self.assertTrue(engine.has_table("shows")) self.assertTrue(engine.has_table("episodes")) self.assertTrue(engine.has_table("meta")) columns = self._tables_dict(engine, "shows") self.assertIsNotNone(columns.get("url")) self.assertIsNone(columns.get("enabled")) self.assertIsNone(columns.get("status")) columns = self._tables_dict(engine, "episodes") self.assertIsNone(columns.get("notified")) engine.dispose() # Migrate to latest version self._migrate(self.path) # Check result - version 3 adds shows.enabled and shows.status engine = self._get_engine() columns = self._tables_dict(engine, "shows") self.assertIsNotNone(columns.get("enabled")) self.assertIsNotNone(columns.get("status")) # Version 4 adds episodes.notified columns = self._tables_dict(engine, "episodes") self.assertIsNotNone(columns.get("notified")) engine.dispose() # Check new schema version db = Database("sqlite:///%s" % self.path) self.assertEqual(4, db.get_schema_version()) db.close()
def test_disable_auto_migration(self): # Create a custom database self._create_custom() # Verify engine = self._get_engine() self.assertTrue(engine.has_table("shows")) self.assertFalse(engine.has_table("episodes")) self.assertTrue(engine.has_table("meta")) columns = self._tables_dict(engine, "shows") self.assertIsNotNone(columns.get("my_int")) self.assertIsNone(columns.get("url")) self.assertIsNone(columns.get("enabled")) self.assertIsNone(columns.get("status")) engine.dispose() # Migrate to latest version -> noop self._migrate(self.path) # Check result engine = self._get_engine() self.assertTrue(engine.has_table("shows")) self.assertFalse(engine.has_table("episodes")) self.assertTrue(engine.has_table("meta")) columns = self._tables_dict(engine, "shows") self.assertIsNotNone(columns.get("my_int")) self.assertIsNone(columns.get("url")) self.assertIsNone(columns.get("enabled")) self.assertIsNone(columns.get("status")) engine.dispose() # Check new schema version db = Database("sqlite:///%s" % self.path) self.assertEqual(-1, db.get_schema_version()) db.close()
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)
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)
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")
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)
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 setUp(self): logging.basicConfig(level=logging.ERROR) logging.disable(logging.ERROR) self.db = Database("sqlite://") self.tempfiles = []
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")
def _migrate(self, filename): db = Database(filename) db.migrate() db.close()