elm-pages-v3-beta/tests/StaticHttpRequestsTests.elm

1144 lines
48 KiB
Elm
Raw Normal View History

module StaticHttpRequestsTests exposing (all)
2019-10-22 08:00:15 +03:00
import Codec
2020-12-07 19:41:10 +03:00
import Dict
2019-10-22 06:21:52 +03:00
import Expect
import Html
import Json.Decode as JD
import Json.Encode as Encode
import OptimizedDecoder as Decode exposing (Decoder)
import Pages.ContentCache as ContentCache
import Pages.ImagePath as ImagePath
2021-04-03 00:44:40 +03:00
import Pages.Internal.Platform.Cli exposing (..)
2020-06-12 06:57:19 +03:00
import Pages.Internal.Platform.Effect as Effect exposing (Effect)
2020-06-12 06:55:19 +03:00
import Pages.Internal.Platform.ToJsPayload as ToJsPayload exposing (ToJsPayload)
import Pages.Internal.StaticHttpBody as StaticHttpBody
import Pages.Manifest as Manifest
import Pages.PagePath as PagePath
import Pages.StaticHttp as StaticHttp
import Pages.StaticHttp.Request as Request
import PagesHttp
import ProgramTest exposing (ProgramTest)
2019-11-03 00:46:52 +03:00
import Regex
2019-11-12 04:48:08 +03:00
import Secrets
import SimulatedEffect.Cmd
2019-11-08 22:34:51 +03:00
import SimulatedEffect.Http as Http
2019-10-22 06:21:52 +03:00
import SimulatedEffect.Ports
import SimulatedEffect.Task
2021-04-03 19:53:42 +03:00
import Test exposing (Test, describe, only, test)
import Test.Http
all : Test
all =
describe "Static Http Requests"
[ test "initial requests are sent out" <|
\() ->
start
[ ( []
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") starDecoder
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86 }"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
2020-01-04 00:22:53 +03:00
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
2019-10-22 08:00:15 +03:00
]
)
]
2021-04-03 19:53:42 +03:00
, only <|
test "StaticHttp request for initial are resolved" <|
\() ->
start
[ ( [ "post-1" ]
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") starDecoder
--, StaticHttp.succeed 86
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://my-cms.com/posts"
"""{ "posts": ["post-1"] }"""
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86 }"""
|> expectSuccess
[ ( "post-1"
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
)
]
, test "andThen" <|
\() ->
start
[ ( [ "elm-pages" ]
2019-11-12 23:48:01 +03:00
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") (Decode.succeed ())
|> StaticHttp.andThen
2021-04-03 00:44:40 +03:00
(\_ ->
2019-11-12 23:48:01 +03:00
StaticHttp.get (Secrets.succeed "NEXT-REQUEST") (Decode.succeed ())
)
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""null"""
|> ProgramTest.simulateHttpOk
"GET"
"NEXT-REQUEST"
"""null"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( "elm-pages"
2020-01-04 00:22:53 +03:00
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """null"""
)
2020-01-04 00:22:53 +03:00
, ( get "NEXT-REQUEST"
, """null"""
)
]
)
]
, test "andThen chain avoids repeat requests" <|
\() ->
let
getReq url decoder =
StaticHttp.request
2020-01-04 00:22:53 +03:00
(Secrets.succeed (get url))
decoder
pokemonDetailRequest : StaticHttp.Request ()
pokemonDetailRequest =
getReq
"https://pokeapi.co/api/v2/pokemon/"
(Decode.list
(Decode.field "url" Decode.string
|> Decode.map
(\url ->
getReq url
(Decode.field "image" Decode.string)
)
)
)
|> StaticHttp.resolve
|> StaticHttp.map (\_ -> ())
in
start
[ ( [ "elm-pages" ], pokemonDetailRequest )
]
|> ProgramTest.simulateHttpOk
"GET"
"https://pokeapi.co/api/v2/pokemon/"
"""[
{"url": "url1"},
{"url": "url2"},
{"url": "url3"},
{"url": "url4"},
{"url": "url5"},
{"url": "url6"},
{"url": "url7"},
{"url": "url8"},
{"url": "url9"},
{"url": "url10"}
]"""
|> ProgramTest.simulateHttpOk
"GET"
"url1"
"""{"image": "image1.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url2"
"""{"image": "image2.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url3"
"""{"image": "image3.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url4"
"""{"image": "image4.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url5"
"""{"image": "image5.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url6"
"""{"image": "image6.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url7"
"""{"image": "image7.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url8"
"""{"image": "image8.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url9"
"""{"image": "image9.jpg"}"""
|> ProgramTest.simulateHttpOk
"GET"
"url10"
"""{"image": "image10.jpg"}"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( "elm-pages"
, [ ( get "https://pokeapi.co/api/v2/pokemon/"
, """[{"url":"url1"},{"url":"url2"},{"url":"url3"},{"url":"url4"},{"url":"url5"},{"url":"url6"},{"url":"url7"},{"url":"url8"},{"url":"url9"},{"url":"url10"}]"""
)
, ( get "url1"
, """{"image":"image1.jpg"}"""
)
, ( get "url2"
, """{"image":"image2.jpg"}"""
)
, ( get "url3"
, """{"image":"image3.jpg"}"""
)
, ( get "url4"
, """{"image":"image4.jpg"}"""
)
, ( get "url5"
, """{"image":"image5.jpg"}"""
)
, ( get "url6"
, """{"image":"image6.jpg"}"""
)
, ( get "url7"
, """{"image":"image7.jpg"}"""
)
, ( get "url8"
, """{"image":"image8.jpg"}"""
)
, ( get "url9"
, """{"image":"image9.jpg"}"""
)
, ( get "url10"
, """{"image":"image10.jpg"}"""
)
]
)
]
, test "port is sent out once all requests are finished" <|
\() ->
start
[ ( [ "elm-pages" ]
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") starDecoder
)
, ( [ "elm-pages-starter" ]
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages-starter") starDecoder
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86 }"""
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages-starter"
"""{ "stargazer_count": 22 }"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( "elm-pages"
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
)
2020-03-11 19:03:47 +03:00
, ( "elm-pages-starter"
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages-starter"
, """{"stargazer_count":22}"""
)
]
)
]
, test "reduced JSON is sent out" <|
\() ->
start
[ ( []
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") (Decode.field "stargazer_count" Decode.int)
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86, "unused_field": 123 }"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
)
]
, test "you can use elm/json decoders with StaticHttp.unoptimizedRequest" <|
\() ->
start
[ ( []
, StaticHttp.unoptimizedRequest
(Secrets.succeed
{ url = "https://api.github.com/repos/dillonkearns/elm-pages"
, method = "GET"
, headers = []
, body = StaticHttp.emptyBody
}
)
(StaticHttp.expectUnoptimizedJson
(JD.field "stargazer_count" JD.int)
)
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86, "unused_field": 123 }"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{ "stargazer_count": 86, "unused_field": 123 }"""
)
]
)
]
, test "plain string" <|
\() ->
start
[ ( []
, StaticHttp.unoptimizedRequest
(Secrets.succeed
{ url = "https://example.com/file.txt"
, method = "GET"
, headers = []
, body = StaticHttp.emptyBody
}
)
(StaticHttp.expectString Ok)
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://example.com/file.txt"
"This is a raw text file."
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
, [ ( get "https://example.com/file.txt"
, "This is a raw text file."
)
]
)
]
, test "Err in String to Result function turns into decode error" <|
\() ->
start
[ ( []
, StaticHttp.unoptimizedRequest
(Secrets.succeed
{ url = "https://example.com/file.txt"
, method = "GET"
, headers = []
, body = StaticHttp.emptyBody
}
)
(StaticHttp.expectString
(\string ->
if String.toUpper string == string then
Ok string
else
Err "String was not uppercased"
)
)
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://example.com/file.txt"
"This is a raw text file."
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
2020-10-21 06:48:21 +03:00
(Codec.decoder (ToJsPayload.toJsCodec canonicalSiteUrl))
(expectErrorsPort
"""-- STATIC HTTP DECODING ERROR ----------------------------------------------------- elm-pages
2020-03-11 19:03:47 +03:00
String was not uppercased"""
)
2019-11-08 22:34:51 +03:00
, test "POST method works" <|
\() ->
start
[ ( []
, StaticHttp.request
(Secrets.succeed
{ method = "POST"
, url = "https://api.github.com/repos/dillonkearns/elm-pages"
, headers = []
, body = StaticHttp.emptyBody
}
)
(Decode.field "stargazer_count" Decode.int)
2019-11-08 22:34:51 +03:00
)
]
|> ProgramTest.simulateHttpOk
"POST"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86, "unused_field": 123 }"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
, [ ( { method = "POST"
, url = "https://api.github.com/repos/dillonkearns/elm-pages"
, headers = []
, body = StaticHttp.emptyBody
2019-11-08 22:34:51 +03:00
}
, """{"stargazer_count":86}"""
)
2019-11-08 22:34:51 +03:00
]
)
]
, test "json is reduced from andThen chains" <|
\() ->
start
[ ( []
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") (Decode.field "stargazer_count" Decode.int)
|> StaticHttp.andThen
2021-04-03 00:44:40 +03:00
(\_ ->
StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages-starter") (Decode.field "stargazer_count" Decode.int)
)
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 100, "unused_field": 123 }"""
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages-starter"
"""{ "stargazer_count": 50, "unused_field": 456 }"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":100}"""
)
, ( get "https://api.github.com/repos/dillonkearns/elm-pages-starter"
, """{"stargazer_count":50}"""
)
]
)
]
, test "reduced json is preserved by StaticHttp.map2" <|
\() ->
start
[ ( []
, StaticHttp.map2 (\_ _ -> ())
(StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") (Decode.field "stargazer_count" Decode.int))
(StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages-starter") (Decode.field "stargazer_count" Decode.int))
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 100, "unused_field": 123 }"""
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages-starter"
"""{ "stargazer_count": 50, "unused_field": 456 }"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":100}"""
)
, ( get "https://api.github.com/repos/dillonkearns/elm-pages-starter"
, """{"stargazer_count":50}"""
)
]
)
]
, test "the port sends out even if there are no http requests" <|
\() ->
start
[ ( []
, StaticHttp.succeed ()
)
]
2020-03-11 19:03:47 +03:00
|> expectSuccess [ ( "", [] ) ]
, test "the port sends out when there are duplicate http requests for the same page" <|
\() ->
start
[ ( []
, StaticHttp.map2 (\_ _ -> ())
2019-11-12 23:48:01 +03:00
(StaticHttp.get (Secrets.succeed "http://example.com") (Decode.succeed ()))
(StaticHttp.get (Secrets.succeed "http://example.com") (Decode.succeed ()))
)
]
|> ProgramTest.simulateHttpOk
"GET"
"http://example.com"
"""null"""
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
, [ ( get "http://example.com"
, """null"""
)
]
)
]
, test "an error is sent out for decoder failures" <|
\() ->
start
2019-10-28 17:57:21 +03:00
[ ( [ "elm-pages" ]
2019-11-12 23:48:01 +03:00
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") (Decode.fail "The user should get this message from the CLI.")
2019-10-28 17:57:21 +03:00
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86 }"""
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
2020-10-21 06:48:21 +03:00
(Codec.decoder (ToJsPayload.toJsCodec canonicalSiteUrl))
(expectErrorsPort
"""-- STATIC HTTP DECODING ERROR ----------------------------------------------------- elm-pages
2019-10-30 08:33:47 +03:00
2020-03-11 19:03:47 +03:00
elm-pages
2019-10-27 02:50:09 +03:00
I encountered some errors while decoding this JSON:
2019-10-27 02:50:09 +03:00
The user should get this message from the CLI.
{
"stargazer_count": 86
}"""
)
, test "an error is sent for missing secrets from continuation requests" <|
\() ->
start
[ ( [ "elm-pages" ]
2019-11-12 23:48:01 +03:00
, StaticHttp.get
2019-11-12 04:48:08 +03:00
(Secrets.succeed
2019-11-11 23:40:38 +03:00
(\apiKey ->
"https://api.github.com/repos/dillonkearns/elm-pages?apiKey=" ++ apiKey
)
2019-11-12 04:48:08 +03:00
|> Secrets.with "API_KEY"
)
Decode.string
|> StaticHttp.andThen
(\url ->
2019-11-12 23:48:01 +03:00
StaticHttp.get
2019-11-12 04:48:08 +03:00
(Secrets.succeed
2019-11-11 23:40:38 +03:00
(\missingSecret ->
url ++ "?apiKey=" ++ missingSecret
)
2019-11-12 04:48:08 +03:00
|> Secrets.with "MISSING"
)
(Decode.succeed ())
)
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages?apiKey=ABCD1234"
""" "continuation-url" """
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
2020-10-21 06:48:21 +03:00
(Codec.decoder (ToJsPayload.toJsCodec canonicalSiteUrl))
2019-11-03 00:46:52 +03:00
(expectErrorsPort
"""-- MISSING SECRET ----------------------------------------------------- elm-pages
I expected to find this Secret in your environment variables but didn't find a match:
Secrets.get "MISSING"
^^^^^^^
So maybe MISSING should be API_KEY"""
)
, test "an error is sent for HTTP errors" <|
\() ->
start
[ ( []
2019-11-12 23:48:01 +03:00
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") (Decode.succeed ())
)
]
|> ProgramTest.simulateHttpResponse
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
(Test.Http.httpResponse
{ statusCode = 404
, headers = []
, body = ""
}
)
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
2020-10-21 06:48:21 +03:00
(Codec.decoder (ToJsPayload.toJsCodec canonicalSiteUrl))
2019-12-07 17:46:45 +03:00
(expectErrorsPort """-- STATIC HTTP ERROR ----------------------------------------------------- elm-pages
I got an error making an HTTP request to this URL: https://api.github.com/repos/dillonkearns/elm-pages
Bad status: 404
Status message: TODO: if you need this, please report to https://github.com/avh4/elm-program-test/issues
Body:
-- STATIC HTTP DECODING ERROR ----------------------------------------------------- elm-pages
Payload sent back invalid JSON""")
2019-10-24 18:26:41 +03:00
, test "uses real secrets to perform request and masked secrets to store and lookup response" <|
\() ->
start
[ ( []
2019-11-12 03:56:25 +03:00
, StaticHttp.request
2019-11-12 04:48:08 +03:00
(Secrets.succeed
2019-11-12 03:56:25 +03:00
(\apiKey bearer ->
{ url = "https://api.github.com/repos/dillonkearns/elm-pages?apiKey=" ++ apiKey
, method = "GET"
, headers = [ ( "Authorization", "Bearer " ++ bearer ) ]
, body = StaticHttp.emptyBody
2019-11-12 03:56:25 +03:00
}
2019-11-11 23:40:38 +03:00
)
2019-11-12 04:48:08 +03:00
|> Secrets.with "API_KEY"
|> Secrets.with "BEARER"
2019-10-28 17:57:21 +03:00
)
(Decode.succeed ())
2019-10-24 18:26:41 +03:00
)
]
2019-11-12 03:56:25 +03:00
|> ProgramTest.ensureHttpRequest "GET"
"https://api.github.com/repos/dillonkearns/elm-pages?apiKey=ABCD1234"
(\request ->
request.headers
|> Expect.equal [ ( "Authorization", "Bearer XYZ789" ) ]
)
|> ProgramTest.simulateHttpResponse
2019-10-24 18:26:41 +03:00
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages?apiKey=ABCD1234"
2019-11-12 03:56:25 +03:00
(Test.Http.httpResponse
{ statusCode = 200
, headers = []
, body = """{ "stargazer_count": 86 }"""
}
)
|> expectSuccess
2020-03-11 19:03:47 +03:00
[ ( ""
, [ ( { method = "GET"
, url = "https://api.github.com/repos/dillonkearns/elm-pages?apiKey=<API_KEY>"
, headers =
[ ( "Authorization", "Bearer <BEARER>" )
]
, body = StaticHttp.emptyBody
2019-10-24 18:26:41 +03:00
}
, """{}"""
)
2019-10-24 18:26:41 +03:00
]
)
]
, describe "staticHttpCache"
[ test "it doesn't perform http requests that are provided in the http cache flag" <|
\() ->
startWithHttpCache (Ok ())
[ ( { url = "https://api.github.com/repos/dillonkearns/elm-pages"
, method = "GET"
, headers = []
, body = StaticHttpBody.EmptyBody
}
, """{"stargazer_count":86}"""
)
]
[ ( []
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") starDecoder
)
]
|> expectSuccess
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
)
]
2020-04-19 20:35:17 +03:00
, test "it ignores unused cache" <|
\() ->
startWithHttpCache (Ok ())
2020-04-19 20:35:17 +03:00
[ ( { url = "https://this-is-never-used.example.com/"
, method = "GET"
, headers = []
, body = StaticHttpBody.EmptyBody
}
, """{"stargazer_count":86}"""
)
]
[ ( []
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") starDecoder
)
]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86 }"""
|> expectSuccess
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
)
]
]
, describe "document parsing errors"
[ test "fails the build when there is an error" <|
\() ->
startWithHttpCache (Err "Found an unhandled HTML tag in markdown doc.")
[]
[ ( []
, StaticHttp.succeed ()
)
]
|> expectError
[ """-- METADATA DECODE ERROR ----------------------------------------------------- elm-pages
2020-07-19 21:09:38 +03:00
I ran into a problem when parsing the metadata for the page with this path: /
Found an unhandled HTML tag in markdown doc."""
]
]
, describe "generateFiles"
[ test "initial requests are sent out" <|
\() ->
startLowLevel
(StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages")
(starDecoder
|> Decode.map
(\starCount ->
[ Ok
{ path = [ "test.txt" ]
, content = "Star count: " ++ String.fromInt starCount
}
]
)
)
)
(Ok ())
[]
[]
|> ProgramTest.simulateHttpOk
"GET"
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86 }"""
|> expectSuccessNew
[]
[ \success ->
success.filesToGenerate
|> Expect.equal
[ { path = [ "test.txt" ]
, content = "Star count: 86"
}
]
]
, test "it sends success port when no HTTP requests are needed because they're all cached" <|
\() ->
startLowLevel
(StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages-starter")
(starDecoder
|> Decode.map
(\starCount ->
[ Ok
{ path = [ "test.txt" ]
, content = "Star count: " ++ String.fromInt starCount
}
]
)
)
)
(Ok ())
[ ( { url = "https://api.github.com/repos/dillonkearns/elm-pages"
, method = "GET"
, headers = []
, body = StaticHttpBody.EmptyBody
}
, """{"stargazer_count":86}"""
)
, ( { url = "https://api.github.com/repos/dillonkearns/elm-pages-starter"
, method = "GET"
, headers = []
, body = StaticHttpBody.EmptyBody
}
, """{"stargazer_count":23}"""
)
]
[ ( []
, StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") starDecoder
)
]
|> expectSuccessNew
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
)
]
[ \success ->
success.filesToGenerate
|> Expect.equal
[ { path = [ "test.txt" ]
, content = "Star count: 23"
}
]
]
]
]
2021-04-03 07:43:57 +03:00
start : List ( List String, StaticHttp.Request a ) -> ProgramTest (Model PathKey String) Msg (Effect PathKey)
start pages =
startWithHttpCache (Ok ()) [] pages
2020-06-13 22:29:36 +03:00
startWithHttpCache :
Result String ()
-> List ( Request.Request, String )
-> List ( List String, StaticHttp.Request a )
2021-04-03 07:43:57 +03:00
-> ProgramTest (Model PathKey String) Msg (Effect PathKey)
startWithHttpCache =
startLowLevel (StaticHttp.succeed [])
startLowLevel :
StaticHttp.Request
(List
2021-04-01 05:55:28 +03:00
(Result
String
{ path : List String
, content : String
}
)
)
-> Result String ()
-> List ( Request.Request, String )
-> List ( List String, StaticHttp.Request a )
2021-04-03 07:43:57 +03:00
-> ProgramTest (Model PathKey String) Msg (Effect PathKey)
startLowLevel generateFiles documentBodyResult staticHttpCache pages =
let
contentCache =
2021-04-03 07:43:57 +03:00
ContentCache.init Nothing
2021-04-03 07:43:57 +03:00
--config : { toJsPort : a -> Cmd msg, fromJsPort : Sub b, manifest : Manifest.Config PathKey, generateFiles : StaticHttp.Request (List (Result String { path : List String, content : String })), init : c -> ((), Cmd d), urlToRoute : { e | path : f } -> f, update : g -> h -> ((), Cmd i), view : j -> { k | path : PagePath.PagePath key } -> StaticHttp.Request { view : l -> m -> { title : String, body : Html.Html n }, head : List o }, subscriptions : p -> q -> r -> Sub s, canonicalSiteUrl : String, pathKey : PathKey, onPageChange : Maybe (t -> ()) }
2021-04-06 03:15:22 +03:00
config : Config PathKey Msg () String ()
config =
{ toJsPort = toJsPort
, fromJsPort = fromJsPort
, manifest = manifest
2021-04-03 07:43:57 +03:00
, generateFiles = generateFiles
2020-01-26 21:19:37 +03:00
, init = \_ -> ( (), Cmd.none )
2021-04-03 19:53:42 +03:00
, getStaticRoutes =
StaticHttp.get (Secrets.succeed "https://my-cms.com/posts")
(Decode.field "posts" (Decode.list Decode.string))
2021-04-03 07:43:57 +03:00
, urlToRoute = .path
2020-01-26 21:19:37 +03:00
, update = \_ _ -> ( (), Cmd.none )
2021-04-06 03:15:22 +03:00
, site =
{ staticData = StaticHttp.succeed ()
, canonicalUrl = \_ -> "canonical-site-url"
, manifest = \_ -> manifest
2021-04-10 20:12:51 +03:00
, head = \_ -> []
2021-04-06 03:15:22 +03:00
, generateFiles = StaticHttp.succeed []
}
, view =
2021-04-03 00:44:40 +03:00
\_ page ->
let
thing =
pages
|> Dict.fromList
2021-04-03 07:43:57 +03:00
|> Debug.log "dict"
|> Dict.get
(page.path
2021-04-03 07:43:57 +03:00
|> Debug.log "page-path"
|> PagePath.toString
|> String.split "/"
|> List.filter (\pathPart -> pathPart /= "")
)
in
case thing of
2019-10-28 17:57:21 +03:00
Just request ->
request
|> StaticHttp.map
2021-04-03 07:43:57 +03:00
(\_ -> { view = \_ -> { title = "Title", body = Html.text "" }, head = [] })
Nothing ->
2021-04-03 16:39:07 +03:00
Debug.todo <| "Couldn't find page: " ++ Debug.toString page ++ "\npages: " ++ Debug.toString pages
2020-10-26 21:50:06 +03:00
, subscriptions = \_ _ _ -> Sub.none
2020-10-21 06:48:21 +03:00
, canonicalSiteUrl = canonicalSiteUrl
2020-01-26 21:19:37 +03:00
, pathKey = PathKey
, routeToPath = \route -> route |> String.split "/"
2021-04-03 07:43:57 +03:00
--, onPageChange = Just (\_ -> ())
, onPageChange = Nothing
}
encodedFlags =
--{"secrets":
-- {"API_KEY": "ABCD1234","BEARER": "XYZ789"}, "mode": "prod", "staticHttpCache": {}
-- }
Encode.object
[ ( "secrets"
, [ ( "API_KEY", "ABCD1234" )
, ( "BEARER", "XYZ789" )
]
|> Dict.fromList
|> Encode.dict identity Encode.string
)
, ( "mode", Encode.string "prod" )
, ( "staticHttpCache", encodedStaticHttpCache )
]
encodedStaticHttpCache =
staticHttpCache
|> List.map
(\( request, httpResponseString ) ->
( Request.hash request, Encode.string httpResponseString )
)
|> Encode.object
in
{-
(Model -> model)
-> ContentCache.ContentCache metadata view
2021-04-10 20:33:26 +03:00
-> Result (List BuildError) (List ( PagePath, metadata ))
-> Config pathKey userMsg userModel metadata view
-> Decode.Value
-> ( model, Effect pathKey )
-}
ProgramTest.createDocument
{ init = init Nothing identity contentCache config
2021-04-03 07:43:57 +03:00
, update = update contentCache config
2019-10-25 17:00:04 +03:00
, view = \_ -> { title = "", body = [] }
}
|> ProgramTest.withSimulatedEffects simulateEffects
|> ProgramTest.start (flags (Encode.encode 0 encodedFlags))
2019-10-24 18:26:41 +03:00
flags : String -> JD.Value
2019-10-24 18:26:41 +03:00
flags jsonString =
case JD.decodeString JD.value jsonString of
2019-10-24 18:26:41 +03:00
Ok value ->
value
Err _ ->
Debug.todo "Invalid JSON value."
2021-04-03 00:44:40 +03:00
simulateEffects : Effect PathKey -> ProgramTest.SimulatedEffect Msg
simulateEffects effect =
case effect of
2020-06-12 06:57:19 +03:00
Effect.NoEffect ->
SimulatedEffect.Cmd.none
2020-06-12 06:57:19 +03:00
Effect.SendJsData value ->
2020-10-21 06:48:21 +03:00
SimulatedEffect.Ports.send "toJsPort" (value |> Codec.encoder (ToJsPayload.toJsCodec canonicalSiteUrl))
-- toJsPort value |> Cmd.map never
2020-06-12 06:57:19 +03:00
Effect.Batch list ->
list
|> List.map simulateEffects
|> SimulatedEffect.Cmd.batch
2021-04-03 00:44:40 +03:00
Effect.FetchHttp ({ unmasked } as requests) ->
2019-11-08 22:34:51 +03:00
Http.request
{ method = unmasked.method
, url = unmasked.url
2019-11-12 03:56:25 +03:00
, headers = unmasked.headers |> List.map (\( key, value ) -> Http.header key value)
, body =
case unmasked.body of
StaticHttpBody.EmptyBody ->
Http.emptyBody
StaticHttpBody.StringBody contentType string ->
Http.stringBody contentType string
StaticHttpBody.JsonBody value ->
Http.jsonBody value
, expect =
PagesHttp.expectString
(\response ->
2019-10-24 17:06:50 +03:00
GotStaticHttpResponse
2019-11-12 03:56:25 +03:00
{ request = requests
, response = response
}
)
2019-11-08 22:34:51 +03:00
, timeout = Nothing
, tracker = Nothing
}
Effect.SendSinglePage info ->
2020-10-14 07:02:12 +03:00
SimulatedEffect.Cmd.batch
2020-10-18 04:58:17 +03:00
[ info
2020-10-20 03:41:27 +03:00
|> Codec.encoder (ToJsPayload.successCodecNew2 "" "")
2020-10-18 04:58:17 +03:00
|> SimulatedEffect.Ports.send "toJsPort"
, SimulatedEffect.Task.succeed ()
2021-04-03 00:44:40 +03:00
|> SimulatedEffect.Task.perform (\_ -> Continue)
2020-10-14 07:02:12 +03:00
]
Effect.Continue ->
2020-10-14 07:02:12 +03:00
--SimulatedEffect.Task.succeed ()
-- |> SimulatedEffect.Task.perform (\_ -> Continue)
SimulatedEffect.Cmd.none
2021-04-03 00:44:40 +03:00
Effect.ReadFile _ ->
2021-04-01 05:55:28 +03:00
SimulatedEffect.Cmd.none
2021-04-03 00:44:40 +03:00
Effect.GetGlob _ ->
2021-04-01 05:55:28 +03:00
SimulatedEffect.Cmd.none
2020-01-28 02:28:42 +03:00
expectErrorsPort : String -> List (ToJsPayload pathKey) -> Expect.Expectation
2019-11-03 00:46:52 +03:00
expectErrorsPort expectedPlainString actualPorts =
case actualPorts of
2020-06-12 06:55:19 +03:00
[ ToJsPayload.Errors actualRichTerminalString ] ->
2020-01-28 02:28:42 +03:00
actualRichTerminalString
|> normalizeErrorExpectEqual expectedPlainString
[] ->
Expect.fail "Expected single error port. Didn't receive any ports."
2020-01-28 02:28:42 +03:00
_ ->
Expect.fail <| "Expected single error port. Got\n" ++ String.join "\n\n" (List.map Debug.toString actualPorts)
normalizeErrorExpectEqual : String -> String -> Expect.Expectation
normalizeErrorExpectEqual expectedPlainString actualRichTerminalString =
actualRichTerminalString
|> Regex.replace
(Regex.fromString "\u{001B}\\[[0-9;]+m"
|> Maybe.withDefault Regex.never
)
(\_ -> "")
|> Expect.equal expectedPlainString
2019-11-03 00:46:52 +03:00
normalizeErrorsExpectEqual : List String -> List String -> Expect.Expectation
normalizeErrorsExpectEqual expectedPlainStrings actualRichTerminalStrings =
actualRichTerminalStrings
|> List.map
(Regex.replace
(Regex.fromString "\u{001B}\\[[0-9;]+m"
|> Maybe.withDefault Regex.never
)
(\_ -> "")
)
|> Expect.equalLists expectedPlainStrings
2021-04-03 00:49:18 +03:00
toJsPort _ =
Cmd.none
fromJsPort =
Sub.none
type PathKey
= PathKey
manifest : Manifest.Config PathKey
manifest =
{ backgroundColor = Nothing
, categories = []
, displayMode = Manifest.Standalone
, orientation = Manifest.Portrait
, description = "elm-pages - A statically typed site generator."
, iarcRatingId = Nothing
, name = "elm-pages docs"
, themeColor = Nothing
2019-10-22 09:02:31 +03:00
, startUrl = PagePath.external ""
, shortName = Just "elm-pages"
2019-10-22 09:02:31 +03:00
, sourceIcon = ImagePath.external ""
2020-10-21 05:38:51 +03:00
, icons = []
}
2020-05-12 02:42:54 +03:00
starDecoder : Decoder Int
starDecoder =
Decode.field "stargazer_count" Decode.int
expectSuccess : List ( String, List ( Request.Request, String ) ) -> ProgramTest model msg effect -> Expect.Expectation
expectSuccess expectedRequests previous =
expectSuccessNew expectedRequests [] previous
expectSuccessNew : List ( String, List ( Request.Request, String ) ) -> List (ToJsPayload.ToJsSuccessPayload PathKey -> Expect.Expectation) -> ProgramTest model msg effect -> Expect.Expectation
expectSuccessNew expectedRequests expectations previous =
previous
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
2020-10-21 06:48:21 +03:00
(Codec.decoder (ToJsPayload.toJsCodec canonicalSiteUrl))
(\value ->
case value of
2021-04-03 00:44:40 +03:00
(ToJsPayload.Success portPayload) :: _ ->
portPayload
|> Expect.all
((\subject ->
subject.pages
|> Expect.equalDicts
(expectedRequests
|> List.map
(\( url, requests ) ->
( url
, requests
|> List.map
(\( request, response ) ->
( Request.hash request, response )
)
|> Dict.fromList
)
)
|> Dict.fromList
)
)
:: expectations
)
[ errorPort ] ->
Expect.fail <| "Expected success port. Got:\n" ++ Debug.toString errorPort
_ ->
Expect.fail ("Expected ports to be called once, but instead there were " ++ String.fromInt (List.length value) ++ " calls.")
)
expectError : List String -> ProgramTest model msg effect -> Expect.Expectation
expectError expectedErrors previous =
previous
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
2020-10-21 06:48:21 +03:00
(Codec.decoder (ToJsPayload.toJsCodec canonicalSiteUrl))
(\value ->
case value of
2020-06-12 06:55:19 +03:00
[ ToJsPayload.Success portPayload ] ->
portPayload.errors
|> normalizeErrorsExpectEqual expectedErrors
[ _ ] ->
Expect.fail "Expected success port."
_ ->
Expect.fail ("Expected ports to be called once, but instead there were " ++ String.fromInt (List.length value) ++ " calls.")
)
2020-10-21 06:48:21 +03:00
canonicalSiteUrl =
""
get : String -> Request.Request
get url =
{ method = "GET"
, url = url
, headers = []
, body = StaticHttp.emptyBody
}