<commit_before>---
version: 1.0.0
title: Bypass
---

Ao testar nossas aplicações, muitas vezes precisamos fazer chamadas a serviços externos.
Podemos até mesmo querer simular diferentes situações como erros inesperados do servidor.
Tratar isso de modo eficiente não é fácil no Elixir sem uma pequena ajuda.

Nesta lição vamos explorar como [bypass](https://github.com/PSPDFKit-labs/bypass) pode nos ajudar rapidamente e tratar facilmente essas chamadas em nossos testes.

{% include toc.html %}

## O que é Bypass?

[Bypass](https://github.com/PSPDFKit-labs/bypass) é descrito como "uma forma rápida de criar um _plug_ customizado que pode substituir um servidor HTTP real para retornar respostas previamente definidas para requisições de clientes.

O que isso significa?
Internamente, Bypass é uma aplicação OTP que atua como um servidor externo escutando e respondendo a requisições.
Com respostas pré-definidas nós podemos testar qualquer número de possibilidades como interrupções inesperadas de serviço e erros, tudo sem fazer uma única chamada externa.

## Usando Bypass

Para melhor ilustrar as funcionalidades do Bypass vamos construir uma aplicação utilitária simples para testar (_ping_) uma lista de domínios e garantir que eles estão online.
Para fazer isso vamos construir um novo projeto supervisor e um GenServer para verificar os domínios em um interválo configurável.
Aproveitando ByPass em nossos testes poderemos verificar se nossa aplicação funcionará em muitos cenários diferentes.

_Nota_: Se você deseja avançar para o código final, dê uma olhada no repositório [Clinic](https://github.com/elixirschool/clinic) do Elixir School.

Neste ponto devemos estar confortáveis criando novos projetos Mix e adicionando nossas dependências, então focaremos nas partes do código que estamos testando.
Se você precisar de uma atualização rápida, consulte a seção [New Projects](https://elixirschool.com/en/lessons/basics/mix/#new-projects) de nossa lição [Mix](https://elixirschool.com/en/lessons/basics/mix).


Vamos começar criando um novo módulo que tratará de fazer as requisições para nossos domínios.
Com [HTTPoison](https://github.com/edgurgel/httpoison) vamos criar uma função, `ping/1`, que recebe uma URL e retorna `{:ok, body}` para uma requisição HTTP 200 e `{:error, reason}` para todos os outros:

```elixir
defmodule Clinic.HealthCheck do
  def ping(urls) when is_list(urls), do: Enum.map(urls, &ping/1)

  def ping(url) do
    url
    |> HTTPoison.get()
    |> response()
  end
<commit_msg>Fix typo in pt/lessons/libraries/bypass.md (#1945)<commit_after>---
version: 1.0.0
title: Bypass
---

Ao testar nossas aplicações, muitas vezes precisamos fazer chamadas a serviços externos.
Podemos até mesmo querer simular diferentes situações como erros inesperados do servidor.
Tratar isso de modo eficiente não é fácil no Elixir sem uma pequena ajuda.

Nesta lição vamos explorar como [bypass](https://github.com/PSPDFKit-labs/bypass) pode nos ajudar rapidamente e tratar facilmente essas chamadas em nossos testes.

{% include toc.html %}

## O que é Bypass?

[Bypass](https://github.com/PSPDFKit-labs/bypass) é descrito como "uma forma rápida de criar um _plug_ customizado que pode substituir um servidor HTTP real para retornar respostas previamente definidas para requisições de clientes.

O que isso significa?
Internamente, Bypass é uma aplicação OTP que atua como um servidor externo escutando e respondendo a requisições.
Com respostas pré-definidas nós podemos testar qualquer número de possibilidades como interrupções inesperadas de serviço e erros, tudo sem fazer uma única chamada externa.

## Usando Bypass

Para melhor ilustrar as funcionalidades do Bypass vamos construir uma aplicação utilitária simples para testar (_ping_) uma lista de domínios e garantir que eles estão online.
Para fazer isso vamos construir um novo projeto supervisor e um GenServer para verificar os domínios em um intervalo configurável.
Aproveitando ByPass em nossos testes poderemos verificar se nossa aplicação funcionará em muitos cenários diferentes.

_Nota_: Se você deseja avançar para o código final, dê uma olhada no repositório [Clinic](https://github.com/elixirschool/clinic) do Elixir School.

Neste ponto devemos estar confortáveis criando novos projetos Mix e adicionando nossas dependências, então focaremos nas partes do código que estamos testando.
Se você precisar de uma atualização rápida, consulte a seção [New Projects](https://elixirschool.com/en/lessons/basics/mix/#new-projects) de nossa lição [Mix](https://elixirschool.com/en/lessons/basics/mix).


Vamos começar criando um novo módulo que tratará de fazer as requisições para nossos domínios.
Com [HTTPoison](https://github.com/edgurgel/httpoison) vamos criar uma função, `ping/1`, que recebe uma URL e retorna `{:ok, body}` para uma requisição HTTP 200 e `{:error, reason}` para todos os outros:

```elixir
defmodule Clinic.HealthCheck do
  def ping(urls) when is_list(urls), do: Enum.map(urls, &ping/1)

  def ping(url) do
    url
    |> HTTPoison.get()
    |> response()
  end

{'fraction_non_alphanumeric': 0.06566752119897457, 'fraction_numerical': 0.003943995267205679, 'mean_word_length': 4.90454016298021, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 7, 'https://': 12, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4867659', 'n_tokens_mistral': 1798, 'n_tokens_neox': 1695, 'n_words': 642}