Test update and view function
This commit is contained in:
parent
a0c0a8354a
commit
9045353810
1 changed files with 97 additions and 13 deletions
|
|
@ -1,23 +1,107 @@
|
|||
module PhotoGrooveTest exposing (..)
|
||||
|
||||
import Expect exposing (Expectation)
|
||||
import Fuzz exposing (Fuzzer, int, list, string)
|
||||
import Expect
|
||||
import Fuzz
|
||||
import Html.Attributes as Attr
|
||||
import Json.Decode as J
|
||||
import Json.Encode as Encode exposing (Value)
|
||||
import PhotoGroove.Internal as Testee
|
||||
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 =
|
||||
describe "photoDecoder"
|
||||
[ fuzz2 Fuzz.string Fuzz.int "title always defaults to '(untitled)'" <|
|
||||
\url size ->
|
||||
[ ( "url", Encode.string url )
|
||||
, ( "size", Encode.int size )
|
||||
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
|
||||
]
|
||||
|> Encode.object
|
||||
|> J.decodeValue Testee.photoDecoder
|
||||
|> Result.map .title
|
||||
|> Expect.equal (Ok "(untitled)")
|
||||
, 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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue