<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ryan Reynolds</title>
    <description>The latest articles on Forem by Ryan Reynolds (@the_real_ryan_reynolds).</description>
    <link>https://forem.com/the_real_ryan_reynolds</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2437831%2Ff922e3f1-63e4-4e0c-922f-e1ef691e402e.jpg</url>
      <title>Forem: Ryan Reynolds</title>
      <link>https://forem.com/the_real_ryan_reynolds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/the_real_ryan_reynolds"/>
    <language>en</language>
    <item>
      <title>Stop Making Developers Rebuild Your API Collections</title>
      <dc:creator>Ryan Reynolds</dc:creator>
      <pubDate>Thu, 20 Nov 2025 17:23:04 +0000</pubDate>
      <link>https://forem.com/the_real_ryan_reynolds/stop-making-developers-rebuild-your-api-collections-5d2g</link>
      <guid>https://forem.com/the_real_ryan_reynolds/stop-making-developers-rebuild-your-api-collections-5d2g</guid>
      <description>&lt;h2&gt;
  
  
  Auto-Generate Bruno Collections From Your OpenAPI Specs
&lt;/h2&gt;

&lt;p&gt;Teams ship OpenAPI specs.&lt;br&gt;
Developers need &lt;em&gt;usable&lt;/em&gt; API collections.&lt;br&gt;
Those two things are almost never kept in sync.&lt;/p&gt;

&lt;p&gt;Every time a developer starts integrating with your API, they end up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Importing a Postman file that's already stale&lt;/li&gt;
&lt;li&gt;  Fixing broken request bodies&lt;/li&gt;
&lt;li&gt;  Guessing auth flows&lt;/li&gt;
&lt;li&gt;  Digging through GitHub issues for accurate examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is unnecessary friction. And it wastes time at scale.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;OpenAPI Catalog&lt;/strong&gt;, a fully automated pipeline that turns&lt;br&gt;
OpenAPI specs into &lt;strong&gt;Bruno collections&lt;/strong&gt; + clean &lt;strong&gt;HTML docs&lt;/strong&gt;, always&lt;br&gt;
synced to the source of truth.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://openapicatalog.com/" rel="noopener noreferrer"&gt;https://openapicatalog.com/&lt;/a&gt;&lt;/strong&gt;\&lt;br&gt;
👉 &lt;strong&gt;Open source repo:&lt;/strong&gt; &lt;a href="https://github.com/rreyn-bruno/openapi-catalog" rel="noopener noreferrer"&gt;https://github.com/rreyn-bruno/openapi-catalog&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Collections Should Come &lt;em&gt;From&lt;/em&gt; the Spec, Not Maintained By Hand
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Specs are the truth. Collections are the interface.
&lt;/h3&gt;

&lt;p&gt;The spec declares what your API &lt;em&gt;is&lt;/em&gt;.&lt;br&gt;
The collection shows developers how to &lt;em&gt;use&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;Today, most companies maintain both manually. That guarantees drift.&lt;/p&gt;

&lt;p&gt;When the collection is generated &lt;em&gt;from the spec&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  No rot&lt;/li&gt;
&lt;li&gt;  No missing endpoints&lt;/li&gt;
&lt;li&gt;  No human error&lt;/li&gt;
&lt;li&gt;  No out-of-sync environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This eliminates a huge source of DX pain.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Bruno collections are Git-native, local-first, and deterministic
&lt;/h3&gt;

&lt;p&gt;This is the real unlock.&lt;/p&gt;

&lt;p&gt;Bruno isn't cloud-locked or bloated. It stores everything in plain&lt;br&gt;
files, diffs cleanly, and works offline. That means an autogenerated&lt;br&gt;
collection becomes a &lt;strong&gt;first-class artifact in your repo&lt;/strong&gt;, just like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;openapi.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  SDK code&lt;/li&gt;
&lt;li&gt;  Migration files&lt;/li&gt;
&lt;li&gt;  Scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Clear diffs when your API changes&lt;/li&gt;
&lt;li&gt;  Collections versioned per release tag&lt;/li&gt;
&lt;li&gt;  CI-driven generation&lt;/li&gt;
&lt;li&gt;  A reproducible workflow instead of a manual export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is structurally better than maintaining a Postman export in your&lt;br&gt;
repo.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Documentation improves automatically
&lt;/h3&gt;

