Skip to content

Conversation

@tungmhoang
Copy link
Collaborator

@tungmhoang tungmhoang commented Dec 17, 2025

Summary

  • Turbo Test guide

Related PRs, issues, or features (optional)

Metadata

  • Adds new file(s)
  • Edits existing file(s)
  • Removes file(s)

PR contributor checklist

Summary by CodeRabbit

Documentation

  • New Features

    • Added comprehensive guide for running Appium Turbo tests with step-by-step instructions and code examples for Android and iOS.
    • Added guidance for obtaining API base URL from the Help portal.
  • Documentation

    • Updated profile management documentation with new sections on viewing username/email and clarified name change instructions.
    • Enhanced API credentials documentation with API base URL guidance.
    • Simplified GameDriver test documentation title.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Dec 17, 2025

Walkthrough

This pull request adds comprehensive documentation for Appium Turbo test execution with example code for Android and iOS, introduces an API base URL obtainment guide, updates profile management documentation, and adds corresponding navigation links. All changes are documentation-focused with no code modifications.

Changes

Cohort / File(s) Summary
Navigation Update
docs/modules/automation-testing/nav.adoc
Added navigation cross-reference to new Appium Turbo test documentation page under Turbo Test Execution section
Appium Turbo Test Documentation
docs/modules/automation-testing/pages/turbo-test-execution/run-appium-test.adoc
New comprehensive guide covering Appium Turbo Test Execution setup, prerequisites, deployment, and execution with full UIAutomator2 (Android) and XCUITest (iOS) code examples, API workflows, and common limitations
Automation Testing Documentation
docs/modules/automation-testing/pages/turbo-test-execution/run-game-driver-test.adoc
Updated page heading and navtitle from "Run a GameDriver test on Kobiton" to "Run a GameDriver test"
Profile Documentation
docs/modules/profile/pages/manage-your-api-credentials.adoc
Added new section "Obtain the API base URL" with included partial template; renamed "Get the server URL" to "Get the Appium server URL" with updated copy and image alt text
Profile Management Updates
docs/modules/profile/pages/manage-your-profile.adoc
Added new section "View your username and email" describing fields that cannot be edited; updated "Change your name" instructions to reference First name and Last name fields instead of Username
Partial Template
docs/modules/profile/partials/obtain-api-base-url.adoc
New reusable documentation partial providing steps to locate and copy the Base URL from the Help portal's API v2 documentation with supporting images

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~5 minutes

  • All changes are documentation content additions and updates with no code logic or structural complexity
  • Straightforward heading adjustments, new sections, and supplementary content for user guidance
  • Minimal risk of introducing issues; focus review on accuracy and consistency of technical instructions

Suggested reviewers

  • erincbailey

Poem

Hops of joy through docs so bright! 🐰
Appium guides take their flight,
API base URLs now clear,
Profile paths appear,
Testing turbo-charged—what a sight! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Turbo test guide' is too vague and generic. While it mentions 'Turbo test', it doesn't clearly convey the specific main change—adding comprehensive Appium Turbo Test Execution documentation. Consider using a more descriptive title like 'Add Appium Turbo Test Execution documentation' or 'Document Appium Turbo Test setup and execution' to better reflect the primary change.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch turbo-test-guide

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@tungmhoang tungmhoang marked this pull request as ready for review December 19, 2025 11:30
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c9a0bd6 and 3bb15ee.

⛔ Files ignored due to path filters (2)
  • docs/modules/profile/images/api-base-url.png is excluded by !**/*.png
  • docs/modules/profile/images/help-portal-api.png is excluded by !**/*.png
