import json from flask import Flask, request, Response from voluptuous import Schema, Required, All, Length, Range, Invalid, Coerce from common.data_facade import DataFacade, DEFAULT_PAGE_SIZE app = Flask('topsecret') data_facade = DataFacade(app) validate_get_page = Schema({ Required('page', default=1): All(Coerce(int), Range(min=1), msg='Page must be an integer >= 1'), Required('page_size', default=DEFAULT_PAGE_SIZE): All(Coerce(int), Range(min=1, max=1000), msg='Page size must be an integer >= 1 and <= 1000'), 'body': All(unicode, Length(min=1), msg="Body search must be a nonzero-length string if specified"), 'sender': All(unicode, Length(min=1), msg="Sender search must be a nonzero-length string if specified"), 'recipient': All(unicode, Length(min=1), msg="Recipient search must be a nonzero-length string if specified"), 'sort': All(unicode, Length(min=1), msg="Sort attribute must be a nonzero-length string if specified")
def setUp(self): self.facade = DataFacade() self.app = Flask(AppConfig.app_name) self.email_collection = AppConfig.email_collection + '_test' self.source_collection = AppConfig.source_collection + '_test'
def test_unbound_facade_raises_exception_on_clear_collection(self): with self.assertRaises(ValueError): broken_facade = DataFacade() broken_facade.clear_collection(self.email_collection, foo='bar')
class DataFacadeTests(unittest.TestCase): def setUp(self): self.facade = DataFacade() self.app = Flask(AppConfig.app_name) self.email_collection = AppConfig.email_collection + '_test' self.source_collection = AppConfig.source_collection + '_test' def tearDown(self): with self.app.app_context(): if self.facade.is_bound: self.facade.clear_collection(self.email_collection) def test_store_and_load_from_flask(self): with self.app.app_context(): self.facade.bind_flask(self.app) message = EmailMessage(subject='foo', body='bar', sender='baz', recipient='bip', date='2016-07-07') self.facade.store(self.email_collection, message.to_dict()) loaded_messages = self.facade.load(self.email_collection, content_hash=message.content_hash) self.assertEqual(1, len(loaded_messages)) self.assertEqual(message, EmailMessage(**loaded_messages[0])) def test_store_and_load_from_pymongo(self): self.facade.bind(AppConfig.mongo_uri) message = EmailMessage(subject='foo', body='bar', sender='baz', recipient='bip', date='2016-07-07') self.facade.store(self.email_collection, message.to_dict()) loaded_messages = self.facade.load(self.email_collection, content_hash=unicode(message.content_hash)) self.assertEqual(1, len(loaded_messages)) self.assertEqual(message, EmailMessage(**loaded_messages[0])) def test_store_and_load_a_page(self): self.facade.bind(AppConfig.mongo_uri) for i in range(1, 1000): message = EmailMessage(subject='foo{}'.format(i), body='bar', sender='baz', recipient='bip', date='2016-07-07') self.facade.store(self.email_collection, message.to_dict()) loaded_messages = self.facade.load(self.email_collection, page=12, page_size=6) self.assertEqual(6, len(loaded_messages)) for num, email in zip(range(67, 72), [EmailMessage(**message) for message in loaded_messages]): self.assertEqual(email.subject, 'foo{}'.format(num)) def test_filter_by_field(self): self.facade.bind(AppConfig.mongo_uri) for i in range(1, 100): message = EmailMessage(subject='foo{}foo'.format(i), body='bar', sender='baz', recipient='bip', date='2016-07-07') self.facade.store(self.email_collection, message.to_dict()) loaded_messages = self.facade.load(self.email_collection, page_size=60, subject='1') self.assertEqual(19, len(loaded_messages)) for email in [EmailMessage(**message) for message in loaded_messages]: self.assertTrue('1' in email.subject) def test_flask_bound_facade_cannot_rebind(self): with self.assertRaises(TypeError): with self.app.app_context(): self.facade.bind_flask(self.app) self.facade.bind_flask(self.app) def test_pymongo_bound_facade_cannot_rebind(self): with self.assertRaises(TypeError): self.facade.bind(AppConfig.mongo_uri) self.facade.bind(AppConfig.mongo_uri) def test_pymongo_bound_facade_cannot_rebind_to_flask(self): with self.assertRaises(TypeError): with self.app.app_context(): self.facade.bind(AppConfig.mongo_uri) self.facade.bind_flask(self.app) def test_flask_bound_facade_cannot_rebind_to_pymongo(self): with self.assertRaises(TypeError): with self.app.app_context(): self.facade.bind_flask(self.app) self.facade.bind(AppConfig.mongo_uri) def test_is_bound_property(self): with self.app.app_context(): self.assertFalse(self.facade.is_bound) self.facade.bind_flask(self.app) self.assertTrue(self.facade.is_bound) def test_unbound_facade_raises_exception_on_load(self): with self.assertRaises(ValueError): broken_facade = DataFacade() broken_facade.load(self.email_collection, foo='bar') def test_unbound_facade_raises_exception_on_store(self): with self.assertRaises(ValueError): broken_facade = DataFacade() broken_facade.load(self.email_collection, foo='bar') def test_unbound_facade_raises_exception_on_clear_collection(self): with self.assertRaises(ValueError): broken_facade = DataFacade() broken_facade.clear_collection(self.email_collection, foo='bar')