2018-05-01 16:20:41 +00:00
|
|
|
"""Integration tests for the auth component."""
|
2018-05-10 08:38:11 +00:00
|
|
|
from . import async_setup_auth, CLIENT_AUTH, CLIENT_REDIRECT_URI
|
2018-05-01 16:20:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
async def test_login_new_user_and_refresh_token(hass, aiohttp_client):
|
|
|
|
"""Test logging in with new user and refreshing tokens."""
|
|
|
|
client = await async_setup_auth(hass, aiohttp_client, setup_api=True)
|
|
|
|
resp = await client.post('/auth/login_flow', json={
|
2018-05-10 08:38:11 +00:00
|
|
|
'handler': ['insecure_example', None],
|
|
|
|
'redirect_uri': CLIENT_REDIRECT_URI,
|
2018-05-01 16:20:41 +00:00
|
|
|
}, auth=CLIENT_AUTH)
|
|
|
|
assert resp.status == 200
|
|
|
|
step = await resp.json()
|
|
|
|
|
|
|
|
resp = await client.post(
|
|
|
|
'/auth/login_flow/{}'.format(step['flow_id']), json={
|
|
|
|
'username': 'test-user',
|
|
|
|
'password': 'test-pass',
|
|
|
|
}, auth=CLIENT_AUTH)
|
|
|
|
|
|
|
|
assert resp.status == 200
|
|
|
|
step = await resp.json()
|
|
|
|
code = step['result']
|
|
|
|
|
|
|
|
# Exchange code for tokens
|
|
|
|
resp = await client.post('/auth/token', data={
|
|
|
|
'grant_type': 'authorization_code',
|
|
|
|
'code': code
|
|
|
|
}, auth=CLIENT_AUTH)
|
|
|
|
|
|
|
|
assert resp.status == 200
|
|
|
|
tokens = await resp.json()
|
|
|
|
|
|
|
|
assert hass.auth.async_get_access_token(tokens['access_token']) is not None
|
|
|
|
|
|
|
|
# Use refresh token to get more tokens.
|
|
|
|
resp = await client.post('/auth/token', data={
|
|
|
|
'grant_type': 'refresh_token',
|
|
|
|
'refresh_token': tokens['refresh_token']
|
|
|
|
}, auth=CLIENT_AUTH)
|
|
|
|
|
|
|
|
assert resp.status == 200
|
|
|
|
tokens = await resp.json()
|
|
|
|
assert 'refresh_token' not in tokens
|
|
|
|
assert hass.auth.async_get_access_token(tokens['access_token']) is not None
|
|
|
|
|
|
|
|
# Test using access token to hit API.
|
|
|
|
resp = await client.get('/api/')
|
|
|
|
assert resp.status == 401
|
|
|
|
|
|
|
|
resp = await client.get('/api/', headers={
|
|
|
|
'authorization': 'Bearer {}'.format(tokens['access_token'])
|
|
|
|
})
|
|
|
|
assert resp.status == 200
|