def pytest_sessionstart(session): """ Called after the Session object has been created and before performing collection and entering the run test loop. """ 'session start' with objects.allow_sync(): UserToken.create_table() BangumiSource.create_table() UserSubmitBangumi.create_table()
def test_submit_subject_id_exist(client: TestClient): user_id = 233 subject_id = 2333 bangumi_id = 'b_id' source = 'bilibili' async def mock_get_current_user(): return UserToken(user_id=user_id) client.app.dependency_overrides[get_current_user] = mock_get_current_user with objects.allow_sync(): db_models.BangumiSource.replace( source=source, bangumi_id=bangumi_id, subject_id=subject_id, ).execute() r = client.post('/bgm-tv-auto-tracker/api.v1/submit/subject_id', json={ 'bangumi_id': bangumi_id, 'source': source, 'subject_id': subject_id, }) assert r.status_code == 400, r.text assert r.json()['detail'] == 'object already exists' assert r.json( )['status'] == 'error', 'submit existed object should return 400' with pytest.raises(UserSubmitBangumi.DoesNotExist): with objects.allow_sync(): UserSubmitBangumi.get( user_id=user_id, bangumi_id=bangumi_id, source=source, subject_id=subject_id, ) client.app.dependency_overrides = {} with objects.allow_sync(): db_models.BangumiSource.delete().where( db_models.BangumiSource.source == source, db_models.BangumiSource.bangumi_id == bangumi_id, db_models.BangumiSource.subject_id == subject_id, ).execute()
def test_submit_subject_id_bad_input(client: TestClient): async def mock_get_current_user(): return UserToken(user_id=233) client.app.dependency_overrides[get_current_user] = mock_get_current_user r = client.post('/bgm-tv-auto-tracker/api.v1/submit/subject_id', json={ 'bangumi_id_': 'string', 'source': 'bilibili', 'subject_id': 288, }) assert r.status_code == 422, r.text with objects.allow_sync(): UserSubmitBangumi.get(user_id=233, bangumi_id='string', source='bilibili', subject_id=288) client.app.dependency_overrides = {}
def test_oauth_callback(client: TestClient): auth_time = datetime.datetime.now() mock_get = mock_response( {'date': auth_time.isoformat()}, json.dumps({ 'id': 233, 'url': 'http://bgm.tv/user/233', 'username': '******', 'nickname': 'some_nickname', 'avatar': { 'large': 'http://lain.bgm.tv/pic/user/l/000/28/76/287622.jpg', 'medium': 'http://lain.bgm.tv/pic/user/m/000/28/76/287622.jpg', 'small': 'http://lain.bgm.tv/pic/user/s/000/28/76/287622.jpg', }, 'sign': '站外点格子工具 https://bgm.tv/group/topic/346446 . ...', 'usergroup': 10, }), ) mock_post = mock_response( {'date': auth_time.isoformat()}, json.dumps({ 'access_token': 'some_access_token', 'expires_in': 6400, 'token_type': 'Bearer', 'user_id': 233, 'refresh_token': 'some_token', }), ) with objects.allow_sync(): UserToken.delete().execute() with mock.patch('requests_async.post', mock_post), mock.patch('requests_async.get', mock_get): r = client.get('/bgm-tv-auto-tracker/api.v1/oauth_callback', params={'code': '233'}) assert r.status_code == 200, 'response code not 200' assert 'bgm-tv-auto-tracker' in r.cookies me_resp = client.get('/bgm-tv-auto-tracker/api.v1/me').json() mock_post.assert_awaited_once_with( 'https://bgm.tv/oauth/access_token', data={ 'code': '233', 'client_id': config.BgmTvAutoTracker.APP_ID, 'grant_type': 'authorization_code', 'redirect_uri': config.BgmTvAutoTracker.callback_url, 'client_secret': config.BgmTvAutoTracker.APP_SECRET, }, ) mock_get.assert_awaited_once_with('https://api.bgm.tv/user/233') assert me_resp['access_token'] == 'some_access_token', ( 'access token mismatch in /me') assert me_resp['expires_in'] == 6400, 'expires time mismatch in /me' assert me_resp['token_type'] == 'Bearer', 'token type mismatch in /me' assert me_resp['user_id'] == 233, 'user_id mismatch in /me' with objects.allow_sync(): user: UserToken = UserToken.get(user_id=233) assert user.access_token == 'some_access_token', 'access token mismatch' assert user.refresh_token == 'some_token', 'refresh token mismatch' assert user.username == 'some_username', 'username mismatch' assert user.nickname == 'some_nickname', 'nickname mismatch' assert user.auth_time == int( auth_time.timestamp()), 'auth time mismatch' assert user.expires_in == 6400, 'expires time mismatch' assert user.usergroup == 10, 'usergroup mismatch'
def test_refresh_token(client: TestClient): auth_time = datetime.datetime.now() mock_get = mock_response( {'date': auth_time.isoformat()}, json.dumps({ 'id': 233, 'url': 'http://bgm.tv/user/233', 'username': '******', 'nickname': 'some_nickname', 'avatar': { 'large': 'http://lain.bgm.tv/pic/user/l/000/28/76/287622.jpg', 'medium': 'http://lain.bgm.tv/pic/user/m/000/28/76/287622.jpg', 'small': 'http://lain.bgm.tv/pic/user/s/000/28/76/287622.jpg', }, 'sign': '站外点格子工具 https://bgm.tv/group/topic/346446 . ...', 'usergroup': 10, }), ) with objects.allow_sync(): UserToken.replace( user_id=233, token_type='Bearer', expires_in=6400, auth_time=1560242743, access_token='some_access_token', refresh_token='some_token', username='******', nickname='some_nickname', usergroup=10, scope='', ).execute() async def mock_get_current_user(): return await objects.get(UserToken, user_id=233) client.app.dependency_overrides[get_current_user] = mock_get_current_user mock_post = mock_response( {'date': auth_time.isoformat()}, json.dumps({ 'access_token': 'new_access_token', 'expires_in': 505, 'token_type': 'Bearer', 'scope': '', 'refresh_token': 'some_new_token', }), ) with mock.patch('requests_async.post', mock_post), mock.patch('requests_async.get', mock_get): r = client.post('/bgm-tv-auto-tracker/api.v1/refresh') assert r.status_code == 200, r.text mock_post.assert_awaited_once_with( 'https://bgm.tv/oauth/access_token', data={ 'grant_type': 'refresh_token', 'refresh_token': 'some_token', 'client_id': config.BgmTvAutoTracker.APP_ID, 'redirect_uri': config.BgmTvAutoTracker.callback_url, 'client_secret': config.BgmTvAutoTracker.APP_SECRET, }) mock_get.assert_awaited_once_with('https://api.bgm.tv/user/233') with objects.allow_sync(): user: UserToken = UserToken.get(user_id=233) assert user.access_token == 'new_access_token', 'access token mismatch' assert user.refresh_token == 'some_new_token', 'refresh token mismatch' assert user.username == 'some_username', 'username mismatch' assert user.nickname == 'some_nickname', 'nickname mismatch' assert user.auth_time == int( auth_time.timestamp()), 'auth time mismatch' assert user.expires_in == 505, 'expires time mismatch' assert user.usergroup == 10, 'usergroup mismatch' client.app.dependency_overrides = {}
bgm_ep_id = pw.IntegerField() episode = pw.IntegerField() user_id = pw.IntegerField() create_time = pw.DateTimeField(default=datetime.datetime.now) modify_time = pw.DateTimeField(default=datetime.datetime.now) class UserSubmitBangumi(S.BgmIpViewer): class Meta: table_name = 'user_submit_bangumi' primary_key = pw.CompositeKey('source', 'bangumi_id', 'user_id') source = pw.FixedCharField(max_length=40) subject_id = pw.IntegerField() bangumi_id = pw.CharField() user_id = pw.IntegerField() modify_time = pw.DateTimeField(default=datetime.datetime.now) if __name__ == '__main__': from app.db.database import objects with objects.allow_sync(): EpSource.create_table() UserToken.create_table() BangumiSource.create_table() MissingBangumi.create_table() UserSubmitBangumi.create_table() UserSubmitEpisode.create_table() Tag.create_table()