107 lines
3.5 KiB
Elm
107 lines
3.5 KiB
Elm
module PhotoGrooveTest exposing (..)
|
|
|
|
import Expect
|
|
import Fuzz
|
|
import Html.Attributes as Attr
|
|
import Json.Decode as J
|
|
import Json.Encode as Encode
|
|
import PhotoGroove.Internal as Testee exposing (FilterType(..), FilterValues, Message(..), Photo, filterTypeToName, initialModel)
|
|
import Test exposing (..)
|
|
import Test.Html.Query as Query
|
|
import Test.Html.Selector exposing (attribute, tag)
|
|
|
|
|
|
suite : Test
|
|
suite =
|
|
concat
|
|
[ describe "photoDecoder"
|
|
[ fuzz2 Fuzz.string Fuzz.int "title always defaults to '(untitled)'" <|
|
|
\url size ->
|
|
[ ( "url", Encode.string url )
|
|
, ( "size", Encode.int size )
|
|
]
|
|
|> Encode.object
|
|
|> J.decodeValue Testee.photoDecoder
|
|
|> Result.map .title
|
|
|> Expect.equal (Ok "(untitled)")
|
|
]
|
|
, describe "update"
|
|
[ describe "slider event sets filter value"
|
|
[ sliderTest Hue .hue
|
|
, sliderTest Ripple .ripple
|
|
, sliderTest Noise .noise
|
|
]
|
|
, test "when photos are loaded, the first one gets selected" <|
|
|
\_ ->
|
|
Testee.initialModel
|
|
|> Testee.update (GotPhotos (Ok <| [ photoFromUrl "1.jpg" ]))
|
|
|> Tuple.first
|
|
|> .status
|
|
|> selectedUrl
|
|
|> Expect.equal (Just "1.jpg")
|
|
]
|
|
, describe "view"
|
|
[ test "no photos, no thumbnails" <|
|
|
\_ ->
|
|
Testee.initialModel
|
|
|> Testee.view
|
|
|> Query.fromHtml
|
|
|> Query.findAll [ tag "img" ]
|
|
|> Query.count (Expect.equal 0)
|
|
, fuzz (Fuzz.intRange 1 5) "URLs render as thumbnails" <|
|
|
\count ->
|
|
let
|
|
urls : List String
|
|
urls =
|
|
List.range 1 count
|
|
|> List.map (\num -> String.fromInt num ++ ".png")
|
|
|
|
photos =
|
|
List.map photoFromUrl urls
|
|
|
|
checks =
|
|
List.map thumbnailRendered urls
|
|
in
|
|
{ initialModel | status = Testee.Loaded photos "" }
|
|
|> Testee.view
|
|
|> Query.fromHtml
|
|
|> Expect.all checks
|
|
]
|
|
]
|
|
|
|
|
|
sliderTest : FilterType -> (FilterValues -> Int) -> Test
|
|
sliderTest filterType value =
|
|
fuzz Fuzz.int (filterTypeToName filterType) <|
|
|
\amount ->
|
|
Testee.initialModel
|
|
|> Testee.update (ChangedFilter filterType amount)
|
|
|> Tuple.first
|
|
|> .filterValues
|
|
|> value
|
|
|> Expect.equal amount
|
|
|
|
|
|
thumbnailRendered : String -> Query.Single msg -> Expect.Expectation
|
|
thumbnailRendered url query =
|
|
query
|
|
|> Query.findAll [ tag "img", attribute (Attr.src (Testee.urlPrefix ++ url)) ]
|
|
|> Query.count (Expect.atLeast 1)
|
|
|
|
|
|
photoFromUrl : String -> Photo
|
|
photoFromUrl url =
|
|
{ url = url, size = 0, title = "" }
|
|
|
|
|
|
selectedUrl : Testee.Status -> Maybe String
|
|
selectedUrl status =
|
|
case status of
|
|
Testee.Loading ->
|
|
Nothing
|
|
|
|
Testee.Loaded _ url ->
|
|
Just url
|
|
|
|
Testee.Errored _ ->
|
|
Nothing
|