def setUp(self, settings_file=None, url_converters=None): from ereuse_devicehub import default_settings as settings self.set_settings(settings) self.app = DeviceHub() self.prepare()
class TestBase(TestMinimal): DEVICES = 'devices' DEVICE_EVENT = 'events/devices' EVENTS = 'events' PLACES = 'places' SNAPSHOT = 'snapshot' ACCOUNTS = 'accounts' def setUp(self, settings_file=None, url_converters=None): from ereuse_devicehub import default_settings as settings self.set_settings(settings) self.app = DeviceHub() self.prepare() @staticmethod def set_settings(settings): settings.MONGO_DBNAME = 'devicehubtest' settings.DATABASES = 'dht1', 'dht2' # Some tests use 2 databases settings.DHT1_DBNAME = 'dht1_' settings.DHT2_DBNAME = 'dht2_' settings.GRD_DEBUG = True # We do not want to actually fulfill GRD settings.APP_NAME = 'DeviceHub' settings.DEBUG = True settings.TESTING = True settings.LOG = True settings.GRD = False settings.AGENT_ACCOUNTS = { 'self': ('*****@*****.**', '12345') } def prepare(self): self.MONGO_DBNAME = self.app.config['MONGO_DBNAME'] self.MONGO_HOST = self.app.config['MONGO_HOST'] self.MONGO_PORT = self.app.config['MONGO_PORT'] self.DATABASES = self.app.config['DATABASES'] self.connection = None self.setupDB() self.test_client = self.app.test_client() self.domain = self.app.config['DOMAIN'] self.token = self._login() self.auth_header = ('authorization', 'Basic ' + self.token) def setupDB(self): self.connection = MongoClient(self.MONGO_HOST, self.MONGO_PORT) self.db = self.connection[self.MONGO_DBNAME] self.drop_databases() self.create_dummy_user() self.create_self_machine_account() # We call the method again as we have erased the DB self.app.grd_submitter_caller = SubmitterCaller(self.app, GRDSubmitter) # self.app.grd_submitter_caller.token = self.app.grd_submitter_caller.prepare_user(self.app) # self.app.grd_submitter_caller.process = None def create_dummy_user(self): self.db.accounts.insert( { 'email': "[email protected]", 'password': AccountDomain.encrypt_password('1234'), 'role': 'admin', 'token': 'NOFATDNNUB', 'databases': self.app.config['DATABASES'], 'defaultDatabase': self.app.config['DATABASES'][0], '@type': 'Account' } ) self.account = self.db.accounts.find_one({'email': '[email protected]'}) def create_self_machine_account(self): email, password = self.app.config['AGENT_ACCOUNTS']['self'] self.db.accounts.insert( { 'role': 'superuser', 'token': 'QYADFBPNZZDFJEWAFGGF', 'databases': self.app.config['DATABASES'], '@type': 'Account', 'email': email, 'password': AccountDomain.encrypt_password(password) } ) def tearDown(self): self.dropDB() del self.app def drop_databases(self): self.connection.drop_database(self.MONGO_DBNAME) for database in self.DATABASES: self.connection.drop_database(self.app.config[database.upper().replace('-', '') + '_DBNAME']) def dropDB(self): self.drop_databases() self.connection.close() def full(self, resource_name: str, resource: dict or str or ObjectId) -> dict: return resource if type(resource) is dict else self.get(resource_name, '', str(resource))[0] def select_database(self, url): if 'accounts' in url: return '' else: return self.app.config['DATABASES'][0] def get(self, resource, query='', item=None, authorize=True, database=None): if resource in self.domain: resource = self.domain[resource]['url'] if item: request = '/%s/%s%s' % (resource, item, query) else: request = '/%s%s' % (resource, query) database = database or self.select_database(resource) return self._get(database + request, self.token if authorize else None) def _get(self, url, token=None, **kwargs): environ_base = {'HTTP_AUTHORIZATION': 'Basic ' + token} if token else {} environ_base.update(kwargs.pop('environ_base', {})) r = self.test_client.get(url, environ_base=environ_base, **kwargs) return self.parse_response(r) def post(self, url, data, headers=None, content_type='application/json'): full_url = self.select_database(url) + '/' + url headers = headers or [] return self._post(full_url, data, self.token, headers, content_type) def _post(self, url, data, token, headers=None, content_type='application/json'): headers = headers or [] headers.append(('authorization', 'Basic ' + token)) if type(data) is str: headers.append(('Content-Type', content_type)) r = self.test_client.post(url, data=data, headers=headers) return self.parse_response(r) return super(TestBase, self).post(url, data, headers, content_type) def patch(self, url, data, headers=None): headers = headers or [] return self._patch(self.select_database(url) + '/' + url, data, self.token, headers) def _patch(self, url, data, token, headers=None): headers = headers or [] headers.append(('authorization', 'Basic ' + token)) return super(TestBase, self).patch(url, data, headers) def put(self, url, data, headers=None): headers = headers or [] return super(TestBase, self).put(self.select_database(url) + '/' + url, data, headers + [self.auth_header]) def delete(self, url, headers=None): headers = headers or [] return super(TestBase, self).delete(self.select_database(url) + '/' + url, headers + [self.auth_header]) def _login(self) -> str: return super(TestBase, self).post('/login', {"email": "[email protected]", "password": "******"})[0]['token'] def assert308(self, status): self.assertEqual(status, 308)