&lt;p&gt;OpenAPI Catalog generates clean, fast HTML docs for every spec it&lt;br&gt;
processes.&lt;/p&gt;

&lt;p&gt;Developers get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A readable reference&lt;/li&gt;
&lt;li&gt;  No massive Swagger UI bundles&lt;/li&gt;
&lt;li&gt;  No Try-It sandbox issues&lt;/li&gt;
&lt;li&gt;  No need for a separate docs pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docs and collections now stay perfectly aligned with the spec.&lt;/p&gt;


&lt;h2&gt;
  
  
  How OpenAPI Catalog Works (Technical Overview)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Discover OpenAPI files&lt;/strong&gt; across GitHub and other sources&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Parse, lint, and validate&lt;/strong&gt; the spec&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Generate a Bruno Collection&lt;/strong&gt; mirroring the API structure&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Produce HTML documentation&lt;/strong&gt; automatically&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Host everything&lt;/strong&gt; with download links&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Rebuild on spec changes&lt;/strong&gt; from upstream&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The system is built to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Automated&lt;/li&gt;
&lt;li&gt;  Deterministic&lt;/li&gt;
&lt;li&gt;  Scalable&lt;/li&gt;
&lt;li&gt;  Easy to fork or extend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire pipeline is open source:&lt;br&gt;
&lt;a href="https://github.com/rreyn-bruno/openapi-catalog" rel="noopener noreferrer"&gt;https://github.com/rreyn-bruno/openapi-catalog&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why API Publishers Should Ship Bruno Collections
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Better onboarding
&lt;/h3&gt;

&lt;p&gt;Developers start with working request examples, no editing raw JSON, no fixing broken imports.&lt;/p&gt;
&lt;h3&gt;
  
  
  Better engineering workflow
&lt;/h3&gt;

&lt;p&gt;API changes become obvious through diffs in both the spec and the&lt;br&gt;
collection.&lt;/p&gt;
&lt;h3&gt;
  
  
  Better versioning
&lt;/h3&gt;

&lt;p&gt;Collections track release tags, branches, and environments cleanly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Better ecosystem integration
&lt;/h3&gt;

&lt;p&gt;Bruno collections are portable, local, and friendly to CI systems.&lt;/p&gt;

&lt;p&gt;For forward-thinking teams, this becomes part of the release pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# CI pseudocode&lt;/span&gt;
generate-bruno-collection openapi.yaml &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; collection/
publish collection/ alongside openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or skip the pipeline entirely and let the catalog do it:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://openapicatalog.com/" rel="noopener noreferrer"&gt;https://openapicatalog.com/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Call for Contributors &amp;amp; API Maintainers
&lt;/h2&gt;

&lt;p&gt;The project is open source and early. Contributions are welcome,&lt;br&gt;
especially around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  New spec sources&lt;/li&gt;
&lt;li&gt;  Better generators&lt;/li&gt;
&lt;li&gt;  Improved docs&lt;/li&gt;
&lt;li&gt;  CI integration examples&lt;/li&gt;
&lt;li&gt;  API maintainers who want their API indexed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain an API and want a synced Bruno collection + docs&lt;br&gt;
generated automatically, open an issue or drop your repo.&lt;/p&gt;

&lt;p&gt;OpenAPI is the source of truth.&lt;br&gt;
Bruno is the developer interface.&lt;br&gt;
This project connects the two... automatically.&lt;/p&gt;

</description>
      <category>api</category>
      <category>tooling</category>
      <category>automation</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Stop Storing API Collections Outside Git</title>
      <dc:creator>Ryan Reynolds</dc:creator>
      <pubDate>Fri, 15 Aug 2025 17:11:52 +0000</pubDate>
      <link>https://forem.com/the_real_ryan_reynolds/stop-storing-api-collections-outside-git-573o</link>
      <guid>https://forem.com/the_real_ryan_reynolds/stop-storing-api-collections-outside-git-573o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64ynxjfpnze6r13jl2bt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64ynxjfpnze6r13jl2bt.png" alt="Git-native API clients versus status quo" width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most API clients follow the same tired playbook:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a proprietary cloud.
