Move stuff
This commit is contained in:
104
intro-to-elm/part9/tests/RoutingTests.elm
Normal file
104
intro-to-elm/part9/tests/RoutingTests.elm
Normal file
@@ -0,0 +1,104 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user