michaelfich

michaelfich

Testing ExAws.stream! with Mox

I’ve been working with a function that looks similar to the one that I’ve described below. It works adequately in practice but trying to unit test it has been a challenge to this point.

lib/my_module.ex

defmodule MyApp.MyModule do
  def my_func do
    "my-s3-bucket"
    |> ExAws.S3.list_objects_v2(prefix: "path/to/files")
    |> ExAws.stream!()
    |> Enum.map(&do_work/1)
  end
end

I’ve currently set up ExAws like the code samples below for mocking out ExAws.request! calls.

config/test.exs

config :my_app, :ex_aws,
  http_client: ExAws.Request.HttpMock

test/support/mocks.ex

Mox.defmock(ExAws.Request.HttpMock, for: ExAws.Request.HttpClient)

If anyone has suggestions for how to make the Mox.expect/4 call here properly set up the ExAws.stream! call, that would be greatly appreciated.

test/my_module_test.exs

defmodule MyApp.MyModuleTest do
  use ExUnit.Case, async: true

  import Mox

  setup :verify_on_exit!

  describe "my_func/0" do
    test "mocks api call(s)" do
      # how do we mock the stream?
      expect(ExAws.Request.HttpMock, ..., fn ..., ... ->
        # unsure
      end)

      assert [_ | _] = my_func()
    end
  end
end

Marked As Solved

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

To mock at the HTTP layer you need to return a response shape that is the same as what AWS itself returns. the stream function is just making repeated object list calls with a cursor, so you’ll need to return that shape.

I don’t however recommend mocking at this layer. You’ll spend more time trying to make ExAws internals work. Rather I would make an internal FileStore behavior in your app and then have a mock of that which can return a stream directly.

Also Liked

LostKobrakai

LostKobrakai

That – but also if you eventually want to run integration tests you can consider pointing it against minio or localstack instances.

Where Next?

Popular in Questions Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
tduccuong
Hi, is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
jaysoifer
Is there a way to rollback a specific migration and only that one ("skipping" all the other ones)? Would mix ecto.rollback -v 2008090...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
nobody
How to bind a phoenix app to a specific ip address? could not find anything about that, nowhere, unfortunately, but for me this is qui...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New

Other popular topics Top

siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
nobody
Hi! In PHP: $SERVER['SERVERADDR'] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

We're in Beta

About us Mission Statement