neurodynamic
How do I test a LiveView hook triggered by a Stripe form?
I have a page in my Phoenix app with some LiveView code. When you click a button, it shows the Stripe credit card modal form via a Hook. It looks roughly like this:
Hooks.StripeFormButton = {
mounted() {
this.el.addEventListener("click", () => {
showStripeForm({
onSuccess: (token) => {
this.pushEvent("save-card", {token: token})
}
})
})
}
}
So a user clicks the button, fills out the Stripe form, and when they submit it, the "save-card" event gets sent to the back-end. That will save their credit card info and then render some info to show that the save was successful.
My problem is, since the click and the form submit are done through hooks instead of phx-click and phx-submit attributes, I can’t figure out a way to test them. I want to be able to write a test that says “after the "save-card" event gets triggered, a confirmation message shows on the page”. But I can’t find a way to trigger the "save-card" event in a LiveView test without using something like render_click or render_submit which won’t work since I’m not using phx-click or phx-submit for the Stripe form. Is there a push_event testing function somewhere that I’m missing in the documentation? Or is there another way to do this?
Marked As Solved
PJUllrich
Just FYI: There’s the render_hook/3 option now, which simulates sending an event through this.pushEvent("foo", "bar") in your JavaScript. It will then trigger the handle_event("foo", "bar", socket)-callback in your LiveView.
So, in your use case, you could write a test like:
render_hook(view, "save-card", %{"token" => stripe_token})
Also Liked
outlog
think you’ll need to test using something like wallaby eg headless chrome/firefox.. since this requires a js runtime..
you can see https://www.tddphoenix.com for getting started - excellent resource..
could be wrong though, but don’t see how elixir side should/can know what goes on in js hooks..
amnu3387
If you have the socket in the test (I haven’t written any tests with liveview, but I imagine you have?) you can just call YourLiveView.Module.handle_event("save-card", %{"token" => "your_token"}, the_socket) and assert on the result of save card and any side effects?
This doesn’t test the client interface tough, just that if an event "save-card" with those params are sent through the live view it works correctly.
neurodynamic
Last Post!
unyraw
Bit of a late answer, but could potentially help someone coming across this post :
You need to target the element with phx-hook attached to it. In your case it would be the div(s) you perform the iteration on.
Also, if your code resides in a Live Component and you don’t want the pushEventTo to be sent to the parent, you need to add a phx-target={@myself} on the targetted element.
Popular in Questions
Other popular topics
Latest Phoenix Threads
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









