ihp-sitemap-1.5.0: Test/SEO/Sitemap.hs
module Main where
import Test.Hspec
import IHP.Test.Mocking
import IHP.Environment
import IHP.ViewPrelude
import IHP.ControllerPrelude hiding (get, request)
import Network.Wai.Test
import Network.HTTP.Types
import IHP.SEO.Sitemap.Types
import IHP.SEO.Sitemap.Routes ()
import IHP.SEO.Sitemap.ControllerFunctions
main :: IO ()
main = hspec do
tests
data Post = Post
{ id :: UUID
, updatedAt :: UTCTime
}
data PostController
= ShowPostAction { postId :: UUID }
deriving (Eq, Show, Data)
instance AutoRoute PostController
instance Controller SitemapController where
action SitemapAction = do
let time = UTCTime { utctDay = ModifiedJulianDay (300 * 300), utctDayTime = 300 * 300 }
let posts = [Post { id = def, updatedAt = time }]
let sitemapLinks = posts |> map (\post ->
SitemapLink
{ url = urlTo $ ShowPostAction (post.id)
, lastModified = Just (post.updatedAt)
, changeFrequency = Just Hourly
})
renderXmlSitemap (Sitemap sitemapLinks)
data WebApplication
= WebApplication
deriving (Eq, Show, Data)
instance FrontController WebApplication where
controllers = [ parseRoute @SitemapController ]
instance InitControllerContext WebApplication where
initContext = pure ()
instance FrontController RootApplication where
controllers = [ mountFrontController WebApplication ]
instance Worker RootApplication where
workers _ = []
testGet :: ByteString -> Session SResponse
testGet url = request $ setPath defaultRequest { requestMethod = methodGet } url
assertSuccess :: ByteString -> SResponse -> IO ()
assertSuccess body response = do
response.simpleStatus `shouldBe` status200
response.simpleBody `shouldBe` (cs body)
assertFailure :: SResponse -> IO ()
assertFailure response = do
response.simpleStatus `shouldBe` status400
config = do
option Development
option (AppPort 8000)
tests :: Spec
tests = aroundAll (withMockContextAndApp WebApplication config) do
describe "SEO" do
describe "Sitemap" do
it "should render a XML Sitemap" $ withContextAndApp \application -> do
runSession (testGet "/sitemap.xml") application
>>= assertSuccess "<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"><url><loc>http://localhost:8000/main/ShowPost?postId=00000000-0000-0000-0000-000000000000</loc><lastmod>2105-04-16</lastmod><changefreq>hourly</changefreq></url></urlset>"