Functions for working with ports during a spec.
Suppose your app sends a port command when a button is clicked,
via a function called my-command-port that takes a string ("TRIGGER_REQUEST" in
this case), and then displays a message received over a port subscription. You
could write a scenario like so:
Spec.describe "command ports and subscription ports"
[ Spec.scenario "send and receive" (
Spec.given (
Spec.Setup.withInit (App.init testFlags)
|> Spec.Setup.withUpdate App.update
|> Spec.Setup.withView App.view
|> Spec.Setup.withSubscriptions App.subscriptions
)
|> Spec.when "a message is sent out"
[ Spec.Markup.target << by [ tag "button" ]
, Spec.Markup.Event.click
]
|> Spec.when "a response is received"
[ Spec.Port.send "my-subscription-port" <|
Json.Encode.object
[ ("message", Encode.string "Have fun!")
]
]
|> Spec.observeThat
[ Spec.it "sent the right message over the port" (
Spec.Port.observe "my-command-port" Json.Decode.string
|> Spec.expect (Spec.Claim.isListWhere
[ Spec.Claim.isEqual Debug.toString "TRIGGER_REQUEST"
]
)
)
, Spec.it "shows the message received" (
Spec.Markup.observeElement
|> Spec.Markup.query << by [ id "message" ]
|> Spec.expect (
Spec.Claim.isSomethingWhere <|
Spec.Markup.text <|
Spec.Claim.isEqual Debug.toString "Have fun!"
)
)
]
)
]A step that sends a message to a port subscription.
Provide the name of the port and an encoded JSON value that should be sent from the JavaScript side.
For example, if you have a port defined in Elm like so:
port listenForStuff : (String -> msg) -> Sub msgThen you could send a message through this port during a scenario like so:
Spec.when "a message is sent to the subscription"
[ Encode.string "Some words"
|> Spec.Port.send "listenForStuff"
]
Observe messages sent out via a command port.
Provide the name of the port (the function name) and a decoder that can decode messages sent out over the port.