def test_dataparsers(self): """ Unit tests for Data parsers objects """ # Check against our test data and make sure we are correctly parsing & fetching the right objects from the data bus_data = parse_bus_data(self.bot.browser.fetch_json(self.bot.urls.BUS_URL % "53410"), '15') self.assertEqual(bus_data[0], Bus("Regent Street", gmt_to_localtime("1831"))) tube_data = parse_tube_data(self.bot.browser.fetch_xml_tree(self.bot.urls.TUBE_URL % ("D", "ECT")), RailStation("Earl's Court"), "D") self.assertEqual(tube_data["Eastbound"][0], TubeTrain("Edgware Road", "Eastbound", "2139", "D", "075")) dlr_data = parse_dlr_data(self.bot.browser.fetch_xml_tree(self.bot.urls.DLR_URL % "pop"), RailStation("Poplar")) self.assertEqual(dlr_data['P1'][0], Train("Beckton", "2107"))
def parse_bus_data(bus_data, route_number): """ Take a parsed JSON object bus_data from a single bus stop and a specified route_number Returns a list of Bus objects for that bus stop and route """ arrivals = bus_data.get('arrivals', []) # Handle TfL's JSON-encoded error message if not arrivals and bus_data.get('stopBoardMessage', '') == "noPredictionsDueToSystemError": raise WhensMyTransportException('tfl_server_down') # Do the user a favour - check for both number and possible Night Bus version of the bus relevant_arrivals = [a for a in arrivals if (a['routeName'] == route_number or a['routeName'] == 'N' + route_number) and a.get('isRealTime', True) and not a.get('isCancelled', False)] # FIXME Temporary logging code for a in relevant_arrivals[:3]: logging.debug("Found bus %s going to %s at %s" % (a['routeName'], a['destination'], a['scheduledTime'])) relevant_buses = [Bus(a['destination'], gmt_to_localtime(a['scheduledTime'])) for a in relevant_arrivals[:3]] return relevant_buses
def test_stringutils(self): """ Unit test for stringutils' methods """ # Check capwords capitalised_strings = ("Bank", "Morden East", "King's Cross St. Pancras", "Kennington Oval via Charing X") for test_string in capitalised_strings: self.assertEqual(test_string, capwords(test_string)) self.assertEqual(test_string, capwords(test_string.lower())) self.assertEqual(test_string, capwords(test_string.upper())) self.assertNotEqual(test_string.lower(), capwords(test_string)) self.assertNotEqual(test_string.upper(), capwords(test_string)) # Check to see cleanup string is working random_string = lambda a, b: "".join([chr(random.Random().randint(a, b)) for _i in range(0, 10)]) dirty_strings = [random_string(48, 122) for _i in range(0, 10)] undesirables = ("a", "b+", "[0-9]", "^x") for dirty_string in dirty_strings: cleaned_string = cleanup_name_from_undesirables(dirty_string, undesirables) for undesirable in undesirables: self.assertIsNone(re.search(undesirable, cleaned_string, flags=re.I)) # Check string similarities - 100 for identical strings, 90 or more for one character change # and nothing at all for a totally unidentical string similarity_string = random_string(65, 122) self.assertEqual(get_name_similarity(similarity_string, similarity_string), 100) self.assertGreaterEqual(get_name_similarity(similarity_string, similarity_string[:-1]), 90) self.assertEqual(get_name_similarity(similarity_string, random_string(48, 57)), 0) # Check to see most similar string gets picked out of an list of similar-looking strings, and that # with very dissimilar strings, there is no candidate at all similarity_candidates = (similarity_string[:3], similarity_string[:5], similarity_string[:9], "z" * 10) self.assertEqual(get_best_fuzzy_match(similarity_string, similarity_candidates), similarity_candidates[-2]) dissimilarity_candidates = [random_string(48, 57) for _i in range(0, 10)] self.assertIsNone(get_best_fuzzy_match(similarity_string, dissimilarity_candidates)) if time.localtime().tm_isdst: self.assertEqual(gmt_to_localtime("2359"), "0059") self.assertEqual(gmt_to_localtime("23:59"), "0059") self.assertEqual(gmt_to_localtime("Tue 00:01"), "0101") else: self.assertEqual(gmt_to_localtime("2359"), "2359") self.assertEqual(gmt_to_localtime("23:59"), "2359") self.assertEqual(gmt_to_localtime("Tue 00:01"), "0001")