mirror of
https://github.com/boostorg/mysql.git
synced 2026-01-27 19:12:10 +00:00
Refactored launch_server into a common utility launch_server now uses `Popen.terminate()`, which handles the race condition case close #393
99 lines
2.8 KiB
Python
99 lines
2.8 KiB
Python
#!/usr/bin/python3
|
|
#
|
|
# Copyright (c) 2019-2024 Ruben Perez Hidalgo (rubenperez038 at gmail dot com)
|
|
#
|
|
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
#
|
|
|
|
import requests
|
|
import random
|
|
import argparse
|
|
import sys
|
|
from os import path
|
|
|
|
sys.path.append(path.abspath(path.dirname(path.realpath(__file__))))
|
|
from launch_server import launch_server
|
|
|
|
|
|
def _check_response(res: requests.Response):
|
|
if res.status_code >= 400:
|
|
print(res.text)
|
|
res.raise_for_status()
|
|
|
|
|
|
def _random_string() -> str:
|
|
return bytes(random.getrandbits(8) for _ in range(8)).hex()
|
|
|
|
|
|
def _call_endpoints(port: int):
|
|
base_url = 'http://127.0.0.1:{}'.format(port)
|
|
|
|
# Create a note
|
|
note_unique = _random_string()
|
|
title = 'My note {}'.format(note_unique)
|
|
content = 'This is a note about {}'.format(note_unique)
|
|
res = requests.post(
|
|
'{}/notes'.format(base_url),
|
|
json={'title': title, 'content': content}
|
|
)
|
|
_check_response(res)
|
|
note = res.json()
|
|
note_id = int(note['note']['id'])
|
|
assert note['note']['title'] == title
|
|
assert note['note']['content'] == content
|
|
|
|
# Retrieve all notes
|
|
res = requests.get('{}/notes'.format(base_url))
|
|
_check_response(res)
|
|
all_notes = res.json()
|
|
assert len([n for n in all_notes['notes'] if n['id'] == note_id]) == 1
|
|
|
|
# Edit the note
|
|
note_unique = _random_string()
|
|
title = 'Edited {}'.format(note_unique)
|
|
content = 'This is a note an edit on {}'.format(note_unique)
|
|
res = requests.put(
|
|
'{}/notes/{}'.format(base_url, note_id),
|
|
json={'title': title, 'content': content}
|
|
)
|
|
_check_response(res)
|
|
note = res.json()
|
|
assert int(note['note']['id']) == note_id
|
|
assert note['note']['title'] == title
|
|
assert note['note']['content'] == content
|
|
|
|
# Retrieve the note
|
|
res = requests.get('{}/notes/{}'.format(base_url, note_id))
|
|
_check_response(res)
|
|
note = res.json()
|
|
assert int(note['note']['id']) == note_id
|
|
assert note['note']['title'] == title
|
|
assert note['note']['content'] == content
|
|
|
|
# Delete the note
|
|
res = requests.delete('{}/notes/{}'.format(base_url, note_id))
|
|
_check_response(res)
|
|
assert res.json()['deleted'] == True
|
|
|
|
# The note is not there
|
|
res = requests.get('{}/notes/{}'.format(base_url, note_id))
|
|
assert res.status_code == 404
|
|
|
|
|
|
def main():
|
|
# Parse command line arguments
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('executable')
|
|
parser.add_argument('host')
|
|
args = parser.parse_args()
|
|
|
|
# Launch the server
|
|
with launch_server(args.executable, args.host) as listening_port:
|
|
# Run the tests
|
|
_call_endpoints(listening_port)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|