Update tests for single-item flow (not batched page build runs).

This commit is contained in:
Dillon Kearns 2021-07-28 08:06:05 -07:00
parent a2f08e03d6
commit 83128c5112
5 changed files with 303 additions and 511 deletions

View File

@ -29,7 +29,7 @@ import Pages.Http
import Pages.Internal.ApplicationType as ApplicationType
import Pages.Internal.Platform.Effect as Effect exposing (Effect)
import Pages.Internal.Platform.StaticResponses as StaticResponses exposing (StaticResponses)
import Pages.Internal.Platform.ToJsPayload as ToJsPayload exposing (ToJsSuccessPayload)
import Pages.Internal.Platform.ToJsPayload as ToJsPayload
import Pages.Internal.StaticHttpBody as StaticHttpBody
import Pages.ProgramConfig exposing (ProgramConfig)
import Pages.StaticHttp.Request
@ -200,12 +200,6 @@ perform renderRequest config toJsPort effect =
Effect.NoEffect ->
Cmd.none
Effect.SendJsData value ->
value
|> Codec.encoder ToJsPayload.toJsCodec
|> toJsPort
|> Cmd.map never
Effect.Batch list ->
list
|> List.map (perform renderRequest config toJsPort)
@ -615,7 +609,7 @@ nextStepToEffect contentCache config model ( updatedStaticResponsesModel, nextSt
StaticResponses.Finish toJsPayload ->
case toJsPayload of
ToJsPayload.ApiResponse ->
StaticResponses.ApiResponse ->
let
apiResponse : Effect
apiResponse =
@ -653,7 +647,7 @@ nextStepToEffect contentCache config model ( updatedStaticResponsesModel, nextSt
Err error ->
[ error ]
|> ToJsPayload.Errors
|> Effect.SendJsData
|> Effect.SendSinglePage True
)
RenderRequest.Page payload ->
@ -777,13 +771,13 @@ nextStepToEffect contentCache config model ( updatedStaticResponsesModel, nextSt
|> Effect.SendSinglePage False
Err error ->
[ error ] |> ToJsPayload.Errors |> Effect.SendJsData
[ error ] |> ToJsPayload.Errors |> Effect.SendSinglePage True
Ok (Just notFoundReason) ->
render404Page config model payload.path notFoundReason
Err error ->
[] |> ToJsPayload.Errors |> Effect.SendJsData
[ error ] |> ToJsPayload.Errors |> Effect.SendSinglePage True
RenderRequest.NotFound path ->
render404Page config model path NotFoundReason.NoMatchingRoute
@ -792,37 +786,33 @@ nextStepToEffect contentCache config model ( updatedStaticResponsesModel, nextSt
, apiResponse
)
_ ->
model.unprocessedPages
|> List.take 1
|> List.filterMap
(\pageAndMetadata ->
case toJsPayload of
ToJsPayload.Success value ->
sendSinglePageProgress value config model pageAndMetadata
|> Just
StaticResponses.Page contentJson ->
let
pageAndMetadata =
case model.unprocessedPages |> List.head of
Just just1 ->
just1
ToJsPayload.Errors errors ->
errors |> ToJsPayload.Errors |> Effect.SendJsData |> Just
Nothing ->
Debug.todo "TODO"
in
( model
, sendSinglePageProgress contentJson config model pageAndMetadata
)
ToJsPayload.ApiResponse ->
Nothing
)
|> (\cmds ->
( model
|> popProcessedRequest
, Effect.Batch cmds
)
)
StaticResponses.Errors errors ->
( model
, errors |> ToJsPayload.Errors |> Effect.SendSinglePage True
)
sendSinglePageProgress :
ToJsSuccessPayload
Dict String String
-> ProgramConfig userMsg userModel route siteData pageData sharedData
-> Model route
-> ( Path, route )
-> Effect
sendSinglePageProgress toJsPayload config model =
sendSinglePageProgress contentJson config model =
\( page, route ) ->
case model.maybeRequestJson of
RenderRequest.SinglePage includeHtml _ _ ->
@ -892,12 +882,6 @@ sendSinglePageProgress toJsPayload config model =
, fragment = Nothing
}
staticData : Dict String String
staticData =
toJsPayload.pages
|> Dict.get (Path.toRelative page)
|> Maybe.withDefault Dict.empty
currentPage : { path : Path, route : route }
currentPage =
{ path = page, route = config.urlToRoute currentUrl }
@ -906,21 +890,21 @@ sendSinglePageProgress toJsPayload config model =
pageDataResult =
StaticHttpRequest.resolve ApplicationType.Browser
(config.data (config.urlToRoute currentUrl))
(staticData |> Dict.map (\_ v -> Just v))
(contentJson |> Dict.map (\_ v -> Just v))
|> Result.mapError (StaticHttpRequest.toBuildError currentUrl.path)
sharedDataResult : Result BuildError sharedData
sharedDataResult =
StaticHttpRequest.resolve ApplicationType.Browser
config.sharedData
(staticData |> Dict.map (\_ v -> Just v))
(contentJson |> Dict.map (\_ v -> Just v))
|> Result.mapError (StaticHttpRequest.toBuildError currentUrl.path)
siteDataResult : Result BuildError siteData
siteDataResult =
StaticHttpRequest.resolve ApplicationType.Cli
(config.site allRoutes |> .data)
(staticData |> Dict.map (\_ v -> Just v))
(contentJson |> Dict.map (\_ v -> Just v))
|> Result.mapError (StaticHttpRequest.toBuildError "Site.elm")
in
case Result.map3 (\a b c -> ( a, b, c )) pageFoundResult renderedResult siteDataResult of
@ -928,10 +912,7 @@ sendSinglePageProgress toJsPayload config model =
case maybeNotFoundReason of
Nothing ->
{ route = page |> Path.toRelative
, contentJson =
toJsPayload.pages
|> Dict.get (Path.toRelative page)
|> Maybe.withDefault Dict.empty
, contentJson = contentJson
, html = rendered.view
, errors = []
, head = rendered.head ++ (config.site allRoutes |> .head) siteData
@ -939,7 +920,8 @@ sendSinglePageProgress toJsPayload config model =
, staticHttpCache = model.allRawResponses |> Dict.Extra.filterMap (\_ v -> v)
, is404 = False
}
|> sendProgress
|> ToJsPayload.PageProgress
|> Effect.SendSinglePage True
Just notFoundReason ->
render404Page config model page notFoundReason
@ -947,17 +929,7 @@ sendSinglePageProgress toJsPayload config model =
Err error ->
[ error ]
|> ToJsPayload.Errors
|> Effect.SendJsData
popProcessedRequest : Model route -> Model route
popProcessedRequest model =
{ model | unprocessedPages = List.drop 1 model.unprocessedPages }
sendProgress : ToJsPayload.ToJsSuccessPayloadNew -> Effect
sendProgress singlePage =
singlePage |> ToJsPayload.PageProgress |> Effect.SendSinglePage False
|> Effect.SendSinglePage True
render404Page :

View File

@ -1,12 +1,11 @@
module Pages.Internal.Platform.Effect exposing (Effect(..))
import DataSource.Http exposing (RequestDetails)
import Pages.Internal.Platform.ToJsPayload exposing (ToJsPayload, ToJsSuccessPayloadNewCombined)
import Pages.Internal.Platform.ToJsPayload exposing (ToJsSuccessPayloadNewCombined)
type Effect
= NoEffect
| SendJsData ToJsPayload
| FetchHttp { masked : RequestDetails, unmasked : RequestDetails }
| ReadFile String
| GetGlob String

View File

@ -1,4 +1,4 @@
module Pages.Internal.Platform.StaticResponses exposing (NextStep(..), StaticResponses, batchUpdate, error, nextStep, renderApiRequest, renderSingleRoute, update)
module Pages.Internal.Platform.StaticResponses exposing (FinishKind(..), NextStep(..), StaticResponses, batchUpdate, error, nextStep, renderApiRequest, renderSingleRoute)
import ApiRoute
import BuildError exposing (BuildError)
@ -11,7 +11,6 @@ import HtmlPrinter exposing (htmlToString)
import Internal.ApiRoute exposing (Done(..))
import NotFoundReason exposing (NotFoundReason)
import Pages.Internal.ApplicationType as ApplicationType
import Pages.Internal.Platform.ToJsPayload as ToJsPayload exposing (ToJsPayload)
import Pages.SiteConfig exposing (SiteConfig)
import Pages.StaticHttp.Request as HashRequest
import Pages.StaticHttpRequest as StaticHttpRequest
@ -108,36 +107,6 @@ renderApiRequest request =
)
update :
{ request :
{ masked : RequestDetails, unmasked : RequestDetails }
, response : Result () String
}
->
{ model
| staticResponses : StaticResponses
, allRawResponses : Dict String (Maybe String)
}
->
{ model
| staticResponses : StaticResponses
, allRawResponses : Dict String (Maybe String)
}
update newEntry model =
let
updatedAllResponses : Dict String (Maybe String)
updatedAllResponses =
-- @@@@@@@@@ TODO handle errors here, change Dict to have `Result` instead of `Maybe`
Dict.insert
(HashRequest.hash newEntry.request.masked)
(Just <| Result.withDefault "TODO" newEntry.response)
model.allRawResponses
in
{ model
| allRawResponses = updatedAllResponses
}
batchUpdate :
List
{ request :
@ -168,7 +137,7 @@ batchUpdate newEntries model =
updatedAllResponses =
Dict.merge
(\key a -> Dict.insert key (Just a))
(\key a b -> Dict.insert key (Just a))
(\key a _ -> Dict.insert key (Just a))
(\key b -> Dict.insert key b)
newResponses
model.allRawResponses
@ -204,7 +173,13 @@ cliDictKey =
type NextStep route
= Continue (Dict String (Maybe String)) (List { masked : RequestDetails, unmasked : RequestDetails }) (Maybe (List route))
| Finish ToJsPayload
| Finish (FinishKind route)
type FinishKind route
= ApiResponse
| Errors (List BuildError)
| Page (Dict String String)
nextStep :
@ -249,19 +224,6 @@ nextStep config ({ secrets, allRawResponses, errors } as model) maybeRoutes =
(buildTimeFilesRequest config)
(allRawResponses |> Dict.Extra.filterMap (\_ value -> Just value))
generatedOkayFiles : List { path : List String, content : String }
generatedOkayFiles =
generatedFiles
|> List.filterMap
(\result ->
case result of
Ok ok ->
Just ok
Err _ ->
Nothing
)
generatedFileErrors : List BuildError
generatedFileErrors =
generatedFiles
@ -438,7 +400,7 @@ nextStep config ({ secrets, allRawResponses, errors } as model) maybeRoutes =
( model.staticResponses, Continue newAllRawResponses newThing maybeRoutes )
Err error_ ->
( model.staticResponses, Finish (ToJsPayload.Errors <| (error_ ++ failedRequests ++ errors)) )
( model.staticResponses, Finish (Errors <| (error_ ++ failedRequests ++ errors)) )
else
case model.staticResponses of
@ -465,27 +427,25 @@ nextStep config ({ secrets, allRawResponses, errors } as model) maybeRoutes =
( model.staticResponses
, case encode allRawResponses staticResponses of
Ok encodedResponses ->
ToJsPayload.toJsPayload
encodedResponses
generatedOkayFiles
allRawResponses
-- TODO send all global head tags on initial call
if List.length allErrors > 0 then
allErrors
-- TODO send all global head tags on initial call
|> Finish
|> Errors
|> Finish
else
Page (encodedResponses |> Dict.values |> List.head |> Maybe.withDefault Dict.empty)
|> Finish
Err buildErrors ->
ToJsPayload.toJsPayload
Dict.empty
generatedOkayFiles
allRawResponses
(allErrors ++ buildErrors)
-- TODO send all global head tags on initial call
(allErrors ++ buildErrors)
|> Errors
|> Finish
)
ApiRequest _ ->
( model.staticResponses
, ToJsPayload.ApiResponse
, ApiResponse
|> Finish
)
@ -503,14 +463,14 @@ nextStep config ({ secrets, allRawResponses, errors } as model) maybeRoutes =
Ok (Just _) ->
( StaticResponses Dict.empty
, Finish ToJsPayload.ApiResponse
, Finish ApiResponse
-- TODO should there be a new type for 404response? Or something else?
)
Err error_ ->
( model.staticResponses
, Finish
(ToJsPayload.Errors <|
(Errors <|
([ StaticHttpRequest.toBuildError
-- TODO give more fine-grained error reference
"get static routes"

View File

@ -1,12 +1,9 @@
module Pages.Internal.Platform.ToJsPayload exposing
( FileToGenerate
, ToJsPayload(..)
, ToJsSuccessPayload
, ToJsSuccessPayloadNew
, ToJsSuccessPayloadNewCombined(..)
, successCodecNew
, successCodecNew2
, toJsCodec
, toJsPayload
)
import BuildError exposing (BuildError)
@ -18,20 +15,6 @@ import Json.Encode
import Pages.StaticHttp.Request
type ToJsPayload
= Errors (List BuildError)
| Success ToJsSuccessPayload
| ApiResponse
type alias ToJsSuccessPayload =
{ pages : Dict String (Dict String String)
, filesToGenerate : List FileToGenerate
, staticHttpCache : Dict String String
, errors : List BuildError
}
type alias ToJsSuccessPayloadNew =
{ route : String
, html : String
@ -50,54 +33,6 @@ type alias FileToGenerate =
}
toJsPayload :
Dict String (Dict String String)
-> List FileToGenerate
-> Dict String (Maybe String)
-> List BuildError
-> ToJsPayload
toJsPayload encodedStatic generated allRawResponses allErrors =
if allErrors |> List.filter .fatal |> List.isEmpty then
Success
(ToJsSuccessPayload
encodedStatic
generated
(allRawResponses
|> Dict.toList
|> List.filterMap
(\( key, maybeValue ) ->
maybeValue
|> Maybe.map (\value -> ( key, value ))
)
|> Dict.fromList
)
allErrors
)
else
Errors <| allErrors
toJsCodec : Codec ToJsPayload
toJsCodec =
Codec.custom
(\errorsTag success vApiResponse value ->
case value of
Errors errorList ->
errorsTag errorList
Success { pages, filesToGenerate, errors, staticHttpCache } ->
success (ToJsSuccessPayload pages filesToGenerate staticHttpCache errors)
ApiResponse ->
vApiResponse
)
|> Codec.variant1 "Errors" Errors errorCodec
|> Codec.variant1 "Success" Success successCodec
|> Codec.variant0 "ApiResponse" ApiResponse
|> Codec.buildCustom
errorCodec : Codec (List BuildError)
errorCodec =
Codec.object (\errorString _ -> errorString)
@ -117,39 +52,6 @@ errorCodec =
|> Codec.buildObject
successCodec : Codec ToJsSuccessPayload
successCodec =
Codec.object ToJsSuccessPayload
|> Codec.field "pages"
.pages
(Codec.dict (Codec.dict Codec.string))
|> Codec.field "filesToGenerate"
.filesToGenerate
(Codec.build
(\list ->
list
|> Json.Encode.list
(\item ->
Json.Encode.object
[ ( "path", item.path |> String.join "/" |> Json.Encode.string )
, ( "content", item.content |> Json.Encode.string )
]
)
)
(Decode.list
(Decode.map2 (\path content -> { path = path, content = content })
(Decode.string |> Decode.map (String.split "/") |> Decode.field "path")
(Decode.string |> Decode.field "content")
)
)
)
|> Codec.field "staticHttpCache"
.staticHttpCache
(Codec.dict Codec.string)
|> Codec.field "errors" .errors errorCodec
|> Codec.buildObject
successCodecNew : String -> String -> Codec ToJsSuccessPayloadNew
successCodecNew canonicalSiteUrl currentPagePath =
Codec.object ToJsSuccessPayloadNew
@ -185,13 +87,21 @@ type ToJsSuccessPayloadNewCombined
| Glob String
| DoHttp { masked : Pages.StaticHttp.Request.Request, unmasked : Pages.StaticHttp.Request.Request }
| Port String
| Errors (List BuildError)
| ApiResponse
successCodecNew2 : String -> String -> Codec ToJsSuccessPayloadNewCombined
successCodecNew2 canonicalSiteUrl currentPagePath =
Codec.custom
(\success vReadFile vGlob vDoHttp vSendApiResponse vPort value ->
(\errorsTag vApiResponse success vReadFile vGlob vDoHttp vSendApiResponse vPort value ->
case value of
ApiResponse ->
vApiResponse
Errors errorList ->
errorsTag errorList
PageProgress payload ->
success payload
@ -210,6 +120,8 @@ successCodecNew2 canonicalSiteUrl currentPagePath =
Port string ->
vPort string
)
|> Codec.variant1 "Errors" Errors errorCodec
|> Codec.variant0 "ApiResponse" ApiResponse
|> Codec.variant1 "PageProgress" PageProgress (successCodecNew canonicalSiteUrl currentPagePath)
|> Codec.variant1 "ReadFile" ReadFile Codec.string
|> Codec.variant1 "Glob" Glob Codec.string

View File

@ -16,7 +16,7 @@ import OptimizedDecoder as Decode exposing (Decoder)
import Pages.ContentCache as ContentCache exposing (ContentCache)
import Pages.Internal.Platform.Cli exposing (..)
import Pages.Internal.Platform.Effect as Effect exposing (Effect)
import Pages.Internal.Platform.ToJsPayload as ToJsPayload exposing (ToJsPayload)
import Pages.Internal.Platform.ToJsPayload as ToJsPayload
import Pages.Internal.StaticHttpBody as StaticHttpBody
import Pages.Manifest as Manifest
import Pages.ProgramConfig exposing (ProgramConfig)
@ -50,11 +50,8 @@ all =
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86 }"""
|> expectSuccess
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
, test "StaticHttp request for initial are resolved" <|
@ -74,11 +71,8 @@ all =
"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}"""
)
]
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
, describe "single page renders"
@ -149,11 +143,8 @@ all =
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86, "language": "Elm" }"""
|> expectSuccess
[ ( "post-1"
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86,"language":"Elm"}"""
)
]
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86,"language":"Elm"}"""
)
]
, test "andThen" <|
@ -176,14 +167,11 @@ all =
"NEXT-REQUEST"
"""null"""
|> expectSuccess
[ ( "elm-pages"
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """null"""
)
, ( get "NEXT-REQUEST"
, """null"""
)
]
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """null"""
)
, ( get "NEXT-REQUEST"
, """null"""
)
]
, test "andThen chain avoids repeat requests" <|
@ -270,75 +258,73 @@ all =
"url10"
"""{"image": "image10.jpg"}"""
|> expectSuccess
[ ( "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" ]
, 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}"""
)
]
[ ( 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" ]
-- , 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}"""
-- )
-- ]
-- )
-- ]
, test "reduced JSON is sent out" <|
\() ->
start
@ -351,11 +337,8 @@ all =
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86, "unused_field": 123 }"""
|> expectSuccess
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
, test "you can use elm/json decoders with StaticHttp.unoptimizedRequest" <|
@ -380,11 +363,8 @@ all =
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86, "unused_field": 123 }"""
|> expectSuccess
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{ "stargazer_count": 86, "unused_field": 123 }"""
)
]
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{ "stargazer_count": 86, "unused_field": 123 }"""
)
]
, test "plain string" <|
@ -407,11 +387,8 @@ all =
"https://example.com/file.txt"
"This is a raw text file."
|> expectSuccess
[ ( ""
, [ ( get "https://example.com/file.txt"
, "This is a raw text file."
)
]
[ ( get "https://example.com/file.txt"
, "This is a raw text file."
)
]
, test "Err in String to Result function turns into decode error" <|
@ -443,7 +420,7 @@ all =
"This is a raw text file."
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
(Codec.decoder ToJsPayload.toJsCodec)
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
(expectErrorsPort
"""-- STATIC HTTP DECODING ERROR ----------------------------------------------------- elm-pages
@ -471,15 +448,12 @@ String was not uppercased"""
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86, "unused_field": 123 }"""
|> expectSuccess
[ ( ""
, [ ( { method = "POST"
, url = "https://api.github.com/repos/dillonkearns/elm-pages"
, headers = []
, body = DataSource.emptyBody
}
, """{"stargazer_count":86}"""
)
]
[ ( { method = "POST"
, url = "https://api.github.com/repos/dillonkearns/elm-pages"
, headers = []
, body = DataSource.emptyBody
}
, """{"stargazer_count":86}"""
)
]
, test "json is reduced from andThen chains" <|
@ -502,14 +476,11 @@ String was not uppercased"""
"https://api.github.com/repos/dillonkearns/elm-pages-starter"
"""{ "stargazer_count": 50, "unused_field": 456 }"""
|> expectSuccess
[ ( ""
, [ ( 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}"""
)
]
[ ( 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" <|
@ -530,14 +501,11 @@ String was not uppercased"""
"https://api.github.com/repos/dillonkearns/elm-pages-starter"
"""{ "stargazer_count": 50, "unused_field": 456 }"""
|> expectSuccess
[ ( ""
, [ ( 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}"""
)
]
[ ( 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" <|
@ -547,7 +515,7 @@ String was not uppercased"""
, DataSource.succeed ()
)
]
|> expectSuccess [ ( "", [] ) ]
|> expectSuccess []
, test "the port sends out when there are duplicate http requests for the same page" <|
\() ->
start
@ -562,11 +530,8 @@ String was not uppercased"""
"http://example.com"
"""null"""
|> expectSuccess
[ ( ""
, [ ( get "http://example.com"
, """null"""
)
]
[ ( get "http://example.com"
, """null"""
)
]
, test "an error is sent out for decoder failures" <|
@ -582,7 +547,7 @@ String was not uppercased"""
"""{ "stargazer_count": 86 }"""
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
(Codec.decoder ToJsPayload.toJsCodec)
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
(expectErrorsPort
"""-- STATIC HTTP DECODING ERROR ----------------------------------------------------- elm-pages
@ -625,7 +590,7 @@ I encountered some errors while decoding this JSON:
""" "continuation-url" """
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
(Codec.decoder ToJsPayload.toJsCodec)
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
(expectErrorsPort
"""-- MISSING SECRET ----------------------------------------------------- elm-pages
@ -654,21 +619,8 @@ So maybe MISSING should be API_KEY"""
)
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
(Codec.decoder ToJsPayload.toJsCodec)
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
(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
TODO
""")
, test "uses real secrets to perform request and masked secrets to store and lookup response" <|
\() ->
@ -705,17 +657,14 @@ TODO
}
)
|> expectSuccess
[ ( ""
, [ ( { method = "GET"
, url = "https://api.github.com/repos/dillonkearns/elm-pages?apiKey=<API_KEY>"
, headers =
[ ( "Authorization", "Bearer <BEARER>" )
]
, body = DataSource.emptyBody
}
, """{}"""
)
]
[ ( { method = "GET"
, url = "https://api.github.com/repos/dillonkearns/elm-pages?apiKey=<API_KEY>"
, headers =
[ ( "Authorization", "Bearer <BEARER>" )
]
, body = DataSource.emptyBody
}
, """{}"""
)
]
, describe "staticHttpCache"
@ -735,11 +684,8 @@ TODO
)
]
|> expectSuccess
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
, test "it ignores unused cache" <|
@ -762,11 +708,8 @@ TODO
"https://api.github.com/repos/dillonkearns/elm-pages"
"""{ "stargazer_count": 86 }"""
|> expectSuccess
[ ( ""
, [ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
[ ( get "https://api.github.com/repos/dillonkearns/elm-pages"
, """{"stargazer_count":86}"""
)
]
, test "validate DataSource is not stored for any pages" <|
@ -1007,7 +950,7 @@ TODO
"""{ "stargazer_count": 123 }"""
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
(Codec.decoder ToJsPayload.toJsCodec)
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
(expectErrorsPort """-- NON-UNIQUE DISTILL KEYS ----------------------------------------------------- elm-pages
I encountered DataSource.distill with two matching keys that had differing encoded values.
@ -1020,91 +963,92 @@ The second encoded value was:
123""")
]
, 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"
}
]
]
]
--, 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"
-- }
-- ]
-- ]
-- ]
]
@ -1430,9 +1374,6 @@ simulateEffects effect =
Effect.NoEffect ->
SimulatedEffect.Cmd.none
Effect.SendJsData value ->
SimulatedEffect.Ports.send "toJsPort" (value |> Codec.encoder ToJsPayload.toJsCodec)
-- toJsPort value |> Cmd.map never
Effect.Batch list ->
list
@ -1500,7 +1441,12 @@ simulateEffects effect =
]
Err error ->
Debug.todo "Unhandled HTTP error."
GotBuildError
{ title = "Static HTTP Error"
, message = []
, fatal = True
, path = ""
}
)
, timeout = Nothing
, tracker = Nothing
@ -1529,7 +1475,7 @@ simulateEffects effect =
SimulatedEffect.Cmd.none
expectErrorsPort : String -> List ToJsPayload -> Expect.Expectation
expectErrorsPort : String -> List ToJsPayload.ToJsSuccessPayloadNewCombined -> Expect.Expectation
expectErrorsPort expectedPlainString actualPorts =
case actualPorts of
[ ToJsPayload.Errors actualRichTerminalString ] ->
@ -1549,10 +1495,12 @@ normalizeErrorExpectEqual : String -> String -> Expect.Expectation
normalizeErrorExpectEqual expectedPlainString actualRichTerminalString =
actualRichTerminalString
|> Regex.replace
(Regex.fromString "\u{001B}\\[[0-9;]+m"
-- strip out all possible ANSI sequences
(Regex.fromString "(\\x9B|\\x1B\\[)[0-?]*[ -/]*[@-~]"
|> Maybe.withDefault Regex.never
)
(\_ -> "")
|> String.replace "\u{001B}" ""
|> normalizeNewlines
|> Expect.equal
(expectedPlainString |> normalizeNewlines)
@ -1567,6 +1515,10 @@ normalizeNewlines string =
|> Regex.replace
(Regex.fromString "( )+" |> Maybe.withDefault Regex.never)
(\_ -> " ")
|> String.replace "\u{000D}" ""
|> Regex.replace
(Regex.fromString "\\s" |> Maybe.withDefault Regex.never)
(\_ -> "")
toJsPort : a -> Cmd msg
@ -1594,40 +1546,37 @@ starDecoder =
Decode.field "stargazer_count" Decode.int
expectSuccess : List ( String, List ( Request.Request, String ) ) -> ProgramTest model msg effect -> Expect.Expectation
expectSuccess : 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 -> Expect.Expectation) -> ProgramTest model msg effect -> Expect.Expectation
expectSuccessNew expectedRequests expectations previous =
expectSuccessNew : List ( Request.Request, String ) -> List (ToJsPayload.ToJsSuccessPayloadNew -> Expect.Expectation) -> ProgramTest model msg effect -> Expect.Expectation
expectSuccessNew expectedRequest expectations previous =
previous
|> ProgramTest.expectOutgoingPortValues
"toJsPort"
(Codec.decoder ToJsPayload.toJsCodec)
(Codec.decoder (ToJsPayload.successCodecNew2 "" ""))
(\value ->
case value of
(ToJsPayload.Success portPayload) :: _ ->
portPayload
|> Expect.all
((\subject ->
subject.pages
|> Expect.equalDicts
(expectedRequests
(ToJsPayload.PageProgress portPayload) :: _ ->
let
singleExpectation : ToJsPayload.ToJsSuccessPayloadNew -> Expect.Expectation
singleExpectation =
\subject ->
subject.contentJson
|> Expect.equal
(expectedRequest
|> List.map
(\( url, requests ) ->
( url
, requests
|> List.map
(\( request, response ) ->
( Request.hash request, response )
)
|> Dict.fromList
)
(\( request, response ) ->
( Request.hash request, response )
)
|> Dict.fromList
)
)
in
portPayload
|> Expect.all
(singleExpectation
:: expectations
)