105 lines
2.8 KiB
Elm
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)
|