def test_get_intersecting_projects(self, get_dto_for_locale, _get_intersecting_projects, get_user_by_username, validate_bbox_area, _make_4326_polygon_from_bbox): if self.skip_tests: return # arrange _make_4326_polygon_from_bbox mock _make_4326_polygon_from_bbox.return_value = Polygon([ (34.68826225820438, -12.59912449955007), (34.68826225820438, -11.57858317689196), (32.50198296132938, -11.57858317689196), (32.50198296132938, -12.59912449955007), (34.68826225820438, -12.59912449955007) ]) # arrange validate_bbox_area mock validate_bbox_area.return_value = True # arrange get_user_by_username mock get_user_by_username.return_value = User(id=3488526) # arrange _get_intersecting_projects mock polygon = json.dumps(get_canned_json('search_bbox_feature.json')) project = Project(id=2274, status=0, default_locale='en', geometry=polygon) projects = [project] _get_intersecting_projects.return_value = projects # arrange get_dto_for_locale mock get_dto_for_locale.return_value = ProjectInfo( name='PEPFAR Kenya: Homa Bay') # arrange dto dto = ProjectSearchBBoxDTO() dto.bbox = map(float, '34.404,-1.034, 34.717,-0.624'.split(',')) dto.preferred_locale = 'en' dto.input_srid = 4326 dto.project_author = 3488526 dto.validate() # arrange expected result expected = json.dumps(get_canned_json('search_bbox_result.json')) # act result = ProjectSearchService.get_projects_geojson(dto) # assert self.assertEqual(str(expected), str(expected))
def get(self): """ Search for projects by bbox projects --- tags: - search produces: - application/json parameters: - in: header name: Authorization description: Base64 encoded session token required: true type: string default: Token sessionTokenHere== - in: header name: Accept-Language description: Language user is requesting type: string required: true default: en - in: query name: bbox description: comma separated list xmin, ymin, xmax, ymax type: string default: 34.404,-1.034, 34.717,-0.624 - in: query name: srid description: srid of bbox coords type: integer default: 4326 - in: query name: createdByMe description: limit to projects created by authenticated user type: boolean required: true default: false responses: 200: description: ok 400: description: Client Error - Invalid Request 403: description: Forbidden 500: description: Internal Server Error """ try: search_dto = ProjectSearchBBoxDTO() search_dto.bbox = map(float, request.args.get('bbox').split(',')) search_dto.input_srid = request.args.get('srid') search_dto.preferred_locale = request.environ.get( 'HTTP_ACCEPT_LANGUAGE') createdByMe = strtobool(request.args.get( 'createdByMe')) if request.args.get('createdByMe') else False if createdByMe: search_dto.project_author = tm.authenticated_user_id search_dto.validate() except Exception as e: current_app.logger.error(f'Error validating request: {str(e)}') return str(e), 400 try: geojson = ProjectSearchService.get_projects_geojson(search_dto) return geojson, 200 except BBoxTooBigError: return {"Error": "Bounding Box too large"}, 403 except ProjectSearchServiceError as e: return {"error": str(e)}, 400 except Exception as e: error_msg = f'Project GET - unhandled error: {str(e)}' current_app.logger.critical(error_msg) return {"error": error_msg}, 500