import json import os import jinja2 from django.test import TestCase import html5lib from lxml.html import tostring, html5parser import responses from imageledger import models TESTING_CONFIG = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'settings.py') class TestImageledgerApp(TestCase): """Setup/teardown for app test cases""" def setUp(self): activate_all_provider_mocks() def activate_all_provider_mocks(): """Mock all the responses we know about from all the providers""" activate_500px_mocks() activate_rijks_mocks() activate_flickr_mocks() activate_wikimedia_mocks() def activate_flickr_mocks(): from imageledger.handlers.handler_flickr import auth flickr = auth() responses.add(responses.POST, flickr.REST_URL, status=200, content_type='application/json', json=load_json_data('flickr-response.json')) def activate_500px_mocks(): from imageledger.handlers.handler_500px import ENDPOINT_PHOTOS responses.add(responses.GET, ENDPOINT_PHOTOS, status=200, content_type='application/json', json=load_json_data('500px-response.json')) def activate_rijks_mocks(): from imageledger.handlers.handler_rijks import ENDPOINT_PHOTOS responses.add(responses.GET, ENDPOINT_PHOTOS, status=200, content_type='application/json', json=load_json_data('rijks-response.json')) def activate_wikimedia_mocks(): from imageledger.handlers.handler_wikimedia import BASE_URL, WIKIDATA_URL entities_template = load_json_data('wikimedia-entities-response.json') wikidata_template = load_json_data('wikimedia-data-response.json') responses.add(responses.GET, BASE_URL, status=200, content_type='application/json', json=entities_template) responses.add(responses.GET, WIKIDATA_URL, status=200, content_type='application/json', json=wikidata_template) def load_json_data(datafile): """Load testing data in JSON format relative to the path where the test lives""" dir_path = os.path.dirname(os.path.realpath(__file__)) return json.loads(open(os.path.join(dir_path, datafile)).read()) def select_node(resp, selector): """Give a response from the app, return just the HTML fragment defined by `selector`. Guaranteed to return one node or None""" r = select_nodes(resp, selector) if r and len(r) > 0: return r[0] return None def select_nodes(resp, selector): """Give a response from the app, return just the HTML fragment defined by `selector`""" h = html5lib.parse(resp.content.decode('utf-8'), treebuilder='lxml', namespaceHTMLElements=False) return h.getroot().cssselect(selector)