From 9045353810ac4208984d60a671fddf75bc3f09f0 Mon Sep 17 00:00:00 2001 From: Alexander Kobjolke Date: Sat, 23 Dec 2023 23:04:37 +0100 Subject: [PATCH] Test update and view function --- tests/PhotoGrooveTest.elm | 110 +++++++++++++++++++++++++++++++++----- 1 file changed, 97 insertions(+), 13 deletions(-) diff --git a/tests/PhotoGrooveTest.elm b/tests/PhotoGrooveTest.elm index 342e11a..d436821 100644 --- a/tests/PhotoGrooveTest.elm +++ b/tests/PhotoGrooveTest.elm @@ -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