packages feed

belka-0.8: tests/Main.hs

module Main
where

import Prelude hiding (assert, choose, (.&.), Success, Failure, Fixed)
import Bug
import Test.Tasty
import Test.Tasty.Runners
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.QuickCheck.Instances
import qualified Belka.IO as A
import qualified Belka.Interact as B
import qualified Belka.Request as C
import qualified Belka.ParseBody as D
import qualified Belka.ParseHead as J
import qualified Belka.ParseHeaders as K
import qualified Belka.Potoki.Transform as I
import qualified Iri.QuasiQuoter as E
import qualified Iri.Parsing.Text as M
import qualified Potoki.Produce as F
import qualified Potoki.IO as G
import qualified Potoki.Consume as H
import qualified Potoki.Transform as N
import qualified Data.Text as L


main =
  defaultMain $
  testGroup "All tests" $
  [
    bombingWithRequests
    ,
    scrape
    ,
    erroneusResponse
    ,
    charset
  ]

erroneusResponse =
  testCase "Erroneous response" $ do
    result <-
      fmap
        (either Left (either (Left . fromString . show) Right))
        (A.interactUsingGlobalManager
          (B.request
            (C.setIri [E.httpUri|http://localhost:993|])
            (pure (fmap (const ()) D.json))))
    assertBool "" (isLeft result)

scrape =
  testCase "Scrape" $ do
    result <- G.produceAndConsume produce consume
    let (Right (Right bodies)) = fmap sequence (sequence result)
    assertBool "" ((not . null) bodies)
  where
    produce =
      F.list [request]
      where
        request =
          C.setIri [E.httpUri|https://best-trailer.ru/player/html5/zrollnotgpmd.php|] <>
          C.setAcceptHeaderToHtml <>
          C.setUserAgentHeader "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 YaBrowser/17.9.1.785 (beta) Yowser/2.5 Safari/537.36" <>
          C.setAcceptLanguageHeader ""
    consume =
      H.transform transform H.list
      where
        transform =
          I.requestUsingNewManager (pure (D.consume consume))
          where
            consume =
              fmap Right H.concat

charset =
  testCase "Charset" $ do
    result <- G.produceAndConsume produce consume
    let (Right (Right bodies)) = fmap sequence (sequence result)
    assertEqual "" ["utf-8"] bodies
  where
    produce =
      F.list [request]
      where
        request =
          C.setIri [E.httpUri|http://google.com|] <>
          C.setAcceptHeaderToHtml <>
          C.setUserAgentHeader "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 YaBrowser/17.9.1.785 (beta) Yowser/2.5 Safari/537.36" <>
          C.setAcceptLanguageHeader ""
    consume =
      H.transform transform H.list
      where
        transform =
          I.requestUsingNewManager (J.parseHeaders K.charset >>= return . pure)

bombingWithRequests =
  testCase "Bombing with requests" $ do
    results <- run
    assertBool (show results) (isRight results)
  where
    getIris =
      do
        result <- traverse M.httpIri . L.split (== '\n') <$> L.readFile "samples/iris"
        either (fail . show) return result
    getRequests =
      do
        iris <- getIris
        return $ do
          iri <- iris
          return $ C.setIri iri
    run =
      do
        requests <- getRequests
        results <- G.produceAndConsume (F.list requests) (H.transform transform H.list)
        either (fail . showString "Parsing error: " . show) (return . sequence) (sequence results)
      where
        transform =
          N.concurrently 30 $
          I.requestUsingNewManager (J.parseHeaders K.contentType >>= return . pure)