packages feed

parquet-hs-0.1.0.0: tests/integration/Spec.hs

module Main
  ( main
  )
where

import Test.Hspec
import System.Process
import System.Environment (setEnv, unsetEnv)
import System.FilePath ((</>))
import Control.Exception (bracket_)
import qualified Data.Aeson as JSON
import qualified Data.Text.IO as TextIO (putStrLn)
import qualified Data.ByteString.Lazy as LByteString (ByteString, toStrict)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Text.Lazy as LText (Text)
import qualified Data.Text.Lazy.IO as LTextIO (putStrLn)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Except (runExceptT)
import Conduit (runResourceT)

import Control.Monad.Logger
import Parquet.Reader (readWholeParquetFile)

testPath :: String
testPath = "tests" </> "integration"

testDataPath :: String
testDataPath = testPath </> "testdata"

intermediateDir :: String
intermediateDir = "nested.parquet"

encoderScriptPath :: String
encoderScriptPath = "gen_parquet.py"

outParquetFilePath :: String
outParquetFilePath = testPath </> "test.parquet"
pysparkPythonEnvName :: String
pysparkPythonEnvName = "PYSPARK_PYTHON"

testParquetFormat :: String -> (String -> IO ()) -> IO ()
testParquetFormat inputFile performTest =
  bracket_
      (setEnv pysparkPythonEnvName "/usr/bin/python3")
      (unsetEnv pysparkPythonEnvName)
    $ do
        callProcess
          "python3"
          [ testPath </> encoderScriptPath
          , testDataPath </> "input1.json"
          , testPath </> intermediateDir
          ]
        callCommand
          $   "cp "
          <>  testPath
          </> intermediateDir
          </> "*.parquet "
          <>  outParquetFilePath
        performTest $ outParquetFilePath
        callProcess "rm" ["-rf", testPath </> intermediateDir]
        -- callProcess "rm" ["-f", outParquetFilePath]

lazyByteStringToText :: LByteString.ByteString -> T.Text
lazyByteStringToText = T.decodeUtf8 . LByteString.toStrict

lazyByteStringToString :: LByteString.ByteString -> String
lazyByteStringToString = T.unpack . lazyByteStringToText

putLazyByteStringLn :: LByteString.ByteString -> IO ()
putLazyByteStringLn = TextIO.putStrLn . lazyByteStringToText

putLazyTextLn :: LText.Text -> IO ()
putLazyTextLn = LTextIO.putStrLn

main :: IO ()
main = hspec $ describe "Reader" $ do
  it "can read columns" $ do
    testParquetFormat "input1.json" $ \parqFile -> do
      liftIO . print =<< runResourceT
        (runStdoutLoggingT (runExceptT (readWholeParquetFile parqFile)))
      pure ()