{"componentChunkName":"component---src-templates-blog-post-js","path":"/test-in-nodejs/","result":{"data":{"markdownRemark":{"fields":{"slug":"/test-in-nodejs/"},"frontmatter":{"titulo":"É hora de aprender a testar!","data":"05/02/2021","tag":"NodeJs","image":{"childImageSharp":{"fluid":{"src":"/static/a4f689ea5dec3a80a04c69bad5f7bb51/46604/testenode.png","base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABfklEQVQ4y+2UTU/CQBCGe/cX6sl/YuKFo9EYE0mIJw96wUhM9GCikQMXjNEECgG0iG4NFbrdFmG729ftQvgSkANHNmlmpzPzzExnUgMrPsYauDpgFEVDOX2fp8/yN5QKKeXAIIfG0btRgFRSyEjLPmCsmNgvrnA826Iz7ScHkDD8mbDrlt/rdXhBC0wSOI6DTCYN2yZgPkVXeipYaufTJwdbZzXc17wh+KFyh0bLGiSRMBijSB4dI509xDnZRjJ1gERiF3v7CTyXczDZDbyOCx742FSwjZ08TvIO0PPAucBVIYvrQhrt4KtfoRACvMcRdCm8kIBSF67bhs98lVHoCvXXESEuihSp/DcsKlSPoQbcFh/x2nxBrno5Y21UXNyy7zMNDYJAcaRKQtHjHOAdCFWt22oqH1/bQ8F1aCz7U56YZIRGow7TLMCyXkHIJxjz1P1NQ4lto1gyUSqbqFYryv7xZ2DGokkuM/Xp1TL+cxjXl1l0Yx5s2Wf9t1k98Bfe6xyEsEB2YAAAAABJRU5ErkJggg==","aspectRatio":1,"srcSet":"/static/a4f689ea5dec3a80a04c69bad5f7bb51/7e7e9/testenode.png 225w,\n/static/a4f689ea5dec3a80a04c69bad5f7bb51/62b1f/testenode.png 450w,\n/static/a4f689ea5dec3a80a04c69bad5f7bb51/46604/testenode.png 500w","sizes":"(max-width: 500px) 100vw, 500px"}}}},"html":"<p>Falaaaa Galera!</p>\n<p>Estou muito animada para esse post, hoje vamos aprender a testar uma API com <strong>tdd</strong> e utilizar <strong>typescript</strong> no nodejs principalmente se você for iniciante, então esse artigo vai ser bem técnico! Já prepara o café e abre o <a href=\"https://code.visualstudio.com/\">vscode</a>!</p>\n<p><img src=\"https://media.giphy.com/media/jvu00LhbjzAJi/giphy.gif\" alt=\"https://media.giphy.com/media/jvu00LhbjzAJi/giphy.gif\"></p>\n<p>Mas antes de iniciar você precisa das seguintes ferramentas:</p>\n<ul>\n<li><a href=\"https://code.visualstudio.com/\">Vscode</a></li>\n<li><a href=\"https://www.npmjs.com/\">npm</a></li>\n<li><a href=\"https://git-scm.com/\">Git</a></li>\n</ul>\n<p>Com as ferramentas em mãos, agora só botar a mão na massa.</p>\n<h3>⚫ O que e TDD?</h3>\n<p>Indo direto ao ponto o TDD (<a href=\"https://en.wikipedia.org/wiki/Test-driven_development\">Test-driven development</a>) é uma metodologia para escrever os testes <strong>primeiro</strong> para um determinado módulo/regra de negócio e para a implementação real <strong>depois</strong>.</p>\n<p>O TDD e um processo de 3 etapas:</p>\n<ul>\n<li>Os desenvolvedores implementam os requisitos do projeto e casos de teste específicos;</li>\n<li>Os casos de teste falham porque os desenvolvedores ainda não escreveram o código;</li>\n<li>Os desenvolvedores escrevem o código para passar nos testes;</li>\n</ul>\n<p>Se você nunca utilizou. Espero que esse artigo te <strong>motive</strong> a utilizar, por que e sensacional!</p>\n<p><img src=\"https://media.giphy.com/media/ZO91JimmRdDrV6qzFT/giphy.gif\" alt=\"https://media.giphy.com/media/ZO91JimmRdDrV6qzFT/giphy.gif\"></p>\n<h3>🏳️ Contexto do projeto</h3>\n<p>Iremos criar uma api de todo list.</p>\n<p>Esse projeto e com foco 100% em testes, aqui <strong>não</strong> vamos aprender sobre JWT, configuração do banco de dados, segurança etc.</p>\n<p><strong>Funcionalidades</strong>:</p>\n<ul>\n<li>✅ Usuário pode listar os todos;</li>\n<li>✅ Usuário pode criar um todo;</li>\n<li>✅ Usuário pode filtrar um todo por id;</li>\n<li>✅ Usuário pode deletar um todo;</li>\n<li>✅ Usuário pode atualizar um todo;</li>\n</ul>\n<p>Tempos atrás fiz um post de <a href=\"https://lorenakauane.com.br/blog/pt/2020-05-22-como-criar-testes-no-front-end-em-reactjs/\">Como criar testes no front-end em ReactJs</a> caso tenha interesse também de testar o seu front!</p>\n<h3>📚 Models</h3>\n<p>Aqui são os modelos do como os dados deve retornar no JSON.</p>\n<p><strong>task:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"task\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"status\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>📍 Routes</h3>\n<p>Aqui você vai conseguir ter a visão das rotas que iremos criar no nosso back-end.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">[GET]   api/todo - View all todos\n[GET]   api/todo/:id - Search by id\n[POST]  api/todo - Save new todo\n[PUT]   api/todo - Update todo\n[DELETE] api/todo/:id - Delete todo</code></pre></div>\n<p>Maravilha, agora a gente tem tudo que a gente precisa para criar nossa api. Bora por a mão no código!</p>\n<h3>⭐ Iniciando o projeto</h3>\n<p>Para iniciar o projeto e bem simples, se certifique que está utilizando o npm ok?</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">mkdir</span> node-todos-testing\n<span class=\"token builtin class-name\">cd</span> node-todos-testing\n<span class=\"token function\">npm</span> init</code></pre></div>\n<h3>💻 Instalando as dependências</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save typescript @types/express express body-parser nodemon</code></pre></div>\n<h3>📢 Configurando o TypeScript</h3>\n<p>Na raiz do projeto crie um arquivo chamado <code class=\"language-text\">tsconfig.json</code> e coloque o seguinte bloco de código</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"compilerOptions\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"module\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"commonjs\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"esModuleInterop\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"target\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"es6\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"noImplicitAny\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"moduleResolution\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"node\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"sourceMap\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"outDir\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dist\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"baseUrl\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\".\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"paths\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"*\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"node_modules/*\"</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"include\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"src/**/*\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"__tests__/**/*\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"exclude\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"node_modules\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"dist\"</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Vamos criar também o arquivo de configuração do <code class=\"language-text\">nodemon.json</code> para ele entender nossos arquivos <code class=\"language-text\">.ts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"ignore\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"**/*.test.ts\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"**/*.spec.ts\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\".git\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"node_modules\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"watch\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"src\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"exec\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"npm run dev:server-debug\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"ext\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ts\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Agora vamos criar a estrura do projeto src e arquivo <code class=\"language-text\">app.ts</code> mas vamos deixar esse arquivo em branco inicialmente ok?</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\">.\n├── node_modules\n├── nodemon.json\n├── package-lock.json\n├── package.json\n├── src\n│   ├── app.ts\n└── tsconfig.json</code></pre></div>\n<p>Agora vamos instalar mais algumas dependências para os testes e realizar nosso primeiro test!</p>\n<ul>\n<li><a href=\"https://jestjs.io/\">Jest</a></li>\n<li><a href=\"https://kulshekhar.github.io/ts-jest/\">ts-jest</a> (Um pré-processador TypeScript com suporte a mapa de origem para Jest que permite usar Jest para testar projetos escritos em TypeScript.)</li>\n<li><a href=\"https://github.com/visionmedia/supertest\">supertest</a>, Biblioteca HTTP</li>\n<li>Jest types</li>\n<li>supertest types</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> i -D jest ts-jest supertest @types/jest @types/supertest</code></pre></div>\n<p>Em seguida, adicione mais um arquivo de configuração para o Jest: <code class=\"language-text\">jest.config.js</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  preset<span class=\"token operator\">:</span> <span class=\"token string\">\"ts-jest\"</span><span class=\"token punctuation\">,</span>\n  testEnvironment<span class=\"token operator\">:</span> <span class=\"token string\">\"node\"</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Depois de adicionar o script de teste ao <code class=\"language-text\">./package.json</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n...\n    <span class=\"token property\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n...\n        <span class=\"token property\">\"test\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"jest\"</span><span class=\"token punctuation\">,</span>\n...\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n...\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Crie mais uma pasta na raiz do projeto <code class=\"language-text\">__tests__</code> e chame nosso arquio <code class=\"language-text\">src/app</code> lembrando que esse arquivo está em branco!</p>\n<p>Mas agora vamos adicionar código nele. Vamos revisar nossa estrutura de projeto, verifique se está igual a sua.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\">.\n├── __tests__\n│   ├── app.test\n├── node_modules\n├── nodemon.json\n├── jest.config.js\n├── package-lock.json\n├── package.json\n├── src\n│   ├── app.ts\n└── tsconfig.json</code></pre></div>\n<p>UFAAAA! Agora podemos escrever nosso primeiro teste \\o</p>\n<p><img src=\"https://media.giphy.com/media/3oKIPnAiaMCws8nOsE/giphy.gif\" alt=\"https://media.giphy.com/media/3oKIPnAiaMCws8nOsE/giphy.gif\"></p>\n<p>No arquivo <code class=\"language-text\">app.test</code> vamos adicionar um endpoint de hello world, para ver se está tudo funcionando.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> newApp <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../src/app\"</span>\n<span class=\"token keyword\">import</span> request <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertest\"</span>\n\n<span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token function\">newApp</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Test public routes\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should respond with a 200 response and a 'Hello World' body in / \"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Hello World!\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Provavelmente a primeira importação vai estar com erro, vamos adicionar o seguinte código no arquivo <code class=\"language-text\">src/app</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> express <span class=\"token keyword\">from</span> <span class=\"token string\">\"express\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Express <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"express\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">newApp</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Express <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  app<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">_<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    res<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello World!\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">return</span> app\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Se executarmos o comando no terminal: <code class=\"language-text\">npm test</code></p>\n<p>Você deve ter algo parecido com isso no seu terminal:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">PASS  __tests__/app.test.ts\n  Test public routes\n    ✓ should respond with a <span class=\"token number\">200</span> response and a <span class=\"token string\">'Hello World'</span> body <span class=\"token keyword\">in</span> /  <span class=\"token punctuation\">(</span><span class=\"token number\">32</span> ms<span class=\"token punctuation\">)</span>\n\nTest Suites: <span class=\"token number\">1</span> passed, <span class=\"token number\">1</span> total\nTests:       <span class=\"token number\">1</span> passed, <span class=\"token number\">1</span> total\nSnapshots:   <span class=\"token number\">0</span> total\nTime:        <span class=\"token number\">1.055</span> s</code></pre></div>\n<p>Agora precisamos refatorar nosso arquivo <code class=\"language-text\">app</code> né? transformar em <code class=\"language-text\">class</code>, e adicionar nosso arquivos de <code class=\"language-text\">router</code>;</p>\n<p>Novo arquivo <code class=\"language-text\">route.ts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> express <span class=\"token keyword\">from</span> <span class=\"token string\">\"express\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Routes</span> <span class=\"token punctuation\">{</span>\n  app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">public</span> <span class=\"token function\">routes</span><span class=\"token punctuation\">(</span>app<span class=\"token operator\">:</span> any<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">_<span class=\"token operator\">:</span> any<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello World!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Arquivo <code class=\"language-text\">app.ts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">as</span> bodyParser <span class=\"token keyword\">from</span> <span class=\"token string\">\"body-parser\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> express <span class=\"token keyword\">from</span> <span class=\"token string\">\"express\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Routes <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./routes\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">App</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">public</span> app<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Application<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">public</span> routePrv<span class=\"token operator\">:</span> Routes <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Routes</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>routePrv<span class=\"token punctuation\">.</span><span class=\"token function\">routes</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">private</span> <span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>app<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>bodyParser<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>app<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>bodyParser<span class=\"token punctuation\">.</span><span class=\"token function\">urlencoded</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> extended<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>app<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"json spaces\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>app<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Arquivo <code class=\"language-text\">app.test.ts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> app <span class=\"token keyword\">from</span> <span class=\"token string\">\"../src/app\"</span>\n<span class=\"token keyword\">import</span> request <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertest\"</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Test public routes\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should respond with a 200 response and a 'Hello World' body in / route\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Hello World!\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Se você rodar o <code class=\"language-text\">npm test</code></p>\n<p>Vai ter o mesmo retorno de success!</p>\n<p>Sensacional né?</p>\n<p>Agora vamos criar mais um teste que retorna a lista de todos:</p>\n<p><code class=\"language-text\">app.test.ts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> app <span class=\"token keyword\">from</span> <span class=\"token string\">\"../src/app\"</span>\n<span class=\"token keyword\">import</span> request <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertest\"</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Test public routes\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should respond with a 200 response and a 'Hello World' body in / route\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Hello World!\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should respond with a 200 response and a list todos body in /todos route\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> res <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todos\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Se você rodar <code class=\"language-text\">npm test</code> vai ter o seguinte retorno:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">FAIL  __tests__/app.test.ts\n  Test public routes\n    ✓ should respond with a <span class=\"token number\">200</span> response and a <span class=\"token string\">'Hello World'</span> body <span class=\"token keyword\">in</span> / route <span class=\"token punctuation\">(</span><span class=\"token number\">22</span> ms<span class=\"token punctuation\">)</span>\n    ✕ should respond with a <span class=\"token number\">200</span> response and a list todos body <span class=\"token keyword\">in</span> /todos route <span class=\"token punctuation\">(</span><span class=\"token number\">7</span> ms<span class=\"token punctuation\">)</span>\n\n  ● Test public routes › should respond with a <span class=\"token number\">200</span> response and a list todos body <span class=\"token keyword\">in</span> /todos route\n\n    expect<span class=\"token punctuation\">(</span>received<span class=\"token punctuation\">)</span>.toEqual<span class=\"token punctuation\">(</span>expected<span class=\"token punctuation\">)</span> // deep equality\n\n    Expected: <span class=\"token number\">200</span>\n    Received: <span class=\"token number\">404</span>\n\n       <span class=\"token number\">9</span> <span class=\"token operator\">|</span>   it<span class=\"token punctuation\">(</span><span class=\"token string\">\"should respond with a 200 response and a list todos body in /todos route\"</span>, async <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token number\">10</span> <span class=\"token operator\">|</span>     const res <span class=\"token operator\">=</span> await request<span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span>.get<span class=\"token punctuation\">(</span><span class=\"token string\">\"/todos\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">></span> <span class=\"token number\">11</span> <span class=\"token operator\">|</span>     expect<span class=\"token punctuation\">(</span>res.status<span class=\"token punctuation\">)</span>.toEqual<span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n         <span class=\"token operator\">|</span>                        ^\n      <span class=\"token number\">12</span> <span class=\"token operator\">|</span>     expect<span class=\"token punctuation\">(</span>res.body<span class=\"token punctuation\">)</span>.toHaveLength<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token number\">13</span> <span class=\"token operator\">|</span>   <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token number\">14</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      at __tests__/app.test.ts:11:24\n      at fulfilled <span class=\"token punctuation\">(</span>__tests__/app.test.ts:5:58<span class=\"token punctuation\">)</span>\n\nTest Suites: <span class=\"token number\">1</span> failed, <span class=\"token number\">1</span> total\nTests:       <span class=\"token number\">1</span> failed, <span class=\"token number\">1</span> passed, <span class=\"token number\">2</span> total\nSnapshots:   <span class=\"token number\">0</span> total\nTime:        <span class=\"token number\">2.346</span> s, estimated <span class=\"token number\">3</span> s\nRan all <span class=\"token builtin class-name\">test</span> suites.\n<span class=\"token function\">npm</span> ERR<span class=\"token operator\">!</span> Test failed.  See above <span class=\"token keyword\">for</span> <span class=\"token function\">more</span> details.</code></pre></div>\n<p>Falhou, mas por que ainda não criamos o <code class=\"language-text\">endpoint</code> todos, vamos criar!</p>\n<p>No arquivo <code class=\"language-text\">routes.ts</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> express <span class=\"token keyword\">from</span> <span class=\"token string\">\"express\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> todos <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    id<span class=\"token operator\">:</span> <span class=\"token string\">\"1\"</span><span class=\"token punctuation\">,</span>\n    task<span class=\"token operator\">:</span> <span class=\"token string\">\"Go to the gym\"</span><span class=\"token punctuation\">,</span>\n    status<span class=\"token operator\">:</span> <span class=\"token string\">\"OK\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Routes</span> <span class=\"token punctuation\">{</span>\n  app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">public</span> <span class=\"token function\">routes</span><span class=\"token punctuation\">(</span>app<span class=\"token operator\">:</span> any<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">_<span class=\"token operator\">:</span> any<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello World!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todos\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">_<span class=\"token operator\">:</span> any<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>todos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Se você rodar <code class=\"language-text\">npm test</code> vai ter o seguinte retorno:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">PASS  __tests__/app.test.ts\n  Test public routes\n    ✓ should respond with a <span class=\"token number\">200</span> response and a <span class=\"token string\">'Hello World'</span> body <span class=\"token keyword\">in</span> / route <span class=\"token punctuation\">(</span><span class=\"token number\">21</span> ms<span class=\"token punctuation\">)</span>\n    ✓ should respond with a <span class=\"token number\">200</span> response and a list todos body <span class=\"token keyword\">in</span> /todos route <span class=\"token punctuation\">(</span><span class=\"token number\">5</span> ms<span class=\"token punctuation\">)</span>\n\nTest Suites: <span class=\"token number\">1</span> passed, <span class=\"token number\">1</span> total\nTests:       <span class=\"token number\">2</span> passed, <span class=\"token number\">2</span> total\nSnapshots:   <span class=\"token number\">0</span> total\nTime:        <span class=\"token number\">0.931</span> s, estimated <span class=\"token number\">3</span> s\nRan all <span class=\"token builtin class-name\">test</span> suites.</code></pre></div>\n<p>YEAHHHH!</p>\n<p>Agora vamos seguir todo o fluxo: <strong>Primeiro o teste</strong>, depois <strong>implementação</strong>, como a gente fez no exemplo a cima!</p>\n<p>Inicialmente vai dar problema, mas vamos adaptando no meio do desenvolvimento, isso é <strong>TDD</strong>!</p>\n<p>O arquivo completo de teste vai ficar desse jeito!</p>\n<p>Criei um arquivo <code class=\"language-text\">TaskType.ts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> type Task <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">?</span><span class=\"token operator\">:</span> string<span class=\"token punctuation\">,</span>\n  task<span class=\"token operator\">?</span><span class=\"token operator\">:</span> string<span class=\"token punctuation\">,</span>\n  status<span class=\"token operator\">?</span><span class=\"token operator\">:</span> string<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">routes.ts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> express <span class=\"token keyword\">from</span> <span class=\"token string\">\"express\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Task <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./TaskType\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> todos <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    id<span class=\"token operator\">:</span> <span class=\"token string\">\"1\"</span><span class=\"token punctuation\">,</span>\n    task<span class=\"token operator\">:</span> <span class=\"token string\">\"Go to the gym\"</span><span class=\"token punctuation\">,</span>\n    status<span class=\"token operator\">:</span> <span class=\"token string\">\"OK\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Routes</span> <span class=\"token punctuation\">{</span>\n  app <span class=\"token operator\">=</span> <span class=\"token function\">express</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">public</span> <span class=\"token function\">routes</span><span class=\"token punctuation\">(</span>app<span class=\"token operator\">:</span> any<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">_<span class=\"token operator\">:</span> any<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello World!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todos\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">_<span class=\"token operator\">:</span> any<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>todos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todo/:id\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> id <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">;</span>\n      todos <span class=\"token operator\">=</span> todos<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>\n        <span class=\"token punctuation\">(</span><span class=\"token parameter\">task<span class=\"token operator\">:</span> Task</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> task<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!==</span> id<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>todos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todo\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> task <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">;</span>\n      todos<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>todos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    app<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todo\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">,</span> res<span class=\"token operator\">:</span> express<span class=\"token punctuation\">.</span>Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> taskToUpdate <span class=\"token operator\">=</span> req<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">;</span>\n      todos <span class=\"token operator\">=</span> todos<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">task<span class=\"token operator\">:</span> Task</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n        task<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> taskToUpdate<span class=\"token punctuation\">.</span>id <span class=\"token operator\">?</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>task<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>taskToUpdate <span class=\"token punctuation\">}</span> <span class=\"token operator\">:</span> task\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      res<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span>todos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">app.test.ts</code></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> app <span class=\"token keyword\">from</span> <span class=\"token string\">\"../src/app\"</span>\n<span class=\"token keyword\">import</span> request <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertest\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Task <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../src/TaskType\"</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Test public routes\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should respond with a 200 response and a 'Hello World' body in / route\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Hello World!\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should respond with a 200 response and a list todos body in /todos route\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> res <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todos\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should create new task in /todo route\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> task<span class=\"token operator\">:</span> Task <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      id<span class=\"token operator\">:</span> <span class=\"token string\">\"2\"</span><span class=\"token punctuation\">,</span>\n      task<span class=\"token operator\">:</span> <span class=\"token string\">\"Learning IA\"</span><span class=\"token punctuation\">,</span>\n      status<span class=\"token operator\">:</span> <span class=\"token string\">\"NOT\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">const</span> res <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todo\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should update a task in /todo route\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> taskToUpdate<span class=\"token operator\">:</span> Task <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      id<span class=\"token operator\">:</span> <span class=\"token string\">\"2\"</span><span class=\"token punctuation\">,</span>\n      task<span class=\"token operator\">:</span> <span class=\"token string\">\"Learning IA\"</span><span class=\"token punctuation\">,</span>\n      status<span class=\"token operator\">:</span> <span class=\"token string\">\"OK\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">const</span> res <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/todo\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>taskToUpdate<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> todos <span class=\"token operator\">=</span> res<span class=\"token punctuation\">.</span>body\n    <span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> todos<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span>\n      <span class=\"token punctuation\">(</span><span class=\"token parameter\">task<span class=\"token operator\">:</span> Task</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> task<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> taskToUpdate<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBeTruthy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"should return a task in /todo:id route\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> res <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>app<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/todo/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token number\">1</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveLength</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Testes criados! Agora você tem mais segurança para alterar o código e implementar novas regras de negócio.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">PASS  __tests__/app.test.ts\n  Test public routes\n    ✓ should respond with a <span class=\"token number\">200</span> response and a <span class=\"token string\">'Hello World'</span> body <span class=\"token keyword\">in</span> / route <span class=\"token punctuation\">(</span><span class=\"token number\">22</span> ms<span class=\"token punctuation\">)</span>\n    ✓ should respond with a <span class=\"token number\">200</span> response and a list todos body <span class=\"token keyword\">in</span> /todos route <span class=\"token punctuation\">(</span><span class=\"token number\">6</span> ms<span class=\"token punctuation\">)</span>\n    ✓ should create new task <span class=\"token keyword\">in</span> /todo route <span class=\"token punctuation\">(</span><span class=\"token number\">22</span> ms<span class=\"token punctuation\">)</span>\n    ✓ should update a task <span class=\"token keyword\">in</span> /todo route <span class=\"token punctuation\">(</span><span class=\"token number\">4</span> ms<span class=\"token punctuation\">)</span>\n    ✓ should <span class=\"token builtin class-name\">return</span> a task <span class=\"token keyword\">in</span> /todo:id route <span class=\"token punctuation\">(</span><span class=\"token number\">3</span> ms<span class=\"token punctuation\">)</span>\n\nTest Suites: <span class=\"token number\">1</span> passed, <span class=\"token number\">1</span> total\nTests:       <span class=\"token number\">5</span> passed, <span class=\"token number\">5</span> total\nSnapshots:   <span class=\"token number\">0</span> total\nTime:        <span class=\"token number\">2.241</span> s, estimated <span class=\"token number\">3</span> s\nRan all <span class=\"token builtin class-name\">test</span> suites.</code></pre></div>\n<p>O código fonte você encontra <a href=\"https://github.com/LorenaKauane/node-todos-testing\">aqui</a>!</p>\n<p>Obrigada pelo seu tempo!</p>\n<p><img src=\"https://media.giphy.com/media/13CoXDiaCcCoyk/giphy.gif\" alt=\"https://media.giphy.com/media/13CoXDiaCcCoyk/giphy.gif\"></p>","timeToRead":9}},"pageContext":{"slug":"/test-in-nodejs/","previousPost":{"fields":{"slug":"/10-musicas-que-me-faz-ser-mais-produtiva/"},"frontmatter":{"templateKey":"blog-post","data":"12 de Fevereiro de 2021","tag":"assuntos aleatórios","titulo":"10 músicas que me faz ser mais produtiva.","locale":"pt"},"timeToRead":3},"nextPost":{"fields":{"slug":"/descubra-as-4-diferencas-entre-map-e-foreach/"},"frontmatter":{"templateKey":"blog-post","data":"30 de Janeiro de 2021","tag":"Javascript","titulo":"Descubra as 4 diferenças entre map e foreach","locale":"pt"},"timeToRead":3},"locale":"pt"}}}