示例#1
0
    def test_aqi_94501_zip_code_cache_expired_request_fails_reporting_area_fallback(
            self):
        self.given_dynamo_table_exists()
        zip_code_last_updated = (datetime.utcnow() -
                                 timedelta(hours=1, minutes=1)).isoformat()
        reporting_area_last_updated = (datetime.utcnow() -
                                       timedelta(minutes=30)).isoformat()
        zip_code_data = self.given_zip_code_cached(zip_code_last_updated)
        zip_code_data["PM2.5"]["AQI"] = 100
        zip_code_data["LastUpdated"] = reporting_area_last_updated
        self.given_reporting_area_cached(reporting_area_last_updated,
                                         zip_code_data)

        event = {"zipCode": "94501"}

        response = lambda_function.lambda_handler(event, {})

        self.verify_dynamo_key_exists("ZipCode:94501", zip_code_last_updated)
        self.verify_dynamo_key_exists("ReportingArea:Oakland|CA",
                                      reporting_area_last_updated)
        self.assertTrue("PM2.5" in response)
        self.assertTrue("AQI" in response["PM2.5"])
        self.assertTrue("ReportingArea" in response["PM2.5"])
        self.assertEqual(response["PM2.5"]["AQI"], 100)
        self.assertEqual(response["PM2.5"]["ReportingArea"], "Oakland")
示例#2
0
    def test_aqi_94501(self):
        self.given_dynamo_table_exists()
        self.given_airnow_routes_mocked()

        event = {
            "params": {
                "querystring": {
                    "zipCode": "94501"
                },
            },
        }

        response = lambda_function.lambda_handler(event, {})

        self.verify_dynamo_key_exists("ZipCode:94501")
        self.verify_dynamo_key_exists("ReportingArea:Oakland|CA")
        self.assertTrue("PM2.5" in response)
        self.assertTrue("AQI" in response["PM2.5"])
        self.assertTrue("MapUrl" in response["PM2.5"])
        self.assertTrue("ReportingArea" in response["PM2.5"])
        self.assertEqual(response["PM2.5"]["AQI"], 15)
        self.assertEqual(response["PM2.5"]["ReportingArea"], "Oakland")
        self.assertEqual(
            response["PM2.5"]["MapUrl"],
            "https://files.airnowtech.org/airnow/today/cur_aqi_sanfrancisco_ca.jpg"
        )
示例#3
0
    def test_aqi_94501_cached(self):
        self.given_dynamo_table_exists()
        last_updated = datetime.utcnow().isoformat()
        zip_code_data = self.given_zip_code_cached(last_updated)
        self.given_reporting_area_cached(last_updated, zip_code_data)

        event = {
            "params": {
                "querystring": {
                    "zipCode": "94501"
                },
            },
        }

        response = lambda_function.lambda_handler(event, {})

        self.verify_dynamo_key_exists("ZipCode:94501", last_updated)
        self.verify_dynamo_key_exists("ReportingArea:Oakland|CA", last_updated)
        self.assertTrue("PM2.5" in response)
        self.assertTrue("AQI" in response["PM2.5"])
        self.assertTrue("MapUrl" in response["PM2.5"])
        self.assertTrue("ReportingArea" in response["PM2.5"])
        self.assertEqual(response["PM2.5"]["AQI"], 25)
        self.assertEqual(response["PM2.5"]["ReportingArea"], "Oakland")
        self.assertEqual(
            response["PM2.5"]["MapUrl"],
            "https://files.airnowtech.org/airnow/today/cur_aqi_sanfrancisco_ca.jpg"
        )
示例#4
0
        def _aqi_request_callback(request):
            parsed = urlparse.urlparse(request.url)
            event = {
                "zipCode": urlparse.parse_qs(parsed.query)["zipCode"][0]
            }

            return (200, {}, json.dumps(aqi_route.lambda_handler(event, {}), default=decimal_default))
示例#5
0
    def test_aqi_air_now_bad_response(self):
        self.given_dynamo_table_exists()
        self.given_airnow_api_bad_response()

        event = {"zipCode": "94501"}

        response = lambda_function.lambda_handler(event, {})

        self.assertEqual(response, {"errorMessage": "Oops, something went wrong. AirNow seems overloaded at the moment."})
