-
Notifications
You must be signed in to change notification settings - Fork 52
LCORE-166: add e2e tests for the endpoints #425
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| [behave] | ||
| paths = tests/e2e/features |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| # Feature: Authorized endpoint API tests | ||
| # TODO: fix test | ||
|
|
||
| # Background: | ||
| # Given The service is started locally | ||
| # And REST API service hostname is localhost | ||
| # And REST API service port is 8080 | ||
| # And REST API service prefix is /v1 | ||
|
|
||
| # Scenario: Check if the OpenAPI endpoint works as expected | ||
| # Given The system is in default state | ||
| # When I access endpoint "authorized" using HTTP POST method | ||
| # Then The status code of the response is 200 | ||
| # And The body of the response has proper username | ||
|
|
||
| # Scenario: Check if LLM responds to sent question with error when not authenticated | ||
| # Given The system is in default state | ||
| # And I remove the auth header | ||
| # When I access endpoint "authorized" using HTTP POST method | ||
| # Then The status code of the response is 400 | ||
| # And The body of the response is the following | ||
| # """ | ||
| # {"detail": "Unauthorized: No auth header found"} | ||
| # """ | ||
|
|
||
| # Scenario: Check if LLM responds to sent question with error when not authorized | ||
| # Given The system is in default state | ||
| # And I modify the auth header so that the user is it authorized | ||
| # When I access endpoint "authorized" using HTTP POST method | ||
| # Then The status code of the response is 403 | ||
| # And The body of the response is the following | ||
| # """ | ||
| # {"detail": "Forbidden: User is not authorized to access this resource"} | ||
| # """ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,54 @@ | ||
| # Feature: conversations endpoint API tests | ||
| #TODO: fix test | ||
|
|
||
| # Background: | ||
| # Given The service is started locally | ||
| # And REST API service hostname is localhost | ||
| # And REST API service port is 8080 | ||
| # And REST API service prefix is /v1 | ||
|
|
||
|
|
||
| # Scenario: Check if conversations endpoint finds the correct conversation when it exists | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "conversations" using HTTP GET method | ||
| # Then The status code of the response is 200 | ||
| # And the proper conversation is returned | ||
|
|
||
| # Scenario: Check if conversations endpoint does not finds the conversation when it does not exists | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "conversations" using HTTP GET method | ||
| # Then The status code of the response is 404 | ||
|
|
||
| # Scenario: Check if conversations endpoint fails when conversation id is not provided | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "conversations" using HTTP GET method | ||
| # Then The status code of the response is 422 | ||
|
|
||
| # Scenario: Check if conversations endpoint fails when service is unavailable | ||
| # Given The system is in default state | ||
| # And the service is stopped | ||
| # When I access REST API endpoint "conversations" using HTTP GET method | ||
| # Then The status code of the response is 503 | ||
|
|
||
| # Scenario: Check if conversations/delete endpoint finds the correct conversation when it exists | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "conversations/delete" using HTTP GET method | ||
| # Then The status code of the response is 200 | ||
| # And the deleted conversation is not found | ||
|
|
||
| # Scenario: Check if conversations/delete endpoint does not finds the conversation when it does not exists | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "conversations/delete" using HTTP GET method | ||
| # Then The status code of the response is 404 | ||
|
|
||
| # Scenario: Check if conversations/delete endpoint fails when conversation id is not provided | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "conversations/delete" using HTTP GET method | ||
| # Then The status code of the response is 422 | ||
|
|
||
| # Scenario: Check if conversations/delete endpoint fails when service is unavailable | ||
| # Given The system is in default state | ||
| # And the service is stopped | ||
| # When I access REST API endpoint "conversations/delete" using HTTP GET method | ||
| # Then The status code of the response is 503 | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,90 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Feature: feedback endpoint API tests | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1
to
+3
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Uncomment and tag the Feature header to avoid parser failures -# Feature: feedback endpoint API tests
+@wip
+Feature: feedback endpoint API tests📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Background: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The service is started locally | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And REST API service hostname is localhost | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And REST API service port is 8080 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And REST API service prefix is /v1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if feedback endpoint is working | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access endpoint "feedback" using HTTP POST with conversation ID conversationID | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "llm_response": "bar", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "sentiment": -1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "user_feedback": "Not satisfied with the response quality", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "user_question": "random question" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 200 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # {"response": "feedback received"} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if feedback endpoint is not working when not authorized | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And I remove the auth header | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access endpoint "feedback" using HTTP POST with conversation ID conversationID | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "llm_response": "bar", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "sentiment": -1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "user_feedback": "Not satisfied with the response quality", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "user_question": "random question" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 400 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # {"response": "feedback received"} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+28
to
+45
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Unauthorized scenario: status/body mismatch For an unauthorized request, asserting 400 with body If you align to the query.feature unauthorized example: -# Then The status code of the response is 400
-# And The body of the response is the following
-# """
-# {"response": "feedback received"}
-# """
+# Then The status code of the response is 400
+# And The body of the response is the following
+# """
+# {"detail": "Unauthorized: No auth header found"}
+# """If the API uses 401 for missing auth: -# Then The status code of the response is 400
+# Then The status code of the response is 401📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if feedback endpoint is not working when feedback is disabled | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And I disable the feedback | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access endpoint "feedback" using HTTP POST with conversation ID conversationID | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "llm_response": "bar", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "sentiment": -1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "user_feedback": "Not satisfied with the response quality", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "user_question": "random question" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 403 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # {"response": "feedback received"} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+46
to
+63
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion “Feedback disabled” scenario: success body used with 403 A 403 should have an error payload, not -# Then The status code of the response is 403
-# And The body of the response is the following
-# """
-# {"response": "feedback received"}
-# """
+# Then The status code of the response is 403
+# And The body of the response is the following
+# """
+# {"detail": "Forbidden: Feedback is disabled"}
+# """📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if feedback endpoint fails with incorrect body format when conversationID is not present | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access endpoint "feedback" using HTTP POST method | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "llm_response": "bar", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "sentiment": -1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "user_feedback": "Not satisfied with the response quality", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "user_question": "random question" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 422 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # { "type": "missing", "loc": [ "body", "conversation_id" ], "msg": "Field required", } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+75
to
+79
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Invalid JSON due to trailing comma in error body Remove the trailing comma. -# { "type": "missing", "loc": [ "body", "conversation_id" ], "msg": "Field required", }
+# { "type": "missing", "loc": [ "body", "conversation_id" ], "msg": "Field required" }📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if feedback/status endpoint is working | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access REST API endpoint "feedback/status" using HTTP GET method | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 200 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # {"functionality": "feedback", "status": { "enabled": true}} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,53 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Feature: Health endpoint API tests | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #TODO: fix test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Background: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The service is started locally | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And REST API service hostname is localhost | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And REST API service port is 8080 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And REST API service prefix is /v1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if service report proper readiness state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access endpoint "readiness" using HTTP GET method | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 200 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response has the following schema | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "ready": "bool", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "reason": "str", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "providers": "list[str]" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # {"ready": true, "reason": "All providers are healthy", "providers": []} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if service report proper readiness state when llama stack is not available | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The llama-stack connection is disrupted | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access endpoint "readiness" using HTTP GET method | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 503 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if service report proper liveness state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access endpoint "liveness" using HTTP GET method | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 200 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response has the following schema | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # "alive": "bool" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # {"alive":true} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if service report proper liveness state when llama stack is not available | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # And The llama-stack connection is disrupted | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # When I access endpoint "liveness" using HTTP GET method | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 503 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1
to
+53
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Feature is entirely commented out; re-enable with @wip instead of commenting As-is, Behave will not discover or run any scenario. Prefer tagging as @wip and excluding via behave.ini (tags = ~@wip) so the file stays syntactically valid and visible. Apply this diff to re-enable the feature (and mark WIP): -# Feature: Health endpoint API tests
-#TODO: fix test
+@wip
+Feature: Health endpoint API tests
+ # TODO: Replace steps with real service control once available.
-# Background:
-# Given The service is started locally
-# And REST API service hostname is localhost
-# And REST API service port is 8080
-# And REST API service prefix is /v1
+ Background:
+ Given The service is started locally
+ And REST API service hostname is localhost
+ And REST API service port is 8080
+ And REST API service prefix is /v1
-# Scenario: Check if service report proper readiness state
-# Given The system is in default state
-# When I access endpoint "readiness" using HTTP GET method
-# Then The status code of the response is 200
-# And The body of the response has the following schema
-# """
-# {
-# "ready": "bool",
-# "reason": "str",
-# "providers": "list[str]"
-# }
-# """
-# And The body of the response is the following
-# """
-# {"ready": true, "reason": "All providers are healthy", "providers": []}
-# """
+ Scenario: Check if service reports proper readiness state
+ Given The system is in default state
+ When I access endpoint "readiness" using HTTP GET method
+ Then The status code of the response is 200
+ And The body of the response has the following schema
+ """
+ {
+ "ready": "bool",
+ "reason": "str",
+ "providers": "list[str]"
+ }
+ """
+ And The body of the response is the following
+ """
+ {"ready": true, "reason": "All providers are healthy", "providers": []}
+ """
-# Scenario: Check if service report proper readiness state when llama stack is not available
-# Given The system is in default state
-# And The llama-stack connection is disrupted
-# When I access endpoint "readiness" using HTTP GET method
-# Then The status code of the response is 503
+ Scenario: Readiness when llama-stack is disrupted
+ Given The system is in default state
+ And The llama-stack connection is disrupted
+ When I access endpoint "readiness" using HTTP GET method
+ Then The status code of the response is 503
-# Scenario: Check if service report proper liveness state
-# Given The system is in default state
-# When I access endpoint "liveness" using HTTP GET method
-# Then The status code of the response is 200
-# And The body of the response has the following schema
-# """
-# {
-# "alive": "bool"
-# }
-# """
-# And The body of the response is the following
-# """
-# {"alive":true}
-# """
+ Scenario: Check if service reports proper liveness state
+ Given The system is in default state
+ When I access endpoint "liveness" using HTTP GET method
+ Then The status code of the response is 200
+ And The body of the response has the following schema
+ """
+ {
+ "alive": "bool"
+ }
+ """
+ And The body of the response is the following
+ """
+ {"alive": true}
+ """
-# Scenario: Check if service report proper liveness state when llama stack is not available
-# Given The system is in default state
-# And The llama-stack connection is disrupted
-# When I access endpoint "liveness" using HTTP GET method
-# Then The status code of the response is 503
+ Scenario: Liveness when llama-stack is disrupted
+ Given The system is in default state
+ And The llama-stack connection is disrupted
+ When I access endpoint "liveness" using HTTP GET method
+ Then The status code of the response is 503📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| # Feature: Info endpoint API tests | ||
| #TODO: fix test | ||
|
|
||
| # Background: | ||
| # Given The service is started locally | ||
| # And REST API service hostname is localhost | ||
| # And REST API service port is 8080 | ||
| # And REST API service prefix is /v1 | ||
|
|
||
| # Scenario: Check if the OpenAPI endpoint works as expected | ||
| # Given The system is in default state | ||
| # When I access endpoint "openapi.json" using HTTP GET method | ||
| # Then The status code of the response is 200 | ||
| # And The body of the response contains OpenAPI | ||
|
|
||
| # Scenario: Check if info endpoint is working | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "info" using HTTP GET method | ||
| # Then The status code of the response is 200 | ||
| # And The body of the response has proper name "lightspeed_stack" and version "0.2.0" | ||
|
|
||
| # Scenario: Check if models endpoint is working | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "models" using HTTP GET method | ||
| # Then The status code of the response is 200 | ||
| # And The body of the response contains gpt | ||
|
|
||
|
|
||
| # Scenario: Check if models endpoint is working | ||
| # Given The system is in default state | ||
| # And The llama-stack connection is disrupted | ||
| # When I access REST API endpoint "models" using HTTP GET method | ||
| # Then The status code of the response is 503 | ||
|
|
||
| # Scenario: Check if metrics endpoint is working | ||
| # Given The system is in default state | ||
| # When I access REST API endpoint "metrics" using HTTP GET method | ||
| # Then The status code of the response is 200 | ||
| # And The body of the response has proper metrics | ||
|
|
||
| # Scenario: Check if metrics endpoint is working | ||
| # Given The system is in default state | ||
| # And The llama-stack connection is disrupted | ||
| # When I access REST API endpoint "metrics" using HTTP GET method | ||
| # Then The status code of the response is 500 | ||
|
|
This file was deleted.
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,60 @@ | ||||||||||||||||||||||||||||||||||||||||
| # Feature: Query endpoint API tests | ||||||||||||||||||||||||||||||||||||||||
| #TODO: fix test | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1
to
+3
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Uncomment and tag the Feature header to avoid parser errors Same issue as other features: the fully-commented file is not a valid feature for Behave. -# Feature: Query endpoint API tests
-#TODO: fix test
+@wip
+Feature: Query endpoint API tests
+# TODO: fix test📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||
| # Background: | ||||||||||||||||||||||||||||||||||||||||
| # Given The service is started locally | ||||||||||||||||||||||||||||||||||||||||
| # And REST API service hostname is localhost | ||||||||||||||||||||||||||||||||||||||||
| # And REST API service port is 8080 | ||||||||||||||||||||||||||||||||||||||||
| # And REST API service prefix is /v1 | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if LLM responds to sent question | ||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||
| # When I use "query" to ask question "Say hello" | ||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 200 | ||||||||||||||||||||||||||||||||||||||||
| # And The response should have proper LLM response format | ||||||||||||||||||||||||||||||||||||||||
| # And The response should contain following fragments | ||||||||||||||||||||||||||||||||||||||||
| # | Fragments in LLM response | | ||||||||||||||||||||||||||||||||||||||||
| # | Hello | | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if LLM responds to sent question with different system prompt | ||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||
| # And I change the system prompt to "new system prompt" | ||||||||||||||||||||||||||||||||||||||||
| # When I use "query" to ask question "Say hello" | ||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 200 | ||||||||||||||||||||||||||||||||||||||||
| # And The response should have proper LLM response format | ||||||||||||||||||||||||||||||||||||||||
| # And The response should contain following fragments | ||||||||||||||||||||||||||||||||||||||||
| # | Fragments in LLM response | | ||||||||||||||||||||||||||||||||||||||||
| # | Hello | | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if LLM responds with error for malformed request | ||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||
| # And I modify the request body by removing the "query" | ||||||||||||||||||||||||||||||||||||||||
| # When I use "query" to ask question "Say hello" | ||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 422 | ||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||
| # { "type": "missing", "loc": [ "body", "system_query" ], "msg": "Field required", } | ||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+30
to
+39
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Mismatch between removed field and expected error JSON; trailing comma makes JSON invalid Step says you remove "query" but the error body points to "system_query". Also the trailing comma before the closing brace invalidates JSON. Two options—pick one for consistency with the API:
In either case, remove the trailing comma. Option A (keep step, fix JSON): -# { "type": "missing", "loc": [ "body", "system_query" ], "msg": "Field required", }
+# { "type": "missing", "loc": [ "body", "query" ], "msg": "Field required" }Option B (change step to system_query, keep JSON key): -# And I modify the request body by removing the "query"
+# And I modify the request body by removing the "system_query"
-# { "type": "missing", "loc": [ "body", "system_query" ], "msg": "Field required", }
+# { "type": "missing", "loc": [ "body", "system_query" ], "msg": "Field required" }
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if LLM responds to sent question with error when not authenticated | ||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||
| # And I remove the auth header | ||||||||||||||||||||||||||||||||||||||||
| # When I use "query" to ask question "Say hello" | ||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 200 | ||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 400 | ||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||
| # {"detail": "Unauthorized: No auth header found"} | ||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+40
to
+50
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Conflicting assertions: double Then with 200 and 400 status codes The “not authenticated” scenario asserts 200 and then 400. Keep only the expected error status. -# Then The status code of the response is 200
-# Then The status code of the response is 400
+# Then The status code of the response is 400If the API standardizes on 401 for missing auth, adjust accordingly: -# Then The status code of the response is 400
+# Then The status code of the response is 401📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||
| # Scenario: Check if LLM responds to sent question with error when not authorized | ||||||||||||||||||||||||||||||||||||||||
| # Given The system is in default state | ||||||||||||||||||||||||||||||||||||||||
| # And I modify the auth header so that the user is it authorized | ||||||||||||||||||||||||||||||||||||||||
| # When I use "query" to ask question "Say hello" | ||||||||||||||||||||||||||||||||||||||||
| # Then The status code of the response is 403 | ||||||||||||||||||||||||||||||||||||||||
| # And The body of the response is the following | ||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||
| # {"detail": "Forbidden: User is not authorized to access this resource"} | ||||||||||||||||||||||||||||||||||||||||
| # """ | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uncomment and tag the Feature header to make the file parsable (keep scenarios commented for now)
Behave requires a real
Feature:header to parse the file. With it commented, the file is invalid. Suggest tagging as@wipand keeping the rest commented until steps land.Apply:
📝 Committable suggestion
🤖 Prompt for AI Agents