🔧 chore(.gitignore): add .docker to the list of ignored files
🐛 fix(locustfile.py): remove unused import and fix incorrect variable name ✨ feat(locustfile.py): add support for authentication and flow creation in on_start method
This commit is contained in:
parent
8bbf25ee14
commit
22391c46eb
2 changed files with 91 additions and 35 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -254,3 +254,4 @@ langflow.db
|
||||||
|
|
||||||
/tmp/*
|
/tmp/*
|
||||||
src/backend/langflow/frontend/
|
src/backend/langflow/frontend/
|
||||||
|
.docker
|
||||||
|
|
@ -1,21 +1,20 @@
|
||||||
from locust import FastHttpUser, task, between
|
from locust import FastHttpUser, task, between, events
|
||||||
import random
|
import random
|
||||||
import time
|
import time
|
||||||
|
import orjson
|
||||||
from rich import print
|
from rich import print
|
||||||
import os
|
import os
|
||||||
|
import httpx
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
class NameTest(FastHttpUser):
|
class NameTest(FastHttpUser):
|
||||||
host = "http://localhost:7860/api/v1" # make sure the port number is correct
|
|
||||||
wait_time = between(1, 5)
|
wait_time = between(1, 5)
|
||||||
|
|
||||||
with open("names.txt", "r") as file:
|
with open("names.txt", "r") as file:
|
||||||
names = [line.strip() for line in file.readlines()]
|
names = [line.strip() for line in file.readlines()]
|
||||||
|
|
||||||
headers = {
|
headers = {}
|
||||||
# api-key
|
|
||||||
"x-api-key": "lf-a1EsRC75ybWiKRCRLyhX1R9rPlqQKYlnRQoZWysg6NM",
|
|
||||||
}
|
|
||||||
|
|
||||||
def poll_task(self, task_id, sleep_time=1):
|
def poll_task(self, task_id, sleep_time=1):
|
||||||
while True:
|
while True:
|
||||||
|
|
@ -26,19 +25,14 @@ class NameTest(FastHttpUser):
|
||||||
headers=self.headers,
|
headers=self.headers,
|
||||||
) as response:
|
) as response:
|
||||||
status = response.js.get("status")
|
status = response.js.get("status")
|
||||||
|
print(f"Poll Response: {response.js}")
|
||||||
if status == "SUCCESS":
|
if status == "SUCCESS":
|
||||||
return response.js.get("result")
|
return response.js.get("result")
|
||||||
elif status in ["FAILURE", "REVOKED"]:
|
elif status in ["FAILURE", "REVOKED"]:
|
||||||
raise ValueError(f"Task failed with status: {status}")
|
raise ValueError(f"Task failed with status: {status}")
|
||||||
time.sleep(sleep_time)
|
time.sleep(sleep_time)
|
||||||
|
|
||||||
@task
|
def process(self, name, flow_id, payload):
|
||||||
def send_name_and_check(self):
|
|
||||||
name = random.choice(self.names)
|
|
||||||
flow_id = os.getenv("FLOW_ID", "88989f6d-8da4-4d6f-8205-480693c36200")
|
|
||||||
session_id = f"{name}-{time.time()}"
|
|
||||||
|
|
||||||
def process(flow_id, payload):
|
|
||||||
task_id = None
|
task_id = None
|
||||||
print(f"Processing {payload}")
|
print(f"Processing {payload}")
|
||||||
with self.rest(
|
with self.rest(
|
||||||
|
|
@ -48,31 +42,92 @@ class NameTest(FastHttpUser):
|
||||||
name="process",
|
name="process",
|
||||||
headers=self.headers,
|
headers=self.headers,
|
||||||
) as response:
|
) as response:
|
||||||
|
print(response.js)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
response.failure("Process call failed")
|
response.failure("Process call failed")
|
||||||
raise ValueError("Process call failed")
|
raise ValueError("Process call failed")
|
||||||
print(response.js)
|
|
||||||
task_id = response.js.get("id")
|
task_id = response.js.get("id")
|
||||||
|
session_id = response.js.get("session_id")
|
||||||
assert task_id, "Inner Task ID not found"
|
assert task_id, "Inner Task ID not found"
|
||||||
|
|
||||||
assert task_id, "Task ID not found"
|
assert task_id, "Task ID not found"
|
||||||
result, session_id = self.poll_task(task_id)
|
result = self.poll_task(task_id)
|
||||||
print(f"Result for {name}: {result}")
|
print(f"Result for {name}: {result}")
|
||||||
|
|
||||||
return result, session_id
|
return result, session_id
|
||||||
|
|
||||||
|
@task
|
||||||
|
def send_name_and_check(self):
|
||||||
|
name = random.choice(self.names)
|
||||||
|
|
||||||
payload1 = {
|
payload1 = {
|
||||||
"inputs": {"text": f"Hello, My name is {name}"},
|
"inputs": {"text": f"Hello, My name is {name}"},
|
||||||
"session_id": session_id,
|
"sync": False,
|
||||||
}
|
}
|
||||||
result1, session_id = process(flow_id, payload1)
|
result1, session_id = self.process(name, self.flow_id, payload1)
|
||||||
|
|
||||||
payload2 = {
|
payload2 = {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"text": "What is my name? Please, answer like this: Your name is <name>"
|
"text": "What is my name? Please, answer like this: Your name is <name>"
|
||||||
},
|
},
|
||||||
"session_id": session_id,
|
"session_id": session_id,
|
||||||
|
"sync": False,
|
||||||
}
|
}
|
||||||
result2, session_id = process(flow_id, payload2)
|
result2, session_id = self.process(name, self.flow_id, payload2)
|
||||||
|
|
||||||
assert f"Your name is {name}" in result2, "Name not found in response"
|
assert f"Your name is {name}" in str(result2), "Name not found in response"
|
||||||
|
|
||||||
|
def on_start(self):
|
||||||
|
print("Starting")
|
||||||
|
login_data = {"username": "superuser", "password": "superuser"}
|
||||||
|
response = httpx.post(f"{self.host}/login", data=login_data)
|
||||||
|
print(response.json())
|
||||||
|
|
||||||
|
tokens = response.json()
|
||||||
|
print(tokens)
|
||||||
|
a_token = tokens["access_token"]
|
||||||
|
logged_in_headers = {"Authorization": f"Bearer {a_token}"}
|
||||||
|
print("Logged in")
|
||||||
|
with open(
|
||||||
|
Path(__file__).parent.parent
|
||||||
|
/ "data"
|
||||||
|
/ "BasicChatwithPromptandHistory.json",
|
||||||
|
"r",
|
||||||
|
) as f:
|
||||||
|
json_flow = f.read()
|
||||||
|
flow = orjson.loads(json_flow)
|
||||||
|
data = flow["data"]
|
||||||
|
# Create test data
|
||||||
|
flow = {"name": "Flow 1", "description": "description", "data": data}
|
||||||
|
print("Creating flow")
|
||||||
|
# Make request to endpoint
|
||||||
|
response = httpx.post(
|
||||||
|
f"{self.host}/flows/",
|
||||||
|
json=flow,
|
||||||
|
headers=logged_in_headers,
|
||||||
|
)
|
||||||
|
self.flow_id = response.json()["id"]
|
||||||
|
print(f"Flow ID: {self.flow_id}")
|
||||||
|
|
||||||
|
# read all users
|
||||||
|
response = httpx.get(
|
||||||
|
f"{self.host}/users/",
|
||||||
|
headers=logged_in_headers,
|
||||||
|
)
|
||||||
|
print(response.json())
|
||||||
|
user_id = next(
|
||||||
|
(
|
||||||
|
user["id"]
|
||||||
|
for user in response.json()["users"]
|
||||||
|
if user["username"] == "superuser"
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
# Create api key
|
||||||
|
response = httpx.post(
|
||||||
|
f"{self.host}/api_key/",
|
||||||
|
json={"user_id": user_id},
|
||||||
|
headers=logged_in_headers,
|
||||||
|
)
|
||||||
|
print(response.json())
|
||||||
|
self.headers["x-api-key"] = response.json()["api_key"]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue