From ff08637a04517e25d4d7fd696049a80232f920a8 Mon Sep 17 00:00:00 2001 From: roost-io Date: Sun, 11 Jan 2026 11:51:34 +0530 Subject: [PATCH] Functional test generated by RoostGPT Using AI Model gpt-4o --- functional_tests/README.md | 19 +++ .../.roost/roost_metadata.json | 24 ++++ .../roost_test_1768112379.csv | 11 ++ .../roost_test_1768112379.feature | 108 ++++++++++++++++++ .../roost_test_1768112379.json | 1 + .../roost_test_1768112379.xlsx | Bin 0 -> 10860 bytes 6 files changed, 163 insertions(+) create mode 100644 functional_tests/README.md create mode 100644 functional_tests/roost_test_1768112379/.roost/roost_metadata.json create mode 100644 functional_tests/roost_test_1768112379/roost_test_1768112379.csv create mode 100644 functional_tests/roost_test_1768112379/roost_test_1768112379.feature create mode 100644 functional_tests/roost_test_1768112379/roost_test_1768112379.json create mode 100644 functional_tests/roost_test_1768112379/roost_test_1768112379.xlsx diff --git a/functional_tests/README.md b/functional_tests/README.md new file mode 100644 index 00000000..396790b3 --- /dev/null +++ b/functional_tests/README.md @@ -0,0 +1,19 @@ +# Roost Generated Functional Test + +**Execution Date:** 1/11/2026, 11:51:33 AM + +**Test Unique Identifier:** "roost_test_1768112379" + +**Input(s):** + 1. bankspromot.txt + Path: ../tcs/bankspromot.txt + +**Test Output Folder:** + 1. [roost_test_1768112379.json](roost_test_1768112379/roost_test_1768112379.json) + 2. [roost_test_1768112379.feature](roost_test_1768112379/roost_test_1768112379.feature) + 3. [roost_test_1768112379.csv](roost_test_1768112379/roost_test_1768112379.csv) + 4. [roost_test_1768112379.xlsx](roost_test_1768112379/roost_test_1768112379.xlsx) + 5. [roost_test_1768112379.docx](roost_test_1768112379/roost_test_1768112379.docx) + +--- + diff --git a/functional_tests/roost_test_1768112379/.roost/roost_metadata.json b/functional_tests/roost_test_1768112379/.roost/roost_metadata.json new file mode 100644 index 00000000..63673a6a --- /dev/null +++ b/functional_tests/roost_test_1768112379/.roost/roost_metadata.json @@ -0,0 +1,24 @@ +{ + "project": { + "name": "roost_test_1768112379", + "created_at": "2026-01-11T06:21:33.787Z", + "updated_at": "2026-01-11T06:21:33.787Z" + }, + "files": { + "input_files": [ + { + "fileName": "roost_test_1768112379.txt", + "fileURI": "/var/tmp/Roost/RoostGPT/TCSBaNCS_functional-after-fix/1768112379/functional_tests/roost_test_1768112379/roost_test_1768112379.txt", + "fileSha": "cf83e1357e" + }, + { + "fileName": "bankspromot.txt", + "fileURI": "/var/tmp/Roost/RoostGPT/TCSBaNCS_functional-after-fix/1768112379/functional_tests/roost_test_1768112379/bankspromot.txt", + "fileSha": "14a19da7ed" + } + ] + }, + "api_files": { + "input_files": [] + } +} \ No newline at end of file diff --git a/functional_tests/roost_test_1768112379/roost_test_1768112379.csv b/functional_tests/roost_test_1768112379/roost_test_1768112379.csv new file mode 100644 index 00000000..5f278dc8 --- /dev/null +++ b/functional_tests/roost_test_1768112379/roost_test_1768112379.csv @@ -0,0 +1,11 @@ +Agent Authentication with SSO and MFA +Account Lockout after Failed Login Attempts +RBAC Enforcement for Supervisor Screens +Customer Identification with KBA Verification +PII/PCI Data Masking in Customer Profiles +Session Timeout and Security Handling +Concurrent Session Management +Sensitive Action Audit Trail Verification +Fraud Signal Detection and Additional Verification +Call Recording Access Control Verification +Secure Error Handling and Message Consistency \ No newline at end of file diff --git a/functional_tests/roost_test_1768112379/roost_test_1768112379.feature b/functional_tests/roost_test_1768112379/roost_test_1768112379.feature new file mode 100644 index 00000000..07cf10e8 --- /dev/null +++ b/functional_tests/roost_test_1768112379/roost_test_1768112379.feature @@ -0,0 +1,108 @@ +Feature: Compliance and Security Testing for Agent and Customer Management + + # UI and API Test Scenarios for comprehensive testing + + @authentication @ui @api + Scenario Outline: Agent Authentication with SSO and MFA + Given the agent account is prepared with SSO and MFA + When the agent navigates to the login page + And enters a valid "" and "" + And successfully inputs the MFA code "" + Then the agent should be logged in successfully + And audit logs should contain user ID, timestamp, login attempts, and account lock status + + Examples: + | username | password | mfa_code | + | valid_user | valid_pass | 123456 | + | locked_user | wrong_pass | 123456 | + + @authentication @ui + Scenario Outline: Account Lockout after Failed Login Attempts + Given the agent account is not locked + When the agent repeatedly enters an invalid "" or "" for 5 attempts + Then the account should be locked + And any further login attempts should be prevented + And audit logs should include the account lock status + + Examples: + | username | password | + | valid_user | wrong_pass | + | invalid_user | valid_pass | + + @rbac @ui + Scenario: RBAC Enforcement for Supervisor Screens + Given an agent logs in with basic permissions + When the agent attempts to access a supervisor screen + Then access should be denied and an error message displayed + And audit logs should document the access attempt and role mismatch + + @kba @ui + Scenario Outline: Customer Identification with KBA Verification + Given a customer account exists with KBA setup + When the agent initiates verification and enters the answer "" + Then the system should "" the verification + And audit the session including answer status + + Examples: + | kba_answer | result | + | correct | proceed | + | incorrect | block | + | random | additional | + + @pii @ui + Scenario: PII/PCI Data Masking in Customer Profiles + Given an agent is logged in with access to customer profiles + When visiting a customer profile with PII/PCI data + Then PAN should be partially masked, and CVV completely hidden + And attempts to view masked details should be logged + + @session @ui + Scenario: Session Timeout and Security Handling + Given an agent is logged in with session timeout set to 10 minutes + When the session is idle for over 10 minutes + And the agent attempts any action post-timeout without re-logging + Then the session should end automatically requiring a fresh login + And audit logs must capture session timeout details + + @session @ui @api + Scenario: Concurrent Session Management + Given an agent account is active on Device A + When the same agent logs in on Device B + Then Device B login forces logout from Device A + And an action on Device A should prompt a re-login + And logs should include session terminations and login attempts + + @audit @ui + Scenario: Sensitive Action Audit Trail Verification + Given an agent has permission to change beneficiary details + When a new beneficiary is added + Then the audit log should record the action with full details + And attempts without permissions should be logged for failures + + @fraud @api + Scenario: Fraud Signal Detection and Additional Verification + Given transaction rules are configured to identify high-risk actions + When an agent attempts a transaction exceeding the threshold + Then the system should identify it as high-risk and demand further verification + And audit logs must record the fraud assessment and verification prompt + + @access_control @ui + Scenario: Call Recording Access Control Verification + Given recordings are accessible only by supervisors + When a supervisor searches and plays a recording + Then the action should be successful + And an agent attempting the same should be denied with an error message + And audit trails should log access attempts and roles + + @error_handling @ui + Scenario Outline: Secure Error Handling and Message Consistency + Given an agent has role-based access + When "" triggers a system error + Then the error message should be generic and secure + And should not expose internal system information + + Examples: + | action | + | accessing unauthorized section | + | entering invalid data | + | malicious input for error trigger | diff --git a/functional_tests/roost_test_1768112379/roost_test_1768112379.json b/functional_tests/roost_test_1768112379/roost_test_1768112379.json new file mode 100644 index 00000000..1839d6b2 --- /dev/null +++ b/functional_tests/roost_test_1768112379/roost_test_1768112379.json @@ -0,0 +1 @@ +[{"type":"functional","title":"Agent Authentication with MFA and Account Lockout","description":"Test whether an agent can log in using SSO and MFA, including account lockout after multiple failed attempts.","testId":"TC-001","testDescription":"Agents attempt to log in using SSO credentials and complete MFA. Account lockout handled correctly after failed attempts.","prerequisites":"Agent account exists with SSO and MFA configured. Account not currently locked.","stepsToPerform":"1. Navigate to login page.\n2. Enter valid SSO username and password.\n3. Enter MFA code received.\n4. Repeat steps with invalid password for 5 attempts.\n5. Try logging in again.","expectedResult":"Agent logs in after valid SSO and MFA verification. Account locks after 5 failed attempts, preventing further logins.","negativeVariations":"Attempt login with incorrect SSO/MFA repeatedly to trigger lockout.","auditLogsToVerify":"Log user ID, timestamp, login attempts, and account lock status.","securityAssertions":"Account locks after incorrect attempts, MFA ensures secure login.","priority":"P0","automationFeasibility":"High, Selenium for UI actions, Postman for API verification.","coverageTags":["Authentication","MFA","Account Lockout"]},{"type":"functional","title":"RBAC Enforcement for Supervisor Screens","description":"Ensure that agents cannot access supervisor-only functionalities.","testId":"TC-002","testDescription":"Agents attempting to access supervisor dashboards or screens should be denied.","prerequisites":"Agent account has basic permissions. Supervisor screen URLs available for testing.","stepsToPerform":"1. Login as an agent.\n2. Attempt to access a URL specific to supervisor roles.\n3. Observe the system's response.","expectedResult":"Access to supervisor screens denied to agents, error message displayed.","negativeVariations":"Attempt to access supervisor URLs directly via browser address bar.","auditLogsToVerify":"Documented access attempt, denied action, and role mismatch.","securityAssertions":"Access control policies enforced correctly, preventing unauthorized access.","priority":"P0","automationFeasibility":"Medium, Selenium or Postman depending on access method.","coverageTags":["RBAC","Access Control"]},{"type":"functional","title":"Customer Identification and KBA Verification","description":"Validating customer's identity using KBA during verification processes.","testId":"TC-003","testDescription":"Agents use correct and incorrect answers for KBA questions during customer verification.","prerequisites":"Valid customer account with KBA details set up in the system.","stepsToPerform":"1. Initiate verification for a customer.\n2. Present KBA question.\n3. Enter correct answer.\n4. Reinitiate verification and enter incorrect answer.","expectedResult":"Correct answers proceed verification, incorrect answers block or initiate additional steps.","negativeVariations":"Enter random answers to KBA questions to test resilience.","auditLogsToVerify":"Log customer ID, timestamp, KBA answers passed/failed, session ID.","securityAssertions":"KBA must confirm verified identity securely.","priority":"P1","automationFeasibility":"Medium, Selenium for UI and API verification with mock data.","coverageTags":["KBA Verification","Customer Identification"]},{"type":"functional","title":"PII/PCI Data Masking in Customer Profiles","description":"Verify compliance with PII/PCI data masking rules within customer interfaces.","testId":"TC-004","testDescription":"Check that sensitive information like PAN and CVV are masked in agent interfaces.","prerequisites":"Agent logged in with access to customer profiles containing PII/PCI fields.","stepsToPerform":"1. Access customer profile containing card information.\n2. Observe the visibility of PAN, CVV, and other sensitive data.","expectedResult":"PAN should be partially masked, and CVV completely hidden.","negativeVariations":"Attempt to view masked details through browser inspection tools.","auditLogsToVerify":"Log fields accessed, user role, and masking status confirmed in audit.","securityAssertions":"Data masking prevents unauthorized access to plain data.","priority":"P0","automationFeasibility":"High, Selenium to check UI masking and penetration testing.","coverageTags":["PII","PCI","Data Masking"]},{"type":"functional","title":"Session Timeout and Security Handling","description":"Implement and verify session timeout controls and validity of session tokens post timeout.","testId":"TC-005","testDescription":"Test idle session timeout and subsequent logout handling.","prerequisites":"Agent logged in, session timeout set to configured period (e.g., 10 minutes).","stepsToPerform":"1. Log in as an agent.\n2. Remain idle until timeout period elapses.\n3. Attempt any action post timeout without re-logging.","expectedResult":"Session ends automatically after idle period, requiring fresh login for any action.","negativeVariations":"Leave session idle, then use browser back button to test session resume.","auditLogsToVerify":"Log when the session timed out, attempted actions post-timeout.","securityAssertions":"Automatic logout ensures session is secure from unauthorized activity.","priority":"P1","automationFeasibility":"High, automated scripts to time session discrepancies.","coverageTags":["Session Management","Security"]},{"type":"functional","title":"Concurrent Session Management","description":"Verify that concurrent sessions are not allowed for agents, enforcing a single active session at a time.","testId":"TC-006","testDescription":"Test system behavior when an agent attempts to log in from two different devices simultaneously.","prerequisites":"Agent account is active and currently logged in on a primary device.","stepsToPerform":"1. Log in to the agent account on Device A.\n2. Log in to the same agent account on Device B.\n3. Attempt any action on Device A post Device B login.","expectedResult":"Device B login forces logout from Device A. Actions attempted on Device A should prompt a re-login.","negativeVariations":"Attempt multiple logins from different IPs to test session consistency.","auditLogsToVerify":"Log user ID, timestamp, device ID, session terminations, and login attempts.","securityAssertions":"Sessions should be valid only for one active login per agent.","priority":"P0","automationFeasibility":"High, using Selenium for UI interaction and session API verification.","coverageTags":["Session Management","Concurrency"]},{"type":"functional","title":"Sensitive Action Log and Audit Trail","description":"Ensure sensitive actions like beneficiary management are correctly logged for audit purposes.","testId":"TC-007","testDescription":"Perform a sensitive change in the system and check the audit log for accuracy.","prerequisites":"Agent account with permission to change beneficiary details.","stepsToPerform":"1. Log in to the system as an authorized agent.\n2. Navigate to the beneficiary management section.\n3. Add a new beneficiary.\n4. Save changes.","expectedResult":"New beneficiary addition is successful. Audit log contains user ID, role, timestamp, action, and relevant details.","negativeVariations":"Attempt to add a beneficiary without required permissions to test audit entry on failure.","auditLogsToVerify":"Verify that beneficiary additions are recorded with complete details including who, when, and what was changed.","securityAssertions":"All sensitive actions must be irrevocably logged in the audit trail.","priority":"P0","automationFeasibility":"Medium, because audit log verification may require backend database access.","coverageTags":["Audit Trail","Sensitive Actions"]},{"type":"functional","title":"Fraud Signal Detection and Handling","description":"Ensure that the system correctly detects and handles fraud signals, necessitating additional verification.","testId":"TC-008","testDescription":"Simulate a high-risk transaction to verify if additional fraud checks are invoked.","prerequisites":"Agent account with permission to conduct transactions, fraud rules configured in the system.","stepsToPerform":"1. Log in to the system as an agent.\n2. Attempt a high-value transaction exceeding the defined threshold.\n3. Observe the system prompts for additional verification.","expectedResult":"The system identifies the transaction as high-risk and requires additional steps for verification, such as OTP or approval.","negativeVariations":"Attempt lower-value transactions to verify no unnecessary fraud checks are triggered.","auditLogsToVerify":"Ensure there are logs detailing the risk assessment, user action, and additional verification prompted.","securityAssertions":"High-risk transactions must trigger appropriate security measures.","priority":"P1","automationFeasibility":"High, simulate transactions using test environments.","coverageTags":["Fraud Detection","Risk Management"]},{"type":"functional","title":"Call Recording Access Control Verification","description":"Check if access to call recordings is appropriately restricted to authorized roles.","testId":"TC-009","testDescription":"Verify access controls surrounding the search and play functions for call recordings.","prerequisites":"Recordings available in the system, supervisor role established with necessary permissions.","stepsToPerform":"1. Log in as a supervisor.\n2. Attempt to search for a specific call recording.\n3. Play the call recording.\n4. Log in as an agent and attempt the same actions.","expectedResult":"Supervisor can search and play recordings successfully; agent access is denied with an appropriate message.","negativeVariations":"Try accessing recordings from a role lacking permission to ensure access is blocked.","auditLogsToVerify":"Check logs for attempts to access recordings, user role, time of access, and success/failure indication.","securityAssertions":"Only authorized roles should access sensitive call recordings.","priority":"P0","automationFeasibility":"Medium, require both UI and backend log validations.","coverageTags":["Access Control","Call Recording"]},{"type":"functional","title":"Secure Error Handling and Message Consistency","description":"Ensure that error messages do not leak sensitive system information.","testId":"TC-010","testDescription":"Trigger various errors intentionally and validate that error messages are generic and do not expose internal details.","prerequisites":"Agent role with access to systems prone to standard errors.","stepsToPerform":"1. Log in as an agent.\n2. Intentionally cause system errors by entering invalid data or accessing unauthorized areas.\n3. Observe the error messages produced.","expectedResult":"Error messages should be consistent across different scenarios and should not divulge any system internals or sensitive information.","negativeVariations":"Attempt unauthorized access with malicious input to test error handling response.","auditLogsToVerify":"Review logs for handled errors and confirm error message outputs.","securityAssertions":"Errors must be handled securely to prevent information disclosure.","priority":"P1","automationFeasibility":"High, as errors can be simulated and validated through automated scripts.","coverageTags":["Error Handling","Security"]},{"type":"functional","title":"Concurrent Session Management for Agent Accounts","description":"Verify that concurrent sessions are not allowed for agents, ensuring a single active session at a time.","testId":"TC-006","testDescription":"Test system behavior when an agent attempts to log in from two different devices simultaneously.","prerequisites":"Agent account is active and currently logged in on a primary device.","stepsToPerform":"1. Log in to the agent account on Device A.\n2. Log in to the same agent account on Device B.\n3. Attempt any action on Device A post Device B login.","expectedResult":"Device B login forces logout from Device A. Actions attempted on Device A should prompt a re-login.","negativeVariations":"Attempt multiple logins from different IPs to test session consistency.","auditLogsToVerify":"Log user ID, timestamp, device ID, session terminations, and login attempts.","securityAssertions":"Sessions should be valid only for one active login per agent.","priority":"P0","automationFeasibility":"High, using Selenium for UI interaction and session API verification.","coverageTags":["Session Management","Concurrency"]},{"type":"functional","title":"Sensitive Action Audit Trail Verification","description":"Ensure sensitive actions like beneficiary management are correctly logged for audit purposes.","testId":"TC-007","testDescription":"Perform a sensitive change in the system and check the audit log for accuracy.","prerequisites":"Agent account with permission to change beneficiary details.","stepsToPerform":"1. Log in to the system as an authorized agent.\n2. Navigate to the beneficiary management section.\n3. Add a new beneficiary.\n4. Save changes.","expectedResult":"New beneficiary addition is successful. Audit log contains user ID, role, timestamp, action, and relevant details.","negativeVariations":"Attempt to add a beneficiary without required permissions to test audit entry on failure.","auditLogsToVerify":"Verify that beneficiary additions are recorded with complete details including who, when, and what was changed.","securityAssertions":"All sensitive actions must be irrevocably logged in the audit trail.","priority":"P0","automationFeasibility":"Medium, because audit log verification may require backend database access.","coverageTags":["Audit Trail","Sensitive Actions"]},{"type":"functional","title":"Fraud Signal Detection and Handling","description":"Ensure that the system correctly detects and handles fraud signals, necessitating additional verification.","testId":"TC-008","testDescription":"Simulate a high-risk transaction to verify if additional fraud checks are invoked.","prerequisites":"Agent account with permission to conduct transactions, fraud rules configured in the system.","stepsToPerform":"1. Log in to the system as an agent.\n2. Attempt a high-value transaction exceeding the defined threshold.\n3. Observe the system prompts for additional verification.","expectedResult":"The system identifies the transaction as high-risk and requires additional steps for verification, such as OTP or approval.","negativeVariations":"Attempt lower-value transactions to verify no unnecessary fraud checks are triggered.","auditLogsToVerify":"Ensure there are logs detailing the risk assessment, user action, and additional verification prompted.","securityAssertions":"High-risk transactions must trigger appropriate security measures.","priority":"P1","automationFeasibility":"High, simulate transactions using test environments.","coverageTags":["Fraud Detection","Risk Management"]},{"type":"functional","title":"Call Recording Access Control Verification","description":"Check if access to call recordings is appropriately restricted to authorized roles.","testId":"TC-009","testDescription":"Verify access controls surrounding the search and play functions for call recordings.","prerequisites":"Recordings available in the system, supervisor role established with necessary permissions.","stepsToPerform":"1. Log in as a supervisor.\n2. Attempt to search for a specific call recording.\n3. Play the call recording.\n4. Log in as an agent and attempt the same actions.","expectedResult":"Supervisor can search and play recordings successfully; agent access is denied with an appropriate message.","negativeVariations":"Try accessing recordings from a role lacking permission to ensure access is blocked.","auditLogsToVerify":"Check logs for attempts to access recordings, user role, time of access, and success/failure indication.","securityAssertions":"Only authorized roles should access sensitive call recordings.","priority":"P0","automationFeasibility":"Medium, require both UI and backend log validations.","coverageTags":["Access Control","Call Recording"]},{"type":"functional","title":"Secure Error Handling and Message Consistency","description":"Ensure that error messages do not leak sensitive system information.","testId":"TC-010","testDescription":"Trigger various errors intentionally and validate that error messages are generic and do not expose internal details.","prerequisites":"Agent role with access to systems prone to standard errors.","stepsToPerform":"1. Log in as an agent.\n2. Intentionally cause system errors by entering invalid data or accessing unauthorized areas.\n3. Observe the error messages produced.","expectedResult":"Error messages should be consistent across different scenarios and should not divulge any system internals or sensitive information.","negativeVariations":"Attempt unauthorized access with malicious input to test error handling response.","auditLogsToVerify":"Review logs for handled errors and confirm error message outputs.","securityAssertions":"Errors must be handled securely to prevent information disclosure.","priority":"P1","automationFeasibility":"High, as errors can be simulated and validated through automated scripts.","coverageTags":["Error Handling","Security"]}] \ No newline at end of file diff --git a/functional_tests/roost_test_1768112379/roost_test_1768112379.xlsx b/functional_tests/roost_test_1768112379/roost_test_1768112379.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7d1548b5c6ca0c6dadca040a61c47e06b04acbaf GIT binary patch literal 10860 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 yAL-?{b^z5sKz}8hKh^)-5Pz#9()_(teo^C;