For example, I have this model:

import File exposing (File)

type alias Model =
{ selectedFiles : Dict String File
, fileUploadInfoList : List FileUploadInfo
, modalSelectedFile : Maybe File
... 
}

type Msg
= SelectedFiles String (List File)
| Upload Int
| UploadedFiles (Result Http.Error (List FileInfo))
| DownloadedFile String (Result Http.Error Bytes.Bytes)
| DownloadFile FileInfo
| LoadedFiles (Result Http.Error (List FileInfo))
| OpenModal { startFocusOn : String, returnFocusTo : String } FileInfo
| ModalMsg Modal.Msg
| Focus String
| Dismiss
| DismissModal
| SelectModalFile (List File)
| UpdateFile
| UpdatedFile (Result Http.Error FileInfo)

And in update function:

update : Msg -> Model -> { token : String, apiBaseUrl : String } -> ( Model, Cmd Msg )
update msg model apiParams =
case msg of
    SelectedFiles key [ file ] ->
        ( { model | selectedFiles = Dict.insert key file model.selectedFiles }, Cmd.none )
    ... 

When I write tests for this update function how do I call it in the test? The dictionary value is of type File. How do I create a test file? What to put for [ file ] ?

1

There are 1 best solutions below

0
bdukes On BEST ANSWER

File is an opaque type, meaning that it can't be created outside of the module where it's defined. In this case, there isn't a way to create a File value in a test environment, because the only ways that the package exposes to create a value are via a Cmd or via a Decoder, and that decoder won't work in node.js.

If you want to be able to test this message, you will need to use a different type in the message. You can move your logic that converts a File into a FileInfo into your event handler, so that the message only deals with FileInfo.

elm-program-test provides shim types to support testing Cmd values, but does not yet support File.