freechat/server-api/client-tests/client.py
shockrah 00fccb72e5 Mysterious tuple from string bug here
Patching because I have other things to do but basically this diff at line 20 shows that even though self.secret was assigned toa  string value, it was still being given the type of tuple with the first/only item being the string value
I have no idea how this was happeneing but its fixed as of now

* also im ignoring the cargo_bin flag in the environment for now as its just causing issues while debugging
2021-01-20 22:50:23 -08:00

127 lines
4.3 KiB
Python

import time
import subprocess, os, sys
import json, requests
from web import http
class Worker:
def __init__(self, domain: str, create_admin: bool):
'''
@opt:base = base url string
@opt:create_admin = creates admin account directly off cargo -c <NAME>
@opt:admin = optionally pass in dictionary with some admin credentials
potentially from another instance to run multiple tests at once
'''
self.domain = domain
self.requests = {}
self.responses = {}
self.jwt = None # never gets assigned until /login is hit
self.basic_creds = self.__create_admin()
self.id = self.basic_creds['id']
self.secret = self.basic_creds['secret']
def __create_admin(self):
# /home/$user/.cargo/bin/cargo <- normally
# NOTE: the above path is prolly some awful shit on ci pipeline
CARGO_BIN = os.getenv('CARGO_BIN')
proc = subprocess.run(f'cargo run --release -- -c dev-test'.split(), text=True, capture_output=True)
try:
return json.loads(proc.stdout)
except:
import sys
print('TESTBOT UNABLE TO LOAD JSON DATA FROM -c flag', file=sys.stderr)
exit(1)
def auth(self, auth_opt: str):
if auth_opt == 'basic':
return self.basic_creds
else:
return {'id': self.id, 'jwt': auth_opt}
def _append_auth(self, opts: dict, auth: str):
'''
Default auth fallback type is jwt because that's they only other type of auth
FC cares about really
@param opts: Dictionary of parameters to pass to the endpoint
@auth: Denotes if we use basic auth or jwt if its not 'basic'
'''
if type(auth) == str:
opts['id'] = self.id
if auth == 'basic':
opts['secret'] = self.secret
else:
opts['jwt'] = auth
return opts
else:
# if its not a string we don't add anything in
return opts
def request(self, method: str, path: str, auth: str, opts: dict, expectation: int):
assert(path[0] == '/')
# First make sure we add in the correct auth params that are requested
opts = self._append_auth(opts, auth)
# Build the request and store it in our structure
url = self.domain + path
req = http.Request(method, url, opts)
r_id = time.time()
self.requests[r_id] = req
resp = req.make(expectation)
self.responses[r_id] = resp
return r_id
def run(worker: Worker):
VOICE_CHAN = 1
TEXT_CHAN = 2
# preliminary test
req_login = worker.request('post', '/login', 'basic',{}, 200)
jwt = worker.responses[req_login].json()
new_channel_name = time.time()
channel_tests = [
# init field provides args for Response object generation
# hop field gives us the ideal statuscode we want when we actually send the request
# NOTE: Grouping by status code
# sanity check
{'init': ['get', '/channels/list', {}], 'auth': None, 'hope': 400},
{'init': ['post', '/login', {}], 'auth': 'basic', 'hope': 200},
{'init': ['post', '/channels/list', {}], 'auth': jwt, 'hope': 200},
# somehow save this garbino
{'init': ['post', '/channels/create', {'name': str(new_channel_name), 'kind': 2, 'description': 'asdf'}], 'auth': jwt, 'hope': 200},
# Just a regular test no saving for this one
{'init': ['post', '/channels/create', {'name': str(new_channel_name+1), 'kind': 2,}], 'auth': jwt, 'hope': 200},
{'init': ['post', '/channels/create', {}], 'auth': jwt, 'hope': 400},
{'init': ['post', '/channels/create', {'name': 123, 'kind': 'adsf'}], 'auth': jwt, 'hope': 400},
# save this and compare its results to the previous
{'init': ['get', '/channels/list', {}], 'auth': jwt, 'hope': 200},
{'init': ['get', '/channels/list', {'random-param': 123}], 'auth': jwt, 'hope': 200},
]
for test in channel_tests:
method, path, opts = test['init']
auth = test['auth']
hope = test['hope']
worker.request(method, path, auth, opts, hope)
if __name__ == '__main__':
worker = Worker('http://localhost:8888', create_admin=True)
run(worker)