packages feed

nbparts-0.1.0.0: tests/Tests/Integration/Util.hs

module Tests.Integration.Util where

import Control.Monad.Error.Class (MonadError, liftEither)
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Aeson qualified as Aeson
import Data.ByteString.Lazy qualified as ByteString.Lazy
import Data.Ipynb qualified as Ipynb
import Data.Text qualified as Text
import Nbparts.Pack (PackOptions)
import Nbparts.Run (Command (Pack, Unpack), Options (Options))
import Nbparts.Run qualified as Nbparts
import Nbparts.Types
  ( Format (FormatJson, FormatMarkdown, FormatYaml),
    NbpartsError,
    renderFormat,
  )
import Nbparts.Unpack (UnpackOptions)
import Test.Hspec (SpecWith, context)

fixtureDir :: FilePath
fixtureDir = "tests/fixtures"

runUnpack :: (MonadError NbpartsError m, MonadIO m) => UnpackOptions -> m ()
runUnpack = Nbparts.run . Options . Unpack

runPack :: (MonadError NbpartsError m, MonadIO m) => PackOptions -> m ()
runPack = Nbparts.run . Options . Pack

readIpynb :: (MonadError String m, MonadIO m) => FilePath -> m (Ipynb.Notebook Ipynb.NbV4)
readIpynb fp = do
  bytes <- liftIO $ ByteString.Lazy.readFile fp
  liftEither $ Aeson.eitherDecode bytes

data UnpackFormats = UnpackFormats
  { sourcesFormat :: Format,
    metadataFormat :: Format,
    outputsFormat :: Format
  }

runSpecWithUnpackFormatsCA :: (UnpackFormats -> SpecWith a) -> SpecWith a
runSpecWithUnpackFormatsCA spec = mapM_ (runSpecWithUnpackFormats spec) unpackFormatsCA

runSpecWithUnpackFormats :: (UnpackFormats -> SpecWith a) -> UnpackFormats -> SpecWith a
runSpecWithUnpackFormats spec fmts@(UnpackFormats {sourcesFormat, metadataFormat, outputsFormat}) =
  context
    ( "when exporting sources to "
        <> Text.unpack (renderFormat sourcesFormat)
        <> ", metadata to "
        <> Text.unpack (renderFormat metadataFormat)
        <> " and outputs to "
        <> Text.unpack (renderFormat outputsFormat)
    )
    $ spec fmts

-- Combinations generated with CAgen.
unpackFormatsCA :: [UnpackFormats]
unpackFormatsCA =
  [ UnpackFormats
      { sourcesFormat = FormatYaml,
        metadataFormat = FormatYaml,
        outputsFormat = FormatYaml
      },
    UnpackFormats
      { sourcesFormat = FormatYaml,
        metadataFormat = FormatJson,
        outputsFormat = FormatJson
      },
    UnpackFormats
      { sourcesFormat = FormatJson,
        metadataFormat = FormatYaml,
        outputsFormat = FormatJson
      },
    UnpackFormats
      { sourcesFormat = FormatJson,
        metadataFormat = FormatJson,
        outputsFormat = FormatYaml
      },
    UnpackFormats
      { sourcesFormat = FormatMarkdown,
        metadataFormat = FormatYaml,
        outputsFormat = FormatJson
      },
    UnpackFormats
      { sourcesFormat = FormatMarkdown,
        metadataFormat = FormatJson,
        outputsFormat = FormatYaml
      }
  ]