Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
21 changed files
with
523 additions
and
90 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
0.3.2 | ||
0.4 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +0,0 @@ | ||
import logging | ||
|
||
# Keep test cases logging quiet | ||
logging.basicConfig(level=logging.CRITICAL + 1) | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
import base64 | ||
import hashlib | ||
import os | ||
import tempfile | ||
import unittest | ||
|
||
from argparse import Namespace | ||
from tabpy_server.app.app import TabPyApp | ||
from tabpy_server.handlers.endpoint_handler import EndpointHandler | ||
from tornado.testing import AsyncHTTPTestCase | ||
from unittest.mock import patch | ||
|
||
|
||
class TestEndpointHandlerWithAuth(AsyncHTTPTestCase): | ||
@classmethod | ||
def setUpClass(cls): | ||
cls.patcher = patch( | ||
'tabpy_server.app.TabPyApp._parse_cli_arguments', | ||
return_value=Namespace( | ||
config=None)) | ||
cls.patcher.start() | ||
|
||
prefix = '__TestEndpointHandlerWithAuth_' | ||
# create password file | ||
cls.pwd_file = tempfile.NamedTemporaryFile( | ||
mode='w+t', prefix=prefix, suffix='.txt', delete=False) | ||
cls.pwd_file.write('username {}'.format( | ||
hashlib.sha3_256('password'.encode('utf-8')).hexdigest())) | ||
cls.pwd_file.close() | ||
|
||
# create state.ini dir and file | ||
cls.state_dir = tempfile.mkdtemp(prefix=prefix) | ||
cls.state_file = open(os.path.join(cls.state_dir, 'state.ini'), 'w+') | ||
cls.state_file.write('[Service Info]\n' | ||
'Name = TabPy Serve\n' | ||
'Description = \n' | ||
'Creation Time = 0\n' | ||
'Access-Control-Allow-Origin = \n' | ||
'Access-Control-Allow-Headers = \n' | ||
'Access-Control-Allow-Methods = \n' | ||
'\n' | ||
'[Query Objects Service Versions]\n' | ||
'\n' | ||
'[Query Objects Docstrings]\n' | ||
'\n' | ||
'[Meta]\n' | ||
'Revision Number = 1\n') | ||
cls.state_file.close() | ||
|
||
# create config file | ||
cls.config_file = tempfile.NamedTemporaryFile( | ||
mode='w+t', prefix=prefix, suffix='.conf', delete=False) | ||
cls.config_file.write( | ||
'[TabPy]\n' | ||
'TABPY_PWD_FILE = {}\n' | ||
'TABPY_STATE_PATH = {}'.format( | ||
cls.pwd_file.name, | ||
cls.state_dir)) | ||
cls.config_file.close() | ||
|
||
@classmethod | ||
def tearDownClass(cls): | ||
cls.patcher.stop() | ||
os.remove(cls.pwd_file.name) | ||
os.remove(cls.state_file.name) | ||
os.remove(cls.config_file.name) | ||
os.rmdir(cls.state_dir) | ||
|
||
def get_app(self): | ||
self.app = TabPyApp(self.config_file.name) | ||
return self.app._create_tornado_web_app() | ||
|
||
def test_no_creds_required_auth_fails(self): | ||
response = self.fetch('/endpoints/anything') | ||
self.assertEqual(401, response.code) | ||
|
||
def test_invalid_creds_fails(self): | ||
response = self.fetch( | ||
'/endpoints/anything', | ||
method='GET', | ||
headers={ | ||
'Authorization': 'Basic {}'. | ||
format( | ||
base64.b64encode('user:wrong_password'.encode('utf-8')). | ||
decode('utf-8')) | ||
}) | ||
self.assertEqual(401, response.code) | ||
|
||
def test_valid_creds_pass(self): | ||
response = self.fetch( | ||
'/endpoints/', | ||
method='GET', | ||
headers={ | ||
'Authorization': 'Basic {}'. | ||
format( | ||
base64.b64encode('username:password'.encode('utf-8')). | ||
decode('utf-8')) | ||
}) | ||
self.assertEqual(200, response.code) | ||
|
||
def test_valid_creds_unknown_endpoint_fails(self): | ||
response = self.fetch( | ||
'/endpoints/unknown_endpoint', | ||
method='GET', | ||
headers={ | ||
'Authorization': 'Basic {}'. | ||
format( | ||
base64.b64encode('username:password'.encode('utf-8')). | ||
decode('utf-8')) | ||
}) | ||
self.assertEqual(404, response.code) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
import base64 | ||
import hashlib | ||
import os | ||
import tempfile | ||
import unittest | ||
|
||
from argparse import Namespace | ||
from tabpy_server.app.app import TabPyApp | ||
from tabpy_server.handlers.endpoints_handler import EndpointsHandler | ||
from tornado.testing import AsyncHTTPTestCase | ||
from unittest.mock import patch | ||
|
||
|
||
class TestEndpointsHandlerWithAuth(AsyncHTTPTestCase): | ||
@classmethod | ||
def setUpClass(cls): | ||
cls.patcher = patch( | ||
'tabpy_server.app.TabPyApp._parse_cli_arguments', | ||
return_value=Namespace( | ||
config=None)) | ||
cls.patcher.start() | ||
|
||
prefix = '__TestEndpointsHandlerWithAuth_' | ||
# create password file | ||
cls.pwd_file = tempfile.NamedTemporaryFile( | ||
mode='w+t', prefix=prefix, suffix='.txt', delete=False) | ||
cls.pwd_file.write('username {}'.format( | ||
hashlib.sha3_256('password'.encode('utf-8')).hexdigest())) | ||
cls.pwd_file.close() | ||
|
||
# create state.ini dir and file | ||
cls.state_dir = tempfile.mkdtemp(prefix=prefix) | ||
cls.state_file = open(os.path.join(cls.state_dir, 'state.ini'), 'w+') | ||
cls.state_file.write('[Service Info]\n' | ||
'Name = TabPy Serve\n' | ||
'Description = \n' | ||
'Creation Time = 0\n' | ||
'Access-Control-Allow-Origin = \n' | ||
'Access-Control-Allow-Headers = \n' | ||
'Access-Control-Allow-Methods = \n' | ||
'\n' | ||
'[Query Objects Service Versions]\n' | ||
'\n' | ||
'[Query Objects Docstrings]\n' | ||
'\n' | ||
'[Meta]\n' | ||
'Revision Number = 1\n') | ||
cls.state_file.close() | ||
|
||
# create config file | ||
cls.config_file = tempfile.NamedTemporaryFile( | ||
mode='w+t', prefix=prefix, suffix='.conf', delete=False) | ||
cls.config_file.write( | ||
'[TabPy]\n' | ||
'TABPY_PWD_FILE = {}\n' | ||
'TABPY_STATE_PATH = {}'.format( | ||
cls.pwd_file.name, | ||
cls.state_dir)) | ||
cls.config_file.close() | ||
|
||
@classmethod | ||
def tearDownClass(cls): | ||
cls.patcher.stop() | ||
os.remove(cls.pwd_file.name) | ||
os.remove(cls.state_file.name) | ||
os.remove(cls.config_file.name) | ||
os.rmdir(cls.state_dir) | ||
|
||
def get_app(self): | ||
self.app = TabPyApp(self.config_file.name) | ||
return self.app._create_tornado_web_app() | ||
|
||
def test_no_creds_required_auth_fails(self): | ||
response = self.fetch('/endpoints') | ||
self.assertEqual(401, response.code) | ||
|
||
def test_invalid_creds_fails(self): | ||
response = self.fetch( | ||
'/endpoints', | ||
method='GET', | ||
headers={ | ||
'Authorization': 'Basic {}'. | ||
format( | ||
base64.b64encode('user:wrong_password'.encode('utf-8')). | ||
decode('utf-8')) | ||
}) | ||
self.assertEqual(401, response.code) | ||
|
||
def test_valid_creds_pass(self): | ||
response = self.fetch( | ||
'/endpoints', | ||
method='GET', | ||
headers={ | ||
'Authorization': 'Basic {}'. | ||
format( | ||
base64.b64encode('username:password'.encode('utf-8')). | ||
decode('utf-8')) | ||
}) | ||
self.assertEqual(200, response.code) |
Oops, something went wrong.