示例#6
0
    def test_aqi_52328(self):
        self.given_dynamo_table_exists()
        self.given_airnow_routes_mocked()

        event = {"zipCode": "52328"}

        response = lambda_function.lambda_handler(event, {})

        self.assertEqual(response, {"errorMessage": "Sorry, AirNow data is unavailable for this zip code."})
示例#7
0
    def test_aqi_94501_zip_code_cached_no_map(self):
        self.given_dynamo_table_exists()
        last_updated = datetime.utcnow().isoformat()
        zip_code_data = self.given_zip_code_cached(last_updated)

        event = {"zipCode": "94501"}

        response = lambda_function.lambda_handler(event, {})

        self.verify_dynamo_key_exists("ZipCode:94501", last_updated)
        self.assertTrue("PM2.5" in response)
        self.assertTrue("AQI" in response["PM2.5"])
        self.assertTrue("MapUrl" not in response["PM2.5"])
        self.assertTrue("ReportingArea" in response["PM2.5"])
        self.assertEqual(response["PM2.5"]["AQI"], 25)
        self.assertEqual(response["PM2.5"]["ReportingArea"], "Oakland")
示例#8
0
    def test_aqi_94501_zip_code_cache_expired(self):
        self.given_dynamo_table_exists()
        self.given_airnow_routes_mocked()
        last_updated = (datetime.utcnow() -
                        timedelta(hours=1, minutes=1)).isoformat()
        zip_code_data = self.given_zip_code_cached(last_updated)

        event = {"zipCode": "94501"}

        response = lambda_function.lambda_handler(event, {})

        self.verify_dynamo_key_exists("ZipCode:94501", last_updated, True)
        self.verify_dynamo_key_exists("ReportingArea:Oakland|CA")
        self.assertTrue("PM2.5" in response)
        self.assertTrue("AQI" in response["PM2.5"])
        self.assertTrue("ReportingArea" in response["PM2.5"])
        self.assertEqual(response["PM2.5"]["AQI"], 15)
        self.assertEqual(response["PM2.5"]["ReportingArea"], "Oakland")
示例#9
0
    def test_aqi_52328(self):
        self.given_dynamo_table_exists()
        self.given_airnow_routes_mocked()

        event = {
            "params": {
                "querystring": {
                    "zipCode": "52328"
                },
            },
        }

        response = lambda_function.lambda_handler(event, {})

        self.verify_dynamo_key_not_exists("ZipCode:52328")
        self.assertEqual(response, {
            "errorMessage":
            "Sorry, AirNow data is unavailable for this zip code."
        })
示例#10
0
    def test_aqi_air_now_non_200(self):
        self.given_dynamo_table_exists()
        self.given_airnow_api_server_error()

        event = {
            "params": {
                "querystring": {
                    "zipCode": "94501"
                },
            },
        }

        response = lambda_function.lambda_handler(event, {})

        self.verify_dynamo_key_not_exists("ZipCode:94501")
        self.assertEqual(
            response, {
                "errorMessage":
                "Oops, something went wrong. AirNow seems overloaded at the moment."
            })
示例#11
0
    def test_aqi_94501_zip_code_cache_expired_request_fails_cache_fallback(
            self):
        self.given_dynamo_table_exists()
        last_updated = (datetime.utcnow() -
                        timedelta(hours=1, minutes=1)).isoformat()
        self.given_zip_code_cached(last_updated)

        event = {
            "params": {
                "querystring": {
                    "zipCode": "94501"
                },
            },
        }

        response = lambda_function.lambda_handler(event, {})

        self.verify_dynamo_key_exists("ZipCode:94501", last_updated)
        self.assertTrue("PM2.5" in response)
        self.assertTrue("AQI" in response["PM2.5"])
        self.assertTrue("ReportingArea" in response["PM2.5"])
        self.assertEqual(response["PM2.5"]["AQI"], 25)
        self.assertEqual(response["PM2.5"]["ReportingArea"], "Oakland")
示例#12
0
def route_aqi():
    event = {
        "zipCode": request.args.get("zipCode")
    }

    return json.dumps(aqi_route.lambda_handler(event, {}), default=decimal_default)