&lt;/li&gt;
&lt;li&gt;Lock in your formats, workflows, and data.
&lt;/li&gt;
&lt;li&gt;Charge you extra to secure them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile…&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Git has been the foundation of modern software development for over a decade.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It’s where your code, your tests, and your docs already live.&lt;br&gt;&lt;br&gt;
It’s where you’ve invested in security, permissions, audit logs, and backups.&lt;/p&gt;

&lt;p&gt;So why are API collections treated like they’re special snowflakes that need their own platform?&lt;/p&gt;

&lt;p&gt;Every API collection outside Git means:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2x security models, backup strategies, approvals&lt;/li&gt;
&lt;li&gt;No true versioning or history diffs
&lt;/li&gt;
&lt;li&gt;Fragmented onboarding&lt;/li&gt;
&lt;li&gt;A mess&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That duplication wastes time, fragments workflows, and increases risk.&lt;/p&gt;

&lt;p&gt;The fix is obvious:&lt;br&gt;&lt;br&gt;
Use an API client that allows your collections to be in Git right next to the code they belong to.&lt;br&gt;&lt;br&gt;
No extra layer to manage. No parallel workflows to reconcile.&lt;br&gt;&lt;br&gt;
You get versioning, collaboration, CI/CD, and security &lt;em&gt;for free&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Git-native API clients are inevitable.&lt;/p&gt;




&lt;p&gt;💡 &lt;strong&gt;Further reading:&lt;/strong&gt; &lt;a href="https://blog.usebruno.com/api-clients-in-git" rel="noopener noreferrer"&gt;Why API collections belong in Git&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>api</category>
      <category>devtool</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Use External Libraries in Bruno Test Scripts</title>
      <dc:creator>Ryan Reynolds</dc:creator>
      <pubDate>Tue, 08 Jul 2025 15:05:56 +0000</pubDate>
      <link>https://forem.com/the_real_ryan_reynolds/how-to-use-external-libraries-in-bruno-test-scripts-3d40</link>
      <guid>https://forem.com/the_real_ryan_reynolds/how-to-use-external-libraries-in-bruno-test-scripts-3d40</guid>
      <description>&lt;p&gt;API Clients are usually powerful… until you try to use the tools you already know — like external libraries (or...cough... Git).&lt;/p&gt;

&lt;p&gt;Other platforms require workarounds, sandboxes, and script injections to get basic utilities working. But Bruno takes a different approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bruno runs your test scripts in a real Node.js environment.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
That means you can &lt;code&gt;npm install&lt;/code&gt; your favorite packages and &lt;code&gt;require()&lt;/code&gt; them like you would in any local project.&lt;/p&gt;

&lt;p&gt;In this post, we’ll walk through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💡 Why using external libraries in your test scripts matters
&lt;/li&gt;
&lt;li&gt;🔍 What Zod is and why it’s useful
&lt;/li&gt;
&lt;li&gt;🧪 Real-world examples using a pet-themed API and &lt;code&gt;zod&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🛠 How to install libraries into your Bruno collection safely
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s dive in!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🛑 &lt;strong&gt;Heads up&lt;/strong&gt;: Leveraging external libraries requires using &lt;code&gt;Developer Mode&lt;/code&gt;. It's important to be cautious when using this mode as it allows script execution on your machine. Only use &lt;code&gt;Developer Mode&lt;/code&gt; when you trust the author of the collection (or if you are the author, of course).&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🤔 Why Use External Libraries in API Tests?
&lt;/h2&gt;

