This commit adds just the subsite itself. The subsite works by running a list of generaters at compile time. The entries produced by the generators are converted into wai-app-static.WaiAppStatic.Storage.Embedded entries. Also, addStaticContent is supported via an IORef. When a widget produces static content (css, javascript), it is stuck into the IORef inside the embedded static subsite. The embedded static subsite will then serve it from the IORef, properly using a 304 response if the client already has the content.
96 lines
2.9 KiB
Haskell
96 lines
2.9 KiB
Haskell
{-# LANGUAGE TemplateHaskell, QuasiQuotes, TypeFamilies, OverloadedStrings #-}
|
|
module EmbedDevelTest where
|
|
|
|
-- Tests the development mode of the embedded static subsite by
|
|
-- using a custom generator testGen.
|
|
|
|
import Data.Maybe (isNothing)
|
|
import EmbedTestGenerator
|
|
import EmbedProductionTest (findEtag)
|
|
import Network.Wai.Test (SResponse(simpleHeaders))
|
|
import Test.HUnit (assertBool)
|
|
import Test.Hspec (Spec)
|
|
import Yesod.Core
|
|
import Yesod.EmbeddedStatic
|
|
import Yesod.Test
|
|
|
|
mkEmbeddedStatic True "eDev" [testGen]
|
|
|
|
data MyApp = MyApp { getStatic :: EmbeddedStatic }
|
|
|
|
mkYesod "MyApp" [parseRoutes|
|
|
/static StaticR EmbeddedStatic getStatic
|
|
|]
|
|
|
|
instance Yesod MyApp
|
|
|
|
noCacheControl :: YesodExample site ()
|
|
noCacheControl = withResponse $ \r -> do
|
|
liftIO $ assertBool "Cache-Control exists" $
|
|
isNothing $ lookup "Cache-Control" $ simpleHeaders r
|
|
liftIO $ assertBool "Expires exists" $
|
|
isNothing $ lookup "Expires" $ simpleHeaders r
|
|
|
|
embedDevSpecs :: Spec
|
|
embedDevSpecs = yesodSpec (MyApp eDev) $ do
|
|
ydescribe "Embedded Development Entries" $ do
|
|
yit "e1 loads" $ do
|
|
get $ StaticR e1
|
|
statusIs 200
|
|
assertHeader "Content-Type" "text/plain"
|
|
noCacheControl
|
|
bodyEquals "e1 devel"
|
|
|
|
tag <- findEtag
|
|
request $ do
|
|
setMethod "GET"
|
|
setUrl $ StaticR e1
|
|
addRequestHeader ("If-None-Match", tag)
|
|
statusIs 304
|
|
|
|
yit "e2 with simulated directory" $ do
|
|
get $ StaticR e2
|
|
statusIs 200
|
|
assertHeader "Content-Type" "abcdef"
|
|
noCacheControl
|
|
bodyEquals "e2 devel"
|
|
|
|
yit "e3 without haskell name" $ do
|
|
get $ StaticR $ embeddedResourceR ["xxxx", "e3"] []
|
|
statusIs 200
|
|
assertHeader "Content-Type" "yyy"
|
|
noCacheControl
|
|
bodyEquals "e3 devel"
|
|
|
|
yit "e4 loads" $ do
|
|
get $ StaticR e4
|
|
statusIs 200
|
|
assertHeader "Content-Type" "text/plain"
|
|
noCacheControl
|
|
bodyEquals "e4 devel"
|
|
|
|
yit "e4 extra development dev1" $ do
|
|
get $ StaticR $ embeddedResourceR ["dev1"] []
|
|
statusIs 200
|
|
assertHeader "Content-Type" "mime"
|
|
noCacheControl
|
|
bodyEquals "dev1 content"
|
|
|
|
tag <- findEtag
|
|
request $ do
|
|
setMethod "GET"
|
|
setUrl $ StaticR $ embeddedResourceR ["dev1"] []
|
|
addRequestHeader ("If-None-Match", tag)
|
|
statusIs 304
|
|
|
|
yit "e4 extra development with path" $ do
|
|
get $ StaticR $ embeddedResourceR ["dir", "dev2"] []
|
|
statusIs 200
|
|
assertHeader "Content-Type" "mime2"
|
|
noCacheControl
|
|
bodyEquals "dev2 content"
|
|
|
|
yit "extra development file 404" $ do
|
|
get $ StaticR $ embeddedResourceR ["xxxxxxxxxx"] []
|
|
statusIs 404
|