def setUp(self): NameParser.bootstrap(TestConfig()) AddressParser.bootstrap(TestConfig()) self.ap = AddressParser(TestConfig())
class AddressParserTests(unittest.TestCase): ap = None def setUp(self): NameParser.bootstrap(TestConfig()) AddressParser.bootstrap(TestConfig()) self.ap = AddressParser(TestConfig()) def tearDown(self): SQLite3Mock.reset() registry.flush() self.ap = None @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_get_street_suffix(self): SQLite3Mock.fetchall_returns = [('street',)] working_data = ['look', 'a', 'street'] result = self.ap.get_street_suffix(working_data) self.assertIsInstance(result, StreetSuffixEntity) self.assertEqual(result.suffix_name, 'street') sql = 'SELECT * FROM street_suffix WHERE ' +\ 'suffix_name = ? or suffix_name = ? or suffix_name = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (sql, ('look', 'a', 'street')), ] ) @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_get_street_suffix_handles_errors_properly(self): SQLite3Mock.fetchall_returns = [sqlite3.Error("Error")] working_data = ['look', 'a', 'street'] result = self.ap.get_street_suffix(working_data) self.assertIsNone(result) sql = 'SELECT * FROM street_suffix WHERE ' +\ 'suffix_name = ? or suffix_name = ? or suffix_name = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (sql, ('look', 'a', 'street')), ] ) def test_separate_suspected_name(self): working_data = [ 'Barack', 'and', 'Michelle', 'Obama', '1600' ] result = self.ap.separate_suspected_name(working_data) self.assertEqual((['1600'], 'Barack Michelle Obama'), result) def test_is_address_name(self): result = self.ap.is_address_name('Barack Michelle Obama') self.assertTrue(result) result = self.ap.is_address_name('not a name') self.assertFalse(result) def test_is_invalid_int(self): result = self.ap.is_invalid_int('123') self.assertTrue(result) result = self.ap.is_invalid_int('abc') self.assertFalse(result) result = self.ap.is_invalid_int('123456') self.assertFalse(result) @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_find_address_tokens(self): SQLite3Mock.fetchall_returns = [ (0,), (20,), (0,) ] working_data = ['str1', 'str2'] result = self.ap.find_address_tokens( working_data, { 'street_suffix': None, 'addressed_to': None, 'address_tokens': [] } ) self.assertEqual( result, ( 1, { 'street_suffix': None, 'addressed_to': None, 'address_tokens': [ { 'token': 'str2', 'matches': 20 } ] } ) ) sql = 'SELECT count(*) FROM city WHERE country = ? OR ' +\ 'postal_code = ? OR city = ? OR state1 = ? OR state2 = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (sql, ('str1', 'str1', 'str1', 'str1', 'str1')), (sql, ('str2', 'str2', 'str2', 'str2', 'str2')), (sql, ( 'str1 str2', 'str1 str2', 'str1 str2', 'str1 str2', 'str1 str2' )), ] ) @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_find_address_tokens_handles_errors_properly(self): SQLite3Mock.fetchall_returns = [ sqlite3.Error('Error'), ] working_data = ['str1'] result = self.ap.find_address_tokens(working_data, []) self.assertEqual(result, (0, [])) sql = 'SELECT count(*) FROM city WHERE country = ? OR ' +\ 'postal_code = ? OR city = ? OR state1 = ? OR state2 = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (sql, ('str1', 'str1', 'str1', 'str1', 'str1')) ] ) def test_parse_with_data_too_long(self): result = self.ap.parse( 'Lorem ipsum dolor sit amet, consectetur adipiscing' + ' elit. Curabitur dignissim feugiat quam, ut tempus nisi' ) count = 0 for _ in result: count += 1 self.assertEqual(0, count) def test_parse_with_no_digits_in_data(self): result = self.ap.parse( 'Lorem ipsum dolor sit amet, consectetur adipiscing' + 'elit. Curabitur dignissim feugiat quam, ut' ) count = 0 for _ in result: count += 1 self.assertEqual(0, count) def test_parse_with_too_few_words(self): result = self.ap.parse('Lorem 123, dolor') count = 0 for _ in result: count += 1 self.assertEqual(0, count) def test_parse_with_no_word_starting_with_digit(self): result = self.ap.parse('Lorem a123, dolor sit') count = 0 for _ in result: count += 1 self.assertEqual(0, count) @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_parse_with_no_street_suffix(self): SQLite3Mock.fetchall_returns = [None] result = self.ap.parse('Lorem 123, dolor sit') count = 0 for _ in result: count += 1 self.assertEqual(0, count) sql = 'SELECT * FROM street_suffix WHERE suffix_name = ? or ' +\ 'suffix_name = ? or suffix_name = ? or suffix_name = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (sql, ('Lorem', '123', 'dolor', 'sit')), ] ) @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_parse_with_impossible_suffix_return(self): SQLite3Mock.fetchall_returns = [('street',)] result = self.ap.parse('Lorem 123, dolor sit') count = 0 for _ in result: count += 1 self.assertEqual(0, count) sql = 'SELECT * FROM street_suffix WHERE suffix_name = ? or ' +\ 'suffix_name = ? or suffix_name = ? or suffix_name = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (sql, ('Lorem', '123', 'dolor', 'sit')), ] ) @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_parse_with_invalid_name_prefix(self): SQLite3Mock.fetchall_returns = [('street',)] result = self.ap.parse('lorem ipsum 123, dolor street') count = 0 for _ in result: count += 1 self.assertEqual(0, count) sql = 'SELECT * FROM street_suffix WHERE suffix_name = ? or ' +\ 'suffix_name = ? or suffix_name = ? or ' +\ 'suffix_name = ? or suffix_name = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (sql, ('lorem', 'ipsum', '123', 'dolor', 'street')), ] ) @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_parse_with_no_address_tokens_found(self): SQLite3Mock.fetchall_returns = [ (0,), (0,), ('street',) ] result = self.ap.parse('Lorem Ipsum 123, dolor street') count = 0 for _ in result: count += 1 self.assertEqual(0, count) ss_sql = 'SELECT * FROM street_suffix WHERE suffix_name = ? or ' +\ 'suffix_name = ? or suffix_name = ? or ' +\ 'suffix_name = ? or suffix_name = ?' city_sql = 'SELECT count(*) FROM city WHERE country = ? OR ' +\ 'postal_code = ? OR city = ? OR state1 = ? OR state2 = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (ss_sql, ('Lorem', 'Ipsum', '123', 'dolor', 'street')), ('PRAGMA temp_store = 2', None), (city_sql, ('dolor', 'dolor', 'dolor', 'dolor', 'dolor')), (city_sql, ( '123 dolor', '123 dolor', '123 dolor', '123 dolor', '123 dolor' )) ] ) @mock.patch('sqlite3.connect', SQLite3Mock.connect) def test_parse_yields_expected_result(self): SQLite3Mock.fetchall_returns = [ (0,), (1,), ('street',) ] result = self.ap.parse('Lorem Ipsum 123, dolor street') count = 0 for res in result: self.assertIsInstance(res, ParseResult) self.assertEqual(res.subtype, 'With Addressee') self.assertEqual(res.confidence, 40) self.assertEqual( res.result_value, { 'street_suffix': 'street', 'addressed_to': 'Lorem Ipsum', 'address_tokens': [ { 'token': 'dolor', 'matches': 1 } ] } ) count += 1 self.assertEqual(1, count) ss_sql = 'SELECT * FROM street_suffix WHERE suffix_name = ? or ' +\ 'suffix_name = ? or suffix_name = ? or ' +\ 'suffix_name = ? or suffix_name = ?' city_sql = 'SELECT count(*) FROM city WHERE country = ? OR ' +\ 'postal_code = ? OR city = ? OR state1 = ? OR state2 = ?' self.assertEqual( SQLite3Mock.execute_calls, [ ('PRAGMA temp_store = 2', None), (ss_sql, ('Lorem', 'Ipsum', '123', 'dolor', 'street')), ('PRAGMA temp_store = 2', None), (city_sql, ('dolor', 'dolor', 'dolor', 'dolor', 'dolor')), (city_sql, ( '123 dolor', '123 dolor', '123 dolor', '123 dolor', '123 dolor' )) ] )