I'm using the nested Elm architecture pattern in an application. The nested components respond to messages coming in on a port. The messages are handled by the top-level component before being handed on to the nested components. So the outer data structure looks something like this:
type alias FromServer =
{ message_type: MessageType
, data: Json.Decode.Value
}
The data field is a Json.Decode.Value because the top-level component doesn't know about the message types defined by the nested components; it does a lookup on the incoming message type and decides to which inner component it will forward the message. So the top level looks like this:
subscriptions : Model.Model -> Sub Message
subscriptions model =
theIncomingPort toMessage
toMessage : FromServer -> Message
toMessage incoming =
case Dict.get incoming.message_type componentDictionary of
Just MyInnerComponent ->
InnerComponentModule.toMessage incoming |> MyInnerComponentMessageWrapper
Nothing ->
...
The inner component's toMessage function also uses the message_type field to choose the decoder to apply to the Json.Decode.Value in the data field.
I want to test the inner component's toMessage function. This means that I need to create a FromServer record with the data contained in a Json.Decode.Value -- ideally created from a Json string.
However, from what I can tell the only way to create this kind of raw Json.Decode.Value is by passing the string in through a port. This seems like a pretty complicated way to set up a test. Is there some other way to accomplish this?