! This merge denotes the MVP completion for the backend decentralization endpoints

More routes are to be added in the future but for now this should suffice

Doc's are now required and the roadmap need to be updated as well
This commit is contained in:
shockrah
2021-05-12 14:27:34 -07:00
22 changed files with 584 additions and 256 deletions

View File

@@ -1,5 +1,6 @@
import subprocess
import os
import sys
import json
class Server:
@@ -8,6 +9,15 @@ class Server:
self.wsurl = meta.get('wsurl')
self.serv_name = meta.get('name')
def __str__(self) -> str:
fields = {
'url': self.url,
'wsurl': self.wsurl,
'name': self.serv_name
}
return str(fields)
class Admin:
def __init__(self, user: dict, server: dict):
self.id = user.get('id')
@@ -20,7 +30,15 @@ class Admin:
self.server = Server(server)
def __str__(self) -> str:
return f'{self.name}#{self.id}'
acc = {
'id': self.id,
'name': self.name,
'permissions': self.permissions,
'secret': self.secret,
'jwt': self.jwt,
}
container = {'user': acc, 'server': str(self.server)}
return str(container)
def create_admin() -> Admin :
CARGO_BIN = os.getenv('CARGO_BIN')
@@ -37,10 +55,12 @@ def create_admin() -> Admin :
if user is None or server is None:
print('stderr ', e)
print('stdout ', proc.stdout)
print(f'User/Server Data was not serializable => {raw}', file=sys.stderr)
return None
else:
return Admin(user, server)
except:
except Exception as e:
print(f'[create_admin] General exception caught in parsing => {e}', file=sys.stderr)
print('stderr ', proc.stderr)
print('stdout ', proc.stdout)
return None

View File