📒 Files selected for processing (6)
  • docs/modules/automation-testing/nav.adoc (1 hunks)
  • docs/modules/automation-testing/pages/turbo-test-execution/run-appium-test.adoc (1 hunks)
  • docs/modules/automation-testing/pages/turbo-test-execution/run-game-driver-test.adoc (1 hunks)
  • docs/modules/profile/pages/manage-your-api-credentials.adoc (3 hunks)
  • docs/modules/profile/pages/manage-your-profile.adoc (1 hunks)
  • docs/modules/profile/partials/obtain-api-base-url.adoc (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: publish-docs-test
🔇 Additional comments (13)
docs/modules/automation-testing/pages/turbo-test-execution/run-game-driver-test.adoc (1)

1-2: LGTM!

The title simplification maintains consistency with the related Appium turbo test documentation while keeping it concise.

docs/modules/profile/pages/manage-your-profile.adoc (1)

18-31: LGTM!

The new "View your username and email" section clearly communicates that these fields are non-editable, providing helpful context before users attempt modifications. The alt text appropriately distinguishes the same image's use across different sections.

docs/modules/automation-testing/nav.adoc (1)

43-45: LGTM!

The new navigation entry correctly links to the Appium Turbo Test guide and is properly positioned alongside the GameDriver documentation within the Turbo Test Execution section.

docs/modules/profile/partials/obtain-api-base-url.adoc (2)

1-1: Verify AsciiDoc comment syntax.

The comment at line 1 uses C-style comment syntax (//) which is valid in AsciiDoc for single-line comments, but verify this is the convention used elsewhere in the partial files of this documentation project to maintain consistency.


3-9: LGTM!

The guidance is clear and well-structured. The two-step process (navigate to Help > API, then locate Base URL) provides sufficient context for users to find the required information. Image references are properly formatted.

docs/modules/profile/pages/manage-your-api-credentials.adoc (3)

6-9: LGTM!

The new "Obtain the API base URL" section properly includes the reusable partial and is logically positioned before the existing credentials sections. The section anchor follows AsciiDoc naming conventions.


21-24: LGTM!

The rename to "Get the Appium server URL" with clarified copy improves documentation clarity by explicitly stating this URL is for Appium automation. The anchor ID change is consistent with the new heading.


45-45: LGTM!

The updated alt text accurately describes the image content and improves accessibility.

docs/modules/automation-testing/pages/turbo-test-execution/run-appium-test.adoc (5)

1-66: LGTM!

The introduction and prerequisites sections are well-structured. The beta notice is appropriately prominent, and the cross-references to related profile documentation are properly formatted.


69-134: LGTM!

The environment variables table is comprehensive and clearly documents all required and optional variables, their purposes, and behavior when omitted. The mapping to Appium capabilities is helpful for developers.


335-447: LGTM!

The packaging, upload, and API execution sections are well-structured with clear instructions for both portal and API-based approaches. The curl examples are properly formatted and the request/response documentation is comprehensive.


448-636: LGTM!

The parameter reference sections are thorough and well-organized. The authentication, request, and response parameters are clearly documented with examples and descriptions for both execution modes.


637-742: LGTM!

The download and demo sections provide practical guidance for retrieving test results and running sample tests. The limitation is appropriately noted at the end.

Comment on lines +176 to +228
String kobitonUrl = System.getenv("KOBITON_URL");
String udid = System.getenv("KOBITON_UDID");
String kobitonSession = System.getenv("KOBITON_SESSION");
String kobitonUsername = System.getenv("KOBITON_USERNAME");
String kobitonApiKey = System.getenv("KOBITON_APIKEY");

// Optional environment variables
String app = System.getenv("KOBITON_APP");
String sessionName = System.getenv("KOBITON_SESSION_NAME");
String sessionDescription = System.getenv("KOBITON_SESSION_DESCRIPTION");
String kobitonRuntime = System.getenv("KOBITON_RUNTIME");

// Validate env vars
if (webdriverUrl == null || kobitonSession == null || udid == null ||
webdriverUrl.isEmpty() || kobitonSession.isEmpty() || udid.isEmpty()) {
System.err.println("Missing required env vars: KOBITON_UDID, KOBITON_WEBDRIVER_URL, or KOBITON_SESSION");
return;
}

// Provide default values for optional env vars if null or empty
if (app == null || app.isEmpty()) {
app = "https://example.com/downloads/sample.apk";
}

if (sessionName == null || sessionName.isEmpty()) {
sessionName = "A Turbo Test session for Android";
}

if (sessionDescription == null || kobitonUsername.isEmpty()) {
sessionDescription = "A sample Turbo Test session for Android";
}

// Capabilities
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("kobiton:sessionName", sessionName);
caps.setCapability("kobiton:sessionDescription", sessionDescription);
caps.setCapability("appium:udid", udid);
caps.setCapability("appium:app", app);
caps.setCapability("appium:automationName", "UIAutomator2");
caps.setCapability("kobiton:session", kobitonSession);
caps.setCapability("appium:username", kobitonUsername);
caps.setCapability("appium:accessKey", kobitonApiKey);
caps.setCapability("kobiton:runtime", kobitonRuntime);

// Initialize driver
AndroidDriver driver = new AndroidDriver(new URI(kobitonBaseUrl).toURL(), caps);

// Save page source
Files.writeString(Path.of("output/page_source.xml"), driver.getPageSource());

// Screenshot
File shot = driver.getScreenshotAs(OutputType.FILE);
Files.copy(shot.toPath(), Path.of("output/screenshot.png"), StandardCopyOption.REPLACE_EXISTING);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix variable naming inconsistencies in the Android example.

The code has several critical variable naming errors that would cause runtime failures:

  1. Line 189-191: Validation checks undefined variable webdriverUrl instead of kobitonUrl (defined at line 176)
  2. Line 191: Error message references non-existent env var KOBITON_WEBDRIVER_URL instead of KOBITON_URL
  3. Line 204: Logic error checks kobitonUsername.isEmpty() when it should check sessionDescription == null || sessionDescription.isEmpty()
  4. Line 221: References undefined variable kobitonBaseUrl instead of kobitonUrl

Additionally, driver.quit() is called twice (lines 231 and 234), which is redundant.

🔎 Proposed fixes for Android example
             // Required environment variables
             String kobitonUrl  = System.getenv("KOBITON_URL");
             String udid = System.getenv("KOBITON_UDID");
             String kobitonSession = System.getenv("KOBITON_SESSION");
             String kobitonUsername = System.getenv("KOBITON_USERNAME");
             String kobitonApiKey = System.getenv("KOBITON_APIKEY");

             // Optional environment variables
             String app = System.getenv("KOBITON_APP");
             String sessionName = System.getenv("KOBITON_SESSION_NAME");
             String sessionDescription = System.getenv("KOBITON_SESSION_DESCRIPTION");
             String kobitonRuntime = System.getenv("KOBITON_RUNTIME");

             // Validate env vars
-            if (webdriverUrl == null || kobitonSession == null || udid == null ||
-                    webdriverUrl.isEmpty() || kobitonSession.isEmpty() || udid.isEmpty())  {
-                System.err.println("Missing required env vars: KOBITON_UDID, KOBITON_WEBDRIVER_URL, or KOBITON_SESSION");
+            if (kobitonUrl == null || kobitonSession == null || udid == null ||
+                    kobitonUrl.isEmpty() || kobitonSession.isEmpty() || udid.isEmpty())  {
+                System.err.println("Missing required env vars: KOBITON_UDID, KOBITON_URL, or KOBITON_SESSION");
                 return;
             }

             // Provide default values for optional env vars if null or empty
             if (app == null || app.isEmpty()) {
                 app = "https://example.com/downloads/sample.apk";
             }

             if (sessionName == null || sessionName.isEmpty()) {
                 sessionName = "A Turbo Test session for Android";
             }

-            if (sessionDescription == null || kobitonUsername.isEmpty()) {
+            if (sessionDescription == null || sessionDescription.isEmpty()) {
                 sessionDescription = "A sample Turbo Test session for Android";
             }

             // Capabilities
             DesiredCapabilities caps = new DesiredCapabilities();
             caps.setCapability("kobiton:sessionName", sessionName);
             caps.setCapability("kobiton:sessionDescription", sessionDescription);
             caps.setCapability("appium:udid", udid);
             caps.setCapability("appium:app", app);
             caps.setCapability("appium:automationName", "UIAutomator2");
             caps.setCapability("kobiton:session", kobitonSession);
             caps.setCapability("appium:username", kobitonUsername);
             caps.setCapability("appium:accessKey", kobitonApiKey);
             caps.setCapability("kobiton:runtime", kobitonRuntime);

             // Initialize driver
-            AndroidDriver driver = new AndroidDriver(new URI(kobitonBaseUrl).toURL(), caps);
+            AndroidDriver driver = new AndroidDriver(new URI(kobitonUrl).toURL(), caps);

             // Save page source
             Files.writeString(Path.of("output/page_source.xml"), driver.getPageSource());

             // Screenshot
             File shot = driver.getScreenshotAs(OutputType.FILE);
             Files.copy(shot.toPath(), Path.of("output/screenshot.png"), StandardCopyOption.REPLACE_EXISTING);
             log.write("Screenshot saved\n");

             driver.quit();
             log.write("Completed successfully at " + LocalDateTime.now() + "\n");
-
-            driver.quit();

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
docs/modules/automation-testing/pages/turbo-test-execution/run-appium-test.adoc
around lines 176-228, fix variable naming and a redundant quit: in the env
validation replace webdriverUrl with kobitonUrl and update the error message to
mention KOBITON_URL; change the sessionDescription check to verify
sessionDescription == null || sessionDescription.isEmpty() (not
kobitonUsername.isEmpty()); use kobitonUrl (not kobitonBaseUrl) when
constructing the driver URI; and remove the duplicated driver.quit() so the
driver is only quit once.

Comment on lines +264 to +309
String kobitonUrl = System.getenv("KOBITON_URL");
String udid = System.getenv("KOBITON_UDID");
String kobitonSession = System.getenv("KOBITON_SESSION");
String kobitonUsername = System.getenv("KOBITON_USERNAME");
String kobitonApiKey = System.getenv("KOBITON_APIKEY");

// Optional environment variables
String app = System.getenv("KOBITON_APP");
String sessionName = System.getenv("KOBITON_SESSION_NAME");
String sessionDescription = System.getenv("KOBITON_SESSION_DESCRIPTION");
String kobitonRuntime = System.getenv("KOBITON_RUNTIME");

// Validate env vars
if (webdriverUrl == null || kobitonSession == null || udid == null ||
webdriverUrl.isEmpty() || kobitonSession.isEmpty() || udid.isEmpty()) {
System.err.println("Missing required env vars: KOBITON_UDID, KOBITON_WEBDRIVER_URL, or KOBITON_SESSION");
return;
}

// Provide default values for optional env vars if null or empty
if (app == null || app.isEmpty()) {
app = "https://example.com/downloads/sample.ipa";
}

if (sessionName == null || sessionName.isEmpty()) {
sessionName = "A Turbo Test session for iOS";
}

if (sessionDescription == null || kobitonUsername.isEmpty()) {
sessionDescription = "A sample Turbo Test session for iOS";
}

// Capabilities
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("kobiton:sessionName", sessionName);
caps.setCapability("kobiton:sessionDescription", sessionDescription);
caps.setCapability("appium:udid", udid);
caps.setCapability("appium:app", app);
caps.setCapability("appium:automationName", "XCUITest");
caps.setCapability("kobiton:session", kobitonSession);
caps.setCapability("appium:username", kobitonUsername);
caps.setCapability("appium:accessKey", kobitonApiKey);
caps.setCapability("kobiton:runtime", kobitonRuntime);

// Initialize driver
IOSDriver driver = new IOSDriver(new URI(kobitonUrl).toURL(), caps);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix variable naming inconsistencies in the iOS example.

The iOS example has the same critical variable naming errors as the Android example:

  1. Line 277-279: Validation checks undefined variable webdriverUrl instead of kobitonUrl
  2. Line 279: Error message references non-existent env var KOBITON_WEBDRIVER_URL instead of KOBITON_URL
  3. Line 292: Logic error checks kobitonUsername.isEmpty() when it should check sessionDescription == null || sessionDescription.isEmpty()

Additionally, driver.quit() is called twice (lines 319 and 322).

🔎 Proposed fixes for iOS example
             // Required environment variables
             String kobitonUrl  = System.getenv("KOBITON_URL");
             String udid = System.getenv("KOBITON_UDID");
             String kobitonSession = System.getenv("KOBITON_SESSION");
             String kobitonUsername = System.getenv("KOBITON_USERNAME");
             String kobitonApiKey = System.getenv("KOBITON_APIKEY");

             // Optional environment variables
             String app = System.getenv("KOBITON_APP");
             String sessionName = System.getenv("KOBITON_SESSION_NAME");
             String sessionDescription = System.getenv("KOBITON_SESSION_DESCRIPTION");
             String kobitonRuntime = System.getenv("KOBITON_RUNTIME");

             // Validate env vars
-            if (webdriverUrl == null || kobitonSession == null || udid == null ||
-                    webdriverUrl.isEmpty() || kobitonSession.isEmpty() || udid.isEmpty())  {
-                System.err.println("Missing required env vars: KOBITON_UDID, KOBITON_WEBDRIVER_URL, or KOBITON_SESSION");
+            if (kobitonUrl == null || kobitonSession == null || udid == null ||
+                    kobitonUrl.isEmpty() || kobitonSession.isEmpty() || udid.isEmpty())  {
+                System.err.println("Missing required env vars: KOBITON_UDID, KOBITON_URL, or KOBITON_SESSION");
                 return;
             }

             // Provide default values for optional env vars if null or empty
             if (app == null || app.isEmpty()) {
                 app = "https://example.com/downloads/sample.ipa";
             }

             if (sessionName == null || sessionName.isEmpty()) {
                 sessionName = "A Turbo Test session for iOS";
             }

-            if (sessionDescription == null || kobitonUsername.isEmpty()) {
+            if (sessionDescription == null || sessionDescription.isEmpty()) {
                 sessionDescription = "A sample Turbo Test session for iOS";
             }

             // Capabilities
             DesiredCapabilities caps = new DesiredCapabilities();
             caps.setCapability("kobiton:sessionName", sessionName);
             caps.setCapability("kobiton:sessionDescription", sessionDescription);
             caps.setCapability("appium:udid", udid);
             caps.setCapability("appium:app", app);
             caps.setCapability("appium:automationName", "XCUITest");
             caps.setCapability("kobiton:session", kobitonSession);
             caps.setCapability("appium:username", kobitonUsername);
             caps.setCapability("appium:accessKey", kobitonApiKey);
             caps.setCapability("kobiton:runtime", kobitonRuntime);

             // Initialize driver
             IOSDriver driver = new IOSDriver(new URI(kobitonUrl).toURL(), caps);

             // Save page source
             Files.writeString(Path.of("output/page_source.xml"), driver.getPageSource());

             // Screenshot
             File shot = driver.getScreenshotAs(OutputType.FILE);
             Files.copy(shot.toPath(), Path.of("output/screenshot.png"), StandardCopyOption.REPLACE_EXISTING);
             log.write("Screenshot saved\n");

             driver.quit();
             log.write("Completed successfully at " + LocalDateTime.now() + "\n");
-
-            driver.quit();

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
docs/modules/automation-testing/pages/turbo-test-execution/run-appium-test.adoc
around lines 264 to 309, fix variable naming and logic errors: replace undefined
webdriverUrl with kobitonUrl in the null/empty validation, update the error
message to mention KOBITON_URL (not KOBITON_WEBDRIVER_URL), change the
sessionDescription check to verify sessionDescription == null ||
sessionDescription.isEmpty(), and remove the duplicate driver.quit() call so the
driver is only quit once; ensure all references to the Kobiton WebDriver URL
variable consistently use kobitonUrl and validate it before constructing the
IOSDriver URI.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants