packages feed

stylish-cabal-0.1.0.0: tests/roundtrip/Hackage.hs

{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}
{-# Language OverloadedStrings #-}
{-# Language DeriveGeneric #-}

import Control.Lens
import Control.Monad
import Data.Aeson
import Data.ByteString.Lazy.UTF8 (toString)
import GHC.Generics
import Network.Wreq
import System.Random.MWC
import System.Random.MWC.Distributions
import System.IO
import Test.Hspec
import qualified Data.Vector as V
import Test.Hspec.Core.Spec
import Utils

newtype GetPackage = GetPackage
    { packageName :: String
    } deriving (Show, Generic)

data GetRevision = GetRevision
    { time :: String
    , user :: String
    , number :: Integer
    } deriving (Show, Generic)

instance FromJSON GetPackage

instance FromJSON GetRevision

getJson :: FromJSON b => String -> IO b
getJson x =
    fmap (view responseBody) $
    asJSON =<< getWith (defaults & header "Accept" .~ ["application/json"]) x

testHackage = do
    packages <-
        runIO $ do
            hSetBuffering stdout NoBuffering
            putStrLn "getting package list..."
            packages <- getJson "http://hackage.haskell.org/packages/"
            putStrLn "done, running tests..."
            gen <- createSystemRandom
            uniformShuffle (V.fromList packages) gen
    parallel $
        describe "for 100 random Hackage packages" $
        forM_ (V.take 100 packages) $ \(GetPackage pname) ->
            mapSpecItem_ applySkips $
            it (mkHeader pname) $ do
                revs <-
                    getJson $
                    "http://hackage.haskell.org/package/" ++ pname ++ "/revisions/"
                let recent = last revs
                cabalFile <-
                    get $
                    "http://hackage.haskell.org/package/" ++
                    pname ++ "/revision/" ++ show (number recent) ++ ".cabal"
                expectParse $ toString $ view responseBody cabalFile

main :: IO ()
main = hspec $ describe "comprehensive check" testHackage