anki-sync-server/tests/helpers/mock_servers.py
Christoph Mack 573aeece81 Add more test helpers and integration tests for SyncApp's media sync feature using WebTest's TestApp.
Add test helpers for creating, inspecting and manipulating instances of SyncApp and RestApp.
Add subclasses of Anki's RemoteServer and RemoteMediaServer for communicating with the wrapped SyncApp instance under test.
Add helpers for monkey patching Anki's MediaManager and DB for easier testing.
Add test assets directory.
2017-10-28 22:36:48 +02:00

69 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
import logging
from anki.sync import HttpSyncer, RemoteServer, RemoteMediaServer, FullSyncer
class MockServerConnection(object):
"""
Mock for HttpSyncer's con attribute, a httplib2 connection. All requests
that would normally got to the remote server will be redirected to our
server_app_to_test object.
"""
def __init__(self, server_app_to_test):
self.test_app = server_app_to_test
def request(self, uri, method='GET', headers=None, body=None):
if method == 'POST':
logging.debug("Posting to URI '{}'.".format(uri))
logging.info("Posting to URI '{}'.".format(uri))
test_response = self.test_app.post(uri,
params=body,
headers=headers,
status="*")
resp = test_response.headers
resp.update({
"status": str(test_response.status_int)
})
cont = test_response.body
return resp, cont
else:
raise Exception('Unexpected HttpSyncer.req() behavior.')
class MockRemoteServer(RemoteServer):
"""
Mock for RemoteServer. All communication to our remote counterpart is
routed to our TestApp object.
"""
def __init__(self, hkey, server_test_app):
# Create a custom connection object we will use to communicate with our
# 'remote' server counterpart.
connection = MockServerConnection(server_test_app)
HttpSyncer.__init__(self, hkey, connection)
def syncURL(self): # Overrides RemoteServer.syncURL().
return "/sync/"
class MockRemoteMediaServer(RemoteMediaServer):
"""
Mock for RemoteMediaServer. All communication to our remote counterpart is
routed to our TestApp object.
"""
def __init__(self, col, hkey, server_test_app):
# Create a custom connection object we will use to communicate with our
# 'remote' server counterpart.
connection = MockServerConnection(server_test_app)
HttpSyncer.__init__(self, hkey, connection)
def syncURL(self): # Overrides RemoteServer.syncURL().
return "/msync/"