2019-10-22 05:11:50 +03:00
|
|
|
module StaticHttpRequestsTests exposing (all)
|
2019-10-22 04:49:46 +03:00
|
|
|
|
2021-05-06 17:26:21 +03:00
|
|
|
import ApiRoute
|
2022-02-08 01:50:38 +03:00
|
|
|
import Bytes.Decode
|
|
|
|
import Bytes.Encode
|
2019-10-22 08:00:15 +03:00
|
|
|
import Codec
|
2021-06-04 03:57:57 +03:00
|
|
|
import DataSource exposing (DataSource)
|
2021-04-20 23:52:54 +03:00
|
|
|
import DataSource.Http
|
2020-12-07 19:41:10 +03:00
|
|
|
import Dict
|
2019-10-22 06:21:52 +03:00
|
|
|
import Expect
|
2019-10-22 04:49:46 +03:00
|
|
|
import Html
|
2022-02-08 01:50:38 +03:00
|
|
|
import Http
|
2022-01-28 07:41:54 +03:00
|
|
|
import Json.Decode as JD exposing (Decoder)
|
2020-04-19 18:17:51 +03:00
|
|
|
import Json.Encode as Encode
|
2021-07-31 01:23:36 +03:00
|
|
|
import Pages.Internal.NotFoundReason
|
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)
|
2021-07-28 18:06:05 +03:00
|
|
|
import Pages.Internal.Platform.ToJsPayload as ToJsPayload
|
2020-03-04 19:17:06 +03:00
|
|
|
import Pages.Internal.StaticHttpBody as StaticHttpBody
|
2021-04-16 18:04:15 +03:00
|
|
|
import Pages.ProgramConfig exposing (ProgramConfig)
|
2021-10-07 22:11:23 +03:00
|
|
|
import Pages.SiteConfig exposing (SiteConfig)
|
2020-01-03 23:18:18 +03:00
|
|
|
import Pages.StaticHttp.Request as Request
|
2021-05-23 20:44:39 +03:00
|
|
|
import Path
|
2019-10-22 04:49:46 +03:00
|
|
|
import ProgramTest exposing (ProgramTest)
|
2019-11-03 00:46:52 +03:00
|
|
|
import Regex
|
2021-04-17 17:42:33 +03:00
|
|
|
import RenderRequest
|
2022-02-27 01:10:31 +03:00
|
|
|
import RequestsAndPending exposing (ResponseBody(..))
|
2022-01-25 02:43:37 +03:00
|
|
|
import Server.Response as Response
|
2019-10-22 05:31:17 +03:00
|
|
|
import SimulatedEffect.Cmd
|
2019-10-22 06:21:52 +03:00
|
|
|
import SimulatedEffect.Ports
|
2022-02-08 01:50:38 +03:00
|
|
|
import Task
|
2022-02-26 20:48:36 +03:00
|
|
|
import Test exposing (Test, describe, skip, test)
|
2019-10-22 05:11:50 +03:00
|
|
|
|
|
|
|
|
|
|
|
all : Test
|
|
|
|
all =
|
2019-10-22 16:46:31 +03:00
|
|
|
describe "Static Http Requests"
|
|
|
|
[ test "initial requests are sent out" <|
|
2019-10-22 05:11:50 +03:00
|
|
|
\() ->
|
2021-07-29 19:17:36 +03:00
|
|
|
startSimple []
|
2022-01-28 07:41:54 +03:00
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" starDecoder)
|
2021-07-29 19:17:36 +03:00
|
|
|
|> simulateHttp
|
2022-01-28 07:41:54 +03:00
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(JsonBody
|
|
|
|
(Encode.object [ ( "stargazer_count", Encode.int 86 ) ])
|
|
|
|
)
|
|
|
|
|> expectSuccess []
|
2021-04-16 18:26:59 +03:00
|
|
|
, test "StaticHttp request for initial are resolved" <|
|
|
|
|
\() ->
|
2021-07-29 19:17:36 +03:00
|
|
|
startSimple
|
|
|
|
[ "post-1" ]
|
2022-01-28 07:41:54 +03:00
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" starDecoder)
|
2021-07-29 19:17:36 +03:00
|
|
|
|> simulateHttp
|
2022-01-28 07:41:54 +03:00
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(JsonBody
|
|
|
|
(Encode.object [ ( "stargazer_count", Encode.int 86 ) ])
|
|
|
|
)
|
2022-02-26 04:30:21 +03:00
|
|
|
|> expectSuccess []
|
2021-06-08 19:54:10 +03:00
|
|
|
, describe "single page renders"
|
|
|
|
[ test "single pages that are pre-rendered" <|
|
|
|
|
\() ->
|
2021-07-29 19:17:36 +03:00
|
|
|
startSimple [ "post-1" ]
|
2022-01-28 07:41:54 +03:00
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" starDecoder)
|
2021-07-29 19:17:36 +03:00
|
|
|
|> simulateHttp
|
2022-01-28 07:41:54 +03:00
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(JsonBody
|
|
|
|
(Encode.object [ ( "stargazer_count", Encode.int 86 ) ])
|
|
|
|
)
|
2021-06-08 19:54:10 +03:00
|
|
|
|> ProgramTest.expectOutgoingPortValues
|
|
|
|
"toJsPort"
|
|
|
|
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
|
|
|
|
(\actualPorts ->
|
|
|
|
case actualPorts of
|
|
|
|
[ ToJsPayload.PageProgress portData ] ->
|
|
|
|
portData.is404
|
|
|
|
|> Expect.false "Expected page to be found and rendered"
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
Expect.fail <| "Expected exactly 1 port of type PageProgress. Instead, got \n" ++ Debug.toString actualPorts
|
|
|
|
)
|
|
|
|
, test "data sources are not resolved 404 pages with matching route but not pre-rendered" <|
|
|
|
|
\() ->
|
|
|
|
startWithRoutes [ "post-2" ]
|
|
|
|
[ [ "post-1" ]
|
|
|
|
]
|
|
|
|
[]
|
|
|
|
[ ( [ "post-2" ]
|
2022-01-28 07:41:54 +03:00
|
|
|
, DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" starDecoder
|
2021-06-08 19:54:10 +03:00
|
|
|
)
|
|
|
|
]
|
|
|
|
|> ProgramTest.expectOutgoingPortValues
|
|
|
|
"toJsPort"
|
|
|
|
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
|
|
|
|
(\actualPorts ->
|
|
|
|
case actualPorts of
|
|
|
|
[ ToJsPayload.PageProgress portData ] ->
|
|
|
|
portData.is404
|
|
|
|
|> Expect.true "Expected 404 not found page"
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
Expect.fail <| "Expected exactly 1 port of type PageProgress. Instead, got \n" ++ Debug.toString actualPorts
|
|
|
|
)
|
|
|
|
]
|
2021-06-01 06:59:30 +03:00
|
|
|
, test "the stripped JSON from the same request with different decoders is merged so the decoders succeed" <|
|
|
|
|
\() ->
|
2021-07-29 19:17:36 +03:00
|
|
|
startSimple
|
|
|
|
[ "post-1" ]
|
|
|
|
(DataSource.map2 Tuple.pair
|
2022-01-28 07:41:54 +03:00
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages"
|
|
|
|
(JD.field "stargazer_count" JD.int)
|
2021-07-29 19:17:36 +03:00
|
|
|
)
|
2022-01-28 07:41:54 +03:00
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages"
|
|
|
|
(JD.field "language" JD.string)
|
2021-07-29 19:17:36 +03:00
|
|
|
)
|
|
|
|
)
|
|
|
|
|> simulateHttp
|
2022-01-28 07:41:54 +03:00
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(JsonBody
|
|
|
|
(Encode.object
|
|
|
|
[ ( "stargazer_count", Encode.int 86 )
|
|
|
|
, ( "language", Encode.string "Elm" )
|
|
|
|
]
|
|
|
|
)
|
|
|
|
)
|
2022-02-26 04:30:21 +03:00
|
|
|
|> expectSuccess []
|
2019-11-01 23:29:09 +03:00
|
|
|
, test "andThen" <|
|
|
|
|
\() ->
|
2021-07-29 19:17:36 +03:00
|
|
|
startSimple
|
|
|
|
[ "elm-pages" ]
|
2022-01-28 07:41:54 +03:00
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" (JD.succeed ())
|
2021-07-29 19:17:36 +03:00
|
|
|
|> DataSource.andThen
|
|
|
|
(\_ ->
|
2022-01-28 07:41:54 +03:00
|
|
|
DataSource.Http.get "NEXT-REQUEST" (JD.succeed ())
|
2021-07-29 19:17:36 +03:00
|
|
|
)
|
|
|
|
)
|
|
|
|
|> simulateHttp
|
2022-01-28 07:41:54 +03:00
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(JsonBody Encode.null)
|
2021-07-29 19:17:36 +03:00
|
|
|
|> simulateHttp
|
2022-01-28 07:41:54 +03:00
|
|
|
(get "NEXT-REQUEST")
|
2022-02-27 01:10:31 +03:00
|
|
|
(JsonBody Encode.null)
|
2022-02-26 04:30:21 +03:00
|
|
|
|> expectSuccess []
|
2022-02-26 19:32:31 +03:00
|
|
|
, test "andThen chain avoids repeat requests" <|
|
|
|
|
\() ->
|
|
|
|
let
|
|
|
|
pokemonDetailRequest : DataSource ()
|
|
|
|
pokemonDetailRequest =
|
|
|
|
DataSource.Http.get
|
|
|
|
"https://pokeapi.co/api/v2/pokemon/"
|
|
|
|
(JD.list
|
|
|
|
(JD.field "url" JD.string
|
|
|
|
|> JD.map
|
|
|
|
(\url ->
|
|
|
|
DataSource.Http.get url
|
|
|
|
(JD.field "image" JD.string)
|
|
|
|
)
|
2019-11-12 20:59:37 +03:00
|
|
|
)
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
|> DataSource.resolve
|
|
|
|
|> DataSource.map (\_ -> ())
|
|
|
|
in
|
|
|
|
startSimple
|
|
|
|
[ "elm-pages" ]
|
|
|
|
pokemonDetailRequest
|
|
|
|
|> simulateMultipleHttp
|
|
|
|
[ ( get "https://pokeapi.co/api/v2/pokemon/"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """[
|
2019-11-12 20:59:37 +03:00
|
|
|
{"url": "url1"},
|
|
|
|
{"url": "url2"},
|
|
|
|
{"url": "url3"},
|
|
|
|
{"url": "url4"},
|
|
|
|
{"url": "url5"},
|
|
|
|
{"url": "url6"},
|
|
|
|
{"url": "url7"},
|
|
|
|
{"url": "url8"},
|
|
|
|
{"url": "url9"},
|
|
|
|
{"url": "url10"}
|
|
|
|
]"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url1"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image1.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url2"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image2.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url3"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image3.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url4"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image4.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url5"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image5.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url6"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image6.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url7"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image7.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url8"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image8.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url9"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image9.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
, ( get "url10"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{"image": "image10.jpg"}"""
|
2022-02-26 19:32:31 +03:00
|
|
|
)
|
|
|
|
]
|
|
|
|
|> expectSuccess []
|
2021-07-28 18:06:05 +03:00
|
|
|
|
|
|
|
--, test "port is sent out once all requests are finished" <|
|
|
|
|
-- \() ->
|
|
|
|
-- start
|
|
|
|
-- [ ( [ "elm-pages" ]
|
|
|
|
-- , DataSource.Http.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages") starDecoder
|
|
|
|
-- )
|
|
|
|
-- , ( [ "elm-pages-starter" ]
|
|
|
|
-- , DataSource.Http.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
|
|
|
|
-- [ ( "elm-pages"
|
|
|
|
-- , [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
|
|
|
|
-- , """{"stargazer_count":86}"""
|
|
|
|
-- )
|
|
|
|
-- ]
|
|
|
|
-- )
|
|
|
|
-- , ( "elm-pages-starter"
|
|
|
|
-- , [ ( get "https://api.github.com/repos/dillonkearns/elm-pages-starter"
|
|
|
|
-- , """{"stargazer_count":22}"""
|
|
|
|
-- )
|
|
|
|
-- ]
|
|
|
|
-- )
|
|
|
|
-- ]
|
2022-02-26 04:30:21 +03:00
|
|
|
, test "reduced JSON is sent out" <|
|
|
|
|
\() ->
|
|
|
|
startSimple []
|
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" (JD.field "stargazer_count" JD.int))
|
|
|
|
|> simulateHttp
|
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(jsonBody """{ "stargazer_count": 86, "unused_field": 123 }""")
|
2022-02-26 04:30:21 +03:00
|
|
|
|> expectSuccess []
|
|
|
|
, test "you can use elm/json decoders with StaticHttp.unoptimizedRequest" <|
|
|
|
|
\() ->
|
|
|
|
startSimple []
|
|
|
|
(DataSource.Http.request
|
|
|
|
{ url = "https://api.github.com/repos/dillonkearns/elm-pages"
|
|
|
|
, method = "GET"
|
|
|
|
, headers = []
|
|
|
|
, body = DataSource.Http.emptyBody
|
|
|
|
}
|
|
|
|
(DataSource.Http.expectJson
|
|
|
|
(JD.field "stargazer_count" JD.int)
|
2021-07-29 19:17:36 +03:00
|
|
|
)
|
2022-02-26 04:30:21 +03:00
|
|
|
)
|
|
|
|
|> simulateHttp
|
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(jsonBody """{ "stargazer_count": 86, "unused_field": 123 }""")
|
|
|
|
|> expectSuccess []
|
|
|
|
, test "plain string" <|
|
|
|
|
\() ->
|
|
|
|
startSimple []
|
|
|
|
(DataSource.Http.request
|
|
|
|
{ url = "https://example.com/file.txt"
|
|
|
|
, method = "GET"
|
|
|
|
, headers = []
|
|
|
|
, body = DataSource.Http.emptyBody
|
|
|
|
}
|
|
|
|
(DataSource.Http.expectString Ok)
|
|
|
|
)
|
|
|
|
|> simulateHttp
|
|
|
|
{ method = "GET"
|
|
|
|
, url = "https://example.com/file.txt"
|
|
|
|
, headers =
|
|
|
|
[]
|
|
|
|
, body = DataSource.Http.emptyBody
|
|
|
|
}
|
|
|
|
(StringBody "This is a raw text file.")
|
2022-02-26 04:30:21 +03:00
|
|
|
|> expectSuccess []
|
2022-02-27 01:35:52 +03:00
|
|
|
, test "Err in String to Result function turns into decode error" <|
|
|
|
|
\() ->
|
|
|
|
startSimple []
|
|
|
|
(DataSource.Http.request
|
|
|
|
{ url = "https://example.com/file.txt"
|
|
|
|
, method = "GET"
|
|
|
|
, headers = []
|
|
|
|
, body = DataSource.Http.emptyBody
|
|
|
|
}
|
|
|
|
(DataSource.Http.expectString
|
|
|
|
(\string ->
|
|
|
|
if String.toUpper string == string then
|
|
|
|
Ok string
|
2020-03-03 18:54:16 +03:00
|
|
|
|
2022-02-27 01:35:52 +03:00
|
|
|
else
|
|
|
|
Err "String was not uppercased"
|
2020-03-03 18:54:16 +03:00
|
|
|
)
|
2021-07-29 19:17:36 +03:00
|
|
|
)
|
2022-02-27 01:35:52 +03:00
|
|
|
|> DataSource.andThen DataSource.fromResult
|
|
|
|
)
|
|
|
|
|> simulateHttp
|
|
|
|
(get "https://example.com/file.txt")
|
|
|
|
(StringBody "This is a raw text file.")
|
|
|
|
|> ProgramTest.expectOutgoingPortValues
|
|
|
|
"toJsPort"
|
|
|
|
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
|
|
|
|
(expectErrorsPort
|
|
|
|
"""-- CALLED STATIC HTTP FAIL ----------------------------------------------------- elm-pages
|
2020-03-03 18:54:16 +03:00
|
|
|
|
2020-03-11 19:03:47 +03:00
|
|
|
|
2020-03-03 18:54:16 +03:00
|
|
|
|
2022-02-27 01:35:52 +03:00
|
|
|
I ran into a call to `DataSource.fail` with message: String was not uppercased"""
|
|
|
|
)
|
2022-02-27 01:18:37 +03:00
|
|
|
, test "POST method works" <|
|
|
|
|
\() ->
|
|
|
|
startSimple []
|
|
|
|
(DataSource.Http.request
|
|
|
|
{ method = "POST"
|
|
|
|
, url = "https://api.github.com/repos/dillonkearns/elm-pages"
|
|
|
|
, headers = []
|
|
|
|
, body = DataSource.Http.emptyBody
|
|
|
|
}
|
|
|
|
(DataSource.Http.expectJson
|
|
|
|
(JD.field "stargazer_count" JD.int)
|
2022-02-26 03:57:50 +03:00
|
|
|
)
|
2022-02-27 01:18:37 +03:00
|
|
|
)
|
|
|
|
|> simulateHttp
|
|
|
|
(post "https://api.github.com/repos/dillonkearns/elm-pages")
|
|
|
|
(jsonBody """{ "stargazer_count": 86, "unused_field": 123 }""")
|
|
|
|
|> expectSuccess []
|
2022-02-26 04:30:21 +03:00
|
|
|
, test "json is reduced from andThen chains" <|
|
|
|
|
\() ->
|
|
|
|
startSimple []
|
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" (JD.field "stargazer_count" JD.int)
|
|
|
|
|> DataSource.andThen
|
|
|
|
(\_ ->
|
|
|
|
DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages-starter" (JD.field "stargazer_count" JD.int)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|> simulateHttp
|
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(jsonBody """{ "stargazer_count": 100, "unused_field": 123 }""")
|
2022-02-26 04:30:21 +03:00
|
|
|
|> simulateHttp
|
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages-starter")
|
2022-02-27 01:10:31 +03:00
|
|
|
(jsonBody """{ "stargazer_count": 50, "unused_field": 456 }""")
|
2022-02-26 04:30:21 +03:00
|
|
|
|> expectSuccess []
|
2022-02-26 18:44:16 +03:00
|
|
|
, test "reduced json is preserved by StaticHttp.map2" <|
|
|
|
|
\() ->
|
|
|
|
startSimple []
|
|
|
|
(DataSource.map2 (\_ _ -> ())
|
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" (JD.field "stargazer_count" JD.int))
|
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages-starter" (JD.field "stargazer_count" JD.int))
|
|
|
|
)
|
|
|
|
|> simulateMultipleHttp
|
|
|
|
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{ "stargazer_count": 100, "unused_field": 123 }"""
|
2022-02-26 18:44:16 +03:00
|
|
|
)
|
|
|
|
, ( get "https://api.github.com/repos/dillonkearns/elm-pages-starter"
|
2022-02-27 01:10:31 +03:00
|
|
|
, jsonBody """{ "stargazer_count": 50, "unused_field": 456 }"""
|
2022-02-26 18:44:16 +03:00
|
|
|
)
|
|
|
|
]
|
|
|
|
|> expectSuccess []
|
2022-02-27 01:10:31 +03:00
|
|
|
, test "the port sends out even if there are no http requests" <|
|
|
|
|
\() ->
|
|
|
|
start
|
|
|
|
[ ( []
|
|
|
|
, DataSource.succeed ()
|
|
|
|
)
|
|
|
|
]
|
|
|
|
|> expectSuccess []
|
|
|
|
, test "the port sends out when there are duplicate http requests for the same page" <|
|
|
|
|
\() ->
|
|
|
|
startSimple []
|
|
|
|
(DataSource.map2 (\_ _ -> ())
|
|
|
|
(DataSource.Http.get "http://example.com" (JD.succeed ()))
|
|
|
|
(DataSource.Http.get "http://example.com" (JD.succeed ()))
|
|
|
|
)
|
|
|
|
|> simulateHttp
|
|
|
|
(get "http://example.com")
|
|
|
|
(jsonBody """null""")
|
|
|
|
|> expectSuccess []
|
2022-02-26 03:57:50 +03:00
|
|
|
, skip <|
|
|
|
|
test "an error is sent out for decoder failures" <|
|
|
|
|
\() ->
|
|
|
|
startSimple [ "elm-pages" ]
|
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" (JD.fail "The user should get this message from the CLI."))
|
|
|
|
|> simulateHttp
|
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
2022-02-27 01:10:31 +03:00
|
|
|
(jsonBody """{ "stargazer_count": 86 }""")
|
2022-02-26 03:57:50 +03:00
|
|
|
|> ProgramTest.expectOutgoingPortValues
|
|
|
|
"toJsPort"
|
|
|
|
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
|
|
|
|
(expectErrorsPort
|
|
|
|
"""-- STATIC HTTP DECODING ERROR ----------------------------------------------------- elm-pages
|
2019-10-30 08:33:47 +03:00
|
|
|
|
2019-11-13 05:22:36 +03:00
|
|
|
I encountered some errors while decoding this JSON:
|
2019-10-27 02:50:09 +03:00
|
|
|
|
2019-11-13 05:22:36 +03:00
|
|
|
The user should get this message from the CLI.
|
2019-11-02 21:13:33 +03:00
|
|
|
|
2019-11-13 05:22:36 +03:00
|
|
|
{
|
|
|
|
"stargazer_count": 86
|
|
|
|
}"""
|
2022-02-26 03:57:50 +03:00
|
|
|
)
|
2022-02-27 01:10:31 +03:00
|
|
|
, describe "staticHttpCache"
|
|
|
|
[ skip <|
|
|
|
|
test "it doesn't perform http requests that are provided in the http cache flag" <|
|
2022-02-26 03:57:50 +03:00
|
|
|
\() ->
|
|
|
|
startWithHttpCache
|
|
|
|
[ ( { url = "https://api.github.com/repos/dillonkearns/elm-pages"
|
|
|
|
, method = "GET"
|
|
|
|
, headers = []
|
|
|
|
, body = StaticHttpBody.EmptyBody
|
|
|
|
}
|
2021-07-28 18:06:05 +03:00
|
|
|
, """{"stargazer_count":86}"""
|
2020-04-19 18:17:51 +03:00
|
|
|
)
|
|
|
|
]
|
2022-02-26 03:57:50 +03:00
|
|
|
[ ( []
|
|
|
|
, DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" starDecoder
|
|
|
|
)
|
|
|
|
]
|
2022-02-27 01:10:31 +03:00
|
|
|
|> expectSuccess []
|
|
|
|
, test "it ignores unused cache" <|
|
|
|
|
\() ->
|
|
|
|
startSimpleWithCache []
|
|
|
|
(DataSource.Http.get "https://api.github.com/repos/dillonkearns/elm-pages" starDecoder)
|
|
|
|
[ ( { url = "https://this-is-never-used.example.com/"
|
|
|
|
, method = "GET"
|
|
|
|
, headers = []
|
|
|
|
, body = StaticHttpBody.EmptyBody
|
|
|
|
}
|
|
|
|
, """{"stargazer_count":86}"""
|
|
|
|
)
|
|
|
|
]
|
|
|
|
|> simulateHttp
|
|
|
|
(get "https://api.github.com/repos/dillonkearns/elm-pages")
|
|
|
|
(jsonBody """{ "stargazer_count": 86 }""")
|
|
|
|
|> expectSuccess []
|
|
|
|
]
|
2021-07-28 18:06:05 +03:00
|
|
|
|
|
|
|
--, describe "generateFiles"
|
|
|
|
-- [ test "initial requests are sent out" <|
|
|
|
|
-- \() ->
|
|
|
|
-- startLowLevel
|
|
|
|
-- [ ApiRoute.succeed
|
|
|
|
-- (DataSource.Http.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages")
|
|
|
|
-- (starDecoder
|
|
|
|
-- |> Decode.map
|
|
|
|
-- (\starCount ->
|
|
|
|
-- { body = "Star count: " ++ String.fromInt starCount
|
|
|
|
-- }
|
|
|
|
-- )
|
|
|
|
-- )
|
|
|
|
-- )
|
|
|
|
-- |> ApiRoute.literal "test.txt"
|
|
|
|
-- |> ApiRoute.single
|
|
|
|
-- ]
|
|
|
|
-- []
|
|
|
|
-- []
|
|
|
|
-- |> 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
|
|
|
|
-- [ ApiRoute.succeed
|
|
|
|
-- (DataSource.Http.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages-starter")
|
|
|
|
-- (starDecoder
|
|
|
|
-- |> Decode.map
|
|
|
|
-- (\starCount ->
|
|
|
|
-- { body = "Star count: " ++ String.fromInt starCount
|
|
|
|
-- }
|
|
|
|
-- )
|
|
|
|
-- )
|
|
|
|
-- )
|
|
|
|
-- |> ApiRoute.literal "test.txt"
|
|
|
|
-- |> ApiRoute.single
|
|
|
|
-- ]
|
|
|
|
-- [ ( { 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}"""
|
|
|
|
-- )
|
|
|
|
-- ]
|
|
|
|
-- [ ( []
|
|
|
|
-- , DataSource.Http.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"
|
|
|
|
-- }
|
|
|
|
-- ]
|
|
|
|
-- ]
|
|
|
|
-- ]
|
2019-10-22 05:11:50 +03:00
|
|
|
]
|
2019-10-22 04:49:46 +03:00
|
|
|
|
|
|
|
|
2021-04-16 18:04:15 +03:00
|
|
|
type Route
|
|
|
|
= Route String
|
|
|
|
|
|
|
|
|
2021-06-04 03:57:57 +03:00
|
|
|
start : List ( List String, DataSource a ) -> ProgramTest (Model Route) Msg Effect
|
2019-10-22 16:46:31 +03:00
|
|
|
start pages =
|
2021-06-04 03:14:25 +03:00
|
|
|
startWithHttpCache [] pages
|
2020-04-19 18:17:51 +03:00
|
|
|
|
|
|
|
|
2020-06-13 22:29:36 +03:00
|
|
|
startWithHttpCache :
|
2021-06-04 03:14:25 +03:00
|
|
|
List ( Request.Request, String )
|
2021-06-04 03:57:57 +03:00
|
|
|
-> List ( List String, DataSource a )
|
2021-04-16 18:04:15 +03:00
|
|
|
-> ProgramTest (Model Route) Msg Effect
|
2020-06-13 22:31:47 +03:00
|
|
|
startWithHttpCache =
|
2021-05-06 17:14:49 +03:00
|
|
|
startLowLevel []
|
2020-06-13 22:31:47 +03:00
|
|
|
|
|
|
|
|
|
|
|
startLowLevel :
|
2021-07-31 01:35:02 +03:00
|
|
|
List (ApiRoute.ApiRoute ApiRoute.Response)
|
2020-06-13 22:31:47 +03:00
|
|
|
-> List ( Request.Request, String )
|
2021-06-04 03:57:57 +03:00
|
|
|
-> List ( List String, DataSource a )
|
2021-04-16 18:04:15 +03:00
|
|
|
-> ProgramTest (Model Route) Msg Effect
|
2021-06-04 03:14:25 +03:00
|
|
|
startLowLevel apiRoutes staticHttpCache pages =
|
2019-10-22 04:49:46 +03:00
|
|
|
let
|
2021-07-27 20:41:18 +03:00
|
|
|
pageToLoad : List String
|
|
|
|
pageToLoad =
|
|
|
|
case pages |> List.head |> Maybe.map Tuple.first of
|
|
|
|
Just justPageToLoad ->
|
|
|
|
justPageToLoad
|
|
|
|
|
|
|
|
Nothing ->
|
|
|
|
Debug.todo "Error - no pages"
|
|
|
|
|
2022-02-26 03:57:50 +03:00
|
|
|
config : ProgramConfig Msg () Route () ()
|
2019-10-22 04:49:46 +03:00
|
|
|
config =
|
|
|
|
{ toJsPort = toJsPort
|
2020-04-17 07:31:21 +03:00
|
|
|
, fromJsPort = fromJsPort
|
2021-05-19 17:58:37 +03:00
|
|
|
, init = \_ _ _ _ _ -> ( (), Cmd.none )
|
2021-04-03 19:53:42 +03:00
|
|
|
, getStaticRoutes =
|
2021-04-16 18:26:59 +03:00
|
|
|
--StaticHttp.get (Secrets.succeed "https://my-cms.com/posts")
|
|
|
|
-- (Decode.field "posts" (Decode.list (Decode.string |> Decode.map Route)))
|
|
|
|
pages
|
|
|
|
|> List.map Tuple.first
|
|
|
|
|> List.map (String.join "/")
|
|
|
|
|> List.map Route
|
2021-04-20 17:31:19 +03:00
|
|
|
|> DataSource.succeed
|
2021-06-09 01:17:56 +03:00
|
|
|
, handleRoute = \_ -> DataSource.succeed Nothing
|
2021-04-16 18:04:15 +03:00
|
|
|
, urlToRoute = .path >> Route
|
2021-04-22 21:33:06 +03:00
|
|
|
, update = \_ _ _ _ _ -> ( (), Cmd.none )
|
2021-07-27 20:41:18 +03:00
|
|
|
, basePath = []
|
2021-04-24 02:24:26 +03:00
|
|
|
, data =
|
2021-12-31 22:52:37 +03:00
|
|
|
\(Route pageRoute) ->
|
2021-04-17 17:42:33 +03:00
|
|
|
let
|
2021-06-04 03:57:57 +03:00
|
|
|
thing : Maybe (DataSource a)
|
2021-04-17 17:42:33 +03:00
|
|
|
thing =
|
|
|
|
pages
|
|
|
|
|> Dict.fromList
|
|
|
|
|> Dict.get
|
|
|
|
(pageRoute
|
|
|
|
|> String.split "/"
|
|
|
|
|> List.filter (\pathPart -> pathPart /= "")
|
|
|
|
)
|
|
|
|
in
|
|
|
|
case thing of
|
|
|
|
Just request ->
|
2022-01-25 02:43:37 +03:00
|
|
|
request |> DataSource.map (\_ -> Response.render ())
|
2021-04-17 17:42:33 +03:00
|
|
|
|
|
|
|
Nothing ->
|
|
|
|
Debug.todo <| "Couldn't find page: " ++ pageRoute ++ "\npages: " ++ Debug.toString pages
|
2021-09-27 20:48:49 +03:00
|
|
|
, site = Just site
|
2019-10-22 04:49:46 +03:00
|
|
|
, view =
|
2021-05-24 21:40:36 +03:00
|
|
|
\page _ ->
|
2019-10-22 16:46:31 +03:00
|
|
|
let
|
2021-06-04 03:57:57 +03:00
|
|
|
thing : Maybe (DataSource a)
|
2019-10-24 15:52:24 +03:00
|
|
|
thing =
|
2019-10-22 16:46:31 +03:00
|
|
|
pages
|
|
|
|
|> Dict.fromList
|
|
|
|
|> Dict.get
|
2021-05-23 20:44:39 +03:00
|
|
|
(page.path |> Path.toSegments)
|
2019-10-22 16:46:31 +03:00
|
|
|
in
|
2019-10-24 15:52:24 +03:00
|
|
|
case thing of
|
2021-04-17 18:18:26 +03:00
|
|
|
Just _ ->
|
2021-04-17 17:42:33 +03:00
|
|
|
\_ _ -> { view = \_ -> { title = "Title", body = Html.text "" }, head = [] }
|
2019-10-24 15:52:24 +03:00
|
|
|
|
|
|
|
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
|
2021-04-16 18:04:15 +03:00
|
|
|
, routeToPath = \(Route route) -> route |> String.split "/"
|
2021-04-24 02:22:23 +03:00
|
|
|
, sharedData = DataSource.succeed ()
|
2021-04-21 17:52:56 +03:00
|
|
|
, onPageChange = \_ -> Continue
|
2021-05-15 05:38:10 +03:00
|
|
|
, apiRoutes = \_ -> apiRoutes
|
2021-06-06 21:11:34 +03:00
|
|
|
, pathPatterns = []
|
2022-02-08 01:50:38 +03:00
|
|
|
, byteDecodePageData = \_ -> Bytes.Decode.fail
|
|
|
|
, sendPageData = \_ -> Cmd.none
|
|
|
|
, encodeResponse = \_ -> Bytes.Encode.signedInt8 0
|
|
|
|
, hotReloadData = Sub.none
|
|
|
|
, decodeResponse = Bytes.Decode.fail
|
|
|
|
, byteEncodePageData = \_ -> Bytes.Encode.signedInt8 0
|
2022-02-26 03:57:50 +03:00
|
|
|
, fetchPageData = \_ _ -> Task.fail Http.NetworkError
|
|
|
|
, gotBatchSub = Sub.none
|
|
|
|
, globalHeadTags = Nothing
|
2019-10-22 04:49:46 +03:00
|
|
|
}
|
2020-04-19 18:17:51 +03:00
|
|
|
|
2021-06-04 03:57:57 +03:00
|
|
|
encodedFlags : Encode.Value
|
2020-04-19 18:17:51 +03:00
|
|
|
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 )
|
|
|
|
]
|
|
|
|
|
2021-06-04 03:57:57 +03:00
|
|
|
encodedStaticHttpCache : Encode.Value
|
2020-04-19 18:17:51 +03:00
|
|
|
encodedStaticHttpCache =
|
|
|
|
staticHttpCache
|
|
|
|
|> List.map
|
|
|
|
(\( request, httpResponseString ) ->
|
|
|
|
( Request.hash request, Encode.string httpResponseString )
|
|
|
|
)
|
|
|
|
|> Encode.object
|
2019-10-22 04:49:46 +03:00
|
|
|
in
|
2020-01-25 23:47:06 +03:00
|
|
|
{-
|
|
|
|
(Model -> model)
|
|
|
|
-> ContentCache.ContentCache metadata view
|
2021-04-10 20:33:26 +03:00
|
|
|
-> Result (List BuildError) (List ( PagePath, metadata ))
|
2020-01-25 23:47:06 +03:00
|
|
|
-> Config pathKey userMsg userModel metadata view
|
|
|
|
-> Decode.Value
|
|
|
|
-> ( model, Effect pathKey )
|
|
|
|
-}
|
2019-10-22 04:49:46 +03:00
|
|
|
ProgramTest.createDocument
|
2021-07-27 20:41:18 +03:00
|
|
|
{ init =
|
|
|
|
init
|
2021-09-27 20:48:49 +03:00
|
|
|
site
|
2021-07-27 20:41:18 +03:00
|
|
|
(RenderRequest.SinglePage
|
|
|
|
RenderRequest.OnlyJson
|
|
|
|
(RenderRequest.Page
|
|
|
|
{ path = Path.fromString (pageToLoad |> String.join "/")
|
|
|
|
, frontmatter = Route (pageToLoad |> String.join "/")
|
|
|
|
}
|
|
|
|
)
|
|
|
|
(Encode.object [])
|
|
|
|
)
|
|
|
|
config
|
2022-02-08 01:50:38 +03:00
|
|
|
, update = update site config
|
2019-10-25 17:00:04 +03:00
|
|
|
, view = \_ -> { title = "", body = [] }
|
2019-10-22 04:49:46 +03:00
|
|
|
}
|
2019-10-22 05:31:17 +03:00
|
|
|
|> ProgramTest.withSimulatedEffects simulateEffects
|
2020-04-19 18:17:51 +03:00
|
|
|
|> ProgramTest.start (flags (Encode.encode 0 encodedFlags))
|
2019-10-24 18:26:41 +03:00
|
|
|
|
|
|
|
|
2022-02-26 03:57:50 +03:00
|
|
|
site : SiteConfig
|
2021-09-27 20:48:49 +03:00
|
|
|
site =
|
2022-02-26 03:57:50 +03:00
|
|
|
{ canonicalUrl = "canonical-site-url"
|
|
|
|
, head = DataSource.succeed []
|
2021-09-27 20:48:49 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-07-29 20:03:42 +03:00
|
|
|
startSimple : List String -> DataSource a -> ProgramTest (Model Route) Msg Effect
|
2021-07-29 19:17:36 +03:00
|
|
|
startSimple route dataSources =
|
|
|
|
startWithRoutes route [ route ] [] [ ( route, dataSources ) ]
|
|
|
|
|
|
|
|
|
2021-07-29 20:03:42 +03:00
|
|
|
startSimpleWithCache : List String -> DataSource a -> List ( Request.Request, String ) -> ProgramTest (Model Route) Msg Effect
|
2021-07-29 19:38:46 +03:00
|
|
|
startSimpleWithCache route dataSources cache =
|
|
|
|
startWithRoutes route [ route ] cache [ ( route, dataSources ) ]
|
|
|
|
|
|
|
|
|
2021-06-08 19:54:10 +03:00
|
|
|
startWithRoutes :
|
|
|
|
List String
|
|
|
|
-> List (List String)
|
|
|
|
-> List ( Request.Request, String )
|
|
|
|
-> List ( List String, DataSource a )
|
|
|
|
-> ProgramTest (Model Route) Msg Effect
|
|
|
|
startWithRoutes pageToLoad staticRoutes staticHttpCache pages =
|
|
|
|
let
|
2022-02-26 03:57:50 +03:00
|
|
|
config : ProgramConfig Msg () Route () ()
|
2021-06-08 19:54:10 +03:00
|
|
|
config =
|
|
|
|
{ toJsPort = toJsPort
|
|
|
|
, fromJsPort = fromJsPort
|
|
|
|
, init = \_ _ _ _ _ -> ( (), Cmd.none )
|
|
|
|
, getStaticRoutes =
|
|
|
|
staticRoutes
|
|
|
|
|> List.map (String.join "/")
|
|
|
|
|> List.map Route
|
|
|
|
|> DataSource.succeed
|
|
|
|
, handleRoute =
|
|
|
|
\(Route route) ->
|
|
|
|
staticRoutes
|
|
|
|
|> List.map (String.join "/")
|
2021-06-08 20:36:05 +03:00
|
|
|
|> List.member route
|
2021-06-09 01:17:56 +03:00
|
|
|
|> (\found ->
|
|
|
|
if found then
|
|
|
|
Nothing
|
|
|
|
|
|
|
|
else
|
2021-07-31 01:23:36 +03:00
|
|
|
Just Pages.Internal.NotFoundReason.NoMatchingRoute
|
2021-06-09 01:17:56 +03:00
|
|
|
)
|
2021-06-08 19:54:10 +03:00
|
|
|
|> DataSource.succeed
|
|
|
|
, urlToRoute = .path >> Route
|
|
|
|
, update = \_ _ _ _ _ -> ( (), Cmd.none )
|
2021-07-27 20:41:18 +03:00
|
|
|
, basePath = []
|
2021-06-08 19:54:10 +03:00
|
|
|
, data =
|
2021-12-31 22:52:37 +03:00
|
|
|
\(Route pageRoute) ->
|
2021-06-08 19:54:10 +03:00
|
|
|
let
|
|
|
|
thing : Maybe (DataSource a)
|
|
|
|
thing =
|
|
|
|
pages
|
|
|
|
|> Dict.fromList
|
|
|
|
|> Dict.get
|
|
|
|
(pageRoute
|
|
|
|
|> String.split "/"
|
|
|
|
|> List.filter (\pathPart -> pathPart /= "")
|
|
|
|
)
|
|
|
|
in
|
|
|
|
case thing of
|
|
|
|
Just request ->
|
2022-02-08 01:50:38 +03:00
|
|
|
request
|
|
|
|
|> DataSource.map (\_ -> Response.render ())
|
2021-06-08 19:54:10 +03:00
|
|
|
|
|
|
|
Nothing ->
|
|
|
|
DataSource.fail <| "Couldn't find page: " ++ pageRoute ++ "\npages: " ++ Debug.toString pages
|
2021-09-27 20:48:49 +03:00
|
|
|
, site = Just site
|
2021-06-08 19:54:10 +03:00
|
|
|
, view =
|
|
|
|
\page _ ->
|
|
|
|
let
|
|
|
|
thing : Maybe (DataSource a)
|
|
|
|
thing =
|
|
|
|
pages
|
|
|
|
|> Dict.fromList
|
|
|
|
|> Dict.get
|
|
|
|
(page.path |> Path.toSegments)
|
|
|
|
in
|
|
|
|
case thing of
|
|
|
|
Just _ ->
|
|
|
|
\_ _ -> { view = \_ -> { title = "Title", body = Html.text "" }, head = [] }
|
|
|
|
|
|
|
|
Nothing ->
|
|
|
|
Debug.todo <| "Couldn't find page: " ++ Debug.toString page ++ "\npages: " ++ Debug.toString pages
|
|
|
|
, subscriptions = \_ _ _ -> Sub.none
|
|
|
|
, routeToPath = \(Route route) -> route |> String.split "/"
|
|
|
|
, sharedData = DataSource.succeed ()
|
|
|
|
, onPageChange = \_ -> Continue
|
|
|
|
, apiRoutes = \_ -> []
|
|
|
|
, pathPatterns = []
|
2022-02-08 01:50:38 +03:00
|
|
|
, byteDecodePageData = \_ -> Bytes.Decode.fail
|
|
|
|
, sendPageData = \_ -> Cmd.none
|
|
|
|
, encodeResponse = \_ -> Bytes.Encode.signedInt8 0
|
|
|
|
, hotReloadData = Sub.none
|
|
|
|
, decodeResponse = Bytes.Decode.fail
|
|
|
|
, byteEncodePageData = \_ -> Bytes.Encode.signedInt8 0
|
2022-02-26 03:57:50 +03:00
|
|
|
, fetchPageData = \_ _ -> Task.fail Http.NetworkError
|
|
|
|
, gotBatchSub = Sub.none
|
|
|
|
, globalHeadTags = Nothing
|
2021-06-08 19:54:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
encodedFlags : Encode.Value
|
|
|
|
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
|
|
|
|
)
|
|
|
|
, ( "staticHttpCache", encodedStaticHttpCache )
|
2021-08-10 05:52:56 +03:00
|
|
|
, ( "mode", Encode.string "dev-server" )
|
2021-06-08 19:54:10 +03:00
|
|
|
]
|
|
|
|
|
|
|
|
encodedStaticHttpCache : Encode.Value
|
|
|
|
encodedStaticHttpCache =
|
|
|
|
staticHttpCache
|
|
|
|
|> List.map
|
|
|
|
(\( request, httpResponseString ) ->
|
|
|
|
( Request.hash request, Encode.string httpResponseString )
|
|
|
|
)
|
|
|
|
|> Encode.object
|
|
|
|
in
|
|
|
|
{-
|
|
|
|
(Model -> model)
|
|
|
|
-> ContentCache.ContentCache metadata view
|
|
|
|
-> Result (List BuildError) (List ( PagePath, metadata ))
|
|
|
|
-> Config pathKey userMsg userModel metadata view
|
|
|
|
-> Decode.Value
|
|
|
|
-> ( model, Effect pathKey )
|
|
|
|
-}
|
|
|
|
ProgramTest.createDocument
|
|
|
|
{ init =
|
|
|
|
init
|
2021-09-27 20:48:49 +03:00
|
|
|
site
|
2021-06-08 19:54:10 +03:00
|
|
|
(RenderRequest.SinglePage
|
|
|
|
RenderRequest.OnlyJson
|
|
|
|
(RenderRequest.Page
|
|
|
|
{ path = Path.fromString (pageToLoad |> String.join "/")
|
|
|
|
, frontmatter = Route (pageToLoad |> String.join "/")
|
|
|
|
}
|
|
|
|
)
|
|
|
|
(Encode.object [])
|
|
|
|
)
|
|
|
|
config
|
2022-02-08 01:50:38 +03:00
|
|
|
, update = update site config
|
2021-06-08 19:54:10 +03:00
|
|
|
, view = \_ -> { title = "", body = [] }
|
|
|
|
}
|
|
|
|
|> ProgramTest.withSimulatedEffects simulateEffects
|
2021-06-23 18:22:07 +03:00
|
|
|
|> ProgramTest.withSimulatedSubscriptions simulateSubscriptions
|
2021-06-08 19:54:10 +03:00
|
|
|
|> ProgramTest.start (flags (Encode.encode 0 encodedFlags))
|
|
|
|
|
|
|
|
|
2019-11-13 05:22:36 +03:00
|
|
|
flags : String -> JD.Value
|
2019-10-24 18:26:41 +03:00
|
|
|
flags jsonString =
|
2019-11-13 05:22:36 +03:00
|
|
|
case JD.decodeString JD.value jsonString of
|
2019-10-24 18:26:41 +03:00
|
|
|
Ok value ->
|
|
|
|
value
|
|
|
|
|
|
|
|
Err _ ->
|
|
|
|
Debug.todo "Invalid JSON value."
|
2019-10-22 04:49:46 +03:00
|
|
|
|
|
|
|
|
2021-07-29 20:03:42 +03:00
|
|
|
sendToJsPort : ToJsPayload.ToJsSuccessPayloadNewCombined -> ProgramTest.SimulatedEffect msg
|
2021-06-23 18:22:07 +03:00
|
|
|
sendToJsPort value =
|
|
|
|
SimulatedEffect.Ports.send "toJsPort" (value |> Codec.encoder (ToJsPayload.successCodecNew2 "" ""))
|
|
|
|
|
|
|
|
|
2021-04-16 18:04:15 +03:00
|
|
|
simulateEffects : Effect -> ProgramTest.SimulatedEffect Msg
|
2019-10-22 05:31:17 +03:00
|
|
|
simulateEffects effect =
|
2022-02-26 03:57:50 +03:00
|
|
|
case effect |> Debug.log "effect" of
|
2020-06-12 06:57:19 +03:00
|
|
|
Effect.NoEffect ->
|
2019-10-22 05:31:17 +03:00
|
|
|
SimulatedEffect.Cmd.none
|
|
|
|
|
|
|
|
-- toJsPort value |> Cmd.map never
|
2020-06-12 06:57:19 +03:00
|
|
|
Effect.Batch list ->
|
2019-10-22 05:31:17 +03:00
|
|
|
list
|
|
|
|
|> List.map simulateEffects
|
|
|
|
|> SimulatedEffect.Cmd.batch
|
|
|
|
|
2022-01-28 07:41:54 +03:00
|
|
|
Effect.FetchHttp unmasked ->
|
2022-02-26 03:57:50 +03:00
|
|
|
if unmasked.url |> String.startsWith "port://" then
|
2021-06-23 18:22:07 +03:00
|
|
|
let
|
|
|
|
portName : String
|
|
|
|
portName =
|
|
|
|
String.dropLeft 7 unmasked.url
|
|
|
|
in
|
|
|
|
ToJsPayload.Port portName
|
|
|
|
|> sendToJsPort
|
|
|
|
|> SimulatedEffect.Cmd.map never
|
|
|
|
|
|
|
|
else
|
2022-02-27 01:10:31 +03:00
|
|
|
ToJsPayload.DoHttp
|
|
|
|
(unmasked
|
|
|
|
--|> withInternalHeader
|
|
|
|
)
|
2021-07-29 19:17:36 +03:00
|
|
|
|> sendToJsPort
|
|
|
|
|> SimulatedEffect.Cmd.map never
|
2019-10-22 05:31:17 +03:00
|
|
|
|
2022-02-26 03:57:50 +03:00
|
|
|
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"
|
2022-02-26 03:57:50 +03:00
|
|
|
, SimulatedEffect.Cmd.none
|
2020-10-14 07:02:12 +03:00
|
|
|
]
|
2020-10-10 03:08:02 +03:00
|
|
|
|
2020-10-14 01:40:36 +03:00
|
|
|
Effect.Continue ->
|
2020-10-14 07:02:12 +03:00
|
|
|
SimulatedEffect.Cmd.none
|
2020-10-14 01:40:36 +03:00
|
|
|
|
2022-02-26 03:57:50 +03:00
|
|
|
Effect.SendSinglePageNew _ toJsSuccessPayloadNewCombined ->
|
2022-02-08 01:50:38 +03:00
|
|
|
SimulatedEffect.Cmd.batch
|
|
|
|
[ toJsSuccessPayloadNewCombined
|
|
|
|
|> Codec.encoder (ToJsPayload.successCodecNew2 "" "")
|
|
|
|
|> SimulatedEffect.Ports.send "toJsPort"
|
2022-02-26 03:57:50 +03:00
|
|
|
, SimulatedEffect.Cmd.none
|
2022-02-08 01:50:38 +03:00
|
|
|
]
|
|
|
|
|
2019-10-22 05:31:17 +03:00
|
|
|
|
2021-07-28 18:06:05 +03:00
|
|
|
expectErrorsPort : String -> List ToJsPayload.ToJsSuccessPayloadNewCombined -> Expect.Expectation
|
2019-11-03 00:46:52 +03:00
|
|
|
expectErrorsPort expectedPlainString actualPorts =
|
2021-07-29 19:17:36 +03:00
|
|
|
case actualPorts |> List.reverse |> List.head of
|
|
|
|
Just (ToJsPayload.Errors actualRichTerminalString) ->
|
2020-01-28 02:28:42 +03:00
|
|
|
actualRichTerminalString
|
2021-04-16 19:20:28 +03:00
|
|
|
|> List.map .title
|
|
|
|
|> String.join "\n"
|
2020-01-28 02:28:42 +03:00
|
|
|
|> normalizeErrorExpectEqual expectedPlainString
|
|
|
|
|
2021-07-29 19:17:36 +03:00
|
|
|
Nothing ->
|
2020-10-07 21:06:44 +03:00
|
|
|
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
|
2021-07-28 18:06:05 +03:00
|
|
|
-- strip out all possible ANSI sequences
|
|
|
|
(Regex.fromString "(\\x9B|\\x1B\\[)[0-?]*[ -/]*[@-~]"
|
2020-01-28 02:28:42 +03:00
|
|
|
|> Maybe.withDefault Regex.never
|
|
|
|
)
|
|
|
|
(\_ -> "")
|
2021-07-28 18:06:05 +03:00
|
|
|
|> String.replace "\u{001B}" ""
|
2021-04-16 19:20:28 +03:00
|
|
|
|> normalizeNewlines
|
|
|
|
|> Expect.equal
|
|
|
|
(expectedPlainString |> normalizeNewlines)
|
|
|
|
|
|
|
|
|
|
|
|
normalizeNewlines : String -> String
|
|
|
|
normalizeNewlines string =
|
|
|
|
string
|
|
|
|
|> Regex.replace
|
|
|
|
(Regex.fromString "(\n)+" |> Maybe.withDefault Regex.never)
|
2021-04-16 19:27:20 +03:00
|
|
|
(\_ -> "")
|
|
|
|
|> Regex.replace
|
|
|
|
(Regex.fromString "( )+" |> Maybe.withDefault Regex.never)
|
|
|
|
(\_ -> " ")
|
2021-07-28 18:06:05 +03:00
|
|
|
|> String.replace "\u{000D}" ""
|
|
|
|
|> Regex.replace
|
|
|
|
(Regex.fromString "\\s" |> Maybe.withDefault Regex.never)
|
|
|
|
(\_ -> "")
|
2019-11-03 00:46:52 +03:00
|
|
|
|
|
|
|
|
2021-06-04 03:59:58 +03:00
|
|
|
toJsPort : a -> Cmd msg
|
2021-04-03 00:49:18 +03:00
|
|
|
toJsPort _ =
|
2019-10-22 04:49:46 +03:00
|
|
|
Cmd.none
|
|
|
|
|
|
|
|
|
2021-06-04 03:59:58 +03:00
|
|
|
fromJsPort : Sub msg
|
2020-04-17 07:31:21 +03:00
|
|
|
fromJsPort =
|
|
|
|
Sub.none
|
|
|
|
|
|
|
|
|
2020-05-12 02:42:54 +03:00
|
|
|
starDecoder : Decoder Int
|
2019-11-13 05:22:36 +03:00
|
|
|
starDecoder =
|
2022-01-28 07:41:54 +03:00
|
|
|
JD.field "stargazer_count" JD.int
|
2020-01-03 23:18:18 +03:00
|
|
|
|
|
|
|
|
2021-07-28 18:06:05 +03:00
|
|
|
expectSuccess : List ( Request.Request, String ) -> ProgramTest model msg effect -> Expect.Expectation
|
2020-01-03 23:18:18 +03:00
|
|
|
expectSuccess expectedRequests previous =
|
2020-06-16 05:42:04 +03:00
|
|
|
expectSuccessNew expectedRequests [] previous
|
|
|
|
|
|
|
|
|
2021-07-28 18:06:05 +03:00
|
|
|
expectSuccessNew : List ( Request.Request, String ) -> List (ToJsPayload.ToJsSuccessPayloadNew -> Expect.Expectation) -> ProgramTest model msg effect -> Expect.Expectation
|
|
|
|
expectSuccessNew expectedRequest expectations previous =
|
2020-01-03 23:18:18 +03:00
|
|
|
previous
|
|
|
|
|> ProgramTest.expectOutgoingPortValues
|
|
|
|
"toJsPort"
|
2021-07-28 18:06:05 +03:00
|
|
|
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
|
2020-04-19 18:17:51 +03:00
|
|
|
(\value ->
|
|
|
|
case value of
|
2021-07-28 18:06:05 +03:00
|
|
|
(ToJsPayload.PageProgress portPayload) :: _ ->
|
|
|
|
let
|
|
|
|
singleExpectation : ToJsPayload.ToJsSuccessPayloadNew -> Expect.Expectation
|
|
|
|
singleExpectation =
|
|
|
|
\subject ->
|
|
|
|
subject.contentJson
|
|
|
|
|> Expect.equal
|
|
|
|
(expectedRequest
|
2020-04-19 18:17:51 +03:00
|
|
|
|> List.map
|
2021-07-28 18:06:05 +03:00
|
|
|
(\( request, response ) ->
|
|
|
|
( Request.hash request, response )
|
2020-04-19 18:17:51 +03:00
|
|
|
)
|
|
|
|
|> Dict.fromList
|
2020-01-03 23:18:18 +03:00
|
|
|
)
|
2021-07-28 18:06:05 +03:00
|
|
|
in
|
|
|
|
portPayload
|
|
|
|
|> Expect.all
|
|
|
|
(singleExpectation
|
2020-06-16 05:42:04 +03:00
|
|
|
:: expectations
|
2020-01-03 23:18:18 +03:00
|
|
|
)
|
2020-04-19 18:17:51 +03:00
|
|
|
|
2021-04-03 23:07:28 +03:00
|
|
|
[ errorPort ] ->
|
|
|
|
Expect.fail <| "Expected success port. Got:\n" ++ Debug.toString errorPort
|
2020-04-19 18:17:51 +03:00
|
|
|
|
|
|
|
_ ->
|
|
|
|
Expect.fail ("Expected ports to be called once, but instead there were " ++ String.fromInt (List.length value) ++ " calls.")
|
2020-01-03 23:18:18 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2021-06-23 18:22:07 +03:00
|
|
|
simulateSubscriptions : a -> ProgramTest.SimulatedSub Msg
|
|
|
|
simulateSubscriptions _ =
|
2022-02-26 03:57:50 +03:00
|
|
|
-- TODO handle build errors or not needed?
|
|
|
|
SimulatedEffect.Ports.subscribe "gotBatchSub"
|
|
|
|
(RequestsAndPending.batchDecoder |> JD.map GotDataBatch |> JD.map (Debug.log "GotBatch"))
|
2021-06-23 18:22:07 +03:00
|
|
|
identity
|
|
|
|
|
|
|
|
|
2020-01-03 23:18:18 +03:00
|
|
|
get : String -> Request.Request
|
|
|
|
get url =
|
|
|
|
{ method = "GET"
|
|
|
|
, url = url
|
2022-02-27 01:36:03 +03:00
|
|
|
, headers = []
|
2021-07-30 01:57:44 +03:00
|
|
|
, body = DataSource.Http.emptyBody
|
2020-01-03 23:18:18 +03:00
|
|
|
}
|
2021-07-29 19:17:36 +03:00
|
|
|
|
|
|
|
|
|
|
|
post : String -> Request.Request
|
|
|
|
post url =
|
|
|
|
{ method = "POST"
|
|
|
|
, url = url
|
2022-02-27 01:36:03 +03:00
|
|
|
, headers = []
|
2021-07-30 01:57:44 +03:00
|
|
|
, body = DataSource.Http.emptyBody
|
2021-07-29 19:17:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-02-27 01:10:31 +03:00
|
|
|
simulateHttp : Request.Request -> RequestsAndPending.ResponseBody -> ProgramTest model msg effect -> ProgramTest model msg effect
|
2021-07-29 19:17:36 +03:00
|
|
|
simulateHttp request response program =
|
|
|
|
program
|
|
|
|
|> ProgramTest.ensureOutgoingPortValues
|
|
|
|
"toJsPort"
|
|
|
|
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
|
|
|
|
(\actualPorts ->
|
|
|
|
case actualPorts of
|
|
|
|
[ ToJsPayload.DoHttp _ ] ->
|
|
|
|
Expect.pass
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
Expect.fail <|
|
|
|
|
"Expected an HTTP request, got:\n"
|
|
|
|
++ Debug.toString actualPorts
|
|
|
|
)
|
2022-02-26 03:57:50 +03:00
|
|
|
|> ProgramTest.simulateIncomingPort "gotBatchSub"
|
2022-02-26 18:44:16 +03:00
|
|
|
(Encode.list (\req -> encodeBatchEntry req response)
|
2022-02-26 03:57:50 +03:00
|
|
|
[ request ]
|
2021-07-29 19:17:36 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-02-27 01:10:31 +03:00
|
|
|
simulateMultipleHttp : List ( Request.Request, ResponseBody ) -> ProgramTest model msg effect -> ProgramTest model msg effect
|
2021-07-29 19:17:36 +03:00
|
|
|
simulateMultipleHttp requests program =
|
|
|
|
program
|
|
|
|
|> ProgramTest.ensureOutgoingPortValues
|
|
|
|
"toJsPort"
|
|
|
|
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
|
|
|
|
(\actualPorts ->
|
|
|
|
case actualPorts of
|
2021-07-29 20:03:42 +03:00
|
|
|
(ToJsPayload.DoHttp _) :: _ ->
|
2021-07-29 19:17:36 +03:00
|
|
|
-- TODO check count of HTTP requests, and check the URLs
|
|
|
|
Expect.pass
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
Expect.fail <|
|
|
|
|
"Expected an HTTP request, got:\n"
|
|
|
|
++ Debug.toString actualPorts
|
|
|
|
)
|
2022-02-26 03:57:50 +03:00
|
|
|
|> ProgramTest.simulateIncomingPort "gotBatchSub"
|
|
|
|
(requests
|
|
|
|
|> Encode.list
|
|
|
|
(\( req, response ) ->
|
2022-02-26 18:44:16 +03:00
|
|
|
encodeBatchEntry req response
|
2022-02-26 03:57:50 +03:00
|
|
|
)
|
2021-07-29 19:17:36 +03:00
|
|
|
)
|
2022-02-26 18:44:16 +03:00
|
|
|
|
|
|
|
|
2022-02-27 01:10:31 +03:00
|
|
|
jsonBody : String -> ResponseBody
|
|
|
|
jsonBody jsonString =
|
|
|
|
JsonBody
|
|
|
|
(jsonString
|
|
|
|
|> JD.decodeString JD.value
|
|
|
|
|> Result.withDefault Encode.null
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
encodeBatchEntry : Request.Request -> ResponseBody -> Encode.Value
|
2022-02-26 18:44:16 +03:00
|
|
|
encodeBatchEntry req response =
|
|
|
|
Encode.object
|
|
|
|
[ ( "request"
|
2022-02-27 01:10:31 +03:00
|
|
|
, Codec.encodeToValue Request.codec
|
|
|
|
(withInternalHeader response req)
|
2022-02-26 18:44:16 +03:00
|
|
|
)
|
|
|
|
, ( "response"
|
2022-02-27 01:10:31 +03:00
|
|
|
, RequestsAndPending.bodyEncoder response
|
|
|
|
--Encode.object
|
|
|
|
--[ ( "bodyKind", Encode.string "json" )
|
|
|
|
--, ( "body", JD.decodeString JD.value response |> Result.withDefault Encode.null )
|
|
|
|
--]
|
2022-02-26 18:44:16 +03:00
|
|
|
)
|
|
|
|
]
|
2022-02-27 01:10:31 +03:00
|
|
|
|
|
|
|
|
|
|
|
withInternalHeader res req =
|
|
|
|
{ req
|
|
|
|
| headers =
|
|
|
|
( "elm-pages-internal"
|
|
|
|
, case res of
|
|
|
|
JsonBody _ ->
|
|
|
|
"ExpectJson"
|
|
|
|
|
|
|
|
BytesBody _ ->
|
|
|
|
"ExpectBytes"
|
|
|
|
|
|
|
|
StringBody _ ->
|
|
|
|
"ExpectString"
|
|
|
|
|
|
|
|
WhateverBody ->
|
|
|
|
"ExpectWhatever"
|
|
|
|
)
|
|
|
|
:: req.headers
|
|
|
|
}
|