<?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: Eric Crooks</title>
    <description>The latest articles on Forem by Eric Crooks (@crookse).</description>
    <link>https://forem.com/crookse</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%2F342543%2F2747271f-96eb-4140-aefc-48d5c33d85ca.jpeg</url>
      <title>Forem: Eric Crooks</title>
      <link>https://forem.com/crookse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/crookse"/>
    <language>en</language>
    <item>
      <title>Bonfire Sessions: Snuky's New Application Details Page</title>
      <dc:creator>Eric Crooks</dc:creator>
      <pubDate>Tue, 28 Apr 2026 22:38:23 +0000</pubDate>
      <link>https://forem.com/crookse/bonfire-sessions-snukys-new-application-details-page-519j</link>
      <guid>https://forem.com/crookse/bonfire-sessions-snukys-new-application-details-page-519j</guid>
      <description>&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I have a ton of scrap wood (woodworking is my hobby) and time to spare in my job search. So here I am coding Snuky by the bonfire—finishing a new feature that enables me to take control of each job opportunity and refine my process for other job opportunities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issues Encountered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Drizzle ORM
&lt;/h3&gt;

&lt;p&gt;I chose &lt;a href="https://orm.drizzle.team/" rel="noopener noreferrer"&gt;Drizzle ORM&lt;/a&gt; for Snuky because I like exploring new technologies. I've used Prisma, Sequelize, and Postgres.js for most of my JavaScript career and don't have issues with them, but I prefer not to rely on the same tools repeatedly. Drizzle is new to me and I want to see how intuitive it is and how it compares to what I've already used.&lt;/p&gt;

&lt;h4&gt;
  
  
  Interoperability
&lt;/h4&gt;

&lt;p&gt;When I migrated the project from using SQLite to Postgres, I had to change my Drizzle ORM queries. For example, here's some code showing how to get my resumes using SQLite and Postgres implementations. I'm using &lt;code&gt;drizzle-orm@~0.45.2&lt;/code&gt; here btw.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;drizzle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* configs */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// SQLite impl&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resumes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resumes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Postgres impl&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resumes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resumes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;results&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can above, the SQLite implementation can return a result in a single chained call. The Postgres implementation does not have a &lt;code&gt;.get()&lt;/code&gt; method, so I had to figure out how to get a single result from the query—make the query and get the first element of the possibly returned array.&lt;/p&gt;

