Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: migrate to pytest for python 3.10 compatibility #588

Merged
merged 1 commit into from
Feb 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,11 @@ analysis:
. venv/bin/activate; flake8 --ignore=E402,F401,W391,W291,W293 twilio --max-line-length=300

test: analysis
. venv/bin/activate; \
find tests -type d | xargs nosetests
. venv/bin/activate; pytest tests

test-with-coverage:
. venv/bin/activate; \
find tests -type d | xargs nosetests --with-coverage --cover-inclusive --cover-erase --cover-package=twilio; \
pytest --cov=twilio tests; \
coverage xml --omit 'twilio/rest/*' -o coverage.xml

docs-install:
Expand Down
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
flake8
mock
nose
requests>=2.0.0
PyJWT>=2.0.0, <3.0.0
twine
4 changes: 2 additions & 2 deletions tests/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
Sphinx==1.8.0
mock==0.8.0
nose
pytest
pytest-cov
coverage
nosexcover
flake8
mccabe
wheel>=0.22.0
Expand Down
164 changes: 81 additions & 83 deletions tests/unit/jwt/test_access_token.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import time
import unittest

from datetime import datetime
from nose.tools import assert_equal

from twilio.jwt.access_token import AccessToken
from twilio.jwt.access_token.grants import (
Expand Down Expand Up @@ -35,31 +33,31 @@ def assert_greater_equal(obj1, obj2):

class AccessTokenTest(unittest.TestCase):
def _validate_claims(self, payload):
assert_equal(SIGNING_KEY_SID, payload['iss'])
assert_equal(ACCOUNT_SID, payload['sub'])
assert SIGNING_KEY_SID == payload['iss']
assert ACCOUNT_SID == payload['sub']

assert_is_not_none(payload['exp'])
assert_is_not_none(payload['jti'])
assert_is_not_none(payload['grants'])
assert payload['exp'] is not None
assert payload['jti'] is not None
assert payload['grants'] is not None

assert_greater_equal(payload['exp'], int(time.time()))
assert payload['exp'] >= int(time.time())

assert_in(payload['iss'], payload['jti'])
assert payload['iss'] in payload['jti']

def test_empty_grants(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
token = scat.to_jwt()

assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal({}, decoded_token.payload['grants'])
assert {} == decoded_token.payload['grants']

def test_region(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret', region='foo')
token = scat.to_jwt()
decoded_token = AccessToken.from_jwt(token, 'secret')
assert_equal(decoded_token.headers['twr'], 'foo')
assert decoded_token.headers['twr'] == 'foo'

def test_empty_region(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
Expand All @@ -72,111 +70,111 @@ def test_nbf(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret', nbf=now)
token = scat.to_jwt()

assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(now, decoded_token.nbf)
assert now == decoded_token.nbf

def test_headers(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self.assertEqual(decoded_token.headers['cty'], 'twilio-fpa;v=1')

def test_identity(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret', identity='test@twilio.com')
token = scat.to_jwt()

assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal({
'identity': 'test@twilio.com'
}, decoded_token.payload['grants'])
assert {
'identity': 'test@twilio.com'
} == decoded_token.payload['grants']

def test_conversations_grant(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
scat.add_grant(ConversationsGrant(configuration_profile_sid='CP123'))

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(1, len(decoded_token.payload['grants']))
assert_equal({
'configuration_profile_sid': 'CP123'
}, decoded_token.payload['grants']['rtc'])
assert 1 == len(decoded_token.payload['grants'])
assert {
'configuration_profile_sid': 'CP123'
} == decoded_token.payload['grants']['rtc']

def test_video_grant(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
scat.add_grant(VideoGrant(room='RM123'))

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(1, len(decoded_token.payload['grants']))
assert_equal({
'room': 'RM123'
}, decoded_token.payload['grants']['video'])
assert 1 == len(decoded_token.payload['grants'])
assert {
'room': 'RM123'
} == decoded_token.payload['grants']['video']

def test_ip_messaging_grant(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
scat.add_grant(IpMessagingGrant(service_sid='IS123', push_credential_sid='CR123'))

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(1, len(decoded_token.payload['grants']))
assert_equal({
'service_sid': 'IS123',
'push_credential_sid': 'CR123'
}, decoded_token.payload['grants']['ip_messaging'])
assert 1 == len(decoded_token.payload['grants'])
assert {
'service_sid': 'IS123',
'push_credential_sid': 'CR123'
} == decoded_token.payload['grants']['ip_messaging']

def test_chat_grant(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
scat.add_grant(ChatGrant(service_sid='IS123', push_credential_sid='CR123'))

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(1, len(decoded_token.payload['grants']))
assert_equal({
'service_sid': 'IS123',
'push_credential_sid': 'CR123'
}, decoded_token.payload['grants']['chat'])
assert 1 == len(decoded_token.payload['grants'])
assert {
'service_sid': 'IS123',
'push_credential_sid': 'CR123'
} == decoded_token.payload['grants']['chat']

def test_sync_grant(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
scat.identity = "bender"
scat.add_grant(SyncGrant(service_sid='IS123', endpoint_id='blahblahendpoint'))

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(2, len(decoded_token.payload['grants']))
assert_equal("bender", decoded_token.payload['grants']['identity'])
assert_equal({
'service_sid': 'IS123',
'endpoint_id': 'blahblahendpoint'
}, decoded_token.payload['grants']['data_sync'])
assert 2 == len(decoded_token.payload['grants'])
assert "bender" == decoded_token.payload['grants']['identity']
assert {
'service_sid': 'IS123',
'endpoint_id': 'blahblahendpoint'
} == decoded_token.payload['grants']['data_sync']

def test_grants(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
scat.add_grant(VideoGrant())
scat.add_grant(IpMessagingGrant())

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(2, len(decoded_token.payload['grants']))
assert_equal({}, decoded_token.payload['grants']['video'])
assert_equal({}, decoded_token.payload['grants']['ip_messaging'])
assert 2 == len(decoded_token.payload['grants'])
assert {} == decoded_token.payload['grants']['video']
assert {} == decoded_token.payload['grants']['ip_messaging']

def test_programmable_voice_grant(self):
grant = VoiceGrant(
Expand All @@ -190,18 +188,18 @@ def test_programmable_voice_grant(self):
scat.add_grant(grant)

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(1, len(decoded_token.payload['grants']))
assert_equal({
'outgoing': {
'application_sid': 'AP123',
'params': {
'foo': 'bar'
}
}
}, decoded_token.payload['grants']['voice'])
assert 1 == len(decoded_token.payload['grants'])
assert {
'outgoing': {
'application_sid': 'AP123',
'params': {
'foo': 'bar'
}
}
} == decoded_token.payload['grants']['voice']

def test_programmable_voice_grant_incoming(self):
grant = VoiceGrant(
Expand All @@ -212,15 +210,15 @@ def test_programmable_voice_grant_incoming(self):
scat.add_grant(grant)

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(1, len(decoded_token.payload['grants']))
assert_equal({
'incoming': {
'allow': True
}
}, decoded_token.payload['grants']['voice'])
assert 1 == len(decoded_token.payload['grants'])
assert {
'incoming': {
'allow': True
}
} == decoded_token.payload['grants']['voice']

def test_task_router_grant(self):
grant = TaskRouterGrant(
Expand All @@ -233,15 +231,15 @@ def test_task_router_grant(self):
scat.add_grant(grant)

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(1, len(decoded_token.payload['grants']))
assert_equal({
'workspace_sid': 'WS123',
'worker_sid': 'WK123',
'role': 'worker'
}, decoded_token.payload['grants']['task_router'])
assert 1 == len(decoded_token.payload['grants'])
assert {
'workspace_sid': 'WS123',
'worker_sid': 'WK123',
'role': 'worker'
} == decoded_token.payload['grants']['task_router']

def test_playback_grant(self):
"""Test that PlaybackGrants are created and decoded correctly."""
Expand All @@ -253,11 +251,11 @@ def test_playback_grant(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret')
scat.add_grant(PlaybackGrant(grant=grant))
token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None
decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(1, len(decoded_token.payload['grants']))
assert_equal(grant, decoded_token.payload['grants']['player'])
assert 1 == len(decoded_token.payload['grants'])
assert grant == decoded_token.payload['grants']['player']

def test_pass_grants_in_constructor(self):
grants = [
Expand All @@ -267,13 +265,13 @@ def test_pass_grants_in_constructor(self):
scat = AccessToken(ACCOUNT_SID, SIGNING_KEY_SID, 'secret', grants=grants)

token = scat.to_jwt()
assert_is_not_none(token)
assert token is not None

decoded_token = AccessToken.from_jwt(token, 'secret')
self._validate_claims(decoded_token.payload)
assert_equal(2, len(decoded_token.payload['grants']))
assert_equal({}, decoded_token.payload['grants']['video'])
assert_equal({}, decoded_token.payload['grants']['ip_messaging'])
assert 2 == len(decoded_token.payload['grants'])
assert {} == decoded_token.payload['grants']['video']
assert {} == decoded_token.payload['grants']['ip_messaging']

def test_constructor_validates_grants(self):
grants = [VideoGrant, 'GrantMeAccessToEverything']
Expand Down
Loading