diff --git a/server-api/.gitignore b/server-api/.gitignore index 24e4eed..60ffa8a 100644 --- a/server-api/.gitignore +++ b/server-api/.gitignore @@ -4,3 +4,5 @@ target static/css/ dev-sql/ diesel.toml + +*.log diff --git a/server-api/build.sh b/server-api/build.sh new file mode 100755 index 0000000..39f2064 --- /dev/null +++ b/server-api/build.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +_help() { +cat < /dev/null 2>&1 + cargo test 1 > /dev/null 2>&1 + cargo run -- -s 1 > /dev/null 2>&1 & + echo Waiting on server to spin up && sleep 2 + server=$! + export CARGO_BIN=$HOME/.cargo/bin/cargo + python3 client-tests/client.py > 'test.log' + kill -9 $server + ;; + b)cargo build;; + r)cargo build --release;; + *) _help;; + esac +done diff --git a/server-api/client-tests/client.py b/server-api/client-tests/client.py new file mode 100644 index 0000000..9bfb2e7 --- /dev/null +++ b/server-api/client-tests/client.py @@ -0,0 +1,87 @@ +import subprocess, os +import json, requests + +class Test: + def __init__(self, base='http://localhost:8888', create_admin=False, admin=None): + ''' + @opt:base = base url string + @opt:create_admin = creates admin account directly off cargo -c + @opt:admin = optionally pass in dictionary with some admin credentials + potentially from another instance to run multiple tests at once + ''' + + self.test_count = 0 + if create_admin: + self.body = Test.__create_admin() + elif admin is not None: + self.body = body + else: + # for now we use this because my dev server has this fake ass acc on it + self.body = { + 'secret': 'utO088fltYrTZg323NZfAGrAkArMkDfwjPmt0ooAYta2oJOYDWcAd1FnrpVVMqZtMeUX4_Hu57-LHCkXy8gedg==', + 'id': 23, + 'name': 'admin', + 'joindate':1602385239, + 'status': 0, + 'permissions': 18446744073709551615 + } + + self.base = base + + @staticmethod + def __create_admin(): + # /home/$user/.cargo/bin/cargo <- normally + # prolly some awful shit on pipes + CARGO_BIN = os.getenv('CARGO_BIN') + raw_json = subprocess.run(f'{CARGO_BIN} run --release -- -c dev-test'.split(), text=True, capture_output=True) + #raw_json = raw_json_b[2:-1].replace('\\n', ' ').strip() + return json.loads(raw_json.stdout) + + + @staticmethod + def log(url: str, method: str, request: requests.Response): + print(f'{method} {url}') + print(f'\t[Status Code]: {request.status_code}') + print(f'\t[Body]: {request.text}') + + def post(self, url, **opts): + rbody = self.body + for k in opts: + rbody[k] = opts[k] + + body = json.dumps(rbody) + r = requests.post(self.base + url, data=rbody) + self.log(self.base + url, 'POST', r) + + def get(self, url, **opts): + rbody = self.body + for k in opts: + rbody[k] = opts[k] + + body = json.dumps(rbody) + r = requests.get(self.base + url, data=body) + self.log(self.base + url, 'GET', r) + + def delete(self, url, **opts): + rbody = self.body + for k in opts: + rbody[k] = opts[k] + + body =json.dumps(rbody) + r = requests.delete(self.base + url, data=body) + self.log(self.base + url, 'DELETE', r) + + def creds(self): + return self.body + + +if __name__ == '__main__': + worker = Test(create_admin=True) + + # First the invites api gets some basic tests + worker.get('/invite/create') + + worker.post('/channels/create', name='something random', kind=1) + worker.get('/channels/list') + worker.delete('/channels/delete', name='something random') + worker.get('/channels/list')