Files
elm-0.19-workshop/intro/part9/tests/RoutingTests.elm
Richard Feldman d57dec1681 Rename more stuff
2018-08-05 04:49:15 -04:00

105 lines
2.8 KiB
Elm

module RoutingTests exposing (..)
import Data.Article as Article exposing (Slug)
import Data.User as User exposing (Username)
import Expect exposing (Expectation)
import Json.Decode exposing (decodeString)
import Navigation exposing (Location)
import Route exposing (Route(..))
import Test exposing (..)
-- TODO need to add lots more tests!
fromLocation : Test
fromLocation =
describe "Route.fromLocation"
[ testLocation "" Root
, testLocation "#login" Login
, testLocation "#logout" Logout
, testLocation "#settings" Settings
, testLocation "#profile/foo" (Profile (usernameFromStr "foo"))
, testLocation "#register" Register
, testLocation "#article/foo" (Article (slugFromStr "foo"))
, testLocation "#editor" NewArticle
, testLocation "#editor/foo" (EditArticle (slugFromStr "foo"))
]
-- HELPERS --
testLocation : String -> Route -> Test
testLocation hash route =
test ("Parsing hash: \"" ++ hash ++ "\"") <|
\() ->
makeHashLocation hash
|> Route.fromLocation
|> Expect.equal (Just route)
makeHashLocation : String -> Location
makeHashLocation hash =
{ hash = hash
, href = ""
, host = ""
, hostname = ""
, protocol = ""
, origin = ""
, port_ = ""
, pathname = ""
, search = ""
, username = ""
, password = ""
}
-- CONSTRUCTING UNEXPOSED VALUES --
-- By decoding values that are not intended to be exposed directly - and crashing
-- if they cannot be decoded, since crashing is harmless in tests - we can let
-- our internal modules continue to expose only the intended ways of
-- constructing those, while still being able to test them.
usernameFromStr : String -> Username
usernameFromStr str =
case decodeString User.usernameDecoder ("\"" ++ str ++ "\"") of
Ok username ->
username
Err err ->
Debug.crash ("Error decoding Username from \"" ++ str ++ "\": " ++ err)
slugFromStr : String -> Slug
slugFromStr str =
let
json =
"""
{ "description": null
, "slug": \"""" ++ str ++ """"
, "title": ""
, "tagList": []
, "createdAt": "2012-04-23T18:25:43.511Z"
, "updatedAt": "2012-04-23T18:25:43.511Z"
, "favorited": false
, "favoritesCount": 1
, "author":
{ "username": ""
, "bio": null
, "image": null
, "following": false
}
}
"""
in
case decodeString Article.decoder json of
Ok article ->
article.slug
Err err ->
Debug.crash ("Error decoding Slug from \"" ++ str ++ "\": " ++ err)