Проверка каждого URL работает в тестах на сайте Yesod - PullRequest
0 голосов
/ 05 июля 2018

Я пытался проверить, все ли ссылки работают на домашней странице веб-сайта Yesod. Я написал этот тест hSpec.

module Handler.HomeSpec (spec) where

import           Data.Either                (fromRight)
import qualified Data.Text                  as T
import           Network.Wai.Test           (simpleBody)
import           TestImport
import           Yesod.Test.TransversingCSS (findAttributeBySelector)

getAllLinks :: YesodExample site [Text]
getAllLinks = withResponse $ \res -> do
    let links = fromRight [] findAttributeBySelector (simpleBody res) "a" "href"
    return $ T.concat <$> links

spec :: Spec
spec = withApp $
    describe "Homepage" $ do
        it "checks all links" $ do
            get HomeR
            statusIs 200
            links <- getAllLinks

            forM_ links $ \oneLink -> do
                get HomeR
                statusIs 200
                get oneLink
                statusIs 200

Все компилируется нормально, но функция get избавляет от части хоста URL-адресов, которые вы ей предоставляете. Например, когда вы дадите ему https://github.com/zigazou/bazasso, он попытается получить /zigazou/bazasso, который возвращает код 404.

Есть ли способ заставить его работать так, как я хочу?

Должен ли я добавить функцию, которая удаляет внешние ссылки из тестов?

Разве это не подходящее место для этого?

1 Ответ

0 голосов
/ 05 июля 2018

Чем проще, тем лучше: из ссылок, которые будут проверяться, я удалил все, что начинается с протокола. Спасибо @ncaq за ваши комментарии.

module Handler.HomeSpec (spec) where

import           Data.Either                (fromRight)
import qualified Data.Text                  as T
import           Network.Wai.Test           (simpleBody)
import           TestImport
import           Yesod.Test.TransversingCSS (findAttributeBySelector)

isRelative :: Text -> Bool
isRelative url
    | T.take 7 url == "http://"  = False
    | T.take 8 url == "https://" = False
    | T.take 7 url == "mailto:"  = False
    | T.take 4 url == "tel:"     = False
    | otherwise                  = True

getAllLinks :: YesodExample site [Text]
getAllLinks = withResponse $ \res -> do
    let currentHtml = simpleBody res
        links = fromRight [] $ findAttributeBySelector currentHtml "a" "href"
    return $ filter isRelative $ T.concat <$> links

spec :: Spec
spec = withApp $
    describe "Homepage" $ do
        it "checks all links" $ do
            get HomeR
            statusIs 200
            links <- getAllLinks

            forM_ links $ \oneLink -> do
                get HomeR
                statusIs 200
                get oneLink
                statusIs 200
...