|
import unittest |
|
|
|
from unittest.mock import MagicMock |
|
from word_frequency import Index, CombinationIndex, Data, count_words |
|
|
|
class TestCombinationIndex(unittest.TestCase): |
|
def setUp(self): |
|
self.records = [ |
|
('red', 'yellow', 'green', 'black'), |
|
('red', 'green', 'blue', 'black'), |
|
('yellow', 'green', 'blue'), |
|
('yellow', 'blue', 'black') |
|
] |
|
self.queries = [ |
|
('blue', 'yellow'), |
|
('black', 'green') |
|
] |
|
self.indexer = CombinationIndex() |
|
def tearDown(self): |
|
self.records = None |
|
self.queries = None |
|
self.indexer = None |
|
|
|
def test_index_single_item(self): |
|
self.indexer.index(('red',)) |
|
self.assertEqual(sorted(self.indexer.indices.keys()), [('red',)]) |
|
|
|
def test_index_multiple_items(self): |
|
expected = [ |
|
('black',), ('black', 'green'), ('black', 'green', 'red'), ('black', 'green', 'red', 'yellow'), |
|
('black', 'red', 'yellow'), ('black', 'green', 'yellow'), |
|
('black', 'red'), ('black', 'yellow'), |
|
('green',), ('green', 'red'), ('green', 'red', 'yellow'), |
|
('green', 'yellow'), |
|
('red',), ('red', 'yellow'), |
|
('yellow',) |
|
] |
|
self.indexer.index(('red', 'yellow', 'green', 'black')) |
|
self.assertEqual(sorted(self.indexer.indices.keys()), sorted(expected)) |
|
|
|
def test_search_single_item_without_match(self): |
|
self.indexer.index(('red',)) |
|
self.assertEqual(self.indexer.search(('black',)), []) |
|
|
|
def test_search_single_item_without_match(self): |
|
self.indexer.index(('red',)) |
|
self.assertEqual(self.indexer.search(('black', 'red')), []) |
|
self.assertEqual(self.indexer.search(('black',)), []) |
|
|
|
def test_search_single_item_with_match(self): |
|
self.indexer.index(('red',)) |
|
self.assertEqual(self.indexer.search(('red',)), [('red',)]) |
|
|
|
def test_search_multiple_item_without_match(self): |
|
self.indexer.index(('red', 'black')) |
|
self.assertEqual(self.indexer.search(('blue', 'red')), []) |
|
self.assertEqual(self.indexer.search(('red', 'blue')), []) |
|
self.assertEqual(self.indexer.search(('black', 'blue')), []) |
|
|
|
def test_search_multiple_item_with_match(self): |
|
record = [('red', 'black', 'yellow', 'green')] |
|
self.indexer.index(record[0]) |
|
self.assertEqual(self.indexer.search(('black',)), record) |
|
self.assertEqual(self.indexer.search(('red',)), record) |
|
self.assertEqual(self.indexer.search(('red', 'black')), record) |
|
self.assertEqual(self.indexer.search(('black', 'red')), record) |
|
self.assertEqual(self.indexer.search(('yellow', 'red')), record) |
|
self.assertEqual(self.indexer.search(('red', 'yellow')), record) |
|
self.assertEqual(self.indexer.search(('yellow', 'black')), record) |
|
self.assertEqual(self.indexer.search(('black', 'yellow')), record) |
|
self.assertEqual(self.indexer.search(('black', 'yellow', 'red')), record) |
|
self.assertEqual(self.indexer.search(('black', 'green', 'red')), record) |
|
self.assertEqual(self.indexer.search(('black', 'yellow', 'green')), record) |
|
|
|
def test_multiple_indexed_records_with_match(self): |
|
records = [('red', 'black', 'yellow', 'green'), ('red', 'green', 'blue')] |
|
self.indexer.index(records[0]) |
|
self.indexer.index(records[1]) |
|
self.assertEqual(self.indexer.search(('red', 'black')), [records[0]]) |
|
self.assertEqual(self.indexer.search(('red', 'black', 'green')), [records[0]]) |
|
self.assertEqual(self.indexer.search(('red', 'green')), records) |
|
self.assertEqual(self.indexer.search(('blue', 'red', 'green')), [records[1]]) |
|
self.assertEqual(self.indexer.search(('red', 'green', 'blue')), [records[1]]) |
|
self.assertEqual(self.indexer.search(('red', 'green')), records) |
|
|
|
class TestData(unittest.TestCase): |
|
def setUp(self): |
|
self.indexer = Index() |
|
self.indexer.index = MagicMock() |
|
self.indexer.search = MagicMock(return_value='found') |
|
self.data = Data(self.indexer) |
|
|
|
def tearDown(self): |
|
self.indexer = None |
|
self.data = None |
|
|
|
def test_constructor(self): |
|
self.assertEqual(self.data.indexer, self.indexer) |
|
self.assertEqual(self.data.data, []) |
|
|
|
def test_index(self): |
|
self.data.index('test_data') |
|
self.indexer.index.assert_called_with('test_data') |
|
self.assertEqual(self.data.data, ['test_data']) |
|
|
|
def test_search_with_empty_query(self): |
|
self.data.data = ['fake'] |
|
self.assertEqual(self.data.search(()), ['fake']) |
|
self.assertFalse(self.indexer.search.called) |
|
|
|
def test_search_with_non_empty_query(self): |
|
self.data.search('test_query') |
|
self.indexer.search.assert_called_with('test_query') |
|
|
|
class TestCountWords(unittest.TestCase): |
|
def test_count(self): |
|
expected = {'test': 2, 'hello': 2, 'world': 1, 'bingo': 3, 'no way': 1} |
|
test = [ |
|
['test', 'hello', 'world', 'test', 'no way', 'bingo', 'bingo'], |
|
['bingo', 'hello'], |
|
] |
|
self.assertEqual(count_words(test), expected) |
|
self.assertEqual(count_words([[]]), {}) |
|
self.assertEqual(count_words([]), {}) |
|
|
|
|
|
if __name__ == '__main__': |
|
unittest.main() |