@@ -2,12 +2,14 @@ from time import time
from request import Request
from config import create_admin, Admin
from config import Server
from json import dumps as to_json
RESPONSES = []
VOICE_CHAN = 1
TEXT_CHAN = 2
def login() -> (Request, str):
def login(admin: Admin) -> (Request, str):
print(f'Provided admin account {admin}')
req = Request(
admin.server.url + '/login',
'post',
@@ -67,9 +69,11 @@ def make_and_receive_invite(admin: Admin) -> (Request, Request):
make_inv_req.fire()
if make_inv_req.response is None:
return (make_inv_req, user_inv_req)
elif make_inv_req.response.status_code >= 400:
print('Params used ', make_inv_req)
return (make_inv_req, None)
# Setup to fire the second request, .fire() is safe to blindly use at this point
print('Response text from /join ', make_inv_req.response.text)
new_invite_body = make_inv_req.response.json()['invite']
code = new_invite_body['id']
user_inv_req = req(admin , 'get' , '/join', {'code': code}, 200, verbose=True)
@@ -89,7 +93,7 @@ if __name__ == '__main__':
# First a quick sanity check for login
# add this after we fire the generic tests
login_req, jwt = login()
login_req, jwt = login(admin)
if jwt is None:
print('Unable to /login - stopping now to avoid pointless failure')
req.show_response()
@@ -104,6 +108,19 @@ if __name__ == '__main__':
# Invite test
# Container for most/all the generic requests we want to fire off
now = time()
tmp_neighbor = {
'name': str(now),
'wsurl': 'wsurl',
'url': str(now),
'description': 'asdf',
'tags': ['red','blue']
}
# This neighbor is used to "update" the tmp one above in /neighbor tests
updated_neighbor = tmp_neighbor.copy()
updated_neighbor['name'] = 'new'
print('Updated neighbor as json ', to_json(updated_neighbor))
requests.extend([
req(fake_user, 'get', '/channels/list', {}, 401),
req(admin, 'post', '/channels/list', {'kind': TEXT_CHAN}, 404),
@@ -117,8 +134,18 @@ if __name__ == '__main__':
req(admin, 'get', '/message/recent', {'channel_id': 123, 'limit': 20}, 404),
req(admin, 'get', '/members/me', {}, 200),
req(admin, 'get', '/members/get_online', {}, 200),
req(admin, 'post', '/members/me/nickname', {'nick': f'randy-{time()}'}, 200),
req(admin , 'get', '/invite/join', {'code': 123}, 404)
req(admin, 'post', '/members/me/nickname', {'nick': f'randy-{now}'}, 200),
req(admin , 'get', '/invite/join', {'code': 123}, 404),
req(admin , "get", "/meta", {}, 200),
req(admin, 'get', '/neighbor/list', {}, 200),
req(admin,'post', '/neighbor/add', {}, 200, body=to_json(tmp_neighbor)),
req(admin, 'get', '/neighbor/list', {}, 200, verbose=True),
req(admin, 'put', '/neighbor/update', {'url':str(now)}, 200, body=to_json(updated_neighbor)),
req(admin, 'put', '/neighbor/update', {'url':'fake'}, 404, body=to_json(updated_neighbor)),
req(admin, 'get', '/neighbor/list', {}, 200),
req(admin, 'delete', '/neighbor/delete', {'url':'fake'}, 200),
req(admin, 'delete', '/neighbor/delete', {'url': str(now)}, 200),
req(admin, 'get', '/neighbor/list', {}, 200, verbose=True),
])
# add this after fire the generic tests
@@ -142,6 +169,7 @@ if __name__ == '__main__':
r.show_response()
if r.passing:
pass_count += 1
req_count = len(requests)
print(f'Passing {pass_count}/{req_count}')

View File

@@ -4,6 +4,7 @@ import requests
NC = '\033[0m'
RED = '\033[1;31m'
GREEN = '\033[1;32m'
YELLOW = '\033[1;33m'
class Request:
@@ -21,6 +22,9 @@ class Request:
self.verbose = verbose
def __str__(self):
return str(self.qs)
@property
def passing(self):
if self.response is None:
@@ -36,6 +40,8 @@ class Request:
self.response = requests.post(self.url, headers=self.headers, params=self.qs, data=self.body)
elif self.method == 'delete':
self.response = requests.delete(self.url, headers=self.headers, params=self.qs)
elif self.method == 'put':
self.response = requests.put(self.url, headers=self.headers, params=self.qs, data=self.body)
return self.response
except Exception as e:
@@ -45,34 +51,36 @@ class Request:
def show_response(self):
if self.response is None:
print('Response := None')
return
real_code = self.response.status_code
real_code = None
if self.response is not None:
real_code = self.response.status_code
if self.hope != real_code:
abstract = RED + 'Fail ' + NC + 'Expected ' + str(self.hope) + ' Got ' + str(real_code)
if self.response is None:
print('\tNo Response to show for')
print(abstract)
print('\t', self.method, ' ', self.url)
if len(self.headers) != 0:
print('\tRequest-Headers ', self.headers)
print(YELLOW + '\tRequest-Headers ' + NC, self.headers)
if len(self.qs) != 0:
print('\tQuery-Dictionary ', self.qs)
print(YELLOW + '\tQuery-Dictionary' + NC, self.qs)
if self.body is not None:
print('\tRequest-Body ', str(self.body))
print(YELLOW + '\tRequest-Body' + NC, str(self.body))
if self.verbose:
print(f'\tResponse-Status {self.response.status_code}')
print(f'\tResponse-Headers {self.response.headers}')
print(f'\tResponse-Text {self.response.text}')
print(f'\t{YELLOW}Response-Status{NC} {self.response.status_code}')
print(f'\t{YELLOW}Response-Headers{NC} {self.response.headers}')
print(f'\t{YELLOW}Response-Text{NC} {self.response.text}')
else:
print(f'{GREEN}Pass{NC} {self.method} {self.url}')
if self.verbose:
print(f'\tResponse-Status {self.response.status_code}')
print(f'\tResponse-Headers {self.response.headers}')
print(f'\tResponse-Text {self.response.text}')
print(f'\t{YELLOW}Response-Status{NC} {self.response.status_code}')
print(f'\t{YELLOW}Response-Headers{NC} {self.response.headers}')
print(f'\t{YELLOW}Response-Text{NC} {self.response.text}')