Repository: llimllib/limbo

Issue:
Remove DarkSky dependency in Weather Plugin
In recent news Dark Sky was acquired by Apple and they will stop accepting new signups to use the API. 
Current API users will work until end 2021. (Source of information: https://blog.darksky.net/dark-sky-has-a-new-home/)

Currently the [weather plugin](https://github.com/llimllib/limbo/blob/master/limbo/plugins/weather.py) uses Dark Sky API. I suggest to move away form it, since new users would be impossible to use the register, get an API key and use the plugin.

Discussion:
llimllib: ![limbo weather](https://user-images.githubusercontent.com/7150/78625572-6da2d880-785a-11ea-9576-5018b6750307.png)


Patch:
diff --git a/README.md b/README.md
index 06d2c82..134fd3c 100644
--- a/README.md
+++ b/README.md
@@ -92,3 +92,4 @@ These are the current default plugins:
 * [@eSoares](https://github.com/eSoares)
 * [@sweinstein89](https://github.com/sweinstein89)
 * [@fenwar](https://github.com/fenwar)
+* [@rdimartino](https://github.com/rdimartino)
diff --git a/limbo/plugins/weather.py b/limbo/plugins/weather.py
index 8d526a6..5116f0b 100644
--- a/limbo/plugins/weather.py
+++ b/limbo/plugins/weather.py
@@ -4,8 +4,9 @@
 Three environment variables control the behavior of this plugin:
     MAPBOX_API_TOKEN: must be set to a valid Mapbox API token
                       https://docs.mapbox.com/api/search/#geocoding
-    DARKSKY_API_KEY: must be set to a valid Dark Sky API key
-                      https://darksky.net/dev/docs#data-point-object
+    OPENWEATHER_API_KEY: must be set to a valid OpenWeather API key
+                      https://openweathermap.org/current
+                      https://openweathermap.org/forecast5
     WEATHER_CELSIUS: if this environment variable is present with any value,
                      the plugin will report temperatures in celsius instead of
                      farenheit
@@ -22,30 +23,32 @@ from datetime import datetime
 
 import requests
 
-# https://darksky.net/dev/docs#data-point-object
+# https://openweathermap.org/weather-conditions
 ICONMAP = {
-    "clear-day": ":sunny:",
-    "clear-night": ":moon:",
-    "rain": ":rain_cloud:",
-    "snow": ":snowflake:",
-    "sleet": ":snow_cloud:",
-    "wind": ":wind_blowing_face:",
-    "fog": ":fog:",
-    "cloudy": ":cloud:",
-    "partly-cloudy-day": ":sun_behind_cloud:",
-    "partly-cloudy-night": ":sun_behind_cloud:",
-    "thunderstorm": ":thunder_cloud_and_rain:",
-    "tornado": ":tornado:",
+    "01d": ":sunny:",
+    "01n": ":moon:",
+    "02d": ":sun_behind_cloud:",
+    "02n": ":sun_behind_cloud:",
+    "03d": ":cloud:",
+    "03n": ":cloud:",
+    "04d": ":cloud:",
+    "04n": ":cloud:",
+    "09d": ":rain_cloud:",
+    "09n": ":rain_cloud:",
+    "10d": ":sun_behind_rain_cloud:",
+    "10n": ":sun_behind_rain_cloud:",
+    "11d": ":thunder_cloud_and_rain:",
+    "11n": ":thunder_cloud_and_rain:",
+    "13d": ":snowflake:",
+    "13n": ":snowflake:",
+    "50d": ":fog:",
+    "50n": ":fog:",
 }
+CELSIUS = "metric"
+IMPERIAL = "imperial"
 
 MAPBOX_API_TOKEN = os.environ.get("MAPBOX_API_TOKEN")
-DARKSKY_API_KEY = os.environ.get("DARKSKY_API_KEY")
-
-
-class WeatherException(Exception):
-    """An exception finding the weather"""
-
-    pass
+OPENWEATHER_API_KEY = os.environ.get("OPENWEATHER_API_KEY")
 
 
 def weather(searchterm):
@@ -56,11 +59,8 @@ def weather(searchterm):
     The title describes the location for the forecast (i.e. "Portland, ME USA")
     The list of forecasts is a list of dictionaries in slack attachment fields
         format (see https://api.slack.com/docs/message-attachments)
-
-    Throws WeatherException if the location given by `searchterm` can't be
-    found.
     """
-    unit = "si" if os.environ.get("WEATHER_CELSIUS") else "us"
+    unit = CELSIUS if os.environ.get("WEATHER_CELSIUS") else IMPERIAL
 
     geo = requests.get(
         "https://api.mapbox.com/geocoding/v5/mapbox.places/{}.json?limit=1&access_token={}".format(
@@ -69,30 +69,51 @@ def weather(searchterm):
     ).json()
     citystate = geo["features"][0]["place_name"]
     lon, lat = geo["features"][0]["center"]
+
+    today = requests.get(
+        "https://api.openweathermap.org/data/2.5/weather?lat={:.2f}&lon={:.2f}&units={}&appid={}".format(
+            lat, lon, unit, OPENWEATHER_API_KEY
+        )
+    ).json()
     forecast = requests.get(
-        "https://api.darksky.net/forecast/{}/{},{}?units={}".format(
-            DARKSKY_API_KEY, lat, lon, unit
+        "https://api.openweathermap.org/data/2.5/forecast?lat={:.2f}&lon={:.2f}&units={}&appid={}".format(
+            lat, lon, unit, OPENWEATHER_API_KEY
         )
     ).json()
 
     title = "Weather for {}: ".format(citystate)
 
-    forecasts = []
-    unit_abbrev = "f" if unit == "us" else "c"
-    for day in forecast["daily"]["data"][0:4]:
-        day_of_wk = datetime.fromtimestamp(day["time"]).strftime("%A")
-        icon = ICONMAP.get(day["icon"], ":question:")
-        forecasts.append(
-            {
-                "title": day_of_wk,
-                "value": u"{} {}°{}".format(
-                    icon, int(round(day["temperatureHigh"])), unit_abbrev
-                ),
-                "short": True,
-            }
-        )
+    # offset in seconds
+    utc_offset = today["timezone"]
+    current_time = datetime.fromtimestamp(today["dt"] + utc_offset)
+
+    forecasts = [parse_forecast(today, current_time, unit)]
+
+    for event in forecast["list"]:
+        event_time = datetime.fromtimestamp(event["dt"] + utc_offset)
+        hour = event_time.strftime("%H")
+        # not today and is 3-hour forecast > 11am and <= 2pm
+        if (
+            current_time.strftime("%d") != event_time.strftime("%d")
+            and hour > "11"
+            and hour <= "14"
+        ):
+            forecasts.append(parse_forecast(event, event_time, unit))
+
+    return title, forecasts[0:4]
+
 
-    return title, forecasts
+def parse_forecast(event, time, unit):
+    day_of_wk = time.strftime("%A")
+    icon = ICONMAP.get(event["weather"][0]["icon"], ":question:")
+    unit_abbrev = "f" if unit == IMPERIAL else "c"
+    return {
+        "title": day_of_wk,
+        "value": u"{} {}°{}".format(
+            icon, int(round(event["main"]["temp"])), unit_abbrev
+        ),
+        "short": True,
+    }
 
 
 def on_message(msg, server):
@@ -103,8 +124,8 @@ def on_message(msg, server):
 
     try:
         title, forecasts = weather(match[0])
-    except WeatherException as err:
-        return err.args[0]
+    except KeyError as err:
+        return "KeyError: {}".format(err.args[0])
 
     attachment = {"fallback": title, "pretext": title, "fields": forecasts[0:4]}
     server.slack.post_message(
diff --git a/setup.py b/setup.py
index 00e28e5..f20cbaa 100644
--- a/setup.py
+++ b/setup.py
@@ -24,7 +24,7 @@ except:
 
 setup(
     name="limbo",
-    version="7.2.0",
+    version="7.3.0",
     description="Simple and Clean Slack Chatbot",
     long_description=longdesc,
     author="Bill Mill",


Test patch:
diff --git a/test/fixtures/weather_basic.yaml b/test/fixtures/weather_basic.yaml
index 07c6792..9973bad 100644
--- a/test/fixtures/weather_basic.yaml
+++ b/test/fixtures/weather_basic.yaml
@@ -2,147 +2,230 @@ interactions:
 - request:
     body: null
     headers:
-      Accept: ['*/*']
-      Accept-Encoding: ['gzip, deflate']
-      Connection: [keep-alive]
-      User-Agent: [python-requests/2.20.0]
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
     method: GET
     uri: https://api.mapbox.com/geocoding/v5/mapbox.places/Oahu%2C%20HI.json?limit=1&access_token=fake_mapbox_token
   response:
     body:
       string: !!binary |
-        H4sIAAAAAAAAA3WS307bMBTGX+XIV0MKqZ00idO7CQ3BBYMJ2A1CyE0O1FtiB9uhVFUfaK+xJ9tx
-        u66Dabnzyfl+5zt/1iysBmQzdooqjA5PbNdhE7Q1LGHPI7oVm90xqxYjvRea3SfscZfp6cea6Za0
-        qm3p7dOcZ6LMZFnURTWdiowkb+kUGDrV4MMufLdXRqzDDl+UaSguKM3ZAV3Qscx6Qxx8DcS53BnZ
-        QYzq8XcsgQs7mqC0ga8alwmcqaXSGuqyqkQCt0YHbOE6qEDAhDVoAjoycCyKIhVciCIRdTqtqiKX
-        5OUJbY8h9r7ed3BltQlRaq1rtdmC/qPfxCyzc7wf0WB9aGyLqcimkvNCSl7WcpqXnP1pbmuWbZK9
-        JDaZyppLKYt6KuiTWUxf6u+6VUFRzpcsz/Oqrg+QN3M4wBw+0U5TIXjGucxKWZVZVm5xfmFdeIjm
-        KO/2+vjs/F2NSmYH/m6wB3AT67lVWvMi55y2X2VFyYt/wKN/R83/6vztfjb3G9qBCsHp+bg9xRn7
-        fHlzfvJpBj9/QMaFhAs1zO0rKNOCDh78OAydRudT+Nh14PTTgqJ0WuhesE3h1iPYRwgL7SEaAB01
-        82906hAsxXFPvEHX+5h7TVLdIHxYhDD42WSyXC7TfpuUNrafqLkdw4QCfnKUwk0kU73BGioVbUWm
-        No/W9Sr2QDYhXgWtxkOvVmBsgDmSJoaix6vL8w/+COjyX3RL05iv4NSOzj+PymHKNr8AqY+EcKsD
-        AAA=
+        H4sIAAAAAAAAA42Tz1LbMBDGX2VHpzJjHFvxHym3DlMGDhQ6QC8Mwyj2QtTakpFkQiaTB+pr9Mm6
+        Spqm0Et90+fd3367Wq1ZWA3IZuwUVRgdntiuwyZoa1jCnkd0Kza7Y1YtRjovNLtP2OMu0tOPNdMt
+        5aq2pbNPeSFlWdWyymrJhSwo5S2dhKFTDT7s5Lt9ZsQ67PBFmYb0nMKcHdAFHcusmWqa0amGvDAf
+        HGJgG0LjayDhcudtxzWqx99aAhd2NEFpA181LhM4U0ulNciqrvMEbo0O2MJ1UIFqJKxBE9CRp+O8
+        LNM8y/Myy3jOuUhymRZ1XU5FUXFZVQWZfULbY4jDWe9bvLLahAiy1rXabLH/RdvEHLPrZj/RwfrQ
+        2BbTnBciy0ohskqKYlpl7E/j20ZoEPuUOIBUyEwIUcoip0/wGL7U33WrgqKYL3w6ndZSHiBvZnSA
+        OXyiFSDjRSF4XmQVmeXVFucX1oWHaI7ibq+Pz87f1agFP/B3Qz+Am1jPrdJcTkte5nXNJS+rrPyH
+        PPp32Olfrb+9vM39hq5EheD0fNyu7ox9vrw5P/k0g58/gGc8gws1zO0rKNOCDh78OAydRudT+Nh1
+        4PTTglRaRXQv2KZw6xHsI4SF9hANgI4582/0NCBY0nFPvEHX+xh7Tam6QfiwCGHws8lkuVym/TYo
+        bWw/UXM7hgkJfnKUwk0kU73BGioVbUWmNo/W9Sr2QDYhrgXdjYdercDYAHOknChFj1eX5x/8EdBL
+        edEtTWO+glM7Ov88Kocp2/wCHsvGkNsDAAA=
     headers:
-      Access-Control-Allow-Origin: ['*']
-      Access-Control-Expose-Headers: ['x-rate-limit-interval,x-rate-limit-limit,x-rate-limit-remaining,x-rate-limit-reset']
-      Age: ['2066']
-      Cache-Control: [max-age=604800]
-      Connection: [keep-alive]
-      Content-Encoding: [gzip]
-      Content-Type: [application/vnd.geo+json; charset=utf-8]
-      Date: ['Fri, 18 Jan 2019 15:37:11 GMT']
-      ETag: ['"7b3891e6826bf90d41abe6d2f062ddd3"']
-      Last-Modified: ['Thu, 17 Jan 2019 19:47:09 GMT']
-      Transfer-Encoding: [chunked]
-      Vary: [Accept-Encoding]
-      Via: [1.1 663b9ec2cd0b34391786d62f92365deb.cloudfront.net (CloudFront)]
-      X-Amz-Cf-Id: [6RAUhAjqVSmMuMW1yTkSh0JrEpK5KEDdNqN-SFYp2nBDu618NuF2Gw==]
-      X-Cache: [Hit from cloudfront]
-      X-Powered-By: [Express]
-      X-Rate-Limit-Interval: ['60']
-      X-Rate-Limit-Limit: ['600']
-      X-Rate-Limit-Reset: ['1547825891']
-    status: {code: 200, message: OK}
+      Access-Control-Allow-Origin:
+      - '*'
+      Access-Control-Expose-Headers:
+      - x-rate-limit-interval,x-rate-limit-limit,x-rate-limit-remaining,x-rate-limit-reset
+      Age:
+      - '549'
+      Cache-Control:
+      - max-age=604800
+      Connection:
+      - keep-alive
+      Content-Encoding:
+      - gzip
+      Content-Type:
+      - application/vnd.geo+json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:13:34 GMT
+      ETag:
+      - '"58c736d68967e252df9aaece3d55a693"'
+      Last-Modified:
+      - Wed, 25 Mar 2020 14:25:21 GMT
+      Transfer-Encoding:
+      - chunked
+      Vary:
+      - Accept-Encoding
+      Via:
+      - 1.1 936397b26a4278a4582b6e1456333afb.cloudfront.net (CloudFront)
+      X-Amz-Cf-Id:
+      - rgafyibVpBaD-jhhh06mm0lAb3Mz872Vb2aGsCsf2beGyK3NKkltMA==
+      X-Amz-Cf-Pop:
+      - EWR52-C2
+      X-Cache:
+      - Hit from cloudfront
+      X-Powered-By:
+      - Express
+      X-Rate-Limit-Interval:
+      - '60'
+      X-Rate-Limit-Limit:
+      - '600'
+      X-Rate-Limit-Reset:
+      - '1586225674'
+    status:
+      code: 200
+      message: OK
 - request:
     body: null
     headers:
-      Accept: ['*/*']
-      Accept-Encoding: ['gzip, deflate']
-      Connection: [keep-alive]
-      User-Agent: [python-requests/2.20.0]
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
     method: GET
-    uri: https://api.darksky.net/forecast/fake_darksky_key/19.477538,-155.10115?units=us
+    uri: https://api.openweathermap.org/data/2.5/weather?lat=19.48&lon=-155.10&units=imperial&appid=fake_openweather_key
   response:
     body:
-      string: !!binary |
-        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
+      string: '{"coord":{"lon":-155.1,"lat":19.48},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"base":"stations","main":{"temp":71.67,"feels_like":70.14,"temp_min":55.99,"temp_max":78.8,"pressure":1012,"humidity":65},"visibility":16093,"wind":{"speed":8.05,"deg":130},"clouds":{"all":75},"dt":1586225615,"sys":{"type":1,"id":7881,"country":"US","sunrise":1586189350,"sunset":1586234135},"timezone":-36000,"id":5855088,"name":"Fern
+        Acres","cod":200}'
+    headers:
+      Access-Control-Allow-Credentials:
+      - 'true'
+      Access-Control-Allow-Methods:
+      - GET, POST
+      Access-Control-Allow-Origin:
+      - '*'
+      Connection:
+      - keep-alive
+      Content-Length:
+      - '471'
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:22:43 GMT
+      Server:
+      - openresty
+      X-Cache-Key:
+      - /data/2.5/weather?lat=19.48&lon=-155.1&units=imperial
+    status:
+      code: 200
+      message: OK
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
+    method: GET
+    uri: https://api.openweathermap.org/data/2.5/forecast?lat=19.48&lon=-155.10&units=imperial&appid=fake_openweather_key
+  response:
+    body:
+      string: '{"cod":"200","message":0,"cnt":40,"list":[{"dt":1586228400,"main":{"temp":70.59,"feels_like":68.86,"temp_min":70.12,"temp_max":70.59,"pressure":1013,"sea_level":1013,"grnd_level":948,"humidity":61,"temp_kf":0.26},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":21},"wind":{"speed":6.69,"deg":149},"rain":{"3h":0.34},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        03:00:00"},{"dt":1586239200,"main":{"temp":67.51,"feels_like":66.54,"temp_min":67.17,"temp_max":67.51,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":68,"temp_kf":0.19},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":27},"wind":{"speed":5.39,"deg":173},"rain":{"3h":0.16},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        06:00:00"},{"dt":1586250000,"main":{"temp":66.4,"feels_like":65.17,"temp_min":66.16,"temp_max":66.4,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":68,"temp_kf":0.13},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":20},"wind":{"speed":5.21,"deg":189},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        09:00:00"},{"dt":1586260800,"main":{"temp":65.57,"feels_like":64.53,"temp_min":65.46,"temp_max":65.57,"pressure":1015,"sea_level":1015,"grnd_level":949,"humidity":68,"temp_kf":0.06},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":18},"wind":{"speed":4.45,"deg":198},"rain":{"3h":0.19},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        12:00:00"},{"dt":1586271600,"main":{"temp":64.53,"feels_like":63.1,"temp_min":64.53,"temp_max":64.53,"pressure":1014,"sea_level":1014,"grnd_level":949,"humidity":66,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01n"}],"clouds":{"all":1},"wind":{"speed":4.14,"deg":217},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        15:00:00"},{"dt":1586282400,"main":{"temp":69.67,"feels_like":69.26,"temp_min":69.67,"temp_max":69.67,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":58,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":3.06,"deg":188},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        18:00:00"},{"dt":1586293200,"main":{"temp":74.1,"feels_like":71.87,"temp_min":74.1,"temp_max":74.1,"pressure":1016,"sea_level":1016,"grnd_level":952,"humidity":56,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":35},"wind":{"speed":8.12,"deg":147},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        21:00:00"},{"dt":1586304000,"main":{"temp":74.68,"feels_like":71.49,"temp_min":74.68,"temp_max":74.68,"pressure":1014,"sea_level":1014,"grnd_level":950,"humidity":55,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":45},"wind":{"speed":9.82,"deg":158},"rain":{"3h":0.83},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        00:00:00"},{"dt":1586314800,"main":{"temp":72.07,"feels_like":69.21,"temp_min":72.07,"temp_max":72.07,"pressure":1014,"sea_level":1014,"grnd_level":949,"humidity":59,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":22},"wind":{"speed":8.97,"deg":177},"rain":{"3h":1.05},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        03:00:00"},{"dt":1586325600,"main":{"temp":68.04,"feels_like":67.14,"temp_min":68.04,"temp_max":68.04,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":68,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":18},"wind":{"speed":5.55,"deg":185},"rain":{"3h":0.88},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        06:00:00"},{"dt":1586336400,"main":{"temp":67.37,"feels_like":66.51,"temp_min":67.37,"temp_max":67.37,"pressure":1017,"sea_level":1017,"grnd_level":951,"humidity":69,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":25},"wind":{"speed":5.35,"deg":194},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        09:00:00"},{"dt":1586347200,"main":{"temp":65.84,"feels_like":64.17,"temp_min":65.84,"temp_max":65.84,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":68,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":24},"wind":{"speed":5.7,"deg":200},"rain":{"3h":0.27},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        12:00:00"},{"dt":1586358000,"main":{"temp":65.01,"feels_like":63.57,"temp_min":65.01,"temp_max":65.01,"pressure":1015,"sea_level":1015,"grnd_level":949,"humidity":67,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":31},"wind":{"speed":4.63,"deg":203},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        15:00:00"},{"dt":1586368800,"main":{"temp":69.58,"feels_like":68.09,"temp_min":69.58,"temp_max":69.58,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":58,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":19},"wind":{"speed":4.94,"deg":190},"rain":{"3h":0.17},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        18:00:00"},{"dt":1586379600,"main":{"temp":75.13,"feels_like":72.39,"temp_min":75.13,"temp_max":75.13,"pressure":1016,"sea_level":1016,"grnd_level":952,"humidity":52,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":8.34,"deg":172},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        21:00:00"},{"dt":1586390400,"main":{"temp":75.34,"feels_like":71.46,"temp_min":75.34,"temp_max":75.34,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":53,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":8},"wind":{"speed":10.83,"deg":180},"rain":{"3h":0.44},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        00:00:00"},{"dt":1586401200,"main":{"temp":72.07,"feels_like":69.91,"temp_min":72.07,"temp_max":72.07,"pressure":1014,"sea_level":1014,"grnd_level":949,"humidity":60,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":27},"wind":{"speed":8.01,"deg":193},"rain":{"3h":1.38},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        03:00:00"},{"dt":1586412000,"main":{"temp":68.13,"feels_like":66.31,"temp_min":68.13,"temp_max":68.13,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":67,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":27},"wind":{"speed":6.98,"deg":193},"rain":{"3h":0.55},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        06:00:00"},{"dt":1586422800,"main":{"temp":67.12,"feels_like":65.28,"temp_min":67.12,"temp_max":67.12,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":68,"temp_kf":0},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":17},"wind":{"speed":6.69,"deg":187},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        09:00:00"},{"dt":1586433600,"main":{"temp":65.7,"feels_like":63.86,"temp_min":65.7,"temp_max":65.7,"pressure":1014,"sea_level":1014,"grnd_level":949,"humidity":67,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":10},"wind":{"speed":5.68,"deg":206},"rain":{"3h":0.12},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        12:00:00"},{"dt":1586444400,"main":{"temp":64.74,"feels_like":63.77,"temp_min":64.74,"temp_max":64.74,"pressure":1015,"sea_level":1015,"grnd_level":949,"humidity":64,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01n"}],"clouds":{"all":2},"wind":{"speed":3.02,"deg":222},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        15:00:00"},{"dt":1586455200,"main":{"temp":69.71,"feels_like":69.19,"temp_min":69.71,"temp_max":69.71,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":57,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":3,"deg":190},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        18:00:00"},{"dt":1586466000,"main":{"temp":75.65,"feels_like":72.79,"temp_min":75.65,"temp_max":75.65,"pressure":1016,"sea_level":1016,"grnd_level":952,"humidity":48,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":7.58,"deg":167},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        21:00:00"},{"dt":1586476800,"main":{"temp":76.46,"feels_like":72.57,"temp_min":76.46,"temp_max":76.46,"pressure":1015,"sea_level":1015,"grnd_level":951,"humidity":47,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":10},"wind":{"speed":9.48,"deg":198},"rain":{"3h":0.35},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        00:00:00"},{"dt":1586487600,"main":{"temp":72.88,"feels_like":71.82,"temp_min":72.88,"temp_max":72.88,"pressure":1014,"sea_level":1014,"grnd_level":950,"humidity":56,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":47},"wind":{"speed":5.35,"deg":195},"rain":{"3h":0.47},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        03:00:00"},{"dt":1586498400,"main":{"temp":68.77,"feels_like":68.25,"temp_min":68.77,"temp_max":68.77,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":66,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":66},"wind":{"speed":4.81,"deg":182},"rain":{"3h":0.54},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        06:00:00"},{"dt":1586509200,"main":{"temp":67.5,"feels_like":66.29,"temp_min":67.5,"temp_max":67.5,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":68,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":76},"wind":{"speed":5.79,"deg":195},"rain":{"3h":0.27},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        09:00:00"},{"dt":1586520000,"main":{"temp":66.52,"feels_like":65.79,"temp_min":66.52,"temp_max":66.52,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":67,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":77},"wind":{"speed":4.18,"deg":227},"rain":{"3h":0.24},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        12:00:00"},{"dt":1586530800,"main":{"temp":65.14,"feels_like":64.96,"temp_min":65.14,"temp_max":65.14,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":68,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":31},"wind":{"speed":2.68,"deg":235},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        15:00:00"},{"dt":1586541600,"main":{"temp":69.84,"feels_like":70.11,"temp_min":69.84,"temp_max":69.84,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":57,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":40},"wind":{"speed":1.68,"deg":200},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        18:00:00"},{"dt":1586552400,"main":{"temp":75.04,"feels_like":73.38,"temp_min":75.04,"temp_max":75.04,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":49,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":60},"wind":{"speed":5.46,"deg":140},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        21:00:00"},{"dt":1586563200,"main":{"temp":76.48,"feels_like":73.47,"temp_min":76.48,"temp_max":76.48,"pressure":1015,"sea_level":1015,"grnd_level":951,"humidity":47,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":44},"wind":{"speed":7.94,"deg":163},"rain":{"3h":0.27},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        00:00:00"},{"dt":1586574000,"main":{"temp":73.89,"feels_like":71.71,"temp_min":73.89,"temp_max":73.89,"pressure":1015,"sea_level":1015,"grnd_level":951,"humidity":52,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":18},"wind":{"speed":6.71,"deg":188},"rain":{"3h":0.62},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        03:00:00"},{"dt":1586584800,"main":{"temp":68.54,"feels_like":67.05,"temp_min":68.54,"temp_max":68.54,"pressure":1017,"sea_level":1017,"grnd_level":951,"humidity":64,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":17},"wind":{"speed":5.91,"deg":206},"rain":{"3h":0.43},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        06:00:00"},{"dt":1586595600,"main":{"temp":67.37,"feels_like":67.71,"temp_min":67.37,"temp_max":67.37,"pressure":1018,"sea_level":1018,"grnd_level":952,"humidity":67,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":12},"wind":{"speed":2.73,"deg":200},"rain":{"3h":0.14},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        09:00:00"},{"dt":1586606400,"main":{"temp":66.36,"feels_like":65.86,"temp_min":66.36,"temp_max":66.36,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":66,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":13},"wind":{"speed":3.47,"deg":225},"rain":{"3h":0.26},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        12:00:00"},{"dt":1586617200,"main":{"temp":65.08,"feels_like":64.47,"temp_min":65.08,"temp_max":65.08,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":66,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01n"}],"clouds":{"all":8},"wind":{"speed":2.98,"deg":252},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        15:00:00"},{"dt":1586628000,"main":{"temp":69.71,"feels_like":68.85,"temp_min":69.71,"temp_max":69.71,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":55,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":25},"wind":{"speed":3.09,"deg":185},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        18:00:00"},{"dt":1586638800,"main":{"temp":76.41,"feels_like":73.49,"temp_min":76.41,"temp_max":76.41,"pressure":1017,"sea_level":1017,"grnd_level":953,"humidity":44,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":79},"wind":{"speed":6.78,"deg":177},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        21:00:00"},{"dt":1586649600,"main":{"temp":75.81,"feels_like":74.17,"temp_min":75.81,"temp_max":75.81,"pressure":1016,"sea_level":1016,"grnd_level":952,"humidity":50,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":89},"wind":{"speed":6.13,"deg":207},"rain":{"3h":0.26},"sys":{"pod":"d"},"dt_txt":"2020-04-12
+        00:00:00"}],"city":{"id":5855088,"name":"Fern Acres","coord":{"lat":19.5122,"lon":-155.0803},"country":"US","population":1504,"timezone":-36000,"sunrise":1586189345,"sunset":1586234131}}'
     headers:
-      Cache-Control: [max-age=60]
-      Connection: [keep-alive]
-      Content-Encoding: [gzip]
-      Content-Type: [application/json; charset=utf-8]
-      Date: ['Fri, 18 Jan 2019 16:11:37 GMT']
-      Expires: ['Fri, 18 Jan 2019 16:12:37 +0000']
-      Transfer-Encoding: [chunked]
-      Vary: [Accept-Encoding]
-      X-Authentication-Time: [1ms]
-      X-Content-Type-Options: [nosniff]
-      X-Forecast-API-Calls: ['13']
-      X-Response-Time: [95.512ms]
-    status: {code: 200, message: OK}
+      Access-Control-Allow-Credentials:
+      - 'true'
+      Access-Control-Allow-Methods:
+      - GET, POST
+      Access-Control-Allow-Origin:
+      - '*'
+      Connection:
+      - keep-alive
+      Content-Length:
+      - '14585'
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:22:43 GMT
+      Server:
+      - openresty
+      X-Cache-Key:
+      - /data/2.5/forecast?lat=19.48&lon=-155.1&units=imperial
+    status:
+      code: 200
+      message: OK
 version: 1
diff --git a/test/fixtures/weather_celsius.yaml b/test/fixtures/weather_celsius.yaml
index 754c9ff..8d952f5 100644
--- a/test/fixtures/weather_celsius.yaml
+++ b/test/fixtures/weather_celsius.yaml
@@ -2,147 +2,230 @@ interactions:
 - request:
     body: null
     headers:
-      Accept: ['*/*']
-      Accept-Encoding: ['gzip, deflate']
-      Connection: [keep-alive]
-      User-Agent: [python-requests/2.20.0]
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
     method: GET
     uri: https://api.mapbox.com/geocoding/v5/mapbox.places/Oahu%2C%20HI.json?limit=1&access_token=fake_mapbox_token
   response:
     body:
       string: !!binary |
-        H4sIAAAAAAAAA3WS307bMBTGX+XIV0MKqZ00idO7CQ3BBYMJ2A1CyE0O1FtiB9uhVFUfaK+xJ9tx
-        u66Dabnzyfl+5zt/1iysBmQzdooqjA5PbNdhE7Q1LGHPI7oVm90xqxYjvRea3SfscZfp6cea6Za0
-        qm3p7dOcZ6LMZFnURTWdiowkb+kUGDrV4MMufLdXRqzDDl+UaSguKM3ZAV3Qscx6Qxx8DcS53BnZ
-        QYzq8XcsgQs7mqC0ga8alwmcqaXSGuqyqkQCt0YHbOE6qEDAhDVoAjoycCyKIhVciCIRdTqtqiKX
-        5OUJbY8h9r7ed3BltQlRaq1rtdmC/qPfxCyzc7wf0WB9aGyLqcimkvNCSl7WcpqXnP1pbmuWbZK9
-        JDaZyppLKYt6KuiTWUxf6u+6VUFRzpcsz/Oqrg+QN3M4wBw+0U5TIXjGucxKWZVZVm5xfmFdeIjm
-        KO/2+vjs/F2NSmYH/m6wB3AT67lVWvMi55y2X2VFyYt/wKN/R83/6vztfjb3G9qBCsHp+bg9xRn7
-        fHlzfvJpBj9/QMaFhAs1zO0rKNOCDh78OAydRudT+Nh14PTTgqJ0WuhesE3h1iPYRwgL7SEaAB01
-        82906hAsxXFPvEHX+5h7TVLdIHxYhDD42WSyXC7TfpuUNrafqLkdw4QCfnKUwk0kU73BGioVbUWm
-        No/W9Sr2QDYhXgWtxkOvVmBsgDmSJoaix6vL8w/+COjyX3RL05iv4NSOzj+PymHKNr8AqY+EcKsD
-        AAA=
+        H4sIAAAAAAAAA42Tz1LbMBDGX2VHpzJjHFvxHym3DlMGDhQ6QC8Mwyj2QtTakpFkQiaTB+pr9Mm6
+        Spqm0Et90+fd3367Wq1ZWA3IZuwUVRgdntiuwyZoa1jCnkd0Kza7Y1YtRjovNLtP2OMu0tOPNdMt
+        5aq2pbNPeSFlWdWyymrJhSwo5S2dhKFTDT7s5Lt9ZsQ67PBFmYb0nMKcHdAFHcusmWqa0amGvDAf
+        HGJgG0LjayDhcudtxzWqx99aAhd2NEFpA181LhM4U0ulNciqrvMEbo0O2MJ1UIFqJKxBE9CRp+O8
+        LNM8y/Myy3jOuUhymRZ1XU5FUXFZVQWZfULbY4jDWe9bvLLahAiy1rXabLH/RdvEHLPrZj/RwfrQ
+        2BbTnBciy0ohskqKYlpl7E/j20ZoEPuUOIBUyEwIUcoip0/wGL7U33WrgqKYL3w6ndZSHiBvZnSA
+        OXyiFSDjRSF4XmQVmeXVFucX1oWHaI7ibq+Pz87f1agFP/B3Qz+Am1jPrdJcTkte5nXNJS+rrPyH
+        PPp32Olfrb+9vM39hq5EheD0fNyu7ox9vrw5P/k0g58/gGc8gws1zO0rKNOCDh78OAydRudT+Nh1
+        4PTTglRaRXQv2KZw6xHsI4SF9hANgI4582/0NCBY0nFPvEHX+xh7Tam6QfiwCGHws8lkuVym/TYo
+        bWw/UXM7hgkJfnKUwk0kU73BGioVbUWmNo/W9Sr2QDYhrgXdjYdercDYAHOknChFj1eX5x/8EdBL
+        edEtTWO+glM7Ov88Kocp2/wCHsvGkNsDAAA=
     headers:
-      Access-Control-Allow-Origin: ['*']
-      Access-Control-Expose-Headers: ['x-rate-limit-interval,x-rate-limit-limit,x-rate-limit-remaining,x-rate-limit-reset']
-      Age: ['2066']
-      Cache-Control: [max-age=604800]
-      Connection: [keep-alive]
-      Content-Encoding: [gzip]
-      Content-Type: [application/vnd.geo+json; charset=utf-8]
-      Date: ['Fri, 18 Jan 2019 15:37:11 GMT']
-      ETag: ['"7b3891e6826bf90d41abe6d2f062ddd3"']
-      Last-Modified: ['Thu, 17 Jan 2019 19:47:09 GMT']
-      Transfer-Encoding: [chunked]
-      Vary: [Accept-Encoding]
-      Via: [1.1 663b9ec2cd0b34391786d62f92365deb.cloudfront.net (CloudFront)]
-      X-Amz-Cf-Id: [6RAUhAjqVSmMuMW1yTkSh0JrEpK5KEDdNqN-SFYp2nBDu618NuF2Gw==]
-      X-Cache: [Hit from cloudfront]
-      X-Powered-By: [Express]
-      X-Rate-Limit-Interval: ['60']
-      X-Rate-Limit-Limit: ['600']
-      X-Rate-Limit-Reset: ['1547825891']
-    status: {code: 200, message: OK}
+      Access-Control-Allow-Origin:
+      - '*'
+      Access-Control-Expose-Headers:
+      - x-rate-limit-interval,x-rate-limit-limit,x-rate-limit-remaining,x-rate-limit-reset
+      Age:
+      - '551'
+      Cache-Control:
+      - max-age=604800
+      Connection:
+      - keep-alive
+      Content-Encoding:
+      - gzip
+      Content-Type:
+      - application/vnd.geo+json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:13:34 GMT
+      ETag:
+      - '"58c736d68967e252df9aaece3d55a693"'
+      Last-Modified:
+      - Wed, 25 Mar 2020 14:25:21 GMT
+      Transfer-Encoding:
+      - chunked
+      Vary:
+      - Accept-Encoding
+      Via:
+      - 1.1 81834769243dfd27a095a32cf5b86723.cloudfront.net (CloudFront)
+      X-Amz-Cf-Id:
+      - Lc2DVnnhJ1nA-euChomIArgAieph4UKrO0jts2630wIcJm9DvIWXmA==
+      X-Amz-Cf-Pop:
+      - EWR52-C2
+      X-Cache:
+      - Hit from cloudfront
+      X-Powered-By:
+      - Express
+      X-Rate-Limit-Interval:
+      - '60'
+      X-Rate-Limit-Limit:
+      - '600'
+      X-Rate-Limit-Reset:
+      - '1586225674'
+    status:
+      code: 200
+      message: OK
 - request:
     body: null
     headers:
-      Accept: ['*/*']
-      Accept-Encoding: ['gzip, deflate']
-      Connection: [keep-alive]
-      User-Agent: [python-requests/2.20.0]
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
     method: GET
-    uri: https://api.darksky.net/forecast/fake_darksky_key/19.477538,-155.10115?units=si
+    uri: https://api.openweathermap.org/data/2.5/weather?lat=19.48&lon=-155.10&units=metric&appid=fake_openweather_key
   response:
     body:
-      string: !!binary |
-        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
+      string: '{"coord":{"lon":-155.1,"lat":19.48},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"base":"stations","main":{"temp":23.49,"feels_like":23.16,"temp_min":21.11,"temp_max":26,"pressure":1012,"humidity":65},"visibility":16093,"wind":{"speed":3.6,"deg":130},"clouds":{"all":75},"dt":1586226165,"sys":{"type":1,"id":7881,"country":"US","sunrise":1586189350,"sunset":1586234135},"timezone":-36000,"id":5855088,"name":"Fern
+        Acres","cod":200}'
+    headers:
+      Access-Control-Allow-Credentials:
+      - 'true'
+      Access-Control-Allow-Methods:
+      - GET, POST
+      Access-Control-Allow-Origin:
+      - '*'
+      Connection:
+      - keep-alive
+      Content-Length:
+      - '468'
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:22:45 GMT
+      Server:
+      - openresty
+      X-Cache-Key:
+      - /data/2.5/weather?lat=19.48&lon=-155.1&units=metric
+    status:
+      code: 200
+      message: OK
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
+    method: GET
+    uri: https://api.openweathermap.org/data/2.5/forecast?lat=19.48&lon=-155.10&units=metric&appid=fake_openweather_key
+  response:
+    body:
+      string: '{"cod":"200","message":0,"cnt":40,"list":[{"dt":1586228400,"main":{"temp":21.44,"feels_like":20.48,"temp_min":21.18,"temp_max":21.44,"pressure":1013,"sea_level":1013,"grnd_level":948,"humidity":61,"temp_kf":0.26},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":21},"wind":{"speed":2.99,"deg":149},"rain":{"3h":0.34},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        03:00:00"},{"dt":1586239200,"main":{"temp":19.73,"feels_like":19.19,"temp_min":19.54,"temp_max":19.73,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":68,"temp_kf":0.19},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":27},"wind":{"speed":2.41,"deg":173},"rain":{"3h":0.16},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        06:00:00"},{"dt":1586250000,"main":{"temp":19.11,"feels_like":18.43,"temp_min":18.98,"temp_max":19.11,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":68,"temp_kf":0.13},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":20},"wind":{"speed":2.33,"deg":189},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        09:00:00"},{"dt":1586260800,"main":{"temp":18.65,"feels_like":18.07,"temp_min":18.59,"temp_max":18.65,"pressure":1015,"sea_level":1015,"grnd_level":949,"humidity":68,"temp_kf":0.06},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":18},"wind":{"speed":1.99,"deg":198},"rain":{"3h":0.19},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        12:00:00"},{"dt":1586271600,"main":{"temp":18.07,"feels_like":17.28,"temp_min":18.07,"temp_max":18.07,"pressure":1014,"sea_level":1014,"grnd_level":949,"humidity":66,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01n"}],"clouds":{"all":1},"wind":{"speed":1.85,"deg":217},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        15:00:00"},{"dt":1586282400,"main":{"temp":20.93,"feels_like":20.7,"temp_min":20.93,"temp_max":20.93,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":58,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":1.37,"deg":188},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        18:00:00"},{"dt":1586293200,"main":{"temp":23.39,"feels_like":22.15,"temp_min":23.39,"temp_max":23.39,"pressure":1016,"sea_level":1016,"grnd_level":952,"humidity":56,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":35},"wind":{"speed":3.63,"deg":147},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        21:00:00"},{"dt":1586304000,"main":{"temp":23.71,"feels_like":21.94,"temp_min":23.71,"temp_max":23.71,"pressure":1014,"sea_level":1014,"grnd_level":950,"humidity":55,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":45},"wind":{"speed":4.39,"deg":158},"rain":{"3h":0.83},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        00:00:00"},{"dt":1586314800,"main":{"temp":22.26,"feels_like":20.67,"temp_min":22.26,"temp_max":22.26,"pressure":1014,"sea_level":1014,"grnd_level":949,"humidity":59,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":22},"wind":{"speed":4.01,"deg":177},"rain":{"3h":1.05},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        03:00:00"},{"dt":1586325600,"main":{"temp":20.02,"feels_like":19.52,"temp_min":20.02,"temp_max":20.02,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":68,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":18},"wind":{"speed":2.48,"deg":185},"rain":{"3h":0.88},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        06:00:00"},{"dt":1586336400,"main":{"temp":19.65,"feels_like":19.17,"temp_min":19.65,"temp_max":19.65,"pressure":1017,"sea_level":1017,"grnd_level":951,"humidity":69,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":25},"wind":{"speed":2.39,"deg":194},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        09:00:00"},{"dt":1586347200,"main":{"temp":18.8,"feels_like":17.87,"temp_min":18.8,"temp_max":18.8,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":68,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":24},"wind":{"speed":2.55,"deg":200},"rain":{"3h":0.27},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        12:00:00"},{"dt":1586358000,"main":{"temp":18.34,"feels_like":17.54,"temp_min":18.34,"temp_max":18.34,"pressure":1015,"sea_level":1015,"grnd_level":949,"humidity":67,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":31},"wind":{"speed":2.07,"deg":203},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        15:00:00"},{"dt":1586368800,"main":{"temp":20.88,"feels_like":20.05,"temp_min":20.88,"temp_max":20.88,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":58,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":19},"wind":{"speed":2.21,"deg":190},"rain":{"3h":0.17},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        18:00:00"},{"dt":1586379600,"main":{"temp":23.96,"feels_like":22.44,"temp_min":23.96,"temp_max":23.96,"pressure":1016,"sea_level":1016,"grnd_level":952,"humidity":52,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":3.73,"deg":172},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        21:00:00"},{"dt":1586390400,"main":{"temp":24.08,"feels_like":21.92,"temp_min":24.08,"temp_max":24.08,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":53,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":8},"wind":{"speed":4.84,"deg":180},"rain":{"3h":0.44},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        00:00:00"},{"dt":1586401200,"main":{"temp":22.26,"feels_like":21.06,"temp_min":22.26,"temp_max":22.26,"pressure":1014,"sea_level":1014,"grnd_level":949,"humidity":60,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":27},"wind":{"speed":3.58,"deg":193},"rain":{"3h":1.38},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        03:00:00"},{"dt":1586412000,"main":{"temp":20.07,"feels_like":19.06,"temp_min":20.07,"temp_max":20.07,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":67,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":27},"wind":{"speed":3.12,"deg":193},"rain":{"3h":0.55},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        06:00:00"},{"dt":1586422800,"main":{"temp":19.51,"feels_like":18.49,"temp_min":19.51,"temp_max":19.51,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":68,"temp_kf":0},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":17},"wind":{"speed":2.99,"deg":187},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        09:00:00"},{"dt":1586433600,"main":{"temp":18.72,"feels_like":17.7,"temp_min":18.72,"temp_max":18.72,"pressure":1014,"sea_level":1014,"grnd_level":949,"humidity":67,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":10},"wind":{"speed":2.54,"deg":206},"rain":{"3h":0.12},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        12:00:00"},{"dt":1586444400,"main":{"temp":18.19,"feels_like":17.65,"temp_min":18.19,"temp_max":18.19,"pressure":1015,"sea_level":1015,"grnd_level":949,"humidity":64,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01n"}],"clouds":{"all":2},"wind":{"speed":1.35,"deg":222},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        15:00:00"},{"dt":1586455200,"main":{"temp":20.95,"feels_like":20.66,"temp_min":20.95,"temp_max":20.95,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":57,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":1.34,"deg":190},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        18:00:00"},{"dt":1586466000,"main":{"temp":24.25,"feels_like":22.66,"temp_min":24.25,"temp_max":24.25,"pressure":1016,"sea_level":1016,"grnd_level":952,"humidity":48,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":3.39,"deg":167},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        21:00:00"},{"dt":1586476800,"main":{"temp":24.7,"feels_like":22.54,"temp_min":24.7,"temp_max":24.7,"pressure":1015,"sea_level":1015,"grnd_level":951,"humidity":47,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":10},"wind":{"speed":4.24,"deg":198},"rain":{"3h":0.35},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        00:00:00"},{"dt":1586487600,"main":{"temp":22.71,"feels_like":22.12,"temp_min":22.71,"temp_max":22.71,"pressure":1014,"sea_level":1014,"grnd_level":950,"humidity":56,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":47},"wind":{"speed":2.39,"deg":195},"rain":{"3h":0.47},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        03:00:00"},{"dt":1586498400,"main":{"temp":20.43,"feels_like":20.14,"temp_min":20.43,"temp_max":20.43,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":66,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":66},"wind":{"speed":2.15,"deg":182},"rain":{"3h":0.54},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        06:00:00"},{"dt":1586509200,"main":{"temp":19.72,"feels_like":19.05,"temp_min":19.72,"temp_max":19.72,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":68,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":76},"wind":{"speed":2.59,"deg":195},"rain":{"3h":0.27},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        09:00:00"},{"dt":1586520000,"main":{"temp":19.18,"feels_like":18.77,"temp_min":19.18,"temp_max":19.18,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":67,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":77},"wind":{"speed":1.87,"deg":227},"rain":{"3h":0.24},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        12:00:00"},{"dt":1586530800,"main":{"temp":18.41,"feels_like":18.31,"temp_min":18.41,"temp_max":18.41,"pressure":1015,"sea_level":1015,"grnd_level":950,"humidity":68,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":31},"wind":{"speed":1.2,"deg":235},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        15:00:00"},{"dt":1586541600,"main":{"temp":21.02,"feels_like":21.17,"temp_min":21.02,"temp_max":21.02,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":57,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":40},"wind":{"speed":0.75,"deg":200},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        18:00:00"},{"dt":1586552400,"main":{"temp":23.91,"feels_like":22.99,"temp_min":23.91,"temp_max":23.91,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":49,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":60},"wind":{"speed":2.44,"deg":140},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        21:00:00"},{"dt":1586563200,"main":{"temp":24.71,"feels_like":23.04,"temp_min":24.71,"temp_max":24.71,"pressure":1015,"sea_level":1015,"grnd_level":951,"humidity":47,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":44},"wind":{"speed":3.55,"deg":163},"rain":{"3h":0.27},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        00:00:00"},{"dt":1586574000,"main":{"temp":23.27,"feels_like":22.06,"temp_min":23.27,"temp_max":23.27,"pressure":1015,"sea_level":1015,"grnd_level":951,"humidity":52,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":18},"wind":{"speed":3,"deg":188},"rain":{"3h":0.62},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        03:00:00"},{"dt":1586584800,"main":{"temp":20.3,"feels_like":19.47,"temp_min":20.3,"temp_max":20.3,"pressure":1017,"sea_level":1017,"grnd_level":951,"humidity":64,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":17},"wind":{"speed":2.64,"deg":206},"rain":{"3h":0.43},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        06:00:00"},{"dt":1586595600,"main":{"temp":19.65,"feels_like":19.84,"temp_min":19.65,"temp_max":19.65,"pressure":1018,"sea_level":1018,"grnd_level":952,"humidity":67,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":12},"wind":{"speed":1.22,"deg":200},"rain":{"3h":0.14},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        09:00:00"},{"dt":1586606400,"main":{"temp":19.09,"feels_like":18.81,"temp_min":19.09,"temp_max":19.09,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":66,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":13},"wind":{"speed":1.55,"deg":225},"rain":{"3h":0.26},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        12:00:00"},{"dt":1586617200,"main":{"temp":18.38,"feels_like":18.04,"temp_min":18.38,"temp_max":18.38,"pressure":1016,"sea_level":1016,"grnd_level":951,"humidity":66,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01n"}],"clouds":{"all":8},"wind":{"speed":1.33,"deg":252},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        15:00:00"},{"dt":1586628000,"main":{"temp":20.95,"feels_like":20.47,"temp_min":20.95,"temp_max":20.95,"pressure":1017,"sea_level":1017,"grnd_level":952,"humidity":55,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":25},"wind":{"speed":1.38,"deg":185},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        18:00:00"},{"dt":1586638800,"main":{"temp":24.67,"feels_like":23.05,"temp_min":24.67,"temp_max":24.67,"pressure":1017,"sea_level":1017,"grnd_level":953,"humidity":44,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":79},"wind":{"speed":3.03,"deg":177},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        21:00:00"},{"dt":1586649600,"main":{"temp":24.34,"feels_like":23.43,"temp_min":24.34,"temp_max":24.34,"pressure":1016,"sea_level":1016,"grnd_level":952,"humidity":50,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":89},"wind":{"speed":2.74,"deg":207},"rain":{"3h":0.26},"sys":{"pod":"d"},"dt_txt":"2020-04-12
+        00:00:00"}],"city":{"id":5855088,"name":"Fern Acres","coord":{"lat":19.5122,"lon":-155.0803},"country":"US","population":1504,"timezone":-36000,"sunrise":1586189345,"sunset":1586234131}}'
     headers:
-      Cache-Control: [max-age=60]
-      Connection: [keep-alive]
-      Content-Encoding: [gzip]
-      Content-Type: [application/json; charset=utf-8]
-      Date: ['Fri, 18 Jan 2019 16:11:37 GMT']
-      Expires: ['Fri, 18 Jan 2019 16:12:37 +0000']
-      Transfer-Encoding: [chunked]
-      Vary: [Accept-Encoding]
-      X-Authentication-Time: [1ms]
-      X-Content-Type-Options: [nosniff]
-      X-Forecast-API-Calls: ['13']
-      X-Response-Time: [95.512ms]
-    status: {code: 200, message: OK}
+      Access-Control-Allow-Credentials:
+      - 'true'
+      Access-Control-Allow-Methods:
+      - GET, POST
+      Access-Control-Allow-Origin:
+      - '*'
+      Connection:
+      - keep-alive
+      Content-Length:
+      - '14585'
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:22:45 GMT
+      Server:
+      - openresty
+      X-Cache-Key:
+      - /data/2.5/forecast?lat=19.48&lon=-155.1&units=metric
+    status:
+      code: 200
+      message: OK
 version: 1
diff --git a/test/fixtures/weather_unicode.yaml b/test/fixtures/weather_unicode.yaml
index ae1a513..ab76acf 100644
--- a/test/fixtures/weather_unicode.yaml
+++ b/test/fixtures/weather_unicode.yaml
@@ -2,137 +2,227 @@ interactions:
 - request:
     body: null
     headers:
-      Accept: ['*/*']
-      Accept-Encoding: ['gzip, deflate']
-      Connection: [keep-alive]
-      User-Agent: [python-requests/2.20.0]
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
     method: GET
     uri: https://api.mapbox.com/geocoding/v5/mapbox.places/%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3.json?limit=1&access_token=fake_mapbox_token
   response:
     body:
       string: !!binary |
-        H4sIAAAAAAAAA41Ty27UMBT9FcurVooyeT9mBxWVuigtoqyqqnKS24lpYqe20+moGgkkJD4BsUFC
-        rBA7VmHLl+RTuJ6ZvmZDV4mP7znn5tybW2oWHdAp3QdmegV7smmgNFwK6tCrHtSCTk/pOHwchx/j
-        MIzD5/HPh3H4Mg7fxuH7OPwah9/j8HUcPmEBPXPoxVpHI+2W8gqVu4aV4PqBn3lxlHpeHAcpPlH/
-        qTUCq9LzNXy6PllNBQ1cM4GHqefmCdYp2YEy3Nrc0jm/5BUzDKXe+Fni0yVKw43B80smZpfy8l5a
-        sBYeYIdsXsghGJSUDdcOOakZb5iokNQyU9ZczM43cs/N4RHzie8z+f/tqyjkDSbke54bBmmexo4f
-        ulEeJJHvWDAPsyC3WB5HYRJhhCUIA2rDif0kSe11GuPVDGSLNgsb5WYix5ILgz6llKrigpnVPLep
-        S1sg1tHcDVvBDHcHy4IoCPPQj9LIz2I7bF1LZc5LWaGB6JvGeTK3zEuiLKLbg3sUAE5141HKXmC/
-        buYFYZRmYeJ5XpD72ybU1HTLJMkfHO7jXJ4tMQVmjOJFv9r8KX19dHKw92pK/v4kgedn5JB1GDnB
-        csKNJrrvuoaD0i550TRE8VmNKG49qGuoXPJOA5EXxNRcE2tOuOUU7/HPIkYiDneKJ6BabWvfIpWX
-        QHZqYzo9nUzm87nbrorcUrYTVsjeTBDQk10Xd4Gv/Dop0Mq2ZTW5uJAKNw+/AdskdjiMC01atiBC
-        GlIAcixkezw+OtjRuwR/pWteQUWKBdmXvdJXPVPg0uU/C4BIgxoEAAA=
+        H4sIAAAAAAAAA41Ty2rcMBT9FaFVAoPH8vg5uzY0kEWalKarEAbZvhmrsSVHkjMZwkALhX5C6aZQ
+        uirddeVu+yX+lF7NTJ6bZmXr6J5zru6RbqhdtkCndB+47TTsqbqGwgol6YhedqCXdHpKh/7j0P8Y
+        +n7oPw9/Pgz9l6H/NvTfh/7X0P8e+q9D/wkL6NmInm90DNJuqChRua15AR4LWOpHYeL7URQk+EX9
+        x9YIrEtnG/h0s3KaGmq44hIXU9/LYqzTqgVthbO5oQtxIUpuOUq9YWnM6Aql4dri+iWX8wt1cSct
+        eQP38Ihsf8ghWJRUtTAjclJxUXNZIqnhtqiEnM+2cs+dwwPmI99n8v/bV56ra5wQ831vEiRZEo3Y
+        xAuzIA7ZyIHZJA0yh2VROIlDHGEB0oLeciIWx4nbTiLcmoNq0GbpRrlN5FgJadGnUEqXQnK7zvMp
+        deUK5GY0t2FrmOPd8bJskjA/iCYsCVkaubAfppT6cZiG9GlMD46LGW4VC9VJ7M4Lg4RFWZqx2PeD
+        jDlJUyltZ4UqXc+2emoSZ/cOd8Nbna3wzNxaLfJufc+n9PXRycHeqyn5+5MEfuCTQ97igAmWE2EN
+        MV3b1gK08ciLuiZazCtE8Y6DvoLSI+8MEHVObCUMceZEOE7+Ht8RsQpxuFU8Ad0YV/sWqaIAslNZ
+        25rpeLxYLLxmXeQVqhnzXHV2jIAZ73qYvFj7tUqilWvLaQp5rjTeMzwDtklcFFxIQxq+JFJZkgNy
+        HOR6PD462DG7BB/OlSihJPmS7KtOm8uOa/Do6h+WhGN7CAQAAA==
     headers:
-      Access-Control-Allow-Origin: ['*']
-      Access-Control-Expose-Headers: ['x-rate-limit-interval,x-rate-limit-limit,x-rate-limit-remaining,x-rate-limit-reset']
-      Age: ['2065']
-      Cache-Control: [max-age=604800]
-      Connection: [keep-alive]
-      Content-Encoding: [gzip]
-      Content-Type: [application/vnd.geo+json; charset=utf-8]
-      Date: ['Fri, 18 Jan 2019 15:37:12 GMT']
-      ETag: ['"3b11400282a24f1012812150e17f9878"']
-      Last-Modified: ['Thu, 17 Jan 2019 19:47:09 GMT']
-      Transfer-Encoding: [chunked]
-      Vary: [Accept-Encoding]
-      Via: [1.1 a171e7841621158d2aaef33e456c3688.cloudfront.net (CloudFront)]
-      X-Amz-Cf-Id: [rS8lRkdLkhXKdhYlCByvG-xOfuaRKH9_7T2NdT1HEGbQ39r1sPbolA==]
-      X-Cache: [Hit from cloudfront]
-      X-Powered-By: [Express]
-      X-Rate-Limit-Interval: ['60']
-      X-Rate-Limit-Limit: ['600']
-      X-Rate-Limit-Reset: ['1547825892']
-    status: {code: 200, message: OK}
+      Access-Control-Allow-Origin:
+      - '*'
+      Access-Control-Expose-Headers:
+      - x-rate-limit-interval,x-rate-limit-limit,x-rate-limit-remaining,x-rate-limit-reset
+      Cache-Control:
+      - max-age=604800
+      Connection:
+      - keep-alive
+      Content-Encoding:
+      - gzip
+      Content-Type:
+      - application/vnd.geo+json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:22:44 GMT
+      ETag:
+      - '"59146077e1b52d626c101ddb33bac7f6"'
+      Last-Modified:
+      - Wed, 25 Mar 2020 14:25:21 GMT
+      Transfer-Encoding:
+      - chunked
+      Vary:
+      - Accept-Encoding
+      Via:
+      - 1.1 26302dbb69a1bcc1682e559282335ad9.cloudfront.net (CloudFront)
+      X-Amz-Cf-Id:
+      - 93EYQf8bBtvtd7I-bGQqGtA6S6kJCtAb2kH-oKXNim8Ia0ZA9bydTA==
+      X-Amz-Cf-Pop:
+      - EWR52-C2
+      X-Cache:
+      - Miss from cloudfront
+      X-Powered-By:
+      - Express
+      X-Rate-Limit-Interval:
+      - '60'
+      X-Rate-Limit-Limit:
+      - '600'
+      X-Rate-Limit-Reset:
+      - '1586226224'
+    status:
+      code: 200
+      message: OK
 - request:
     body: null
     headers:
-      Accept: ['*/*']
-      Accept-Encoding: ['gzip, deflate']
-      Connection: [keep-alive]
-      User-Agent: [python-requests/2.20.0]
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
     method: GET
-    uri: https://api.darksky.net/forecast/fake_darksky_key/13.75,100.51667?units=us
+    uri: https://api.openweathermap.org/data/2.5/weather?lat=13.75&lon=100.52&units=imperial&appid=fake_openweather_key
   response:
     body:
-      string: !!binary |
-        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
+      string: '{"coord":{"lon":100.52,"lat":13.75},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02d"}],"base":"stations","main":{"temp":88.75,"feels_like":95.11,"temp_min":87.8,"temp_max":91.99,"pressure":1011,"humidity":66},"visibility":10000,"wind":{"speed":8.05,"deg":190},"clouds":{"all":20},"dt":1586226160,"sys":{"type":1,"id":9235,"country":"TH","sunrise":1586214575,"sunset":1586259003},"timezone":25200,"id":1609350,"name":"Bangkok","cod":200}'
+    headers:
+      Access-Control-Allow-Credentials:
+      - 'true'
+      Access-Control-Allow-Methods:
+      - GET, POST
+      Access-Control-Allow-Origin:
+      - '*'
+      Connection:
+      - keep-alive
+      Content-Length:
+      - '464'
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:22:44 GMT
+      Server:
+      - openresty
+      X-Cache-Key:
+      - /data/2.5/weather?lat=13.75&lon=100.52&units=imperial
+    status:
+      code: 200
+      message: OK
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - python-requests/2.23.0
+    method: GET
+    uri: https://api.openweathermap.org/data/2.5/forecast?lat=13.75&lon=100.52&units=imperial&appid=fake_openweather_key
+  response:
+    body:
+      string: '{"cod":"200","message":0,"cnt":40,"list":[{"dt":1586228400,"main":{"temp":93.61,"feels_like":96.37,"temp_min":90.48,"temp_max":93.61,"pressure":1012,"sea_level":1012,"grnd_level":1011,"humidity":54,"temp_kf":1.74},"weather":[{"id":804,"main":"Clouds","description":"overcast
+        clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":12.91,"deg":190},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        03:00:00"},{"dt":1586239200,"main":{"temp":96.22,"feels_like":97.27,"temp_min":93.88,"temp_max":96.22,"pressure":1008,"sea_level":1008,"grnd_level":1007,"humidity":45,"temp_kf":1.3},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":69},"wind":{"speed":12.97,"deg":176},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        06:00:00"},{"dt":1586250000,"main":{"temp":94.84,"feels_like":93.87,"temp_min":93.27,"temp_max":94.84,"pressure":1005,"sea_level":1005,"grnd_level":1004,"humidity":45,"temp_kf":0.87},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":4},"wind":{"speed":15.39,"deg":167},"sys":{"pod":"d"},"dt_txt":"2020-04-07
+        09:00:00"},{"dt":1586260800,"main":{"temp":88.93,"feels_like":86.74,"temp_min":88.16,"temp_max":88.93,"pressure":1007,"sea_level":1007,"grnd_level":1005,"humidity":54,"temp_kf":0.43},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":19},"wind":{"speed":17.54,"deg":168},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        12:00:00"},{"dt":1586271600,"main":{"temp":85.82,"feels_like":85.5,"temp_min":85.82,"temp_max":85.82,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":65,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01n"}],"clouds":{"all":2},"wind":{"speed":16.62,"deg":174},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        15:00:00"},{"dt":1586282400,"main":{"temp":84.85,"feels_like":86.25,"temp_min":84.85,"temp_max":84.85,"pressure":1009,"sea_level":1009,"grnd_level":1008,"humidity":70,"temp_kf":0},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":24},"wind":{"speed":14.81,"deg":178},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        18:00:00"},{"dt":1586293200,"main":{"temp":84.54,"feels_like":86.05,"temp_min":84.54,"temp_max":84.54,"pressure":1009,"sea_level":1009,"grnd_level":1008,"humidity":69,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04n"}],"clouds":{"all":68},"wind":{"speed":13.89,"deg":176},"sys":{"pod":"n"},"dt_txt":"2020-04-07
+        21:00:00"},{"dt":1586304000,"main":{"temp":84.97,"feels_like":87.96,"temp_min":84.97,"temp_max":84.97,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":70,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":46},"wind":{"speed":12.12,"deg":172},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        00:00:00"},{"dt":1586314800,"main":{"temp":90.45,"feels_like":92.1,"temp_min":90.45,"temp_max":90.45,"pressure":1012,"sea_level":1012,"grnd_level":1011,"humidity":57,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":52},"wind":{"speed":13.53,"deg":169},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        03:00:00"},{"dt":1586325600,"main":{"temp":93.2,"feels_like":93.13,"temp_min":93.2,"temp_max":93.2,"pressure":1009,"sea_level":1009,"grnd_level":1008,"humidity":49,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":28},"wind":{"speed":14.72,"deg":174},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        06:00:00"},{"dt":1586336400,"main":{"temp":92.91,"feels_like":91.8,"temp_min":92.91,"temp_max":92.91,"pressure":1006,"sea_level":1006,"grnd_level":1005,"humidity":45,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":0},"wind":{"speed":14.12,"deg":172},"sys":{"pod":"d"},"dt_txt":"2020-04-08
+        09:00:00"},{"dt":1586347200,"main":{"temp":87.91,"feels_like":86.16,"temp_min":87.91,"temp_max":87.91,"pressure":1008,"sea_level":1008,"grnd_level":1007,"humidity":54,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01n"}],"clouds":{"all":1},"wind":{"speed":15.9,"deg":170},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        12:00:00"},{"dt":1586358000,"main":{"temp":85.73,"feels_like":86.25,"temp_min":85.73,"temp_max":85.73,"pressure":1011,"sea_level":1011,"grnd_level":1009,"humidity":66,"temp_kf":0},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":24},"wind":{"speed":15.48,"deg":178},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        15:00:00"},{"dt":1586368800,"main":{"temp":84.51,"feels_like":87.3,"temp_min":84.51,"temp_max":84.51,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":71,"temp_kf":0},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":12},"wind":{"speed":12.46,"deg":188},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        18:00:00"},{"dt":1586379600,"main":{"temp":83.64,"feels_like":87.35,"temp_min":83.64,"temp_max":83.64,"pressure":1009,"sea_level":1009,"grnd_level":1008,"humidity":73,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":43},"wind":{"speed":10.83,"deg":182},"sys":{"pod":"n"},"dt_txt":"2020-04-08
+        21:00:00"},{"dt":1586390400,"main":{"temp":84.51,"feels_like":89.24,"temp_min":84.51,"temp_max":84.51,"pressure":1011,"sea_level":1011,"grnd_level":1010,"humidity":72,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":32},"wind":{"speed":9.44,"deg":178},"rain":{"3h":0.12},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        00:00:00"},{"dt":1586401200,"main":{"temp":90.77,"feels_like":93.4,"temp_min":90.77,"temp_max":90.77,"pressure":1012,"sea_level":1012,"grnd_level":1011,"humidity":53,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear
+        sky","icon":"01d"}],"clouds":{"all":2},"wind":{"speed":10.02,"deg":182},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        03:00:00"},{"dt":1586412000,"main":{"temp":94.15,"feels_like":94.89,"temp_min":94.15,"temp_max":94.15,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":44,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":27},"wind":{"speed":11.23,"deg":168},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        06:00:00"},{"dt":1586422800,"main":{"temp":93.29,"feels_like":92.59,"temp_min":93.29,"temp_max":93.29,"pressure":1007,"sea_level":1007,"grnd_level":1006,"humidity":46,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":72},"wind":{"speed":14.25,"deg":170},"sys":{"pod":"d"},"dt_txt":"2020-04-09
+        09:00:00"},{"dt":1586433600,"main":{"temp":88.05,"feels_like":88.68,"temp_min":88.05,"temp_max":88.05,"pressure":1009,"sea_level":1009,"grnd_level":1008,"humidity":61,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":39},"wind":{"speed":15.12,"deg":169},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        12:00:00"},{"dt":1586444400,"main":{"temp":86.02,"feels_like":87.93,"temp_min":86.02,"temp_max":86.02,"pressure":1012,"sea_level":1012,"grnd_level":1010,"humidity":69,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":33},"wind":{"speed":14.63,"deg":172},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        15:00:00"},{"dt":1586455200,"main":{"temp":84.58,"feels_like":87.89,"temp_min":84.58,"temp_max":84.58,"pressure":1011,"sea_level":1011,"grnd_level":1010,"humidity":72,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04n"}],"clouds":{"all":61},"wind":{"speed":12.03,"deg":193},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        18:00:00"},{"dt":1586466000,"main":{"temp":83.59,"feels_like":88.11,"temp_min":83.59,"temp_max":83.59,"pressure":1011,"sea_level":1011,"grnd_level":1009,"humidity":73,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":33},"wind":{"speed":9.33,"deg":196},"sys":{"pod":"n"},"dt_txt":"2020-04-09
+        21:00:00"},{"dt":1586476800,"main":{"temp":84.27,"feels_like":88.59,"temp_min":84.27,"temp_max":84.27,"pressure":1012,"sea_level":1012,"grnd_level":1011,"humidity":70,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":52},"wind":{"speed":9.08,"deg":175},"rain":{"3h":0.61},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        00:00:00"},{"dt":1586487600,"main":{"temp":90.09,"feels_like":92.97,"temp_min":90.09,"temp_max":90.09,"pressure":1013,"sea_level":1013,"grnd_level":1012,"humidity":55,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":69},"wind":{"speed":10,"deg":176},"rain":{"3h":0.28},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        03:00:00"},{"dt":1586498400,"main":{"temp":93.49,"feels_like":95.32,"temp_min":93.49,"temp_max":93.49,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":46,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10d"}],"clouds":{"all":51},"wind":{"speed":9.91,"deg":171},"rain":{"3h":0.17},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        06:00:00"},{"dt":1586509200,"main":{"temp":93.45,"feels_like":93.96,"temp_min":93.45,"temp_max":93.45,"pressure":1009,"sea_level":1009,"grnd_level":1008,"humidity":46,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":81},"wind":{"speed":12.24,"deg":172},"sys":{"pod":"d"},"dt_txt":"2020-04-10
+        09:00:00"},{"dt":1586520000,"main":{"temp":88,"feels_like":88.95,"temp_min":88,"temp_max":88,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":61,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04n"}],"clouds":{"all":83},"wind":{"speed":14.5,"deg":174},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        12:00:00"},{"dt":1586530800,"main":{"temp":86.13,"feels_like":88.41,"temp_min":86.13,"temp_max":86.13,"pressure":1013,"sea_level":1013,"grnd_level":1012,"humidity":68,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04n"}],"clouds":{"all":81},"wind":{"speed":13.6,"deg":190},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        15:00:00"},{"dt":1586541600,"main":{"temp":84.74,"feels_like":88.14,"temp_min":84.74,"temp_max":84.74,"pressure":1011,"sea_level":1011,"grnd_level":1010,"humidity":72,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast
+        clouds","icon":"04n"}],"clouds":{"all":86},"wind":{"speed":12.03,"deg":195},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        18:00:00"},{"dt":1586552400,"main":{"temp":83.93,"feels_like":89.01,"temp_min":83.93,"temp_max":83.93,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":74,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light
+        rain","icon":"10n"}],"clouds":{"all":64},"wind":{"speed":9.08,"deg":198},"rain":{"3h":0.33},"sys":{"pod":"n"},"dt_txt":"2020-04-10
+        21:00:00"},{"dt":1586563200,"main":{"temp":84.87,"feels_like":90.23,"temp_min":84.87,"temp_max":84.87,"pressure":1012,"sea_level":1012,"grnd_level":1011,"humidity":70,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":61},"wind":{"speed":7.81,"deg":196},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        00:00:00"},{"dt":1586574000,"main":{"temp":91.36,"feels_like":93.45,"temp_min":91.36,"temp_max":91.36,"pressure":1013,"sea_level":1013,"grnd_level":1012,"humidity":49,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":39},"wind":{"speed":9.4,"deg":193},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        03:00:00"},{"dt":1586584800,"main":{"temp":94.19,"feels_like":95.22,"temp_min":94.19,"temp_max":94.19,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":44,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":50},"wind":{"speed":10.76,"deg":176},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        06:00:00"},{"dt":1586595600,"main":{"temp":94.53,"feels_like":94.17,"temp_min":94.53,"temp_max":94.53,"pressure":1007,"sea_level":1007,"grnd_level":1006,"humidity":44,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03d"}],"clouds":{"all":42},"wind":{"speed":13.47,"deg":170},"sys":{"pod":"d"},"dt_txt":"2020-04-11
+        09:00:00"},{"dt":1586606400,"main":{"temp":88.74,"feels_like":88.66,"temp_min":88.74,"temp_max":88.74,"pressure":1008,"sea_level":1008,"grnd_level":1007,"humidity":57,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":44},"wind":{"speed":15.05,"deg":170},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        12:00:00"},{"dt":1586617200,"main":{"temp":85.95,"feels_like":86.32,"temp_min":85.95,"temp_max":85.95,"pressure":1011,"sea_level":1011,"grnd_level":1010,"humidity":67,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":30},"wind":{"speed":16.37,"deg":185},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        15:00:00"},{"dt":1586628000,"main":{"temp":84.83,"feels_like":86.68,"temp_min":84.83,"temp_max":84.83,"pressure":1010,"sea_level":1010,"grnd_level":1009,"humidity":72,"temp_kf":0},"weather":[{"id":801,"main":"Clouds","description":"few
+        clouds","icon":"02n"}],"clouds":{"all":17},"wind":{"speed":14.85,"deg":196},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        18:00:00"},{"dt":1586638800,"main":{"temp":84.81,"feels_like":87.66,"temp_min":84.81,"temp_max":84.81,"pressure":1009,"sea_level":1009,"grnd_level":1008,"humidity":70,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered
+        clouds","icon":"03n"}],"clouds":{"all":49},"wind":{"speed":12.24,"deg":187},"sys":{"pod":"n"},"dt_txt":"2020-04-11
+        21:00:00"},{"dt":1586649600,"main":{"temp":85.35,"feels_like":89.55,"temp_min":85.35,"temp_max":85.35,"pressure":1011,"sea_level":1011,"grnd_level":1010,"humidity":70,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken
+        clouds","icon":"04d"}],"clouds":{"all":72},"wind":{"speed":10.36,"deg":175},"sys":{"pod":"d"},"dt_txt":"2020-04-12
+        00:00:00"}],"city":{"id":1609350,"name":"Bangkok","coord":{"lat":13.75,"lon":100.5167},"country":"TH","population":5104476,"timezone":25200,"sunrise":1586214576,"sunset":1586259004}}'
     headers:
-      Cache-Control: [max-age=3600]
-      Connection: [keep-alive]
-      Content-Encoding: [gzip]
-      Content-Type: [application/json; charset=utf-8]
-      Date: ['Fri, 18 Jan 2019 16:11:37 GMT']
-      Expires: ['Fri, 18 Jan 2019 17:11:37 +0000']
-      Transfer-Encoding: [chunked]
-      Vary: [Accept-Encoding]
-      X-Authentication-Time: [2ms]
-      X-Content-Type-Options: [nosniff]
-      X-Forecast-API-Calls: ['14']
-      X-Response-Time: [61.088ms]
-    status: {code: 200, message: OK}
+      Access-Control-Allow-Credentials:
+      - 'true'
+      Access-Control-Allow-Methods:
+      - GET, POST
+      Access-Control-Allow-Origin:
+      - '*'
+      Connection:
+      - keep-alive
+      Content-Length:
+      - '14422'
+      Content-Type:
+      - application/json; charset=utf-8
+      Date:
+      - Tue, 07 Apr 2020 02:22:44 GMT
+      Server:
+      - openresty
+      X-Cache-Key:
+      - /data/2.5/forecast?lat=13.75&lon=100.52&units=imperial
+    status:
+      code: 200
+      message: OK
 version: 1
diff --git a/test/test_plugins/test_weather.py b/test/test_plugins/test_weather.py
index 76069c6..3d58bc6 100644
--- a/test/test_plugins/test_weather.py
+++ b/test/test_plugins/test_weather.py
@@ -22,7 +22,7 @@ def msgobj(msg):
 def weather_env_vars(monkeypatch):
     """Disable environment variables that mess up our tests"""
     monkeypatch.setenv("MAPBOX_API_TOKEN", "fake_mapbox_token")
-    monkeypatch.setenv("DARKSKY_API_KEY", "fake_darksky_key")
+    monkeypatch.setenv("OPENWEATHER_API_KEY", "fake_openweather_key")
 
 
 def test_basic():
@@ -33,7 +33,7 @@ def test_basic():
         on_message(msgobj(u"!weather Oahu, HI"), server)
         attachment = json.loads(server.slack.posted_messages[0][1]["attachments"])[0]
         assert "Weather for Oahu" in attachment["pretext"]
-        assert attachment["fields"][0]["value"] == u":rain_cloud: 75°f"
+        assert attachment["fields"][0]["value"] == u":cloud: 72°f"
 
 
 def test_unicode():
@@ -44,14 +44,15 @@ def test_unicode():
         on_message(msgobj(u"!weather กรุงเทพมหานคร"), server)
         # not blowing up == success
 
+
 def test_units(monkeypatch):
     from weather import on_message
+
     monkeypatch.setenv("WEATHER_CELSIUS", "yes")
 
     server = limbo.FakeServer()
-    #todo record a fixture with correct content for celcius
     with vcr.use_cassette("test/fixtures/weather_celsius.yaml"):
         on_message(msgobj(u"!weather Oahu, HI"), server)
         attachment = json.loads(server.slack.posted_messages[0][1]["attachments"])[0]
         assert "Weather for Oahu" in attachment["pretext"]
-        assert attachment["fields"][0]["value"] == u":rain_cloud: 75°c"
+        assert attachment["fields"][0]["value"] == u":cloud: 23°c"