# py-scopes: tests.test_api """Tests for the fastapi- (and asyncio-) based stuff""" from scopes import config from scopes.api.auth import config as auth_config config.settings = config.Settings(_env_file='tests/test.env') auth_config.settings = auth_config.Settings(_env_file='tests/test.env') import pytest from fastapi.testclient import TestClient from httpx2 import ASGITransport, AsyncClient, BasicAuth from scopes.api import main from scopes.api.main import app from scopes.storage import tracking, user as st_user from scopes.api.auth import user as api_user @pytest.fixture(scope='module') def storage(): storage = config.StorageFactory(config.settings)(config.settings.dbschema) storage.dropTable('tracks') storage.dropTable('users') storage.commit() return storage def async_client(): return AsyncClient(transport=ASGITransport(app=app), base_url='http://test') #@pytest.mark.anyio #async def test_root(): #async with async_client() as clt: #response = await clt.get('/') def test_root(): with TestClient(app) as clt: response = clt.get('/') assert response.status_code == 200 assert response.json() == {'Hello': 'World'} def test_tracking(storage, caplog): tracks = storage.create(tracking.Container) tr01 = tracking.Track('t01', 'john') tr01.update(dict(activity='testing')) trid01 = tracks.save(tr01) storage.commit() with TestClient(app) as clt: caplog.set_level(config.settings.log_level) tracks = clt.get('/tracks').json() assert len(tracks) == 1 tr = tracks[0] assert tr['timeStamp'].startswith('202') tr['timeStamp'] = '...' assert tr == {'uid': 'rec-1', 'head': {'taskId': 't01', 'userName': 'john'}, 'data': {'activity': 'testing'}, 'timeStamp': '...'} resp = clt.post('/tracks', json={'head': {'taskId': 't02', 'userName': 'jim'}, 'data': {'activity': 'implement post track'}}) assert resp.status_code == 200 tr02 = resp.json() assert tr02['uid'] == 'rec-2' #print('\n*** Logs: ', caplog.text) #print('*** tr02', tr02) def test_user(storage, caplog): users = storage.create(st_user.Users) pw = 'secret' pw_hash = api_user.hashPassword(pw) u01 = st_user.User('jim', 'jim', data=dict(display_name='Jim', pw_hash=pw_hash)) u01id = users.save(u01) storage.commit() with TestClient(app) as clt: caplog.set_level(config.settings.log_level) auth = BasicAuth(username='jim', password='secret') users = clt.get('/users').json() assert len(users) == 1 u01i = users[0] assert u01i.get(pw_hash) is None inp = {'name': 'jane', 'login': 'jane', 'display_name': 'Jane', 'email': 'jane@xmpl.org', 'password': 'secret'} resp = clt.post('/users', json=inp, auth=auth) assert resp.status_code == 200 u02 = resp.json() assert u02['uid'] == 'user-2' ts02 = u02.get('timeStamp') assert ts02 is not None del inp['password'] inp['display_name'] = 'Jane Doe' resp = clt.post('/users', json=inp, auth=auth) assert resp.status_code == 200 u02a = resp.json() assert u02a['uid'] == 'user-2' ts02a = u02a.get('timeStamp') assert ts02a is not None