&lt;p&gt;Real-world APIs can get complex: nested responses, dynamic data, or custom validations. Instead of writing that logic from scratch, external libraries give you reliable, well-tested tools to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Format or manipulate data (&lt;code&gt;dayjs&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Validate conditions (&lt;code&gt;joi&lt;/code&gt;, &lt;code&gt;zod&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Generate dynamic content (&lt;code&gt;uuid&lt;/code&gt;, &lt;code&gt;faker&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Do complex math or logic (&lt;code&gt;mathjs&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Bruno, you don’t need to hack these in. You just install them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; Bruno also includes built-in libraries like &lt;code&gt;chai&lt;/code&gt;, &lt;code&gt;axios&lt;/code&gt;, &lt;code&gt;ajv&lt;/code&gt;, and &lt;code&gt;lodash&lt;/code&gt; — no install needed. &lt;a href="https://docs.usebruno.com/testing/script/inbuilt-libraries" rel="noopener noreferrer"&gt;Learn more in our inbuilt libraries docs&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  📚 What Is Zod?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zod.dev" rel="noopener noreferrer"&gt;&lt;code&gt;zod&lt;/code&gt;&lt;/a&gt; is a TypeScript-first schema validation library for JavaScript. It’s lightweight, powerful, and works great for validating API responses in tests.&lt;/p&gt;

&lt;p&gt;Here’s what Zod is great at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defining strict schemas for expected objects
&lt;/li&gt;
&lt;li&gt;Parsing and validating incoming data
&lt;/li&gt;
&lt;li&gt;Throwing clear, readable errors when validation fails
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📦 Installing External Libraries in Bruno
&lt;/h2&gt;

&lt;p&gt;To use an external package like &lt;code&gt;zod&lt;/code&gt; in your test scripts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Navigate to your Bruno collection folder:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;path/to/your/bruno-collection
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Initialize a &lt;code&gt;package.json&lt;/code&gt; file:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Install the external package:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;zod
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Bruno will now be able to use the installed package inside your test scripts just like any regular Node.js project.&lt;/p&gt;




&lt;h2&gt;
  
  
  🐾 Real-World Examples
&lt;/h2&gt;

&lt;p&gt;Let’s walk through two playful but practical examples using Bruno, Zod, and our echo server. You can follow along or &lt;a href="https://github.com/bruno-collections/external-libraries-zod" rel="noopener noreferrer"&gt;grab the collection from GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fetch.usebruno.com?url=https%3A%2F%2Fgithub.com%2Fbruno-collections%2Fexternal-libraries-zod" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffetch.usebruno.com%2Fbutton.svg" alt="Fetch in Bruno" width="142" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📄 Request 1: Validating Response for &lt;code&gt;Name&lt;/code&gt; and &lt;code&gt;Type&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bruno"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dog"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Luna"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cat"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ziggy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bird"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test Script:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bird&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UserSchema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Validate response schema structure&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3onljbq1oi6nmwu2e3wr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3onljbq1oi6nmwu2e3wr.png" alt="Test Result 1" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📄 Request 2: Detailed Pet Validation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pet_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bruno"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"vaccinated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"friendly"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"energetic"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pet_002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Luna"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"vaccinated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"quiet"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test Script:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PetSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pet_&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;nonnegative&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;vaccinated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PetsResponseSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;pets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PetSchema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Valid response structure for pets&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;PetsResponseSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;All pets must be vaccinated&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unvaccinated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pet&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;pet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vaccinated&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unvaccinated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Found unvaccinated pets: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;unvaccinated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljd49sb9ujijzxa6ux7m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljd49sb9ujijzxa6ux7m.png" alt="Test Result 2" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Why Bruno’s Approach Wins
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Bruno ✅&lt;/th&gt;
&lt;th&gt;Others ❌&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Use &lt;code&gt;require()&lt;/code&gt; like normal Node.js&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install npm packages&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supports any external module (even private)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local-first (no cloud storage of secrets/code)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No sandboxes. No evals. No headaches. 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Try the Demo Yourself
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/bruno-collections/external-libraries-zod" rel="noopener noreferrer"&gt;Fetch the full working collection from GitHub&lt;/a&gt; or click the button below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fetch.usebruno.com?url=https%3A%2F%2Fgithub.com%2Fbruno-collections%2Fexternal-libraries-zod" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffetch.usebruno.com%2Fbutton.svg" alt="Fetch in Bruno" width="142" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ll see the request go out to the echo server, the response come back, and your Zod-powered tests validate the schema.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Using external libraries in test scripts shouldn’t be a hassle. Bruno treats your code like actual code — because it is.&lt;/p&gt;

&lt;p&gt;We’d love to see what libraries &lt;em&gt;you&lt;/em&gt; end up using in Bruno collections. Got something cool to share? Tag us or contribute to &lt;a href="https://docs.usebruno.com" rel="noopener noreferrer"&gt;docs.usebruno.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy testing! 🐶&lt;/p&gt;

</description>
      <category>api</category>
      <category>testing</category>
      <category>node</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Working with JSON Data in Bruno</title>
      <dc:creator>Ryan Reynolds</dc:creator>
      <pubDate>Tue, 08 Jul 2025 11:25:28 +0000</pubDate>
      <link>https://forem.com/the_real_ryan_reynolds/working-with-json-data-in-bruno-2p1l</link>
      <guid>https://forem.com/the_real_ryan_reynolds/working-with-json-data-in-bruno-2p1l</guid>
      <description>&lt;p&gt;JSON (JavaScript Object Notation) is the go-to format for sending and receiving data in modern web APIs. Its simplicity, readability, and wide support across programming languages make it a favorite among developers. While XML had its moment, JSON has clearly taken the lead, especially in the world of REST APIs.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk through the basics of JSON architecture and structure, followed by real-world examples of how to access and test JSON properties using &lt;a href="https://www.usebruno.com" rel="noopener noreferrer"&gt;Bruno&lt;/a&gt;—an open-source, Git-sync'd, API client that puts developers first.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Quick Primer on JSON
&lt;/h2&gt;

&lt;p&gt;JSON represents data as key-value pairs and supports objects, arrays, strings, numbers, booleans, and null values. Here’s a simple JSON object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bruno"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello@usebruno.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"twitter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@use_bruno"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usebruno"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here's a more complex nested structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"orderID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0000001211"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"orderInvoiceNo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1234567"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"OrderBlocks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"lineNo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"productCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"001"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"lineNo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"productCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"012"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despite its nested nature, the data is easy to work with in Bruno thanks to its built-in JSON viewer, which formats responses cleanly and makes it easy to collapse and expand sections.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04aw7eliuk1mwwjspegz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04aw7eliuk1mwwjspegz.png" alt="Bruno JSON Viewer" width="721" height="620"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Bruno Test Examples
&lt;/h2&gt;

&lt;p&gt;Want to try this yourself? All examples are available in a &lt;a href="https://github.com/rreyn-bruno/working-with-JSON" rel="noopener noreferrer"&gt;public GitHub collection&lt;/a&gt;. You can clone it directly, or use the "Fetch in Bruno" button to import them instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Example 1: Validate Key Names and Values
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OrderBlock has expected lineNo and productCode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;OrderBlocks&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstBlock&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lineNo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstBlock&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;productCode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lineNo&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productCode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Example 2: Find a Block by lineNo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Find OrderBlock by lineNo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;OrderBlocks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lineNo&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;an&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productCode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;013&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Example 3: Flatten Nested Arrays of lineNo Values
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Flatten all lineNo arrays&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;OrderBlocks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allLineNos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lineNo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;All lineNos:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;allLineNos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;allLineNos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greaterThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Try It Yourself in Bruno
&lt;/h2&gt;

&lt;p&gt;You can run these tests by cloning the public collection on GitHub. Just click the button below to fetch it directly in Bruno:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fetch.usebruno.com?url=https%3A%2F%2Fgithub.com%2Fbruno-collections%2Fjson-testing-examples" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffetch.usebruno.com%2Fbutton.svg" alt="Fetch in Bruno" width="142" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or clone the repo directly: &lt;a href="https://github.com/bruno-collections/json-testing-examples" rel="noopener noreferrer"&gt;https://github.com/bruno-collections/json-testing-examples&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;JSON is foundational to modern APIs, and Bruno makes working with it simple and elegant. Whether you're debugging a response, writing a test, or building a mock, Bruno helps you focus on what matters — your data.&lt;/p&gt;

&lt;p&gt;To learn more, check out the &lt;a href="https://docs.usebruno.com" rel="noopener noreferrer"&gt;Bruno docs&lt;/a&gt; or &lt;a href="https://discord.com/invite/fAPz4PrYnK" rel="noopener noreferrer"&gt;join the Bruno Discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>testing</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
