Manual Test Guide
Nouto Desktop App: Manual Test Guide
Section titled “Nouto Desktop App: Manual Test Guide”Purpose
Section titled “Purpose”This document walks you through every feature of the Nouto desktop app, one step at a time. You do not need any prior experience with API clients or programming. Each scenario tells you exactly what to click, what to type, and what to expect. If something does not match the expected result, mark it as failed and file a GitHub issue.
Prerequisites
Section titled “Prerequisites”- Nouto desktop app installed on your computer
- Node.js (version 18 or later) installed. Download it from https://nodejs.org
- pnpm package manager installed. After installing Node.js, open a terminal and run:
Verify it works by running
Terminal window npm install -g pnpmpnpm --version. You should see a version number. - Internet connection (some tests use public online APIs)
What is an API?
Section titled “What is an API?”An API (Application Programming Interface) is a way for programs to talk to each other over the internet. When you type a URL in a browser, you are making a request to a server. The server sends back a response (usually a web page). API clients like Nouto let you send these requests manually and inspect the responses in detail, which is useful for building and testing software.
How to Log Your Results
Section titled “How to Log Your Results”Since you are reading this guide on a website, the checkboxes are not interactive. Use one of these methods to track your results:
- Spreadsheet template (recommended): Download the test results template and open it in Google Sheets, Excel, or LibreOffice Calc. All 193 scenarios are already listed. Just fill in the Result column with
PassorFailand add any observations in the Notes column. - Print this page: Print this guide (or save it as a PDF with
Ctrl+P) and check off each scenario with a pen. - Notepad: Open a text file and write the scenario number and result for each test, e.g.:
1.1 - Pass1.2 - Pass1.3 - Fail - Could not find About section
When you are done, share the completed spreadsheet or notes with the development team.
Conventions
Section titled “Conventions”- Steps are numbered. Follow them in order.
- Expected describes what you should see after completing the steps.
- Each scenario ends with
- [ ] Pass. Mark it as “Pass” or “Fail” in your tracking sheet. - Text in
monospaceis something you type or click exactly as written. >means a menu path: “File > New” means click File, then click New.
Starting the Test Servers
Section titled “Starting the Test Servers”Some tests require local servers running on your computer. Open a terminal (Command Prompt, PowerShell, or Terminal) for each server. You can start them all at once before you begin, or start each one when you reach the relevant section.
WebSocket Echo Server (needed for Section 16):
cd test-servers/ws-echo-testpnpm installnode server.jsYou should see: WebSocket echo server running on ws://localhost:4001
SSE Server (needed for Section 17):
cd test-servers/sse-testpnpm installnode server.jsYou should see: SSE test server running on http://localhost:4002
GraphQL Subscriptions Server (needed for Section 18):
cd test-servers/gql-sub-testpnpm installnode server.jsYou should see the server running on port 4000.
gRPC Server (needed for Section 19):
cd test-servers/grpc-testpnpm installnode server.jsYou should see the server running on port 50051.
When a Test Fails
Section titled “When a Test Fails”If a scenario does not produce the expected result, follow these steps before moving on:
-
Take a screenshot of the current state of the app.
- Windows: press
Win + Shift + S, then select the area to capture. The screenshot is saved to your clipboard; paste it into a file or directly into the GitHub issue. - Mac: press
Cmd + Shift + 4, then select the area. The screenshot is saved to your Desktop.
- Windows: press
-
Open the Developer Tools to check for errors.
- Press
Ctrl + Shift + I(Windows) orCmd + Option + I(Mac) to open the DevTools panel. - Click the Console tab.
- Look for red error messages. If you see any, take a screenshot of the console too.
- You do not need to understand the errors. Just capture them for the bug report.
- Press
-
Copy diagnostics from the app.
- Go to Settings > Desktop > Copy Diagnostics. This copies system info to your clipboard.
- Paste it into your bug report.
-
Note what happened in your own words: what you saw, what was missing, or what looked wrong.
-
File a GitHub issue (see below), then continue testing. Do not stop at the first failure.
Reporting Issues
Section titled “Reporting Issues”If any scenario fails, or you notice something unexpected (a crash, confusing behavior, or a visual glitch), please create a GitHub issue.
Where to file: https://github.com/frostybee/nouto/issues
Use this template:
Title: Short description (e.g., “WebSocket: echo message not received”)
Section & Scenario: Section 16, Scenario 16.3
Steps to reproduce:
- (Copy the steps from this guide)
- (Note any deviations from the guide)
Expected result: (What this guide said should happen)
Actual result: (What actually happened)
Screenshots: Attach screenshots of the app and, if applicable, the DevTools console.
Console errors: (Paste any red error messages from DevTools > Console, or write “None” if the console was clean)
Diagnostics: (Paste the output from Settings > Desktop > Copy Diagnostics)
Environment:
- OS: (e.g., Windows 11, macOS 14)
- App version: (from Settings > About)
Labels: Use
bugfor broken functionality,uxfor confusing or unintuitive behavior.
Test Sections
Section titled “Test Sections”Section 1: First Launch and Orientation
Section titled “Section 1: First Launch and Orientation”What is a REST client? A REST client is an application that lets you send HTTP requests to servers and inspect the responses. Think of it as a more powerful browser that shows you all the technical details of each request.
1.1 Launch the App
Section titled “1.1 Launch the App”Steps:
- Open the Nouto desktop app.
Expected: The app opens with a welcome screen or an empty workspace. You should see:
- A toolbar at the top with workspace, environment, and settings controls
- An activity rail on the far left (vertical strip of icons)
- A sidebar on the left with tabs (Collections, History, Trash)
- A main panel in the center (empty or showing a welcome screen)
- A status bar at the bottom
- [ ] Pass
1.2 Create a New Project
Section titled “1.2 Create a New Project”Steps:
- Click the workspace menu (top-left area of the toolbar, or the folder icon).
- Click New Project.
- Choose a folder on your computer (e.g., create a folder called
nouto-teston your Desktop). - Confirm creation.
Expected: The app creates a new project. The title bar or workspace area shows the project name. The sidebar should be empty (no collections yet).
- [ ] Pass
1.3 Check App Version
Section titled “1.3 Check App Version”Steps:
- Click the gear icon (Settings) in the activity rail or toolbar.
- Navigate to About.
Expected: You see the app version number (e.g., 0.1.0). Note this version for bug reports.
- [ ] Pass
1.4 Toggle the Sidebar
Section titled “1.4 Toggle the Sidebar”Steps:
- Click the sidebar toggle button (usually a hamburger icon or panel icon in the toolbar).
- Click it again to bring the sidebar back.
Expected: The sidebar hides and shows. The main panel expands to fill the space when the sidebar is hidden.
- [ ] Pass
1.5 Resize Panels
Section titled “1.5 Resize Panels”Steps:
- Hover your mouse over the border between the sidebar and the main panel. The cursor should change to a resize cursor.
- Click and drag left or right to resize.
- If there is a request/response split in the main panel, try resizing that divider too.
Expected: Panels resize smoothly. Content adjusts to the new size.
- [ ] Pass
Section 2: Basic HTTP Requests
Section titled “Section 2: Basic HTTP Requests”What is an HTTP request? When you visit a website, your browser sends an HTTP request to a server. The request has a “method” (like GET to fetch data, or POST to send data) and a URL (the address). The server sends back a response with a status code (like 200 for success) and data.
2.1 Send a GET Request
Section titled “2.1 Send a GET Request”Steps:
- Click the New Request button (or press
Ctrl+N). - Make sure the method dropdown says GET.
- In the URL bar, type:
https://jsonplaceholder.typicode.com/posts/1 - Click Send (or press
Ctrl+Enter).
Expected: The response panel appears with:
- Status: 200 OK (shown in green)
- Body containing JSON with fields like
userId,id,title, andbody - Duration in milliseconds
- Size information
- [ ] Pass
2.2 Send a POST Request with JSON Body
Section titled “2.2 Send a POST Request with JSON Body”Steps:
- Open a new request tab.
- Change the method dropdown to POST.
- In the URL bar, type:
https://jsonplaceholder.typicode.com/posts - Click the Body tab in the request panel.
- Select JSON as the body type.
- In the body editor, type:
{"title": "Test Post","body": "This is a test","userId": 1}
- Click Send.
Expected: Status: 201 Created. The response body contains the data you sent, plus an id field (e.g., 101).
- [ ] Pass
2.3 Send a PUT Request
Section titled “2.3 Send a PUT Request”Steps:
- Open a new request tab.
- Change the method to PUT.
- URL:
https://jsonplaceholder.typicode.com/posts/1 - Click the Body tab, select JSON, and type:
{"id": 1,"title": "Updated Title","body": "Updated content","userId": 1}
- Click Send.
Expected: Status: 200 OK. The response body shows the updated data.
- [ ] Pass
2.4 Send a PATCH Request
Section titled “2.4 Send a PATCH Request”Steps:
- Open a new request tab.
- Change the method to PATCH.
- URL:
https://jsonplaceholder.typicode.com/posts/1 - Body tab > JSON:
{"title": "Patched Title"}
- Click Send.
Expected: Status: 200 OK. The response body shows the post with title changed to "Patched Title" and other fields unchanged.
- [ ] Pass
2.5 Send a DELETE Request
Section titled “2.5 Send a DELETE Request”Steps:
- Open a new request tab.
- Change the method to DELETE.
- URL:
https://jsonplaceholder.typicode.com/posts/1 - Click Send.
Expected: Status: 200 OK. The response body is an empty object {}.
- [ ] Pass
2.6 Send a HEAD Request
Section titled “2.6 Send a HEAD Request”Steps:
- Open a new request tab.
- Change the method to HEAD.
- URL:
https://jsonplaceholder.typicode.com/posts/1 - Click Send.
Expected: Status: 200 OK. The response body is empty (HEAD requests only return headers, no body). Response headers should still be visible in the Headers tab.
- [ ] Pass
2.7 Send an OPTIONS Request
Section titled “2.7 Send an OPTIONS Request”Steps:
- Open a new request tab.
- Change the method to OPTIONS.
- URL:
https://httpbin.org/get - Click Send.
Expected: Status: 200 OK. The response includes CORS-related headers like Access-Control-Allow-Methods.
- [ ] Pass
2.8 Request with Query Parameters
Section titled “2.8 Request with Query Parameters”Steps:
- Open a new request tab.
- Method: GET.
- URL:
https://httpbin.org/get - Click the Query tab (or Params tab) in the request panel.
- Add a parameter: Key =
name, Value =Alice - Add another parameter: Key =
age, Value =30 - Click Send.
Expected: Status: 200 OK. In the response body, you should see an args object containing "name": "Alice" and "age": "30". The URL bar should update to show ?name=Alice&age=30.
- [ ] Pass
2.9 Request with Custom Headers
Section titled “2.9 Request with Custom Headers”Steps:
- Open a new request tab.
- Method: GET.
- URL:
https://httpbin.org/headers - Click the Headers tab in the request panel.
- Add a header: Key =
X-Custom-Header, Value =HelloWorld - Add another header: Key =
X-Test-Id, Value =12345 - Click Send.
Expected: Status: 200 OK. The response body shows a headers object that includes "X-Custom-Header": "HelloWorld" and "X-Test-Id": "12345".
- [ ] Pass
2.10 Cancel a Long-Running Request
Section titled “2.10 Cancel a Long-Running Request”Steps:
- Open a new request tab.
- Method: GET.
- URL:
https://httpbin.org/delay/10(this endpoint waits 10 seconds before responding). - Click Send.
- Immediately click the Cancel button (it replaces the Send button while a request is in progress).
Expected: The request is cancelled. You should see a cancellation message or error instead of a response. The duration should be much less than 10 seconds.
- [ ] Pass
2.11 Send with Keyboard Shortcut
Section titled “2.11 Send with Keyboard Shortcut”Steps:
- Open a new request tab.
- Method: GET.
- URL:
https://httpbin.org/get - Press
Ctrl+Enter(instead of clicking Send).
Expected: The request is sent and you receive a 200 OK response, same as clicking the Send button.
- [ ] Pass
Section 3: Request Body Types
Section titled “Section 3: Request Body Types”What is a request body? When you send data to a server (like submitting a form), the data goes in the request body. Different formats exist for different purposes: JSON is the most common for APIs, Form Data is used for file uploads, and URL-encoded is what browsers use for HTML forms.
3.1 JSON Body
Section titled “3.1 JSON Body”Steps:
- Open a new request tab. Method: POST. URL:
https://httpbin.org/post - Body tab > select JSON.
- Type:
{ "message": "Hello JSON" }
- Click Send.
Expected: Status: 200 OK. The response json field contains { "message": "Hello JSON" }. The headers section shows Content-Type as application/json.
- [ ] Pass
3.2 Text Body
Section titled “3.2 Text Body”Steps:
- Open a new request tab. Method: POST. URL:
https://httpbin.org/post - Body tab > select Text.
- Type:
Hello, this is plain text - Click Send.
Expected: Status: 200 OK. The response data field contains "Hello, this is plain text". The Content-Type header should be text/plain.
- [ ] Pass
3.3 XML Body
Section titled “3.3 XML Body”Steps:
- Open a new request tab. Method: POST. URL:
https://httpbin.org/post - Body tab > select XML.
- Type:
<note><to>Tester</to><message>Hello XML</message></note>
- Click Send.
Expected: Status: 200 OK. The response data field contains the XML text you typed.
- [ ] Pass
3.4 Form Data
Section titled “3.4 Form Data”Steps:
- Open a new request tab. Method: POST. URL:
https://httpbin.org/post - Body tab > select Form Data (multipart).
- Add a field: Key =
username, Value =tester - Add a field: Key =
color, Value =blue - Click Send.
Expected: Status: 200 OK. The response form field contains "username": "tester" and "color": "blue".
- [ ] Pass
3.5 URL-Encoded Form
Section titled “3.5 URL-Encoded Form”Steps:
- Open a new request tab. Method: POST. URL:
https://httpbin.org/post - Body tab > select URL Encoded.
- Add a field: Key =
email, Value =test@example.com - Add a field: Key =
password, Value =secret123 - Click Send.
Expected: Status: 200 OK. The response form field contains "email": "test@example.com" and "password": "secret123". The Content-Type header shows application/x-www-form-urlencoded.
- [ ] Pass
3.6 Binary File Upload
Section titled “3.6 Binary File Upload”Steps:
- Open a new request tab. Method: POST. URL:
https://httpbin.org/post - Body tab > select Binary.
- Click the file picker and choose any small file from your computer (e.g., a
.txtor.pngfile). - Click Send.
Expected: Status: 200 OK. The response should show information about the uploaded file in the data or files field.
- [ ] Pass
Section 4: Response Viewer
Section titled “Section 4: Response Viewer”What is the response viewer? After you send a request, the server’s response appears in the response panel. Nouto provides multiple tabs and views to inspect different parts of the response: the body (the actual data), headers (metadata), cookies, timing, and more.
4.1 Text View vs. Tree View
Section titled “4.1 Text View vs. Tree View”Steps:
- Send a GET request to
https://jsonplaceholder.typicode.com/posts/1. - In the response body, look for a toggle to switch between Text (raw text) and Tree (structured tree) views.
- Switch to Tree view.
- Switch back to Text view.
Expected: Text view shows the raw JSON as formatted text. Tree view shows an expandable/collapsible tree with each field as a node. Both display the same data in different formats.
- [ ] Pass
4.2 Pretty vs. Raw Toggle
Section titled “4.2 Pretty vs. Raw Toggle”Steps:
- With the same response from 4.1 open, look for a Pretty/Raw toggle in the body tab.
- Switch to Raw mode.
- Switch back to Pretty mode.
Expected: Pretty mode shows the JSON nicely formatted with indentation. Raw mode shows the unformatted, compact JSON.
- [ ] Pass
4.3 JSONPath Filter
Section titled “4.3 JSONPath Filter”Steps:
- Send a GET request to
https://jsonplaceholder.typicode.com/posts(note: no/1at the end, so this returns a list). - In the response body area, look for a JSONPath filter input.
- Type:
$[0].title - Press Enter or apply.
Expected: The filtered result shows only the title of the first post, instead of the entire array.
- [ ] Pass
4.4 JSON Stats
Section titled “4.4 JSON Stats”Steps:
- With a JSON response loaded (from step 4.1 or 4.3), look for a JSON stats button or panel.
- Open it.
Expected: You see statistics about the JSON: number of keys, depth, or similar metrics.
- [ ] Pass
4.5 Response Headers Tab
Section titled “4.5 Response Headers Tab”Steps:
- Send a GET request to
https://httpbin.org/get. - Click the Headers tab in the response panel.
Expected: You see two sections: the request headers (what you sent) and the response headers (what the server returned). Response headers should include things like Content-Type, Content-Length, Access-Control-Allow-Origin.
- [ ] Pass
4.6 Cookies Tab
Section titled “4.6 Cookies Tab”Steps:
- Send a GET request to
https://httpbin.org/cookies/set/testcookie/testvalue. - Click the Cookies tab in the response panel.
Expected: You see cookie information. The Set-Cookie header should be visible, showing testcookie=testvalue.
- [ ] Pass
4.7 Timing Breakdown
Section titled “4.7 Timing Breakdown”Steps:
- Send a GET request to
https://httpbin.org/get. - Click the Timing tab in the response panel.
Expected: A timing breakdown showing phases like DNS lookup, TCP connection, TLS handshake, time to first byte (TTFB), and download time. Each phase has a duration in milliseconds.
- [ ] Pass
4.8 Redirect Chain
Section titled “4.8 Redirect Chain”Steps:
- Send a GET request to
https://httpbin.org/redirect/3(this redirects 3 times before responding). - Click the Redirects tab in the response panel (it may only appear when redirects occur).
Expected: Status: 200 OK (the final response). The Redirects tab shows 3 redirect hops, each with its status code (302) and URL.
- [ ] Pass
4.9 Image Response
Section titled “4.9 Image Response”Steps:
- Send a GET request to
https://httpbin.org/image/png. - Look at the response body.
Expected: The response body area shows the PNG image rendered as a preview, rather than raw binary data.
- [ ] Pass
4.10 Download a Response
Section titled “4.10 Download a Response”Steps:
- Send a GET request to
https://jsonplaceholder.typicode.com/posts/1. - Look for a Download button in the response panel.
- Click it and save the file to your Desktop.
Expected: A .json file is saved to your Desktop containing the response body.
- [ ] Pass
4.11 Copy Response and Zoom
Section titled “4.11 Copy Response and Zoom”Steps:
- With a JSON response loaded, try copying the response body (look for a copy button, or select all and
Ctrl+C). - Look for zoom controls (zoom in/out buttons or
Ctrl+/Ctrl-) in the response editor. - Zoom in, then zoom out.
Expected: The response body is copied to clipboard. Zoom controls increase/decrease the font size in the response editor.
- [ ] Pass
Section 5: Collections and Organization
Section titled “Section 5: Collections and Organization”What is a collection? A collection is a group of saved requests, organized into folders. Think of it like a folder on your computer that contains bookmarks. Collections let you save requests you use frequently so you do not have to re-type them.
5.1 Create a New Collection
Section titled “5.1 Create a New Collection”Steps:
- In the sidebar, look for a New Collection button or right-click in the Collections tab.
- Create a new collection named
Test Collection.
Expected: A new collection called Test Collection appears in the sidebar.
- [ ] Pass
5.2 Save a Request to the Collection
Section titled “5.2 Save a Request to the Collection”Steps:
- Open a new request tab. Method: GET. URL:
https://jsonplaceholder.typicode.com/posts - Click the Save button (or
Ctrl+S). - Choose
Test Collectionas the destination. - Name the request
List All Posts. - Confirm save.
Expected: The request List All Posts appears inside Test Collection in the sidebar. The tab title updates to show the saved name.
- [ ] Pass
5.3 Create Nested Folders
Section titled “5.3 Create Nested Folders”Steps:
- Right-click on
Test Collectionin the sidebar. - Select New Folder.
- Name it
Users. - Right-click on the
Usersfolder. - Select New Folder.
- Name it
Admin.
Expected: The sidebar shows: Test Collection > Users > Admin, a folder inside a folder inside a collection.
- [ ] Pass
5.4 Save Requests into Folders
Section titled “5.4 Save Requests into Folders”Steps:
- Open a new request. Method: GET. URL:
https://jsonplaceholder.typicode.com/users - Save it to the
Usersfolder asList Users. - Open another request. Method: GET. URL:
https://jsonplaceholder.typicode.com/users/1 - Save it to the
Adminfolder asGet Admin User.
Expected: Both requests appear in their respective folders in the sidebar.
- [ ] Pass
5.5 Drag and Drop
Section titled “5.5 Drag and Drop”Steps:
- Click and hold the
Get Admin Userrequest in theAdminfolder. - Drag it up to the
Usersfolder (not insideAdmin). - Release.
Expected: The request moves from Admin to Users. Admin folder is now empty.
- [ ] Pass
5.6 Rename a Request and Collection
Section titled “5.6 Rename a Request and Collection”Steps:
- Right-click on
List All Postsin the sidebar. - Select Rename.
- Change the name to
Get All Posts. - Right-click on
Test Collection. - Select Rename (or Edit).
- Change the name to
My API Tests.
Expected: Both items show their new names in the sidebar.
- [ ] Pass
5.7 Duplicate a Request
Section titled “5.7 Duplicate a Request”Steps:
- Right-click on
Get All Posts. - Select Duplicate.
Expected: A copy appears (e.g., Get All Posts (Copy) or similar) in the same location. Opening it shows the same URL and settings as the original.
- [ ] Pass
5.8 Pin a Request
Section titled “5.8 Pin a Request”Steps:
- Right-click on
Get All Posts. - Select Pin (or similar).
Expected: The request appears in a “Pinned” section at the top of the sidebar, making it easy to find.
- [ ] Pass
5.9 Search and Filter Collections
Section titled “5.9 Search and Filter Collections”Steps:
- Look for a search/filter input at the top of the Collections tab.
- Type
User.
Expected: The sidebar filters to show only items matching “User” (e.g., List Users, Users folder). Non-matching items are hidden.
- [ ] Pass
5.10 Sort Collections
Section titled “5.10 Sort Collections”Steps:
- Look for a sort control in the Collections tab (might be a dropdown or sort icon).
- Sort by A-Z.
- Sort by Method.
Expected: The items reorder according to the selected sort option. A-Z sorts alphabetically. Method groups by HTTP method (DELETE, GET, PATCH, POST, PUT).
- [ ] Pass
5.11 Multi-Select and Move
Section titled “5.11 Multi-Select and Move”Steps:
- Hold
Ctrland click onGet All PostsandList Usersto select both. - Right-click on the selection.
- Choose Move (or drag both items to the
Adminfolder).
Expected: Both requests are moved to the Admin folder.
- [ ] Pass
5.12 Copy as cURL
Section titled “5.12 Copy as cURL”Steps:
- Right-click on any saved request (e.g.,
Get All Posts). - Select Copy as cURL.
- Open a text editor and paste (
Ctrl+V).
Expected: A cURL command is pasted, like curl 'https://jsonplaceholder.typicode.com/posts'. It should be a valid cURL command that matches the request’s method, URL, headers, and body.
- [ ] Pass
Section 6: Trash
Section titled “Section 6: Trash”What is Trash? When you delete a request or folder, it goes to the Trash instead of being permanently removed. You can restore items from the Trash or permanently delete them.
6.1 Delete and View in Trash
Section titled “6.1 Delete and View in Trash”Steps:
- Right-click on the
Get All Posts (Copy)request (the duplicate from 5.7). - Select Delete.
- Click the Trash tab in the sidebar.
Expected: The deleted request appears in the Trash tab.
- [ ] Pass
6.2 Restore from Trash
Section titled “6.2 Restore from Trash”Steps:
- In the Trash tab, find the deleted request.
- Click Restore (or right-click > Restore).
Expected: The request reappears in its original location in the Collections tab.
- [ ] Pass
6.3 Permanently Delete
Section titled “6.3 Permanently Delete”Steps:
- Delete the same request again (right-click > Delete in Collections).
- Go to the Trash tab.
- Permanently delete it (right-click > Delete permanently, or similar).
Expected: The request is gone from both Collections and Trash. It cannot be recovered.
- [ ] Pass
Section 7: Environments and Variables
Section titled “Section 7: Environments and Variables”What are environments? Environments let you define variables (like
base_url) that you can reuse across requests. This is useful when you have multiple servers (development, staging, production) and want to switch between them without editing every request.
7.1 Create an Environment
Section titled “7.1 Create an Environment”Steps:
- Click the Environments icon in the activity rail (or open the environments panel).
- Click the Environments tab.
- Click Create Environment (or the + button).
- Name it
Development.
Expected: A new environment called Development appears in the list.
- [ ] Pass
7.2 Add Variables
Section titled “7.2 Add Variables”Steps:
- Select the
Developmentenvironment. - Add a variable: Name =
base_url, Value =https://jsonplaceholder.typicode.com - Add another variable: Name =
post_id, Value =1
Expected: Both variables appear in the environment’s variable list.
- [ ] Pass
7.3 Set Active Environment
Section titled “7.3 Set Active Environment”Steps:
- Set
Developmentas the active environment (click it, or use the environment selector dropdown in the toolbar).
Expected: The environment selector in the toolbar shows Development. The environment may be highlighted or marked as active in the environments panel.
- [ ] Pass
7.4 Use Variables in a Request
Section titled “7.4 Use Variables in a Request”Steps:
- Open a new request tab.
- Method: GET.
- URL:
{{base_url}}/posts/{{post_id}} - Click Send.
Expected: The request is sent to https://jsonplaceholder.typicode.com/posts/1. Status: 200 OK. The response shows the post with id: 1. The variables {{base_url}} and {{post_id}} are substituted with their values from the active environment.
- [ ] Pass
7.5 Create a Second Environment and Switch
Section titled “7.5 Create a Second Environment and Switch”Steps:
- Create another environment called
Production. - Add a variable: Name =
base_url, Value =https://httpbin.org - Add a variable: Name =
post_id, Value =get - Switch the active environment to
Production. - Go back to the request from step 7.4 (with URL
{{base_url}}/posts/{{post_id}}). - Click Send.
Expected: The request now goes to https://httpbin.org/posts/get instead. The response will be different (likely a 404, since httpbin does not have that path). The point is that the same request URL resolved to a different address because you switched environments.
- [ ] Pass
7.6 Global Variables
Section titled “7.6 Global Variables”Steps:
- Switch back to the
Developmentenvironment. - In the environments panel, go to the Global Variables tab.
- Add a variable: Name =
app_name, Value =Nouto - Open a new request. Method: GET. URL:
https://httpbin.org/get - Add a header: Key =
X-App-Name, Value ={{app_name}} - Click Send.
Expected: In the response body headers, you see "X-App-Name": "Nouto". Global variables are available regardless of which environment is active.
- [ ] Pass
7.7 Secret Variables
Section titled “7.7 Secret Variables”Steps:
- In the
Developmentenvironment, add a variable: Name =api_key, Value =sk-12345-secret - Mark it as secret (there should be a toggle, lock icon, or checkbox).
Expected: The variable value is masked (shown as dots or asterisks) in the environments panel. It is stored securely in the OS keychain. The actual value is still used when sending requests.
- [ ] Pass
7.8 Dynamic Variables
Section titled “7.8 Dynamic Variables”Steps:
- Open a new request. Method: POST. URL:
https://httpbin.org/post - Body tab > JSON:
{"requestId": "{{$uuid.v4}}","timestamp": "{{$timestamp.iso}}","random": "{{$random.int, 1, 100}}"}
- Click Send.
- Click Send again (a second time).
Expected: Status: 200 OK both times. In the response json field:
requestIdis a UUID (likea1b2c3d4-e5f6-...), different each timetimestampis an ISO date string, different each timerandomis a number between 1 and 100, likely different each time
- [ ] Pass
7.9 Link a .env File
Section titled “7.9 Link a .env File”Steps:
- Create a file called
test.envon your computer with this content:DB_HOST=localhostDB_PORT=5432 - In the environments panel, look for a Link .env file option.
- Link the
test.envfile you just created. - Open a new request. Method: GET. URL:
https://httpbin.org/get - Add a header: Key =
X-DB-Host, Value ={{DB_HOST}} - Click Send.
Expected: In the response headers, you see "X-Db-Host": "localhost". The variables from the .env file are available for use.
- [ ] Pass
Section 8: Cookie Jar
Section titled “Section 8: Cookie Jar”What is a cookie jar? Cookies are small pieces of data that servers store in your browser to remember things (like login sessions). A cookie jar in Nouto stores cookies received from servers. You can have multiple jars and switch between them.
8.1 Open Cookie Jar
Section titled “8.1 Open Cookie Jar”Steps:
- In the environments panel, click the Cookie Jar tab.
Expected: The cookie jar panel opens, showing a jar (possibly empty or with a default jar).
- [ ] Pass
8.2 Create a New Cookie Jar
Section titled “8.2 Create a New Cookie Jar”Steps:
- Click Create Cookie Jar (or the + button).
- Name it
Test Jar.
Expected: A new jar called Test Jar appears in the jar list.
- [ ] Pass
8.3 Send a Request That Sets Cookies
Section titled “8.3 Send a Request That Sets Cookies”Steps:
- Make sure the
Test Jar(or the default jar) is active. - Open a new request. Method: GET.
- URL:
https://httpbin.org/cookies/set/flavor/chocolate - Click Send.
- Go back to the Cookie Jar panel.
Expected: The cookie flavor=chocolate appears in the jar, under the domain httpbin.org.
- [ ] Pass
8.4 Delete a Cookie
Section titled “8.4 Delete a Cookie”Steps:
- In the cookie jar, find the
flavorcookie. - Delete it (click a delete button or right-click > Delete).
Expected: The cookie is removed from the jar.
- [ ] Pass
8.5 Clear the Cookie Jar
Section titled “8.5 Clear the Cookie Jar”Steps:
- First, send another cookie-setting request: GET
https://httpbin.org/cookies/set/color/red - In the cookie jar panel, click Clear (clear all cookies).
Expected: All cookies in the jar are removed. The jar is empty.
- [ ] Pass
Section 9: Authentication
Section titled “Section 9: Authentication”What is authentication? Authentication is how a server verifies who you are. There are many methods: Basic Auth (username + password), Bearer Token (a secret key), API Key (a code sent in a header or URL parameter), and more. Nouto supports all common auth methods.
9.1 Basic Authentication
Section titled “9.1 Basic Authentication”Steps:
- Open a new request. Method: GET.
- URL:
https://httpbin.org/basic-auth/testuser/testpass - Click the Auth tab in the request panel.
- Select Basic Auth.
- Username:
testuser - Password:
testpass - Click Send.
Expected: Status: 200 OK. The response body shows { "authenticated": true, "user": "testuser" }.
- [ ] Pass
9.2 Basic Auth with Wrong Credentials
Section titled “9.2 Basic Auth with Wrong Credentials”Steps:
- Same request as 9.1, but change the password to
wrongpass. - Click Send.
Expected: Status: 401 Unauthorized. The server rejects the request.
- [ ] Pass
9.3 Bearer Token
Section titled “9.3 Bearer Token”Steps:
- Open a new request. Method: GET.
- URL:
https://httpbin.org/bearer - Auth tab > select Bearer Token.
- Token:
my-secret-token-12345 - Click Send.
Expected: Status: 200 OK. The response body shows { "authenticated": true, "token": "my-secret-token-12345" }.
- [ ] Pass
9.4 API Key in Header
Section titled “9.4 API Key in Header”Steps:
- Open a new request. Method: GET.
- URL:
https://httpbin.org/headers - Auth tab > select API Key.
- Key:
X-API-Key - Value:
abc123 - Location: Header
- Click Send.
Expected: Status: 200 OK. In the response headers, you see "X-Api-Key": "abc123".
- [ ] Pass
9.5 API Key in Query Parameter
Section titled “9.5 API Key in Query Parameter”Steps:
- Open a new request. Method: GET.
- URL:
https://httpbin.org/get - Auth tab > select API Key.
- Key:
api_key - Value:
xyz789 - Location: Query Parameter
- Click Send.
Expected: Status: 200 OK. In the response args, you see "api_key": "xyz789". The URL in the response shows ?api_key=xyz789.
- [ ] Pass
9.6 Auth Inheritance
Section titled “9.6 Auth Inheritance”Steps:
- Right-click on
My API Testscollection. - Open Settings (or Edit).
- In the Auth section, set Bearer Token with value
collection-token. - Save.
- Open the
Get All Postsrequest (inside this collection). - In the Auth tab, make sure it says Inherit from parent (or similar).
- Click Send to
https://httpbin.org/headers(change the URL temporarily).
Expected: The response headers show "Authorization": "Bearer collection-token". The request inherited the auth from its parent collection.
- [ ] Pass
9.7 Override Inherited Auth
Section titled “9.7 Override Inherited Auth”Steps:
- In the same request from 9.6, change the Auth tab to Basic Auth.
- Set username:
override, password:pass. - Send to
https://httpbin.org/headers.
Expected: The response headers show a Basic authorization header (base64-encoded override:pass) instead of the Bearer token. The request-level auth overrides the collection-level auth.
- [ ] Pass
9.8 Digest Authentication
Section titled “9.8 Digest Authentication”Steps:
- Open a new request. Method: GET.
- URL:
https://httpbin.org/digest-auth/auth/user/passwd - Auth tab > select Digest Auth.
- Username:
user - Password:
passwd - Click Send.
Expected: Status: 200 OK. The response body shows { "authenticated": true, "user": "user" }.
- [ ] Pass
Section 10: Request Settings
Section titled “Section 10: Request Settings”What are request settings? Each request can have its own settings for things like timeouts (how long to wait for a response), redirect behavior, and SSL/TLS configuration.
10.1 Custom Timeout (Success)
Section titled “10.1 Custom Timeout (Success)”Steps:
- Open a new request. Method: GET.
- URL:
https://httpbin.org/delay/3(responds after 3 seconds). - Click the Settings tab in the request panel.
- Set Timeout to
10000(10 seconds). - Click Send.
Expected: After about 3 seconds, you get Status: 200 OK. The request succeeded because the timeout (10s) was longer than the delay (3s).
- [ ] Pass
10.2 Custom Timeout (Failure)
Section titled “10.2 Custom Timeout (Failure)”Steps:
- Open a new request. Method: GET.
- URL:
https://httpbin.org/delay/10(responds after 10 seconds). - Settings tab > set Timeout to
2000(2 seconds). - Click Send.
Expected: After about 2 seconds, the request fails with a timeout error. You should see an error message indicating the request timed out.
- [ ] Pass
10.3 Disable Follow Redirects
Section titled “10.3 Disable Follow Redirects”Steps:
- Open a new request. Method: GET.
- URL:
https://httpbin.org/redirect/1(redirects once). - Settings tab > set Follow Redirects to off (or uncheck it).
- Click Send.
Expected: Status: 302 Found (or 301/307/308). The app shows the redirect response itself, rather than following the redirect to the final destination. You should see a Location header in the response pointing to the redirect target.
- [ ] Pass
10.4 SSL Toggle
Section titled “10.4 SSL Toggle”Steps:
- In the request Settings tab, look for SSL options (e.g., “Reject Unauthorized”).
- Verify the toggle exists and can be switched on/off.
Expected: The SSL options are visible and toggleable. (Testing with an actual self-signed certificate is not required here. Just verify the controls exist.)
- [ ] Pass
Section 11: Pre-request and Post-response Scripts
Section titled “Section 11: Pre-request and Post-response Scripts”What are scripts? Scripts are small JavaScript programs that run before a request is sent (pre-request) or after a response is received (post-response). You can use them to set headers dynamically, log information, or extract data from responses.
11.1 Pre-request Script: Set a Header
Section titled “11.1 Pre-request Script: Set a Header”Steps:
- Open a new request. Method: GET. URL:
https://httpbin.org/headers - Click the Scripts tab in the request panel.
- In the Pre-request script editor, type:
nt.request.setHeader('X-Script-Header', 'added-by-script');
- Click Send.
Expected: Status: 200 OK. In the response headers, you see "X-Script-Header": "added-by-script". The header was added by the script before the request was sent.
- [ ] Pass
11.2 Post-response Script: Log Output
Section titled “11.2 Post-response Script: Log Output”Steps:
- Open a new request. Method: GET. URL:
https://jsonplaceholder.typicode.com/posts/1 - Scripts tab > Post-response script:
console.log('Status:', nt.response.status);console.log('Title:', nt.response.json().title);
- Click Send.
- In the response panel, click the Scripts tab (in the response area, not the request area).
Expected: The Scripts output shows two log lines:
Status: 200Title:followed by the title of the post
- [ ] Pass
11.3 Script: Set Variable from Response
Section titled “11.3 Script: Set Variable from Response”Steps:
- Open a new request. Method: GET. URL:
https://jsonplaceholder.typicode.com/posts/1 - Scripts tab > Post-response:
const data = nt.response.json();nt.setVar('savedTitle', data.title);console.log('Saved title:', data.title);
- Click Send.
- Open a new request. Method: POST. URL:
https://httpbin.org/post - Body tab > JSON:
{"previousTitle": "{{savedTitle}}"}
- Click Send.
Expected: In the second response, the json field shows "previousTitle" with the actual title from the first request (not the literal text {{savedTitle}}). The variable was set by the script and used in the next request.
- [ ] Pass
11.4 Script: Write a Test
Section titled “11.4 Script: Write a Test”Steps:
- Open a new request. Method: GET. URL:
https://jsonplaceholder.typicode.com/posts/1 - Scripts tab > Post-response:
nt.test('Status is 200', () => {expect(nt.response.status).to.equal(200);});nt.test('Body has a title', () => {const body = nt.response.json();expect(body).to.have.property('title');});
- Click Send.
- In the response panel, check both the Scripts tab and the Tests tab.
Expected: Two tests are listed, both passing (green checkmarks). The test names “Status is 200” and “Body has a title” appear with pass indicators.
- [ ] Pass
11.5 Script: Failing Test
Section titled “11.5 Script: Failing Test”Steps:
- Same request as 11.4. Change the post-response script to:
nt.test('Status should be 404', () => {expect(nt.response.status).to.equal(404);});
- Click Send.
Expected: The test “Status should be 404” appears with a fail indicator (red). The actual status was 200, not 404.
- [ ] Pass
Section 12: Assertions (No-Code Tests)
Section titled “Section 12: Assertions (No-Code Tests)”What are assertions? Assertions are tests you can add to a request without writing code. You pick what to check (status code, body, header, etc.), how to compare (equals, contains, greater than, etc.), and what value to expect.
12.1 Status Code Assertion
Section titled “12.1 Status Code Assertion”Steps:
- Open a new request. Method: GET. URL:
https://jsonplaceholder.typicode.com/posts/1 - Click the Tests tab (or Assertions tab) in the request panel.
- Click Add Assertion (or the + button).
- Set: Target = Status Code, Operator = =, Expected =
200 - Click Send.
Expected: In the response Tests tab, the assertion shows as passed (green). Status code was 200, which equals the expected 200.
- [ ] Pass
12.2 Body Contains Assertion
Section titled “12.2 Body Contains Assertion”Steps:
- Same request. Add another assertion:
- Target = Response Body, Operator = contains, Expected =
userId
- Target = Response Body, Operator = contains, Expected =
- Click Send.
Expected: The assertion passes. The response body contains the text “userId”.
- [ ] Pass
12.3 Response Time Assertion
Section titled “12.3 Response Time Assertion”Steps:
- Same request. Add another assertion:
- Target = Response Time, Operator = <, Expected =
5000
- Target = Response Time, Operator = <, Expected =
- Click Send.
Expected: The assertion passes (assuming the response took less than 5000ms).
- [ ] Pass
12.4 Header Assertion
Section titled “12.4 Header Assertion”Steps:
- Same request. Add another assertion:
- Target = Header, Property =
content-type, Operator = contains, Expected =json
- Target = Header, Property =
- Click Send.
Expected: The assertion passes. The content-type header contains “json” (it is application/json; charset=utf-8).
- [ ] Pass
12.5 JSON Path Assertion
Section titled “12.5 JSON Path Assertion”Steps:
- Same request. Add another assertion:
- Target = JSON Path, Property =
$.userId, Operator = =, Expected =1
- Target = JSON Path, Property =
- Click Send.
Expected: The assertion passes. The JSONPath $.userId evaluates to 1, which equals the expected value.
- [ ] Pass
12.6 Failing Assertion
Section titled “12.6 Failing Assertion”Steps:
- Same request. Add another assertion:
- Target = Status Code, Operator = =, Expected =
404
- Target = Status Code, Operator = =, Expected =
- Click Send.
Expected: This assertion fails (red). The other assertions from previous steps still pass. You can see a mix of passed and failed assertions.
- [ ] Pass
Section 13: History
Section titled “Section 13: History”What is history? Every request you send is automatically saved in the History tab. This lets you go back and see what you sent previously, even if you did not save it to a collection.
13.1 View History
Section titled “13.1 View History”Steps:
- Click the History tab in the sidebar.
Expected: You see a list of all the requests you have sent during this testing session, with timestamps, methods, URLs, and status codes.
- [ ] Pass
13.2 Search History
Section titled “13.2 Search History”Steps:
- In the History tab, look for a search input.
- Type
httpbin.
Expected: The history filters to show only requests that were sent to httpbin.org.
- [ ] Pass
13.3 Open a History Entry
Section titled “13.3 Open a History Entry”Steps:
- Click on any history entry.
Expected: The request opens in a new tab with its original method, URL, headers, and body pre-filled. You can re-send it.
- [ ] Pass
13.4 Save History Entry to Collection
Section titled “13.4 Save History Entry to Collection”Steps:
- Right-click on a history entry (or find a “Save” option).
- Save it to
My API Testscollection. - Give it a name.
Expected: The request appears in the collection.
- [ ] Pass
13.5 View History Stats
Section titled “13.5 View History Stats”Steps:
- Look for a Stats button or link in the History tab.
- Click it.
Expected: You see statistics about your request history: number of requests, status code distribution, top endpoints, average response time, or similar.
- [ ] Pass
13.6 Export History
Section titled “13.6 Export History”Steps:
- Look for an Export option in the History tab.
- Export as JSON.
- Export as CSV.
Expected: Two files are saved: a .json file and a .csv file, both containing your request history data.
- [ ] Pass
13.7 Clear History
Section titled “13.7 Clear History”Steps:
- Look for a Clear option in the History tab.
- Clear all history.
- Confirm the action.
Expected: The History tab is now empty. All previous entries are gone.
- [ ] Pass
Section 14: Collection Runner
Section titled “Section 14: Collection Runner”What is the collection runner? The collection runner lets you execute all requests in a collection (or folder) in sequence, automatically. It is useful for running a series of API tests and seeing which ones pass or fail.
14.1 Prepare a Test Collection
Section titled “14.1 Prepare a Test Collection”Steps:
- Create a new collection called
Runner Tests. - Add these requests (save each to the collection):
- GET
https://jsonplaceholder.typicode.com/posts/1. Name:Get Post - POST
https://jsonplaceholder.typicode.com/postswith JSON body{"title":"Runner Test","body":"test","userId":1}. Name:Create Post - GET
https://jsonplaceholder.typicode.com/users. Name:Get Users - GET
https://httpbin.org/status/404. Name:Expect 404
- GET
- Add an assertion to
Get Post: Status Code = 200 - Add an assertion to
Expect 404: Status Code = 200 (this will fail on purpose)
Expected: The collection has 4 requests, two with assertions.
- [ ] Pass
14.2 Run the Collection
Section titled “14.2 Run the Collection”Steps:
- Click the Runner icon in the activity rail.
- Select
Runner Testscollection. - Click Run (or Start).
Expected: The runner executes all 4 requests in order. You see a progress bar and results appear one by one. Get Post passes, Create Post passes, Get Users passes, Expect 404 fails (because the status was 404 but the assertion expected 200).
- [ ] Pass
14.3 Filter Results
Section titled “14.3 Filter Results”Steps:
- After the run completes, look for a filter option (All / Passed / Failed).
- Click Failed.
Expected: Only Expect 404 is shown (the one that failed).
- [ ] Pass
14.4 Retry Failed Requests
Section titled “14.4 Retry Failed Requests”Steps:
- Click Retry Failed (or similar button).
Expected: Only the failed request (Expect 404) runs again. It fails again (same reason).
- [ ] Pass
14.5 Data-Driven Run
Section titled “14.5 Data-Driven Run”Steps:
- Create a CSV file called
test-data.csvon your computer with this content:post_id123 - Create a new collection called
Data Runner. - Add a request: GET
https://jsonplaceholder.typicode.com/posts/{{post_id}}. Name:Get Post By ID - Open the Runner, select
Data Runner. - Click Select Data File and choose
test-data.csv. - Run the collection.
Expected: The runner executes the request 3 times, once for each row in the CSV: with post_id = 1, then 2, then 3. All three should return 200 OK with different post data.
- [ ] Pass
14.6 Export Run Results
Section titled “14.6 Export Run Results”Steps:
- After a completed run, look for an Export button.
- Export as HTML.
Expected: An HTML report file is saved. Opening it in a browser shows a formatted test report with pass/fail results.
- [ ] Pass
14.7 View Run History
Section titled “14.7 View Run History”Steps:
- In the Runner panel, look for a History section.
- Click on a past run.
Expected: You see the full details of that past run: which requests passed, which failed, timing, and assertion results.
- [ ] Pass
Section 15: GraphQL
Section titled “Section 15: GraphQL”What is GraphQL? GraphQL is an alternative to REST APIs. Instead of having fixed endpoints (like
/posts/1), GraphQL has a single endpoint where you send a “query” describing exactly what data you want. The server returns only the fields you asked for.
15.1 Switch to GraphQL Mode
Section titled “15.1 Switch to GraphQL Mode”Steps:
- Open a new request.
- Switch the connection mode to GraphQL (look for a mode switcher near the URL bar, or in the method dropdown).
- URL:
https://countries.trevorblades.com/graphql
Expected: The request panel changes to show a GraphQL query editor instead of the regular body/params tabs.
- [ ] Pass
15.2 Introspect the Schema
Section titled “15.2 Introspect the Schema”Steps:
- Look for an Introspect or Fetch Schema button.
- Click it.
Expected: The schema is loaded from the server. You may see a “Schema loaded” notification. A schema explorer panel or dropdown becomes available.
- [ ] Pass
15.3 Browse the Schema Explorer
Section titled “15.3 Browse the Schema Explorer”Steps:
- Open the Schema Explorer (may be a tab or sidebar within the GraphQL panel).
- Browse the available types and fields.
Expected: You see the GraphQL schema structure: types like Country, Continent, Language, and their fields. You can click on types to see their fields.
- [ ] Pass
15.4 Simple Query
Section titled “15.4 Simple Query”Steps:
- In the query editor, type:
{countries {namecode}}
- Click Send.
Expected: Status: 200 OK. The response shows a list of countries, each with a name and code field (e.g., { "name": "Andorra", "code": "AD" }).
- [ ] Pass
15.5 Query with Variables
Section titled “15.5 Query with Variables”Steps:
- In the query editor, type:
query GetCountry($code: ID!) {country(code: $code) {namecapitalcurrency}}
- In the Variables pane (below or beside the query editor), type:
{"code": "US"}
- Click Send.
Expected: Status: 200 OK. The response shows: { "country": { "name": "United States", "capital": "Washington, D.C.", "currency": "USD,USN,USS" } }.
- [ ] Pass
15.6 View Response in Tree View
Section titled “15.6 View Response in Tree View”Steps:
- In the response panel, switch to Tree View.
Expected: The response is shown as an expandable tree: data > country > name, capital, currency.
- [ ] Pass
Section 16: WebSocket
Section titled “Section 16: WebSocket”What is a WebSocket? Unlike regular HTTP requests (where you send a request and get one response), a WebSocket creates a persistent two-way connection. Both the client and server can send messages at any time. It is used for real-time features like chat, live updates, and gaming.
Prerequisite: Start the WebSocket echo server:
cd test-servers/ws-echo-testpnpm installnode server.js16.1 Connect to WebSocket
Section titled “16.1 Connect to WebSocket”Steps:
- Open a new request.
- Switch the connection mode to WebSocket.
- URL:
ws://localhost:4001 - Click Connect.
Expected: The connection status changes to “Connected” (green). You receive a welcome message: { "type": "welcome", "message": "Connected to HiveFetch test WebSocket server" }.
- [ ] Pass
16.2 Send a Text Message
Section titled “16.2 Send a Text Message”Steps:
- In the message input area, type:
Hello WebSocket! - Click Send.
Expected: Your sent message appears in the message log (marked as “sent” or with an outgoing arrow). Shortly after, an echo response appears: { "type": "echo", "original": "Hello WebSocket!", "timestamp": "...", "length": 16 }.
- [ ] Pass
16.3 Observe Automatic Pings
Section titled “16.3 Observe Automatic Pings”Steps:
- Wait about 10 seconds without sending anything.
- Watch the message log.
Expected: You see automatic ping messages arriving approximately every 5 seconds: { "type": "ping", "time": "..." }.
- [ ] Pass
16.4 Send Multiple Messages
Section titled “16.4 Send Multiple Messages”Steps:
- Send three more messages quickly:
Message 1Message 2Message 3
Expected: The message log shows all sent messages and their echo responses, each with timestamps. Messages are displayed in chronological order with direction indicators (sent vs. received).
- [ ] Pass
16.5 Record a Session
Section titled “16.5 Record a Session”Steps:
- Click the Record button (or start recording option).
- Send two messages:
Recording test AandRecording test B - Click Stop Recording.
- Save the session (give it a name like
Test Session).
Expected: The recording stops. A session is saved with the messages exchanged during the recording period.
- [ ] Pass
16.6 Load and Replay a Session
Section titled “16.6 Load and Replay a Session”Steps:
- Disconnect from the WebSocket.
- Look for a Sessions list or Load Session option.
- Load
Test Session. - Connect to
ws://localhost:4001again. - Click Replay.
Expected: The saved messages are replayed: Recording test A and Recording test B are sent automatically, and you receive echo responses for each.
- [ ] Pass
16.7 Disconnect
Section titled “16.7 Disconnect”Steps:
- Click Disconnect.
Expected: The connection status changes to “Disconnected”. No more messages are received.
- [ ] Pass
Section 17: Server-Sent Events (SSE)
Section titled “Section 17: Server-Sent Events (SSE)”What is SSE? Server-Sent Events is a one-way streaming technology. The server continuously sends events (data updates) to the client over a single HTTP connection. Unlike WebSocket, only the server sends data; the client just listens. It is used for live feeds, notifications, and real-time dashboards.
Prerequisite: Start the SSE server:
cd test-servers/sse-testpnpm installnode server.js17.1 Connect to SSE Stream
Section titled “17.1 Connect to SSE Stream”Steps:
- Open a new request.
- Switch the connection mode to SSE.
- URL:
http://localhost:4002/events - Click Connect.
Expected: The connection status changes to “Connected”. Events start appearing in the event stream viewer, approximately one per second.
- [ ] Pass
17.2 View Incoming Events
Section titled “17.2 View Incoming Events”Steps:
- Watch the event stream for about 5 seconds.
Expected: You see multiple events, each with:
- Event type:
counter - Data: JSON like
{ "count": 1, "time": "..." },{ "count": 2, "time": "..." }, etc. - ID: An incrementing number (1, 2, 3, …)
The count increases by 1 with each event.
- [ ] Pass
17.3 Disconnect from SSE
Section titled “17.3 Disconnect from SSE”Steps:
- Click Disconnect.
- Wait a few seconds.
Expected: The connection status changes to “Disconnected”. No new events appear. The events you already received remain visible.
- [ ] Pass
Section 18: GraphQL Subscriptions
Section titled “Section 18: GraphQL Subscriptions”What are GraphQL subscriptions? GraphQL subscriptions are like SSE but for GraphQL. They use a WebSocket connection to stream real-time data updates from the server to the client. You write a subscription query, and the server sends events whenever the subscribed data changes.
Prerequisite: Start the GraphQL Subscriptions server:
cd test-servers/gql-sub-testpnpm installnode server.js18.1 Connect and Subscribe (Countdown)
Section titled “18.1 Connect and Subscribe (Countdown)”Steps:
- Open a new request.
- Switch the connection mode to GraphQL Subscription.
- URL:
ws://localhost:4000 - In the query editor, type:
subscription {countdown(from: 5)}
- Click Connect (or Subscribe/Send).
Expected: You receive 6 events over about 5 seconds:
{ "countdown": 5 }{ "countdown": 4 }{ "countdown": 3 }{ "countdown": 2 }{ "countdown": 1 }{ "countdown": 0 }
Events arrive approximately one per second.
- [ ] Pass
18.2 Subscribe to Tick
Section titled “18.2 Subscribe to Tick”Steps:
- Change the query to:
subscription {tick}
- Subscribe again.
- Wait about 8 seconds.
Expected: You receive incrementing numbers approximately every 2 seconds: { "tick": 1 }, { "tick": 2 }, { "tick": 3 }, { "tick": 4 }.
- [ ] Pass
18.3 Disconnect
Section titled “18.3 Disconnect”Steps:
- Click Disconnect.
Expected: The connection closes. No more events arrive.
- [ ] Pass
18.4 Auto-Reconnect Toggle
Section titled “18.4 Auto-Reconnect Toggle”Steps:
- Look for an Auto-Reconnect toggle or setting.
- Verify it exists and can be toggled on/off.
Expected: The auto-reconnect option is visible and toggleable.
- [ ] Pass
Section 19: gRPC
Section titled “Section 19: gRPC”What is gRPC? gRPC is a high-performance communication protocol that programs use to call functions on remote servers. Instead of sending text like REST APIs, gRPC uses a compact binary format defined by
.protofiles (which describe the available services and data types). It supports streaming (sending multiple messages over a single connection).
Prerequisite: Start the gRPC server:
cd test-servers/grpc-testpnpm installnode server.js19.1 Switch to gRPC Mode
Section titled “19.1 Switch to gRPC Mode”Steps:
- Open a new request.
- Switch the connection mode to gRPC.
- In the URL/address field, type:
localhost:50051
Expected: The request panel changes to show gRPC-specific controls (service/method selector, message editor, metadata tab).
- [ ] Pass
19.2 Server Reflection
Section titled “19.2 Server Reflection”Steps:
- Click the Reflect button (or similar).
Expected: The app discovers the server’s services automatically. You should see a list of services:
helloworld.Greetertest.TestServiceusers.UserService
- [ ] Pass
19.3 Browse Services and Methods
Section titled “19.3 Browse Services and Methods”Steps:
- Expand the
users.UserServiceservice.
Expected: You see its methods: CreateUser, GetUser, ListUsers, UpdateUser, DeleteUser. Each method shows its input and output types.
- [ ] Pass
19.4 Unary Call: SayHello
Section titled “19.4 Unary Call: SayHello”Steps:
- Select service
helloworld.Greeter, methodSayHello. - In the message body, type:
{"name": "Tester"}
- Click Invoke (or Send).
Expected: You receive a response with a greeting message (e.g., { "message": "Hello, Tester!" } or similar).
- [ ] Pass
19.5 Unary Call: Echo
Section titled “19.5 Unary Call: Echo”Steps:
- Select service
test.TestService, methodEcho. - Message body:
{"message": "hello","repeatCount": 3}
- Click Invoke.
Expected: You receive a response echoing the message (possibly repeated or formatted based on repeatCount).
- [ ] Pass
19.6 gRPC Auth Error
Section titled “19.6 gRPC Auth Error”Steps:
- Select service
test.TestService, methodRequireAuth. - Message body:
{} - Click Invoke (without setting any metadata).
Expected: You receive a gRPC error with status UNAUTHENTICATED. The error message indicates that authorization is required.
- [ ] Pass
19.7 gRPC with Metadata
Section titled “19.7 gRPC with Metadata”Steps:
- Same method
RequireAuth. - Click the Metadata tab.
- Add: Key =
authorization, Value =Bearer test-token - Click Invoke.
Expected: The call succeeds. You receive a successful response instead of the UNAUTHENTICATED error.
- [ ] Pass
19.8 List Users
Section titled “19.8 List Users”Steps:
- Select service
users.UserService, methodListUsers. - Message body:
{} - Click Invoke.
Expected: You receive a list of users containing at least Alice (id: “1”) and Bob (id: “2”).
- [ ] Pass
19.9 Get Single User
Section titled “19.9 Get Single User”Steps:
- Select method
GetUser. - Message body:
{"id": "1"}
- Click Invoke.
Expected: You receive Alice’s user data (name, email, and other fields).
- [ ] Pass
19.10 Load Proto File Manually
Section titled “19.10 Load Proto File Manually”Steps:
- Instead of using reflection, look for an option to Load Proto File.
- Navigate to
test-servers/grpc-test/proto/greeter.protoand open it.
Expected: The proto file is loaded. The helloworld.Greeter service appears with its SayHello method, without needing server reflection.
- [ ] Pass
Section 20: Mock Server
Section titled “Section 20: Mock Server”What is a mock server? A mock server is a fake server that you run locally. You define routes (URL paths) and the responses they should return. This is useful for testing your application when the real server is not available, or for simulating specific scenarios.
20.1 Open Mock Server
Section titled “20.1 Open Mock Server”Steps:
- Click the Mock Server icon in the activity rail.
Expected: The Mock Server panel opens, showing route configuration and server controls.
- [ ] Pass
20.2 Add a GET Route
Section titled “20.2 Add a GET Route”Steps:
- Click Add Route (or +).
- Set: Method = GET, Path =
/api/hello, Status =200 - Response body:
{"message": "Hello from mock server!"}
- Set a response header:
Content-Type=application/json
Expected: The route appears in the routes list.
- [ ] Pass
20.3 Add a POST Route
Section titled “20.3 Add a POST Route”Steps:
- Add another route: Method = POST, Path =
/api/data, Status =201 - Response body:
{"created": true, "id": 42}
Expected: Both routes are listed.
- [ ] Pass
20.4 Add a Route with Latency
Section titled “20.4 Add a Route with Latency”Steps:
- Add another route: Method = GET, Path =
/api/slow, Status =200 - Response body:
{"slow": true} - Set Latency to min:
500, max:1000(milliseconds).
Expected: The route is configured with a delay of 500-1000ms.
- [ ] Pass
20.5 Start the Mock Server
Section titled “20.5 Start the Mock Server”Steps:
- Set the port to
3000(or leave the default). - Click Start (or the play button).
Expected: The server starts. The status changes to “Running” (green). You see a message like “Mock server running on port 3000”.
- [ ] Pass
20.6 Test the Mock Server
Section titled “20.6 Test the Mock Server”Steps:
- Open a new request tab. Method: GET. URL:
http://localhost:3000/api/hello - Click Send.
- Open another request. Method: POST. URL:
http://localhost:3000/api/data - Click Send.
- Open another request. Method: GET. URL:
http://localhost:3000/api/slow - Click Send.
Expected:
/api/helloreturns 200 OK with{"message": "Hello from mock server!"}/api/datareturns 201 Created with{"created": true, "id": 42}/api/slowreturns 200 OK with{"slow": true}after a 500-1000ms delay
- [ ] Pass
20.7 View Request Logs
Section titled “20.7 View Request Logs”Steps:
- In the Mock Server panel, click the Logs tab.
Expected: You see the 3 requests you just sent, with timestamps, methods, paths, and status codes.
- [ ] Pass
20.8 Stop the Server
Section titled “20.8 Stop the Server”Steps:
- Click Stop (or the stop button).
Expected: The server stops. The status changes to “Stopped”. Sending a request to http://localhost:3000/api/hello now fails with a connection error.
- [ ] Pass
Section 21: Benchmarking
Section titled “Section 21: Benchmarking”What is benchmarking? Benchmarking sends the same request many times in rapid succession to measure the server’s performance. It reports statistics like average response time, requests per second, and percentile distributions (e.g., “95% of requests completed in under X milliseconds”).
21.1 Open Benchmark Panel
Section titled “21.1 Open Benchmark Panel”Steps:
- Click the Benchmark icon in the activity rail.
Expected: The Benchmark panel opens with configuration fields for iterations, concurrency, and other settings.
- [ ] Pass
21.2 Configure and Run a Benchmark
Section titled “21.2 Configure and Run a Benchmark”Steps:
- Set up a request: Method = GET, URL =
https://httpbin.org/get - Set Iterations to
20 - Set Concurrent connections to
3 - Click Start (or Run).
Expected: The benchmark starts. You see a progress indicator (e.g., 1/20, 2/20, …, 20/20). Individual iteration results appear as they complete.
- [ ] Pass
21.3 View Statistics
Section titled “21.3 View Statistics”Steps:
- After the benchmark completes, look at the statistics table.
Expected: You see:
- Mean (average response time)
- Median (middle value)
- p95 and p99 (95th and 99th percentile)
- Min and Max response times
- Requests per second (RPS)
- Possibly a distribution chart
- [ ] Pass
21.4 Export Results
Section titled “21.4 Export Results”Steps:
- Click Export and save as CSV.
Expected: A CSV file is saved with the benchmark results, including per-iteration data.
- [ ] Pass
Section 22: OpenAPI Editor
Section titled “Section 22: OpenAPI Editor”What is OpenAPI? OpenAPI (formerly Swagger) is a standard for describing REST APIs. An OpenAPI spec file (written in YAML or JSON) describes all the endpoints, parameters, request/response formats, and authentication methods of an API. Nouto includes a built-in editor for creating and viewing these spec files.
22.1 Open the OpenAPI Editor
Section titled “22.1 Open the OpenAPI Editor”Steps:
- Click the OpenAPI icon in the activity rail.
Expected: The OpenAPI editor opens, showing a code editor (for YAML/JSON) and possibly a preview pane.
- [ ] Pass
22.2 Open a Sample Spec
Section titled “22.2 Open a Sample Spec”Steps:
- Look for an Open File option in the OpenAPI editor.
- Open the sample OpenAPI file:
my-docs/testing/sample-files/sample-openapi.yaml(if available), or paste this minimal spec:openapi: "3.1.0"info:title: Test APIversion: "1.0"paths:/hello:get:summary: Say helloresponses:"200":description: OKcontent:application/json:schema:type: objectproperties:message:type: string
Expected: The spec appears in the editor with syntax highlighting.
- [ ] Pass
22.3 Browse the Outline
Section titled “22.3 Browse the Outline”Steps:
- Look for an Outline panel or tree on the side of the editor.
- Click on different items in the outline.
Expected: The outline shows the structure of the spec (paths, operations, schemas). Clicking on an item navigates to that section in the editor.
- [ ] Pass
22.4 View the Preview
Section titled “22.4 View the Preview”Steps:
- Look for a Preview pane (it may already be visible, or you may need to toggle it).
Expected: The preview shows the API documentation rendered as interactive docs (similar to Swagger UI), with endpoints listed, expandable details, and parameter descriptions.
- [ ] Pass
22.5 Linting Diagnostics
Section titled “22.5 Linting Diagnostics”Steps:
- In the editor, intentionally introduce an error. For example, change
openapi: "3.1.0"toopenapi: "9.9.9". - Look for diagnostic markers (underlines, icons, or a problems panel).
Expected: The editor shows a warning or error indicating that 9.9.9 is not a valid OpenAPI version.
- [ ] Pass
22.6 Generate Collection from Spec
Section titled “22.6 Generate Collection from Spec”Steps:
- Fix the spec (change back to
"3.1.0"). - Look for a Generate Collection option.
- Click it.
Expected: A new collection is created in the sidebar based on the API spec. It contains requests matching the endpoints defined in the spec.
- [ ] Pass
Section 23: Code Generation
Section titled “Section 23: Code Generation”What is code generation? After composing a request in Nouto, you can generate equivalent code in different programming languages. This is useful when you want to replicate the same request in your own application.
23.1 Generate cURL
Section titled “23.1 Generate cURL”Steps:
- Open a request with some configuration (e.g., GET
https://httpbin.org/getwith a custom headerX-Test: hello). - Click Send to verify it works.
- Look for a Code button or Generate Code option (often in the response panel or action bar).
- Select cURL.
Expected: A cURL command is generated that matches your request, including the URL, method, and custom header.
- [ ] Pass
23.2 Generate Python
Section titled “23.2 Generate Python”Steps:
- In the code generation panel, switch to Python (requests).
Expected: Python code using the requests library is generated. It should include requests.get(...) with the URL and headers.
- [ ] Pass
23.3 Generate Other Languages
Section titled “23.3 Generate Other Languages”Steps:
- Switch through the available languages: JavaScript (Fetch), JavaScript (Axios), Go, C#, Java, PHP, Swift, Dart, PowerShell.
- Verify each one generates code.
Expected: Each language shows syntactically plausible code for making the same HTTP request. The URL, method, and headers appear in each generated snippet.
- [ ] Pass
Section 24: Import Collections
Section titled “Section 24: Import Collections”What is importing? Importing lets you load collections from other API clients (like Postman, Insomnia, or Bruno) into Nouto. This is useful if you are migrating from another tool and do not want to re-create all your requests manually.
Before starting this section, download the sample import files (ZIP) and extract them to a folder on your computer. The files are also available in the repository at my-docs/testing/sample-files/.
24.1 Import Postman Collection
Section titled “24.1 Import Postman Collection”Steps:
- In the Collections tab, click the Import button (or right-click > Import Collection).
- Select the file:
my-docs/testing/sample-files/postman-collection.json
Expected: A new collection appears in the sidebar with requests from the Postman file. The requests have correct methods, URLs, headers, and bodies.
- [ ] Pass
24.2 Import Postman Environment
Section titled “24.2 Import Postman Environment”Steps:
- In the Environments panel, look for an Import option.
- Select the file:
my-docs/testing/sample-files/postman-environment.json
Expected: A new environment appears with variables from the Postman environment file.
- [ ] Pass
24.3 Import Insomnia Collection
Section titled “24.3 Import Insomnia Collection”Steps:
- Import collection from:
my-docs/testing/sample-files/insomnia-export.json
Expected: A new collection appears with requests from the Insomnia export.
- [ ] Pass
24.4 Import Hoppscotch Collection
Section titled “24.4 Import Hoppscotch Collection”Steps:
- Import collection from:
my-docs/testing/sample-files/hoppscotch-collection.json
Expected: A new collection appears with requests from the Hoppscotch file.
- [ ] Pass
24.5 Import HAR File
Section titled “24.5 Import HAR File”Steps:
- Import collection from:
my-docs/testing/sample-files/sample.har
Expected: A new collection appears with requests extracted from the HAR file (HAR files record browser network traffic).
- [ ] Pass
24.6 Import Thunder Client Collection
Section titled “24.6 Import Thunder Client Collection”Steps:
- Import collection from:
my-docs/testing/sample-files/thunder-client-collection.json
Expected: A new collection appears with requests from the Thunder Client export.
- [ ] Pass
24.7 Import Thunder Client Folder
Section titled “24.7 Import Thunder Client Folder”Steps:
- Look for an Import Thunder Client Folder option.
- Select the folder:
my-docs/testing/sample-files/thunder-tests/
Expected: Collections are imported from the Thunder Client folder structure.
- [ ] Pass
24.8 Import Bruno Collection
Section titled “24.8 Import Bruno Collection”Steps:
- Import collection from:
my-docs/testing/sample-files/bruno/(select the folder or individual.brufiles).
Expected: A new collection appears with requests parsed from the Bruno .bru files.
- [ ] Pass
24.9 Import OpenAPI Spec as Collection
Section titled “24.9 Import OpenAPI Spec as Collection”Steps:
- Import collection from:
my-docs/testing/sample-files/sample-openapi.yaml
Expected: A new collection appears with requests generated from the OpenAPI spec’s endpoints.
- [ ] Pass
24.10 Import from cURL
Section titled “24.10 Import from cURL”Steps:
- Look for an Import cURL option.
- Paste this cURL command:
curl -X POST https://httpbin.org/post -H "Content-Type: application/json" -d '{"test": true}'
- Confirm.
Expected: A new request is created with: Method = POST, URL = https://httpbin.org/post, Header Content-Type: application/json, Body = {"test": true}.
- [ ] Pass
24.11 Import from URL
Section titled “24.11 Import from URL”Steps:
- Look for an Import from URL option.
- Enter a URL to a hosted collection file (e.g., a raw GitHub URL to a Postman collection).
Expected: The file is fetched from the URL, the format is auto-detected, and a collection is created.
- [ ] Pass
Section 25: Export Collections
Section titled “Section 25: Export Collections”What is exporting? Exporting saves your collections in various file formats. You can export to share with teammates, migrate to another tool, or create backups.
25.1 Export as Nouto Native
Section titled “25.1 Export as Nouto Native”Steps:
- Right-click on a collection in the sidebar.
- Select Export as Nouto (or Export > Nouto).
- Save the file.
Expected: A .json file is saved in Nouto’s native format.
- [ ] Pass
25.2 Export as Postman
Section titled “25.2 Export as Postman”Steps:
- Right-click on a collection.
- Select Export to Postman.
- Save the file.
Expected: A .postman_collection.json file is saved that can be imported into Postman.
- [ ] Pass
25.3 Export as HAR
Section titled “25.3 Export as HAR”Steps:
- Right-click on a collection.
- Select Export as HAR.
- Save the file.
Expected: A .har file is saved in the HAR format.
- [ ] Pass
25.4 Generate OpenAPI from Collection
Section titled “25.4 Generate OpenAPI from Collection”Steps:
- Right-click on a collection.
- Select Generate OpenAPI.
- Save the file.
Expected: An .openapi.yaml file is generated describing the collection’s endpoints as an OpenAPI specification.
- [ ] Pass
25.5 Bulk Export All Collections
Section titled “25.5 Bulk Export All Collections”Steps:
- Look for a Bulk Export option (might be in the collection tab’s menu or context menu).
- Export all collections as Nouto native.
Expected: A single file (or multiple files) containing all your collections is saved.
- [ ] Pass
Section 26: Backup and Restore
Section titled “Section 26: Backup and Restore”What is backup? Backup creates a complete snapshot of all your app data: collections, environments, settings, history, cookies, and more. You can restore from a backup to recover your data.
26.1 Create a Backup
Section titled “26.1 Create a Backup”Steps:
- Look for a Backup option (might be in Settings, the workspace menu, or a dedicated menu).
- Click Export Backup.
- Save the backup file.
Expected: A .nouto-backup file is saved. This contains all your collections, environments, settings, and other data.
- [ ] Pass
26.2 Delete Some Data
Section titled “26.2 Delete Some Data”Steps:
- Delete one collection from the sidebar.
- Delete one environment from the environments panel.
Expected: The collection and environment are gone.
- [ ] Pass
26.3 Restore from Backup
Section titled “26.3 Restore from Backup”Steps:
- Click Import Backup (same location as Export Backup).
- Select the backup file from step 26.1.
Expected: Your deleted collection and environment are restored. All data is back to the state it was in when the backup was created.
- [ ] Pass
Section 27: Settings
Section titled “Section 27: Settings”What are settings? Settings let you customize the app’s appearance, behavior, and default values. Changes here affect the entire app.
27.1 Change Theme
Section titled “27.1 Change Theme”Steps:
- Open Settings (gear icon).
- Go to Appearance (or Theme).
- Switch between Dark, Light, and Auto themes.
Expected: The app’s color scheme changes accordingly. Dark uses dark backgrounds, Light uses light backgrounds, Auto follows your OS setting.
- [ ] Pass
27.2 Import a VS Code Theme
Section titled “27.2 Import a VS Code Theme”Steps:
- In theme settings, look for Import Theme or Browse Themes.
- Import a VS Code theme file (JSON format), or browse available themes.
Expected: The theme is applied. Colors change to match the imported theme.
- [ ] Pass
27.3 Change Interface Font and Size
Section titled “27.3 Change Interface Font and Size”Steps:
- Go to Interface settings.
- Change the interface font (dropdown showing system fonts).
- Change the font size (increase or decrease).
Expected: The app’s UI text changes to the selected font and size. All menus, labels, and buttons reflect the change.
- [ ] Pass
27.4 Change Editor Font and Size
Section titled “27.4 Change Editor Font and Size”Steps:
- In the same settings area, change the editor font and editor size.
- Go back to a request and look at the body editor or response viewer.
Expected: The code/text editor uses the new font and size. The UI font (menus, labels) is unaffected.
- [ ] Pass
27.5 Modify Keyboard Shortcuts
Section titled “27.5 Modify Keyboard Shortcuts”Steps:
- Go to Shortcuts settings.
- Find the “Send Request” shortcut (default:
Ctrl+Enter). - Click to change it (or just verify the recording UI works).
- Press
Escapeto cancel the change (or set it back to the original).
Expected: The shortcut editor lets you record a new key combination. Conflict detection warns if you pick a shortcut already in use.
- [ ] Pass
27.6 Enable Autostart
Section titled “27.6 Enable Autostart”Steps:
- Go to Desktop settings.
- Toggle Autostart on login.
Expected: The toggle switches. (You can verify by restarting your computer, but just toggling it on/off is sufficient for this test.)
- [ ] Pass
27.7 Set a Global Shortcut
Section titled “27.7 Set a Global Shortcut”Steps:
- In Desktop settings, look for Global Shortcut.
- Set a system-wide hotkey (e.g.,
Ctrl+Shift+N). - Minimize the app.
- Press the hotkey.
Expected: The Nouto app comes to the foreground when you press the global shortcut, even when another app is focused.
- [ ] Pass
27.8 Configure OpenAPI Lint Rules
Section titled “27.8 Configure OpenAPI Lint Rules”Steps:
- Go to OpenAPI settings.
- Find the lint rule configuration section.
- Change a rule’s severity (e.g., change one from “warning” to “error”, or turn one off).
Expected: The rule severity updates. If you open the OpenAPI editor, the diagnostics reflect the new severity.
- [ ] Pass
Section 28: Projects and Workspace
Section titled “Section 28: Projects and Workspace”What is a project? A project in Nouto is a folder on your computer where all your collections, environments, and settings are stored. Different projects keep their data separate, so you can have one project per team or per API.
28.1 Create a New Project
Section titled “28.1 Create a New Project”Steps:
- Open the workspace menu (top-left).
- Click New Project.
- Create a new folder (e.g.,
nouto-project-2). - Confirm.
Expected: A new, empty project opens. The sidebar has no collections. This is a separate workspace from your previous project.
- [ ] Pass
28.2 Close the Project
Section titled “28.2 Close the Project”Steps:
- Open the workspace menu.
- Click Close Project.
Expected: The project closes. You may see the welcome screen or an empty state.
- [ ] Pass
28.3 Recent Projects
Section titled “28.3 Recent Projects”Steps:
- Open the workspace menu.
- Look for Open Recent or a recent projects list.
Expected: You see both projects you created (nouto-test and nouto-project-2) in the recent list.
- [ ] Pass
28.4 Reopen from Recent
Section titled “28.4 Reopen from Recent”Steps:
- Click on the first project (
nouto-test) from the recent list.
Expected: The project opens with all your previously saved collections, environments, and data intact.
- [ ] Pass
28.5 Workspace Metadata
Section titled “28.5 Workspace Metadata”Steps:
- Look for Workspace Settings or workspace metadata (might be in the workspace menu).
- Set a name and description for the workspace.
- Save.
Expected: The workspace name and description are saved. They may appear in the title bar or workspace menu.
- [ ] Pass
Section 29: Miscellaneous
Section titled “Section 29: Miscellaneous”29.1 Command Palette
Section titled “29.1 Command Palette”What is the command palette? The command palette is a quick search bar (like Spotlight on Mac or Start menu search on Windows) that lets you find and open requests, collections, environments, and commands by typing.
Steps:
- Press
Ctrl+K(or click the search icon in the toolbar). - Type the name of a saved request (e.g.,
Get Post). - Select it from the results.
Expected: The command palette opens as a search overlay. Typing filters the results. Selecting a request opens it in a tab.
- [ ] Pass
29.2 Undo and Redo
Section titled “29.2 Undo and Redo”Steps:
- Open a saved request.
- Change the URL to something different.
- Press
Ctrl+Z(Undo). - Press
Ctrl+Shift+Z(Redo).
Expected: Undo reverts the URL to its previous value. Redo restores the change.
- [ ] Pass
29.3 Duplicate a Request Tab
Section titled “29.3 Duplicate a Request Tab”Steps:
- Look for a way to duplicate the current tab (right-click on the tab, or use a menu option).
Expected: A new tab opens with the same request contents.
- [ ] Pass
29.4 Responsive Layout
Section titled “29.4 Responsive Layout”Steps:
- Make the app window very wide (full screen on a wide monitor).
- Look at the request/response split. It should be horizontal (side by side).
- Make the window narrow (about half the screen width).
- Look at the split. It should switch to vertical (stacked top/bottom).
Expected: The layout automatically adjusts based on the window width. Wide = side by side, narrow = stacked.
- [ ] Pass
29.5 Copy Diagnostics
Section titled “29.5 Copy Diagnostics”Steps:
- Go to Settings > Desktop.
- Click Copy Diagnostics.
- Paste into a text editor.
Expected: System diagnostic information is copied to your clipboard, including OS version, app version, and other technical details useful for bug reports.
- [ ] Pass
29.6 Load Sample Collection
Section titled “29.6 Load Sample Collection”Steps:
- In the Collections tab, look for a Load Sample Collection option (might be on the welcome screen or in a menu).
- Click it.
Expected: A sample collection is added to the sidebar with example requests that demonstrate the app’s features.
- [ ] Pass
Section 30: Credential Storage and Persistence
Section titled “Section 30: Credential Storage and Persistence”What is credential storage? When you enter passwords, tokens, or API keys in Nouto, the app stores them securely in your operating system’s credential manager (Windows Credential Manager on Windows, Keychain on macOS). The collection files saved to disk never contain your actual passwords. Variable placeholders like
{{token}}are not credentials, so they stay in the file as-is and are resolved at send time.
30.1 Variable Placeholder Survives Save Cycle
Section titled “30.1 Variable Placeholder Survives Save Cycle”Steps:
- Make sure the Sample Collection (httpbin.org) is loaded. If it is not, load it from the welcome screen or Collections menu.
- Set the Sample Environment as the active environment.
- In the sidebar, expand the Sample Collection > Authentication folder.
- Click the Bearer Token request to open it.
- Click the Auth tab in the request panel.
- Confirm the type is Bearer Token and the Token field shows
{{token}}. - Click Send.
- Close the app completely.
- Reopen the app.
- Open the same Bearer Token request again.
- Click the Auth tab.
Expected: The Token field still shows {{token}} (the literal placeholder text, not an empty field). The request sent in step 7 should have returned 200 OK with the token resolved to my-sample-token.
- [ ] Pass
30.2 Real Credential Persists Across Restart (Windows)
Section titled “30.2 Real Credential Persists Across Restart (Windows)”Steps:
- Open a new request. Method: GET. URL:
https://httpbin.org/basic-auth/testuser/persist-me - Click the Auth tab. Select Basic Auth.
- Username:
testuser, Password:persist-me - Click Send. Confirm Status: 200 OK.
- Save the request to any collection. Name it
Persist Test. - Close the app completely.
- Reopen the app.
- Open the
Persist Testrequest from the collection. - Click the Auth tab.
- Open a terminal (Command Prompt or PowerShell) and run:
cmdkey /list | findstr nouto
Expected: The Auth tab shows Basic Auth with username testuser and password persist-me (click the eye icon to reveal). The terminal output from step 10 includes at least one entry with nouto in its name, confirming the credential is stored in Windows Credential Manager.
- [ ] Pass
30.3 Real Credential Persists Across Restart (macOS)
Section titled “30.3 Real Credential Persists Across Restart (macOS)”Steps:
- Follow the same steps as 30.2, but on a Mac.
- After reopening the app, confirm the credentials are intact.
- Open Keychain Access (Applications > Utilities > Keychain Access).
- In the search bar, type
nouto-desktop.
Expected: The Auth tab shows the saved credentials. Keychain Access shows at least one entry with nouto-desktop as the service name.
- [ ] Pass
30.4 On-Disk File Does Not Contain Plaintext Credentials
Section titled “30.4 On-Disk File Does Not Contain Plaintext Credentials”Steps:
- After completing 30.2 (Windows) or 30.3 (macOS), open the collections file in a text editor:
- Windows:
%APPDATA%\com.nouto.app\nouto\collections.json(Type%APPDATA%in the File Explorer address bar, then navigate tocom.nouto.app\nouto) - macOS:
~/Library/Application Support/com.nouto.app/nouto/collections.json(In Finder, pressCmd+Shift+Gand paste the path)
- Windows:
- Search the file for the text
persist-me.
Expected: The text persist-me does not appear anywhere in the file. Instead, the Persist Test request shows "password": "" and a "passwordRef" field with a keychain reference key. The actual password is stored only in the OS credential manager, not on disk.
- [ ] Pass
30.5 First-Run Sample Collection Loads with Auth Intact
Section titled “30.5 First-Run Sample Collection Loads with Auth Intact”Steps:
- Delete the Sample Collection (httpbin.org) from the sidebar (right-click > Delete).
- Delete the Sample Environment from the environments panel.
- Close the app completely.
- Reopen the app.
- On the welcome screen, click Load Sample Collection (or find this option in the Collections menu).
- In the sidebar, expand Sample Collection > Authentication.
- Click Bearer Token. Click the Auth tab.
- Click Basic Auth. Click the Auth tab.
- Click the Environments icon in the activity rail. Check the environments list.
Expected:
- The Bearer Token request’s Auth tab shows type Bearer Token with
{{token}}in the Token field. - The Basic Auth request’s Auth tab shows type Basic Auth with username
userand passwordpasswd. - The Sample Environment appears in the environments panel with two variables:
baseUrl=https://httpbin.organdtoken=my-sample-token.
- [ ] Pass
30.6 Sample Environment Survives App Restart After First Run
Section titled “30.6 Sample Environment Survives App Restart After First Run”Steps:
- Immediately after completing 30.5 (do not make any other changes), close the app.
- Reopen the app.
- Click the Environments icon in the activity rail.
- Open the collections file on disk (same path as 30.4).
- Open the environments file in a text editor:
- Windows:
%APPDATA%\com.nouto.app\nouto\environments.json - macOS:
~/Library/Application Support/com.nouto.app/nouto/environments.json
- Windows:
Expected: The Sample Environment is still visible in the environments panel with both variables (baseUrl and token). The environments.json file contains the sample environment data (it is not empty or missing the environment entry).
- [ ] Pass
Test Summary
Section titled “Test Summary”After completing all sections, count your results:
| Section | Name | Scenarios | Passed | Failed |
|---|---|---|---|---|
| 1 | First Launch and Orientation | 5 | __ | __ |
| 2 | Basic HTTP Requests | 11 | __ | __ |
| 3 | Request Body Types | 6 | __ | __ |
| 4 | Response Viewer | 11 | __ | __ |
| 5 | Collections and Organization | 12 | __ | __ |
| 6 | Trash | 3 | __ | __ |
| 7 | Environments and Variables | 9 | __ | __ |
| 8 | Cookie Jar | 5 | __ | __ |
| 9 | Authentication | 8 | __ | __ |
| 10 | Request Settings | 4 | __ | __ |
| 11 | Pre-request and Post-response Scripts | 5 | __ | __ |
| 12 | Assertions (No-Code Tests) | 6 | __ | __ |
| 13 | History | 7 | __ | __ |
| 14 | Collection Runner | 7 | __ | __ |
| 15 | GraphQL | 6 | __ | __ |
| 16 | WebSocket | 7 | __ | __ |
| 17 | SSE | 3 | __ | __ |
| 18 | GraphQL Subscriptions | 4 | __ | __ |
| 19 | gRPC | 10 | __ | __ |
| 20 | Mock Server | 8 | __ | __ |
| 21 | Benchmarking | 4 | __ | __ |
| 22 | OpenAPI Editor | 6 | __ | __ |
| 23 | Code Generation | 3 | __ | __ |
| 24 | Import Collections | 11 | __ | __ |
| 25 | Export Collections | 5 | __ | __ |
| 26 | Backup and Restore | 3 | __ | __ |
| 27 | Settings | 8 | __ | __ |
| 28 | Projects and Workspace | 5 | __ | __ |
| 29 | Miscellaneous | 6 | __ | __ |
| 30 | Credential Storage and Persistence | 6 | __ | __ |
| Total | 193 | __ | __ |
Thank you for testing! Please file GitHub issues for any failed scenarios at: https://github.com/frostybee/nouto/issues