&lt;p&gt;My expectation with interoperable code here is: &lt;strong&gt;devs should be able to switch their database without having to modify their code&lt;/strong&gt;. Granted, the code is not far off from being able to do this, but being a little off can degrade the developer experience (if you add missing documentation to this, then it's degraded a bit more).&lt;/p&gt;

&lt;p&gt;Being on &lt;code&gt;drizzle-orm v0.x&lt;/code&gt;, I did try using &lt;code&gt;drizzle-orm v1.x&lt;/code&gt; and it didn't make a difference with interoperability. I still had to change my code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Migrations
&lt;/h4&gt;

&lt;p&gt;I had a difficult time trying to get migrations to work. The error outputs aren't clear and sometimes there are no errors. Sometimes &lt;code&gt;drizzle-kit&lt;/code&gt; just fails silently, and I'm not the only one experiencing these issues. See the related issue and pull request below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/drizzle-team/drizzle-orm/issues/5521" rel="noopener noreferrer"&gt;https://github.com/drizzle-team/drizzle-orm/issues/5521&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/drizzle-team/drizzle-orm/pull/5617" rel="noopener noreferrer"&gt;https://github.com/drizzle-team/drizzle-orm/pull/5617&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I spent about 4 hours trying to get migrations to work for me. I even tried using the internal &lt;code&gt;migrate()&lt;/code&gt; function and couldn't get that to work for me (still encountered silent failures).&lt;/p&gt;

&lt;h4&gt;
  
  
  Documentation
&lt;/h4&gt;

&lt;p&gt;There's a documentation-driven article on GitHub somewhere that states (words to this effect), "If it's not documented, it doesn't exist. If it's documented incorrectly, it's broken." In Drizzle ORM's case, there are many things undocumented, yet the product seems feature-rich. I do wish their documentation was more verbose and broken down Barney style like Team Treehouse videos because I feel this product can be very intuitive. I did fork the repo with plans to write some documentation for them, but that's a low priority for me right now.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.crookse.com/journal/2026-04-27-bonfire-sessions-snukys-new-application-details-page" rel="noopener noreferrer"&gt;https://www.crookse.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>AI vs. AI: Snuky’s New Look</title>
      <dc:creator>Eric Crooks</dc:creator>
      <pubDate>Tue, 28 Apr 2026 22:36:30 +0000</pubDate>
      <link>https://forem.com/crookse/ai-vs-ai-snukys-new-look-3fg7</link>
      <guid>https://forem.com/crookse/ai-vs-ai-snukys-new-look-3fg7</guid>
      <description>&lt;h2&gt;
  
  
  Snuky in a Nutshell
&lt;/h2&gt;

&lt;p&gt;I started working on Snuky a week or two ago. I mentioned it in my last article (&lt;a href="https://crookse.com/journal/2026-04-13-how-ai-is-driving-your-job-search-without-you-knowing" rel="noopener noreferrer"&gt;How AI Is Driving Your Job Search Without You Knowing&lt;/a&gt;) where I discussed using AI tools to "beat the system" (the system being any AI-driven ATS).&lt;/p&gt;

&lt;p&gt;Snuky is my AI-driven platform for automating job searches and applications. Tracking them in Google Sheets was burning me out, so I decided to code something to solve that pain point in my job search. As of today, Snuky is tracking my applications, monitoring job postings, and notifying me of changes to job postings. So far it's made job searching easier for me—especially when it comes to notifying me about job postings being removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Job Description Matching
&lt;/h3&gt;

&lt;p&gt;By reverse-engineering AI models and ATS keyword matching (NLP-driven), I &lt;em&gt;think&lt;/em&gt; I've figured out how they score resumes against job descriptions—they (or recruiters themselves) reject candidates that don't meet a specific threshold match (e.g., 50%). Snuky does well with extracting job description keywords, but calculating my resume's exact match score is iffy since AI models define "matches" differently. Using this knowledge, I'll combine the results of different AI models and use the average match score.&lt;/p&gt;

&lt;h3&gt;
  
  
  More Automation
&lt;/h3&gt;

&lt;p&gt;This is just the beginning of my automated job search process. I'm planning to automate it to the point I don't have to search for jobs. My plan is to have Snuky search for jobs (specifically job descriptions on job boards) that match my resume or could match my resume (based on keyword matching). From there it will take my resume and tailor it to the job description. Currently, that's a manual process for me and it's tedious AF.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://www.crookse.com/journal/2026-04-17-ai-vs-ai-snukys-new-look" rel="noopener noreferrer"&gt;https://www.crookse.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>career</category>
    </item>
    <item>
      <title>Why we created Rhum for testing Deno projects</title>
      <dc:creator>Eric Crooks</dc:creator>
      <pubDate>Wed, 24 Jun 2020 12:31:28 +0000</pubDate>
      <link>https://forem.com/crookse/why-we-created-rhum-for-testing-deno-projects-33mf</link>
      <guid>https://forem.com/crookse/why-we-created-rhum-for-testing-deno-projects-33mf</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/drashland/rhum" rel="noopener noreferrer"&gt;Rhum&lt;/a&gt; is a lightweight testing framework for Deno. It uses zero dependencies outside of Deno's Standard Modules and works with &lt;code&gt;deno test&lt;/code&gt; under the hood.&lt;/p&gt;

&lt;p&gt;This article dives deeper into the "why" we created Rhum and for what purpose.&lt;/p&gt;

&lt;p&gt;An article written by &lt;a class="mentioned-user" href="https://dev.to/craigmorten"&gt;@craigmorten&lt;/a&gt; dives deeper into using Rhum. Link is here &lt;a href="https://dev.to/craigmorten/how-to-write-spec-tests-in-deno-55e8"&gt;https://dev.to/craigmorten/how-to-write-spec-tests-in-deno-55e8&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;The Drash Land team and I noticed that testing Drash was starting to become unwieldy. Drash has many unit tests and the output was something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test parseBodyAsJson: can parse JSON bodies... ok (2ms)
test setHeaders(): attaches headers the request ... ok (2ms)
test getMimeType(): file is not a URL ... ok (3ms)
test getMimeType(): file is a URL ... ok (4ms)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While testing, we noticed that the output was not as descriptive as we wanted/needed it to be to help us debug failing tests. Failing tests were not easily noticeable through the output. So next we tried to be more descriptive with the tests to get the following output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test http_service_test.ts | parseBodyAsJson: can parse JSON bodies... ok (2ms)
test http_service_test.ts | setHeaders(): attaches headers the request ... ok (2ms)
test http_service_test.ts | getMimeType(): file is not a URL ... ok (3ms)
test http_service_test.ts | getMimeType(): file is a URL ... ok (4ms)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this setup, a failing test would show us what test file to look in and what test to look for. This worked for a while, but then the output grew and it became a bit hard to read. See the screenshot below:&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%2Fi%2Fhdow8gja69kj0u2i5l2p.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%2Fi%2Fhdow8gja69kj0u2i5l2p.png" alt="Drash - Rhum" width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not only that, our tests files became hard to read because we did not have a syntax like &lt;a href="https://mochajs.org/" rel="noopener noreferrer"&gt;Mocha&lt;/a&gt;'s nested &lt;code&gt;describe&lt;/code&gt; and &lt;code&gt;it&lt;/code&gt; syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;To make things easier for us, we decided to work on a module (which later became Rhum) to help us write tests like Mocha and Baretest. We also wanted the output to be nice. Our thoughts on the syntax were something like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;testPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;the_test_file.ts&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="nf"&gt;testSuite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;methodOne()&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="nf"&gt;testCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns true when it does the thing&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="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;testCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns false if it can't do the thing&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="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nf"&gt;testSuite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;methodTwo()&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="nf"&gt;testCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns true when it does the thing&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="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;testCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns false if it can't do the thing&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="p"&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;We used &lt;code&gt;testPlan&lt;/code&gt;, &lt;code&gt;testSuite&lt;/code&gt;, and &lt;code&gt;testCase&lt;/code&gt; to follow QA practices. This is testing after all.&lt;/p&gt;

&lt;p&gt;Our thoughts on the resulting output were something like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;the_test_file.ts
    methodOne()
        returns true when it does the thing
        returns false if it can't do the thing
    methodTwo()
        returns true when it does the thing
        returns false if it can't do the thing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With some very helpful guidance from @bartlomieju from the Deno team, we were able to build Rhum and have it work for us in a way that makes writing tests easier and reading output easier.&lt;/p&gt;

&lt;p&gt;Before Rhum, we had the following output in Drash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test services/http_request_service_test.ts | accepts() | Asserting: accepts the single type if it is present in the header ... ok (1ms)
test services/http_request_service_test.ts | accepts() | Asserting: rejects the single type if it is not present in the header ... ok (1ms)
test services/http_request_service_test.ts | accepts() | Asserting: accepts the first of multiple types if it is present in the header ... ok (1ms)
test services/http_request_service_test.ts | accepts() | Asserting: accepts the second of multiple types if it is present in the header ... ok (1ms)
test services/http_request_service_test.ts | accepts() | Asserting: rejects the multiple types if none are present in the header ... ok (0ms)
test services/http_request_service_test.ts | getCookie() | Asserting: Returns the cookie value if it exists ... ok (1ms)
test services/http_request_service_test.ts | getCookie() | Asserting: Returns undefined if the cookie does not exist ... ok (0ms)
test services/http_service_test.ts | Asserting: getMimeType(): file is not a URL ... ok (3ms)
test services/http_service_test.ts | Asserting: getMimeType(): file is a URL ... ok (4ms)

test result: ok. 116 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (839ms)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services/http_request_service_test.ts
    accepts()
        accepts the single type if it is present in the header ... ok (1ms)
        rejects the single type if it is not present in the header ... ok (1ms)
        accepts the first of multiple types if it is present in the header ... ok (1ms)
        accepts the second of multiple types if it is present in the header ... ok (1ms)
        rejects the multiple types if none are present in the header ... ok (1ms)
    getCookie()
        Returns the cookie value if it exists ... ok (1ms)
        Returns undefined if the cookie does not exist ... ok (1ms)

services/http_service_test.ts
    getMimeType()
        file is not a URL ... ok (3ms)
        file is a URL ... ok (3ms)

test result: ok. 116 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (770ms)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not only that, the test files in Drash are much cleaner with nested test suites and test cases.&lt;/p&gt;

&lt;p&gt;If you are testing your Deno project and running into the issues we came across, I recommend you give Rhum a shot. It may solve your problems as it did for us.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;Eric&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Special Thanks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;@bartlomieju for showing us the following issue to base our development on: &lt;a href="https://github.com/denoland/deno/issues/4092" rel="noopener noreferrer"&gt;https://github.com/denoland/deno/issues/4092&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All who participated in the poll for the name. It was tied between Rhum and Bourbon. We decided to close the poll and have Alexa flip a coin for us. Rhum won.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/melhirech" rel="noopener noreferrer"&gt;@melhirech&lt;/a&gt; for suggesting Rhum in the polls.&lt;/p&gt;

</description>
      <category>deno</category>
      <category>typescript</category>
      <category>testing</category>
    </item>
    <item>
      <title>Drash - A REST microframework for Deno</title>
      <dc:creator>Eric Crooks</dc:creator>
      <pubDate>Thu, 27 Feb 2020 03:40:45 +0000</pubDate>
      <link>https://forem.com/crookse/drash-a-rest-microframework-for-deno-cib</link>
      <guid>https://forem.com/crookse/drash-a-rest-microframework-for-deno-cib</guid>
      <description>&lt;p&gt;As Deno's visibility grows, I'm seeing more and more people who are interested in creating Deno HTTP servers so they can build applications. About a year ago I was in the same position and then came Drash. Drash is a REST microframework for Deno. It's loaded with documentation and tutorials and covers many use cases. I recommend (if you're interested) you check it out!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drash.land" rel="noopener noreferrer"&gt;https://drash.land&lt;/a&gt;&lt;/p&gt;

</description>
      <category>deno</category>
      <category>drash</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
