module Handler.Utils.RatingSpec where import TestImport import Handler.Utils.Rating import ModelSpec () import Model.RatingSpec () import Data.Time.Clock.System (systemEpochDay) import qualified Data.ByteString.Lazy as LBS import qualified Data.Text as Text import Utils (assertM, MsgRendererS(..)) import Text.Shakespeare.I18N (renderMessage) spec :: Spec spec = describe "Rating file parsing/pretty-printing" $ do it "roundtrips" . property $ \(_ :: SubmissionId, subId) (mRating -> rating) -> parseRating' (formatRating mr' def subId rating) === Just (ratingValues rating) it "has idempotent formatting" . property $ \(_ :: SubmissionId, subId) (mRating -> rating) -> fmap (\r' -> formatRating mr' def subId $ rating { ratingValues = r' }) (parseRating' $ formatRating mr' def subId rating) === Just (formatRating mr' def subId rating) where mr' :: forall site. MsgRendererS site mr' = MsgRenderer $ renderMessage (error "foundation inspected" :: site) [] parseRating' :: LBS.ByteString -> Maybe Rating' parseRating' = either (\(_ :: SomeException) -> Nothing) Just . parseRating . flip (File "bewertung.txt") time . Just . LBS.toStrict time = UTCTime systemEpochDay 0 mRating rating = rating { ratingValues = mRating' $ ratingValues rating } mRating' rating' = rating' { ratingTime = Just time -- There is no field for ratingTime so we just always expect file modification time , ratingComment = assertM (not . Text.null) $ Text.strip <$> ratingComment rating' }