From 37885bf4f01337f29da93f560a311c9d1e6393ed Mon Sep 17 00:00:00 2001 From: Jeff Grunewald Date: Wed, 22 Feb 2023 22:19:47 -0500 Subject: [PATCH] Swapping Bandit for Cowboy as default test server (#29) * Swapping Bandit for Cowboy as test server * updating everything and fixing up internal testing apis --- .github/workflows/ci.yml | 8 +-- .github/workflows/release.yml | 4 +- lib/maverick/api/generator.ex | 2 +- mix.exs | 18 +++--- mix.lock | 46 ++++++++-------- test/maverick/api_test.exs | 94 +++++++++++++------------------- test/maverick/exception_test.exs | 55 ++++++------------- test/support/api_case.ex | 90 ++++++++++++++++++++++++++++++ test/support/ca.pem | 17 ++++++ test/support/cert.pem | 50 +++++++---------- test/support/conn_case.ex | 4 +- test/support/key.pem | 76 +++++++++----------------- test/support/test_routes.ex | 3 +- 13 files changed, 248 insertions(+), 219 deletions(-) create mode 100644 test/support/api_case.ex create mode 100644 test/support/ca.pem diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dbf1632..c364e35 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,8 +11,8 @@ jobs: - uses: actions/checkout@v2 - uses: erlef/setup-beam@v1 with: - otp-version: 23.2 - elixir-version: 1.11 + otp-version: 24.3 + elixir-version: 1.12 - name: Get dependencies run: | mix local.rebar --force @@ -28,8 +28,8 @@ jobs: - uses: actions/checkout@v2 - uses: erlef/setup-beam@v1 with: - otp-version: 23.2 - elixir-version: 1.11 + otp-version: 24.3 + elixir-version: 1.12 - name: Retrieve cached PLT uses: actions/cache@v1 id: plt-cache diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d848cb0..8937a76 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,8 +10,8 @@ jobs: - uses: actions/checkout@v2 - uses: erlef/setup-beam@v1 with: - otp-version: 23.2 - elixir-version: 1.11 + otp-version: 24.3 + elixir-version: 1.12 - name: Build run: | mix local.rebar --force diff --git a/lib/maverick/api/generator.ex b/lib/maverick/api/generator.ex index f85af8c..aea4bbe 100644 --- a/lib/maverick/api/generator.ex +++ b/lib/maverick/api/generator.ex @@ -24,7 +24,7 @@ defmodule Maverick.Api.Generator do |> Jason.encode!() var!(conn) - |> put_resp_content_type("application/json", nil) + |> put_resp_content_type("application/json") |> send_resp(404, response) end end diff --git a/mix.exs b/mix.exs index 5fe4452..2def2c0 100644 --- a/mix.exs +++ b/mix.exs @@ -2,7 +2,7 @@ defmodule Maverick.MixProject do use Mix.Project @name "Maverick" - @version "0.2.0" + @version "0.3.0" @repo "https://github.com/jeffgrunewald/maverick" def project do @@ -10,7 +10,7 @@ defmodule Maverick.MixProject do app: :maverick, name: @name, version: @version, - elixir: "~> 1.10", + elixir: "~> 1.12", description: "Web API framework with a need for speed", homepage_url: @repo, source_url: @repo, @@ -31,13 +31,13 @@ defmodule Maverick.MixProject do defp deps do [ - {:plug, "~> 1.12"}, - {:jason, "~> 1.2"}, - {:nimble_parsec, "~> 1.1", optional: true}, - {:dialyxir, "~> 1.1", only: [:dev], runtime: false}, - {:hackney, "~> 1.17", only: :test}, - {:plug_cowboy, "~> 2.5", only: :test}, - {:ex_doc, "~> 0.25", only: :dev, runtime: false} + {:plug, "~> 1.14"}, + {:jason, "~> 1.4"}, + {:nimble_parsec, "~> 1.2", optional: true}, + {:dialyxir, "~> 1.2", only: :dev, runtime: false}, + {:finch, "~> 0.14", only: :test}, + {:bandit, "~> 0.6", only: :test}, + {:ex_doc, "~> 0.29", only: :dev, runtime: false} ] end diff --git a/mix.lock b/mix.lock index 541e10e..435e121 100644 --- a/mix.lock +++ b/mix.lock @@ -1,28 +1,26 @@ %{ - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, - "cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"}, - "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"}, - "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"}, - "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, + "bandit": {:hex, :bandit, "0.6.9", "82e59f9415597b8c02f6af3588d40c3d04b6867365654b603fbe9af81eedb5d1", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 0.6.1", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.4.3", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "c451d2fc26e3b2f703b338070420a6e205e052738c9e1009781d8da96f6c6cc3"}, + "castore": {:hex, :castore, "0.1.22", "4127549e411bedd012ca3a308dede574f43819fe9394254ca55ab4895abfa1a2", [:mix], [], "hexpm", "c17576df47eb5aa1ee40cc4134316a99f5cad3e215d5c77b8dd3cfef12a22cac"}, + "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, + "dialyxir": {:hex, :dialyxir, "1.2.0", "58344b3e87c2e7095304c81a9ae65cb68b613e28340690dfe1a5597fd08dec37", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "61072136427a851674cab81762be4dbeae7679f85b1272b6d25c3a839aff8463"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.30", "0b938aa5b9bafd455056440cdaa2a79197ca5e693830b4a982beada840513c5f", [:mix], [], "hexpm", "3b5385c2d36b0473d0b206927b841343d25adb14f95f0110062506b300cd5a1b"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, - "ex_doc": {:hex, :ex_doc, "0.25.1", "4b736fa38dc76488a937e5ef2944f5474f3eff921de771b25371345a8dc810bc", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3200b0a69ddb2028365281fbef3753ea9e728683863d8cdaa96580925c891f67"}, - "hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"}, - "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, - "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, + "ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"}, + "finch": {:hex, :finch, "0.14.0", "619bfdee18fc135190bf590356c4bf5d5f71f916adb12aec94caa3fa9267a4bc", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5459acaf18c4fdb47a8c22fb3baff5d8173106217c8e56c5ba0b93e66501a8dd"}, + "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, + "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, + "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "2.0.1", "0de4c81303fe07806ebc2494d5321ce8fb4df106e34dd5f9d787b637ebadc256", [:mix], [], "hexpm", "7a86b920d2aedce5fb6280ac8261ac1a739ae6c1a1ad38f5eadf910063008942"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, - "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "plug": {:hex, :plug, "1.12.1", "645678c800601d8d9f27ad1aebba1fdb9ce5b2623ddb961a074da0b96c35187d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d57e799a777bc20494b784966dc5fbda91eb4a09f571f76545b72a634ce0d30b"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.5.0", "51c998f788c4e68fc9f947a5eba8c215fbb1d63a520f7604134cab0270ea6513", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5b2c8925a5e2587446f33810a58c01e66b3c345652eeec809b76ba007acde71a"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, - "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, - "telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, + "mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"}, + "mint": {:hex, :mint, "1.4.2", "50330223429a6e1260b2ca5415f69b0ab086141bc76dc2fbf34d7c389a6675b2", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "ce75a5bbcc59b4d7d8d70f8b2fc284b1751ffb35c7b6a6302b5192f8ab4ddd80"}, + "nimble_options": {:hex, :nimble_options, "0.5.2", "42703307b924880f8c08d97719da7472673391905f528259915782bb346e0a1b", [:mix], [], "hexpm", "4da7f904b915fd71db549bcdc25f8d56f378ef7ae07dc1d372cbe72ba950dce0"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, + "nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"}, + "plug": {:hex, :plug, "1.14.0", "ba4f558468f69cbd9f6b356d25443d0b796fbdc887e03fa89001384a9cac638f", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "bf020432c7d4feb7b3af16a0c2701455cbbbb95e5b6866132cb09eb0c29adc14"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.3", "8f77d13aeb32bfd9e654cb68f0af517b371fb34c56c9f2b58fe3df1235c1251a", [:mix], [], "hexpm", "b5672099c6ad5c202c45f5a403f21a3411247f164e4a8fab056e5cd8a290f4a2"}, + "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, + "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, + "thousand_island": {:hex, :thousand_island, "0.6.2", "4b87f315b767ed6960d1d4b5aee015522d2d2ba12a14144a7b03e706d945e60b", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "84dde4cc8a876bc5993083153ec90a8c3f2feeb57b4a12b1a3206c929e75e226"}, + "websock": {:hex, :websock, "0.4.3", "184ac396bdcd3dfceb5b74c17d221af659dd559a95b1b92041ecb51c9b728093", [:mix], [], "hexpm", "5e4dd85f305f43fd3d3e25d70bec4a45228dfed60f0f3b072d8eddff335539cf"}, } diff --git a/test/maverick/api_test.exs b/test/maverick/api_test.exs index f6e32c9..a3ee101 100644 --- a/test/maverick/api_test.exs +++ b/test/maverick/api_test.exs @@ -1,56 +1,50 @@ defmodule Maverick.ApiTest do use ExUnit.Case, async: true - - import Maverick.Test.Helpers - - @host "http://localhost:4000" + use Maverick.ApiCase @headers [{"content-type", "application/json"}] describe "serves the handled routes" do - setup do - start_supervised!( - {Plug.Cowboy, scheme: :http, plug: Maverick.TestApi, options: [port: 4000]} - ) - - :ok - end + setup :http1_client + setup :http_server - test "GET request with empty body" do - resp = :hackney.get("#{@host}/api/v1/route1/hello/steve") + test "GET request with empty body", ctx do + {:ok, resp} = req(ctx.client, :get, "#{ctx.host}/api/v1/route1/hello/steve") assert 200 == resp_code(resp) assert resp_content_type(resp) assert "Hi there steve" == resp_body(resp) end - test "POST request with custom error code" do + test "POST request with custom error code", ctx do body = %{num1: 2, num2: 3} |> Jason.encode!() - resp = :hackney.post("#{@host}/api/v1/route1/multiply", @headers, body) + + {:ok, resp} = req(ctx.client, :post, "#{ctx.host}/api/v1/route1/multiply", @headers, body) assert 200 == resp_code(resp) assert resp_content_type(resp) assert %{"product" => 6} == resp_body(resp) end - test "POST request that handles the complete Request struct" do - resp = - :hackney.post( - "#{@host}/api/v1/route2/fly/me/to/the", - @headers ++ [{"space-rocket", "brrr"}], - "" + test "POST request that handles the complete Request struct", ctx do + {:ok, resp} = + req( + ctx.client, + :post, + "#{ctx.host}/api/v1/route2/fly/me/to/the", + @headers ++ [{"space-rocket", "brrr"}] ) %{"destination" => destination} = resp |> resp_body() assert 200 == resp_code(resp) - assert resp_content_type(resp) - assert {"space-rocket", "brrr"} in resp_headers(resp) + assert {"space-rocket", "BRRR"} in resp_headers(resp) assert destination in ["moon", "mars", "stars"] end - test "PUT requests with query params" do - resp = :hackney.put("#{@host}/api/v1/route2/clock/now?timezone=Etc/UTC", @headers) + test "PUT requests with query params", ctx do + {:ok, resp} = + req(ctx.client, :put, "#{ctx.host}/api/v1/route2/clock/now?timezone=Etc/UTC", @headers) {:ok, %DateTime{} = time, _} = resp |> resp_body() |> DateTime.from_iso8601() @@ -61,30 +55,24 @@ defmodule Maverick.ApiTest do end describe "supplies error results" do - setup do - start_supervised!( - {Plug.Cowboy, scheme: :http, plug: Maverick.TestApi, options: [port: 4000]} - ) + setup :http1_client + setup :http_server - :ok - end + test "handles unexpected routes", ctx do + body = %{"magic_word" => "please"} |> Jason.encode!() - test "handles unexpected routes" do - resp = - :hackney.post( - "#{@host}/api/v1/route1/gimme/that/data", - @headers, - %{"magic_word" => "please"} |> Jason.encode!() - ) + {:ok, resp} = + req(ctx.client, :post, "#{ctx.host}/api/v1/route1/gimme/that/data", @headers, body) assert 404 == resp_code(resp) assert resp_content_type(resp) assert %{"error_code" => 404, "error_message" => "Not Found"} == resp_body(resp) end - test "handles error tuples from internal functions" do + test "handles error tuples from internal functions", ctx do body = %{num1: 25, num2: 2} |> Jason.encode!() - resp = :hackney.post("#{@host}/api/v1/route1/multiply", @headers, body) + + {:ok, resp} = req(ctx.client, :post, "#{ctx.host}/api/v1/route1/multiply", @headers, body) assert 403 == resp_code(resp) assert resp_content_type(resp) @@ -92,26 +80,18 @@ defmodule Maverick.ApiTest do end end - defp resp_code({:ok, status_code, _headers, _ref}), do: status_code - - defp resp_headers({:ok, _status_code, headers, _ref}), do: headers + describe "ssl" do + setup :http1_client + setup :https_server - defp resp_header({:ok, _, headers, _}, key) do - Enum.find(headers, fn {k, _} -> k == key end) - end + test "handles secured connections", ctx do + body = %{num1: 4, num2: 4} |> Jason.encode!() - defp resp_body({:ok, _status_code, _headers, ref}) do - {:ok, body} = :hackney.body(ref) - Jason.decode!(body) - end + {:ok, resp} = req(ctx.client, :post, "#{ctx.host}/api/v1/route1/multiply", @headers, body) - defp resp_content_type(resp) do - case resp_header(resp, "content-type") do - nil -> - flunk("Content-type is not set") - - {_, content_type} -> - assert response_content_type?(content_type, :json) + assert 200 == resp_code(resp) + assert resp_content_type(resp) + assert %{"product" => 16} == resp_body(resp) end end end diff --git a/test/maverick/exception_test.exs b/test/maverick/exception_test.exs index e4cbe3c..03627b0 100644 --- a/test/maverick/exception_test.exs +++ b/test/maverick/exception_test.exs @@ -1,21 +1,19 @@ defmodule Maverick.ExceptionTest do use ExUnit.Case + use Maverick.ApiCase - import Maverick.Test.Helpers - - @host "http://localhost:4000" @headers [{"content-type", "application/json"}] - setup_all do - start_supervised!({Plug.Cowboy, scheme: :http, plug: Maverick.TestApi, options: [port: 4000]}) - - :ok - end + setup_all :http_server describe "handles exceptions" do - test "default fallback impl for unexpected exceptions" do + setup :http1_client + + test "default fallback impl for unexpected exceptions", ctx do bad_body = %{num1: 2, num2: "three"} |> Jason.encode!() - resp = :hackney.post("#{@host}/api/v1/route1/multiply", @headers, bad_body) + + {:ok, resp} = + req(ctx.client, :post, "#{ctx.host}/api/v1/route1/multiply", @headers, bad_body) assert 500 == resp_code(resp) @@ -25,10 +23,12 @@ defmodule Maverick.ExceptionTest do } == resp_body(resp) end - test "known exception type in request handling" do - resp = - :hackney.post( - "#{@host}/api/v1/route2/fly/me/to/the", + test "known exception type in request handling", ctx do + {:ok, resp} = + req( + ctx.client, + :post, + "#{ctx.host}/api/v1/route2/fly/me/to/the", [{"Content-Type", "application/x-www-form-urlencoded"}], "field1=value1&field2=value2" ) @@ -42,34 +42,15 @@ defmodule Maverick.ExceptionTest do } == resp_body(resp) end - test "custom exception handling" do + test "custom exception handling", ctx do illegal_body = %{"color" => "red"} |> Jason.encode!() - resp = :hackney.post("#{@host}/api/v1/route1/color_match", @headers, illegal_body) + + {:ok, resp} = + req(ctx.client, :post, "#{ctx.host}/api/v1/route1/color_match", @headers, illegal_body) assert 406 = resp_code(resp) assert %{"error_code" => 406, "error_message" => "no red!"} == resp_body(resp) end end - - defp resp_code({:ok, status_code, _headers, _ref}), do: status_code - - defp resp_header({:ok, _, headers, _}, key) do - Enum.find(headers, fn {k, _} -> k == key end) - end - - defp resp_body({:ok, _status_code, _headers, ref}) do - {:ok, body} = :hackney.body(ref) - Jason.decode!(body) - end - - defp resp_content_type(resp) do - case resp_header(resp, "content-type") do - nil -> - flunk("Content-type is not set") - - {_, content_type} -> - assert response_content_type?(content_type, :json) - end - end end diff --git a/test/support/api_case.ex b/test/support/api_case.ex new file mode 100644 index 0000000..ad35d34 --- /dev/null +++ b/test/support/api_case.ex @@ -0,0 +1,90 @@ +defmodule Maverick.ApiCase do + @moduledoc false + + use ExUnit.CaseTemplate + + using do + quote location: :keep do + import Maverick.Api.Helpers + end + end +end + +defmodule Maverick.Api.Helpers do + @moduledoc false + + import ExUnit.Callbacks, only: [start_supervised: 1, start_supervised!: 1] + + def http1_client(_context), do: finch_client(:http1) + def http2_client(_context), do: finch_client(:http2) + + defp finch_client(protocol) do + name = self() |> inspect() |> String.to_atom() + + opts = [ + name: name, + pools: %{ + default: [ + size: 50, + count: 1, + protocol: protocol, + conn_opts: [ + transport_opts: [ + verify: :verify_peer, + cacertfile: Path.join(__DIR__, "../support/ca.pem") + ] + ] + ] + } + ] + + start_supervised!({Finch, opts}) + [client: name] + end + + def http_server(_context), do: server(:http) + def https_server(_context), do: server(:https) + + defp server(type) do + transport_options = + case type == :https do + true -> + [ + certfile: Path.join(__DIR__, "../support/cert.pem"), + keyfile: Path.join(__DIR__, "../support/key.pem") + ] + + false -> + [] + end + + {:ok, server} = + [ + plug: Maverick.TestApi, + scheme: type, + read_timeout: 1000, + options: [port: 0, transport_options: Keyword.merge(transport_options, ip: :loopback)] + ] + |> Bandit.child_spec() + |> start_supervised() + + {:ok, %{port: port}} = ThousandIsland.listener_info(server) + [host: "#{type}://localhost:#{port}", port: port] + end + + def req(client, method, uri, headers \\ [], body \\ nil) do + method + |> Finch.build(uri, headers, body) + |> Finch.request(client) + end + + def resp_code(%Finch.Response{status: status_code}), do: status_code + + def resp_headers(%Finch.Response{headers: headers}), do: headers + + def resp_body(%Finch.Response{body: body}), do: Jason.decode!(body) + + def resp_content_type(resp) do + {"content-type", "application/json; charset=utf-8"} in resp_headers(resp) + end +end diff --git a/test/support/ca.pem b/test/support/ca.pem new file mode 100644 index 0000000..c4ed0ed --- /dev/null +++ b/test/support/ca.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICyjCCAbICCQCRKhJFmW6v0zANBgkqhkiG9w0BAQsFADAnMQswCQYDVQQGEwJV +UzEYMBYGA1UEAwwPRXhhbXBsZS1Sb290LUNBMB4XDTIxMDYwNjAzMDcxMVoXDTI3 +MDExNDAzMDcxMVowJzELMAkGA1UEBhMCVVMxGDAWBgNVBAMMD0V4YW1wbGUtUm9v +dC1DQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOdFzns6VXOtAsVw +CxAVWFbfEEDzzJemaCmcnW7xxcPu/NutEKbrZzDPUW8FcRTK90i81rffcT12hEFV +k66zVWVOxYFAGxqYhvrOaJlehwlWdmGCl2740UdsvXsziNXuKFYmZi3/8+rV4UJY +s/Ipv61a8x/2KagCYykr2G03iAiF/C2j//xpjrUfSuGMu/lapDXxQfDsAGtd7qSc +HHEMzBvLq8cLuwVJFQEBqvEU3Nkn3gAeW7gC6myGRH3c68mbWmY/r5RcS7KdFjsD +BVMGZXOtzLozXzQqI/G4DmTxKvYqFN/pjz9PZ8vQFkr9ddrC09kNmxCcCbC3WQfa +3FihVM0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA1oErpO9Co61Wb+6mqYyFMZpy +Bedyf3SIQzQlDig+R/+avs7ZMmZtu0A7LjMPdgpfrJhlBK/1ThkNRYRsMbnyku+F +qC1XEnrfRG9PXYcxigH6DLTaHSfYVE5QQFQAZequiQb6K0LVWUcuPVkzZNGMl3RR +qb9/pM2hCwwNApnZYi4SzH6tfhF6OFi5dNexCEqqtKd00ZZh09ERhnqZpR62jQS/ +SERs6ZS9K9D+A9f/4cRSJOFB9gSfil0sqxBC5GhO6Bse5HEprlPkHPeoHMD1Mj1K +zH1twf4Amnz3p9OGRZZ6qspkXhT+8gTIfzlcX/wJpv7c53uI/OAIxRwogI0w7Q== +-----END CERTIFICATE----- diff --git a/test/support/cert.pem b/test/support/cert.pem index 8f03246..4c27742 100644 --- a/test/support/cert.pem +++ b/test/support/cert.pem @@ -1,33 +1,21 @@ -----BEGIN CERTIFICATE----- -MIIFxjCCA64CCQD3kovuOkiV7TANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMC -VVMxCzAJBgNVBAgMAk9IMREwDwYDVQQHDAhDb2x1bWJ1czEZMBcGA1UECgwQR3J1 -bmV3YWxkIERlc2lnbjEUMBIGA1UECwwLRW5naW5lZXJpbmcxGjAYBgNVBAMMEXRl -c3QubWF2ZXJpY2suY29tMScwJQYJKoZIhvcNAQkBFhhqZWZmQGdydW5ld2FsZGRl -c2lnbi5jb20wIBcNMjAxMTE5MjEyMDM1WhgPMjEyMDEwMjYyMTIwMzVaMIGjMQsw -CQYDVQQGEwJVUzELMAkGA1UECAwCT0gxETAPBgNVBAcMCENvbHVtYnVzMRkwFwYD -VQQKDBBHcnVuZXdhbGQgRGVzaWduMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEaMBgG -A1UEAwwRdGVzdC5tYXZlcmljay5jb20xJzAlBgkqhkiG9w0BCQEWGGplZmZAZ3J1 -bmV3YWxkZGVzaWduLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AOichQ1WeujxF1GwQUB1R644+IXIXf7Oy5A7mJzX2avFpZfHxZ+A5flNyyx74JZt -KGS6kYFoMy8MYF1o/YfWv45jh5pjIMBC4343SpUdZ9NJd9LfvWbhnpvVEiwLBmgZ -3vlHgI2IoQ/g32J7CVoPz49lLvXjfMVQiblsPZpzkajwgHHJERb3W9nnbxx+gcku -+EhC2N/kfdhcJJvtVx3z3/sGK/iiPhZuv8qJwYMXwEUor1NMWyMi1/ozKW3rJ8Xn -PGPlpbyTh/z0NZQDoZVgeQkS/Agao2ixJ0c0PJdeyvXLU0DetHD6nj3LCZK3jBFR -ThTVC/HzG+FiwvvN88WIXykxVlAdtr7vgBk/AQ+K9ckQcc4MAJp8B/RIWb7hBj5s -g8KOBoYcHfNiWqJgAr1D6b2qPwaxUi0oZAkyikvflTx0y2fVm+rNtBUMT2ITiHWd -dpsixjFv7J48v4sJlC24QQTYIGMpTdm+ZO6phFOsuSzked5YKrE8kzEs9iier8N0 -++CJwMZHcHeokGHguVAjzHV3lyUf2LRUCz0QCyLQSb68mWb6nf5GX49ElwdzPwFH -qeQ0fSNNHiTYth8TpNRpMTlVemzG97v93PiO+ydgXScarp6lRpnziGgxroCRBhb3 -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 -----END CERTIFICATE----- diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index fff70ec..c28d90d 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -3,12 +3,12 @@ defmodule Maverick.ConnCase do using do quote do - import Maverick.Test.Helpers + import Maverick.Conn.Helpers end end end -defmodule Maverick.Test.Helpers do +defmodule Maverick.Conn.Helpers do require ExUnit.Assertions def response(%Plug.Conn{status: status, resp_body: body}, given) do diff --git a/test/support/key.pem b/test/support/key.pem index 3297d37..138b22e 100644 --- a/test/support/key.pem +++ b/test/support/key.pem @@ -1,52 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDonIUNVnro8RdR -sEFAdUeuOPiFyF3+zsuQO5ic19mrxaWXx8WfgOX5Tcsse+CWbShkupGBaDMvDGBd -aP2H1r+OY4eaYyDAQuN+N0qVHWfTSXfS371m4Z6b1RIsCwZoGd75R4CNiKEP4N9i -ewlaD8+PZS7143zFUIm5bD2ac5Go8IBxyREW91vZ528cfoHJLvhIQtjf5H3YXCSb -7Vcd89/7Biv4oj4Wbr/KicGDF8BFKK9TTFsjItf6Mylt6yfF5zxj5aW8k4f89DWU -A6GVYHkJEvwIGqNosSdHNDyXXsr1y1NA3rRw+p49ywmSt4wRUU4U1Qvx8xvhYsL7 -zfPFiF8pMVZQHba+74AZPwEPivXJEHHODACafAf0SFm+4QY+bIPCjgaGHB3zYlqi -YAK9Q+m9qj8GsVItKGQJMopL35U8dMtn1ZvqzbQVDE9iE4h1nXabIsYxb+yePL+L -CZQtuEEE2CBjKU3ZvmTuqYRTrLks5HneWCqxPJMxLPYonq/DdPvgicDGR3B3qJBh -4LlQI8x1d5clH9i0VAs9EAsi0Em+vJlm+p3+Rl+PRJcHcz8BR6nkNH0jTR4k2LYf -E6TUaTE5VXpsxve7/dz4jvsnYF0nGq6epUaZ84hoMa6AkQYW939SWIJAW5dvwZjN -1mGFyLBvKM1RWgwaaehgddk96dvuEQIDAQABAoICAC+5XTr9UT5VqJkj9l9JMKm4 -GpUoJNDQkMdI0ujrCEfLx0u6uvscsRJTOaooyE1UnAL+nDfWrxmqCmNf1RR3pNmL -5hhw2hlYH+CXa3/ohpK88g6bxPpEtAv4zT+oC2p0VGEEoIVpUNI3Kt3DrImD0Ov0 -sIvWXpUFDxyx7nmv2GS240N1I0J5AalVaGCKPAqQznPU8zYMZR1s2j37lfIZRQz1 -mTPr5Z0on8ToOoGw78vAqygF9HTjAzjcIlXg90oNRUChrz1fb3kgiZWSoSZKosqP -0JHBFWG3Zv2e5AeSdUW0r6IRjyfW43x+Gbq2WdB7w+9WPpsna8L0RljvSmJutkcT -KMPXxTx5e7vZcqf1IH8LBqKXSyCSibyKO/v9qhomMCrnZ7nCJeaKqubhP3GBVfWI -gb0pnr97OR7ZJMtUVCZhj9EFcsgW4cHnVc51G43uhFzEJQELJoKQFL/Q2Ui0LJFt -ELkXqCq6EUf/6knJa9ZHiiniMqpG/ZlByOLagp8vtrxKIvNazk69K5+wqZH7BqcS -iq1Ovtj0N3kNaD6GEEqgtKTJvK59SXpxjnPHQp43qEQ3XrFSDLq8dsgPnp+yeZdJ -iWf3Z5ny+FSv9EpoVLb6QQE2FlZ+PT76XB39yzET0YgQ8djxxkiaim1o8SLV3ccz -ZbeglmlBz8bWAkDhgXM5AoIBAQD4BhNSiEOk/hQHwAsuBiTIKE0AorFBED9x+BTh -SSLfvtwFPjyzZyuop8ZMPocG48HMUqWOiC6P5+ZS5wmvhvLMvZt9ryK4kNB1ahXL -GWw8YlFqZ5r9F8AK7MitApNs9s6jL0flHVqJcyW8DFO6jQWygqKJ+irIR5no6Xs0 -uCvAC4TI2Ud6euue0F9FONNgofxybStKL7Mk0Wms0FjrUWu46+Qu49Bqp9fAJOVp -lgknWV4lX3GhstFBlph4qpIWU0FoPcumvzY+jRtnzDKKqojk/86cO1exq0vQldg3 -+yMzSk3Wdm/1ZYYpp1pP3D2mr2sJ/Fbfq3/FxaMIp4crYttLAoIBAQDwF47XkxRj -03HBICq2Qk5sz2666bLmKVcDYUdrzY+bWNoNgtkUpMtLPooNyDIccEgg9HVUXl1L -+WmKsSXpi3m3eMl2qGbgD0MLpisPsmpTNpJwomulSy64Biq0ILWRhSBbXCQ1H+My -IGQwGaXIQWgN5bDGX4E0vrwZZi/rZ7NiHsaVn7B/UvYsDTdqn5+ENeTzAWMrhg31 -YH0zJnTIn9E5iMZqXw24iLIDr64YUAdGsC25dfI8dVN9z2/w8fiVU7+9Zbmrv2hq -i2L+HdB1TOLYqHa4l97mcV1FqL0tpi48QZXrcsecPiDeEEuraHX1vtDYPWfe+rWs -JokSsxY19MaTAoIBAQDw+h4t8x0eIordmNaD6g40twtR0cC8wYeTOQE4fjG3CJ6H -LZgWiugdXp1JGPtiU0nJNoeKe4AZ66uZ4sZDV69yA8sei1oFzxXq7p6sDVBfPvtx -kaZBv6CkPLkhd747gXT1kgudbS65GzqPgb6cI0Zk0Y4Q1xJYM1Ezvh4p88L2PXrP -FmTfeKyTSks2W2bsnZZEqxMDamL5I8oz0N6EDEDIk9DJSikGZ3s1QePv+Yl9RNQ3 -JYunGrE7s5ECtF9p94w2Nsw2f9O5ZKo66Gg22EhXjr90hifHBPKNf/lrMsNZoxkL -hVl0KSb4M5SIwSjZWdh7BER33w4u3r5vuy2Wlt8PAoIBAFEAsbm7rrJrYUK2NpLd -VhZR+droA+qxYeELDgyqAtx3osHSNqlHXCtbwzoZJAcCPuOXdoprd/CtClW3pMHh -w8QJ5Xa6JFNN8uHYQ0j9ee/vRoLn2YegEPgXZIr3Sir5jkwkjza5Nm7wDL1JuewR -XSjrKLQU/sOr4kxzdJFooFXnajqK8QJUHCgKoXrAthHmGQN/oVTK2qTB1BvQyq/x -c6aEpeS3gyqSO/UQbZ1YSswnnpWm3H5XWz7kILFbAfJnmhYtXvI6FuFze4eeyXj5 -4sMUO1HWM2buMnjREFp5abn8qrcQN5ZYQ8CIIO+Iw9uQcGe0d/n7/hVBvxdnAoRb -vC8CggEAEk1XONQ5BK1xdyEUclp97nS5/h47TyxlVKe0V3L/9Ln8UIeBZxnCTYkQ -mPsj3SJ3vuAKoiJxHFrY8/NZurLEhnI5FU0AGhHv3WkbT8oh43DWndPuGQkjNbOL -6PZG2JIfWR+zGhR3jb/FH8nPfyid7tvYWboY8sTCQM4TwvkRKdIG2ilgNjusqK3T -HgWB9/spYAjvU/MfntdrApMnXm6tGlYLspIPu8hTcToM2DiddHJ+ZWgWcdob3LaL -grx+Z7SfFZq7zNvRynJmqZUeI3u3Tkwtoo3qWkNYiQxx/Cz3UxKSE+6Hf+HajqCh -qb0E/z7QhlLE6cAazqFgoUQkjX49Ig== +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDzfvS6N2dQxpjC +84/+Z2/uPFseEWuMQaKHjMjttiKhLvd8uHJWrE/GGWKFIdvNwFFBmo2WoIImtfRy +kigM5rtkhYuH0aKmGLcs7bL5tqoodjkTxjiaNFFBO6uWpTOEbYJzaALj542dnmAD +BH5bfNCtF/E2AAH2d8L3xxC+cvDQ3fC6wSrElZhNeG6uzsxzDTxrhxLE5PxEowbS +XoUJENXk9NkwoDz7nUyJMuI5JBUPxTojLq0nB/hrGrikWakm4c7/Gt9BQZf+dHE2 +50G/Skn4NA4yhGz+dTSF/j7krfSpS+Pa+wLCqUjapqblRkpiJ0VcflzqOGLbdg3r +upUAFM1PAgMBAAECggEAL2mEC5JoKqFQ83zrh9TqRZA5CcTIlTnehNhT831ohswX +YpCjqt7IdcFRnqy2GP0elVCbyz2buh/p5jkxVTnEOVGLlrmqGv9rA3ORSvBXd6N1 +f7U0JkqTm8kboyytuFZ+dSxGi8v1lkBVX6ELXZMTKvEjhalAuJYfP5HiX8MPwwti +540zHN4fQ9cgDkpjLyR+g4us1iBtYmbx/+BHeE6tsN5I0dc4Ee/LxXLkBRqNhB4K +g6wWynqLtX12py/TFaBfs8DSMY1IfdCxJDxiahtGCXFokfsQbqBySpLrdx41ela4 +IG5qr0u9/XyX4Y6pm4chNxKMwqRRF9bllGXEI2HySQKBgQD/pY43H3gPM/8IMzcT +f3YvBX1KliU26xdbjPGrp+lAsUcAEv0gNmYsr6lUFZNd3RmsqfYR7Rt2GE468i95 +gfgRmTXUrDbZKeu92qvZNfd9f3HJYsjcHhSNNtRSYNubjpwniU4zyl78Jjz4jv44 +xNjEtmQ//FNTIIaKAr5zQ8lTxQKBgQDz1RoFwkJs38+LfLotjmNcmV7vC4Q4H3ZG +m6mRNTfAiwFy9kbF16d4+fZ/byoHxSAOEjH08sKjQ1koH0moFQaFXWDW7/gwIiq3 +ErKO8ZE53uazFGOhNmHMdkdaTwb/Hn5/DKJBBexY/2O8S+tIZchhB0hluiz3QKSo +p/rbcDiqAwKBgQDAXDFrltk/D0/qOqdJm5IxBX9mPR4ZecHkmGRMVpczn3EeRCuF +LompPDA8XdO6QCEOhADtMi2EqftLbWp9kmc3zsHrmf3XYCzLeZvvYCUuoFPdReB/ +iH7MVyJiLhFwtlkXgsB+Rds8/gTIvsfZrXyyX8+FOfb0yLeTZ0co8iuuRQKBgCgG +hT0IxGqm2qTlFpK/2uOqcYD//PZRg9LXXqBtgfdjWhuK/dcgLWeYcLQ+hUG9RCPL +LNQuvXCbb5k8eZTTzrw5tdnSjoUoNqbStOjuEo7TXj9rS2d9S9SKXfAfJODgGpe0 +dTYDSObbFX4lYDwEKT50OZgpVZRI0j61RGKdK1ANAoGBAKoO8Sbm6O9KTfvgVuQf +t/L1c47JI6GnX1i9JCgQxRapmEYEupt0hRJh36zSvnip+iy8J22useJFtCcxeZUj +XOH1WOWwQn8qDSUPA3PVO3TZb+k4Z8VlIKzrEWHLl56zWPO5Su7AHXseJhY1Z4Bz +WmUvA9kdCmStQ7RMH89NRnh8 -----END PRIVATE KEY----- diff --git a/test/support/test_routes.ex b/test/support/test_routes.ex index 884efb1..1085004 100644 --- a/test/support/test_routes.ex +++ b/test/support/test_routes.ex @@ -56,8 +56,7 @@ defmodule Maverick.TestRoute2 do response_header = conn.req_headers |> Map.new() - |> Map.update("Space-Rocket", "BLASTOFF", fn val -> String.upcase(val) end) - |> Map.drop(["Content-Length"]) + |> Map.update("space-rocket", "BLASTOFF", fn val -> String.upcase(val) end) {:ok, response_header, %{"destination" => destination}} end