packages feed

yesod-core-1.7.0.0: test/YesodCoreTest/Content.hs

{-# LANGUAGE OverloadedStrings #-}
module YesodCoreTest.Content (specs) where

import Test.Hspec

import Yesod.Core
import Yesod.Core.Types (TypedContent, typedContentToSnippet)
import Data.Text (Text, pack)
import Data.Text.Encoding (encodeUtf8)
import Data.ByteString (ByteString)

import qualified Data.Encoding as Enc
import qualified Data.Encoding.GB18030 as Enc
import qualified Data.Encoding.CP1251 as Enc
import qualified Data.Encoding.ShiftJIS as Enc
import qualified Data.Encoding.CP932 as Enc

fakeContent :: (String -> ByteString) -> String -> String -> TypedContent
fakeContent encode contentTypeString contentString =
  TypedContent
  (encode contentTypeString)
  (toContent $ encode contentString)

fakeUtf8Content :: String -> String -> TypedContent
fakeUtf8Content = fakeContent (encodeUtf8 . pack)

fakeGB18030Content :: String -> String -> TypedContent
fakeGB18030Content = fakeContent $ Enc.encodeStrictByteString Enc.GB18030

fakeCP1251Content :: String -> String -> TypedContent
fakeCP1251Content = fakeContent $ Enc.encodeStrictByteString Enc.CP1251

fakeShiftJISContent :: String -> String -> TypedContent
fakeShiftJISContent = fakeContent $ Enc.encodeStrictByteString Enc.ShiftJIS

fakeCP932Content :: String -> String -> TypedContent
fakeCP932Content = fakeContent $ Enc.encodeStrictByteString Enc.CP932

specs :: Spec
specs = describe "typedContentToSnippet" $ do
    it "does not serialize content that is apparently binary data" $ do
      let content = fakeUtf8Content "application/octet-stream" "fake"
      (typedContentToSnippet content 100) `shouldBe` Nothing

    it "serializes UTF-8 encoded JSON" $ do
      let content = fakeUtf8Content "application/json; charset=utf-8" "[1,2,3]"
      (typedContentToSnippet content 100) `shouldBe` (Just "[1,2,3]")

    it "serializes text with no specified encoding" $ do
      let content = fakeUtf8Content "text/css" "fake"
      (typedContentToSnippet content 100) `shouldBe` (Just "fake")

    it "serializes RSS with no specified encoding" $ do
      let content = fakeUtf8Content "application/rss" "fake"
      (typedContentToSnippet content 100) `shouldBe` (Just "fake")

    it "serializes Atom feeds with no specified encoding" $ do
      let content = fakeUtf8Content "application/atom" "fake"
      (typedContentToSnippet content 100) `shouldBe` (Just "fake")

    it "truncates long snippets" $ do
      let content = fakeUtf8Content "application/json; charset=utf-8" "[1,2,3]"
      (typedContentToSnippet content 2) `shouldBe` (Just "[1...+ 5")

    it "serializes GB18030 text" $ do
      let content = fakeGB18030Content "application/json; charset=GB18030" "[1,2,3]"
      (typedContentToSnippet content 100) `shouldBe` (Just "[1,2,3]")

    it "serializes CP1251 text" $ do
      let content = fakeCP1251Content "application/json; charset=windows-1251" "[1,2,3]"
      (typedContentToSnippet content 100) `shouldBe` (Just "[1,2,3]")

    it "serializes ShiftJIS text" $ do
      let content = fakeShiftJISContent "application/json; charset=Shift_JIS" "[1,2,3]"
      (typedContentToSnippet content 100) `shouldBe` (Just "[1,2,3]")

    it "serializes CP932 text" $ do
      let content = fakeCP932Content "application/json; charset=Windows-31J" "[1,2,3]"
      (typedContentToSnippet content 100) `shouldBe` (Just "[1,2,3]")