class TestMockServer(unittest.TestCase): def setUp(self): self.server = MockServer(host = "localhost", port = 5001) self.daemon = True self.server.start() def test_add_response_json(self): # example of how to add response json that needs to be returned for any requests for a specific route self.server.add_response_json(url = "/mobiles/manufacturers", serializable = ["samsung", "apple", "mi"], methods = ('GET',)) response = requests.get(self.server.url + "/mobiles/manufacturers") self.assertEqual(200, response.status_code) self.assertEqual(["samsung", "apple", "mi"], response.json()) def test_no_endpoint_registered(self): # call an end point which is not registered response = requests.get(self.server.url + "/mobiles/models") self.assertEqual(404, response.status_code) def tearDown(self): self.server.shutdown_server()
class ErfGeoIntegrationState(IntegrationState): def __init__(self, stateName, tests=None, fastMode=False): IntegrationState.__init__(self, stateName, tests=tests, fastMode=fastMode) self.testdataDir = join(mydir, 'data') self.digitaleCollectiePort = PortNumberGenerator.next() self.erfGeoEnrichmentPort = PortNumberGenerator.next() self.erfGeoEnrichmentLocalStatePath = join(self.integrationTempdir, 'erfGeoEnrichmentLocal') self.erfGeoEnrichmentIndexPort = PortNumberGenerator.next() self.erfGeoEnrichmentIndexLocalStatePath = join(self.integrationTempdir, 'erfGeoEnrichmentIndexLocal') erfGeoRepositorySetsSelectionFile = join(self.erfGeoEnrichmentLocalStatePath, 'erfgeo_dc_sets.json') if not self.fastMode: clearOrCreateDir(self.erfGeoEnrichmentLocalStatePath) open(erfGeoRepositorySetsSelectionFile, 'w').write(ERFGEO_SETS_SELECTION_JSON) self.erfGeoApiPort = PortNumberGenerator.next() self.globalStatePath = join(self.integrationTempdir, 'global') self.saharaGetPort = PortNumberGenerator.next() self.config = config = readConfig(join(documentationDir, 'examples', 'dc-erfgeo-enrich.config')) # test example config has necessary parameters def setConfig(config, parameter, value): assert config.get(parameter), "key '%s' should only be given a value if it is already declared in source config %s." % (parameter, config) print "config[%s] = %s" % (repr(parameter), repr(value)) config[parameter] = value setConfig(config, 'erfgeoEnrich.portNumber', self.erfGeoEnrichmentPort) setConfig(config, 'erfgeoEnrich.index.portNumber', self.erfGeoEnrichmentIndexPort) setConfig(config, 'digitaleCollectie.host', 'localhost') setConfig(config, 'digitaleCollectie.port', self.digitaleCollectiePort) setConfig(config, 'erfgeo.searchApiBaseUrl', 'http://localhost:%s' % self.erfGeoApiPort) config['global.apacheLogStream'] = 'disabled' config['global.debug.periodicdownload.period'] = '0.1' self.configFile = join(self.integrationTempdir, 'erfgeo.config') with open(self.configFile, 'w') as f: for item in config.items(): f.write('%s = %s\n' % item) def binDir(self, executable=None): binDir = join(projectDir, 'bin') if not isdir(binDir): binDir = '/usr/bin' result = binDir if executable is None else join(binDir, executable) return result def setUp(self): self._startMockErfGeoApi() self._startMockDigitaleCollectie() self._startErfGeoEnrichmentServer() self._startErfGeoEnrichmentIndexServer() self._createDatabase() def tearDown(self): IntegrationState.tearDown(self) self.mockErfGeoApi.halt = True def _startMockDigitaleCollectie(self): self._startServer( serviceName='DigitaleCollectie-mock', executable=join(mydir, 'testutils/start-mockdc'), serviceReadyUrl='http://localhost:%s/ready' % self.digitaleCollectiePort, port=self.digitaleCollectiePort, dataDir=join(self.testdataDir, 'dc_summaries') ) def _startErfGeoEnrichmentServer(self): self._startServer( serviceName='erfGeoEnrichment', executable=self.binDir('erfgeo-enrichment-server'), serviceReadyUrl='http://localhost:%s/info/version' % self.erfGeoEnrichmentPort, stateDir=self.erfGeoEnrichmentLocalStatePath, configFile=self.configFile) def _startErfGeoEnrichmentIndexServer(self): self._startServer( serviceName='erfGeoEnrichmentIndex', executable=self.binDir('erfgeo-enrichment-index-server'), serviceReadyUrl='http://localhost:%s/info/version' % self.erfGeoEnrichmentIndexPort, stateDir=self.erfGeoEnrichmentIndexLocalStatePath, configFile=self.configFile) def _startMockErfGeoApi(self): def makeResponse(request): for key, value in [ ('%22Verenigde+Staten%22', 'soestdijk'), ('%22Leunseweg%22%2C+%22Leunen%22%2C+%22Venray%22', 'leunseweg-leunen-venray'), ('GET', 'utrecht') ]: if key in request: return httputils.okHtml + open(join(self.testdataDir, 'api.erfgeo.nl/%s.response.json' % value)).read() self.mockErfGeoApi = MockServer(self.erfGeoApiPort) self.mockErfGeoApi.makeResponse = makeResponse self.mockErfGeoApi.start() def _createDatabase(self): if self.fastMode: print "Reusing database in", self.integrationTempdir return print "Creating database in", self.integrationTempdir sleepWheel(28) # give ErfGeoEnrichment service etc. some time to process and commit def _uploadUpdateRequests(self, datadir, uploadPath, uploadPorts, filter=None): requests = (join(datadir, r) for r in sorted(listdir(datadir)) if r.endswith('.updateRequest')) for filename in requests: if filter is None or filter(filename): self._uploadUpdateRequest(filename, uploadPath, uploadPorts) def _uploadUpdateRequest(self, filename, uploadPath, uploadPorts): aPort = choice(uploadPorts) print 'http://localhost:%s%s' % (aPort, uploadPath), '<-', basename(filename)[:-len('.updateRequest')] updateRequest = open(filename).read() lxml = parse(StringIO(updateRequest)) uploadIdentifier = xpathFirst(lxml, '//ucp:recordIdentifier/text()') self.uploaded.append((uploadIdentifier, updateRequest)) header, body = postRequest(aPort, uploadPath, updateRequest, parse=False, timeOutInSeconds=18.0) if '200' not in header.split('\r\n', 1)[0]: print 'No 200 response, but:\n', header exit(123) if "srw:diagnostics" in body: print body exit(1234) def stopServer(self, *args, **kwargs): self._stopServer(*args, **kwargs)