from typing import Optional import requests from locust import HttpUser, between, task API_BASE_URL = "http://localhost:8000" def login(username: str, password: str) -> Optional[str]: """This function calls the login endpoint of the API to authenticate the user and get a token. Args: username (str): email of the user password (str): password of the user Returns: Optional[str]: token if login is successful, None otherwise """ url = f"{API_BASE_URL}/login" headers = { "accept": "application/json", "Content-Type": "application/x-www-form-urlencoded", } data = { "grant_type": "", "username": username, "password": password, "scope": "", "client_id": "", "client_secret": "", } response = requests.post(url, headers=headers, data=data) if response.status_code == 200: return response.json()["access_token"] else: return None class APIUser(HttpUser): """Represents a user in the API.""" wait_time = between(1, 5) @task(1) def predict(self): """Predicts an image using the model.""" token = login("admin@example.com", "admin") files = [ ("file", ("dog.jpeg", open("stress_test/dog.jpeg", "rb"), "image/jpeg")) ] headers = {"Authorization": f"Bearer {token}"} payload = {} self.client.post( "http://0.0.0.0:8000/model/predict", headers=headers, data=payload, files=files, )