packages feed

rds-data-0.1.1.2: integration/Test/Data/RdsData/Migration/ConnectionSpec.hs

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}

{- HLINT ignore "Move brackets to avoid $" -}
{- HLINT ignore "Redundant id" -}
{- HLINT ignore "Redundant pure" -}
{- HLINT ignore "Use camelCase" -}
{- HLINT ignore "Use let" -}

module Test.Data.RdsData.Migration.ConnectionSpec
  ( tasty_rds_integration_test,
  ) where

import qualified Amazonka.Types                         as AWS
import           Data.Function
import           Data.Generics.Product.Any
import qualified Data.List                              as L
import           Data.RdsData.Default
import           Data.RdsData.Polysemy.Core
import           Data.RdsData.Polysemy.Error
import           Data.RdsData.Polysemy.Migration
import           Data.RdsData.Polysemy.Test.Cluster
import           Data.RdsData.Polysemy.Test.Env
import           Data.RdsData.Polysemy.Test.Workspace
import           HaskellWorks.Polysemy.Amazonka
import           HaskellWorks.Polysemy.File
import           HaskellWorks.Polysemy.Hedgehog
import           HaskellWorks.Polysemy.Prelude
import           HaskellWorks.TestContainers.LocalStack
import           Lens.Micro
import qualified System.Info                            as OS
import qualified Test.Tasty                             as Tasty
import qualified Test.Tasty.Hedgehog                    as H
import qualified TestContainers.Tasty                   as TC

isWindows :: Bool
isWindows = OS.os == "mingw32"

isMacos :: Bool
isMacos = OS.os == "darwin"

-- cabal test rds-data-test --test-options "--pattern \"/RDS integration test/\""
tasty_rds_integration_test :: Tasty.TestTree
tasty_rds_integration_test =
  if isWindows || isMacos
    then Tasty.testGroup "LocalStackSpec skipped on Windows and MacOS" []
    else
      TC.withContainers (setupContainers' projectDefaultLocalStack) $ \getContainer ->
        H.testProperty "RDS integration test" $ propertyOnce $ localWorkspace "rds-data" $ runLocalTestEnv getContainer $ do
          rdsClusterDetails <- createRdsDbCluster "rds_data_migration" getContainer

          dbClusterArn <- rdsClusterDetails ^. the @"createDbClusterResponse" . the @"dbCluster" . _Just . the @"dbClusterArn"
            & nothingFail

          runReaderStatementContextFromClusterDetails rdsClusterDetails $ do
            waitUntilRdsDbClusterAvailable dbClusterArn
              & trapFail @AWS.Error
              & jotShowDataLog @AwsLogEntry

            initialiseDb
              & trapFail @RdsDataError
              & trapFail @AWS.Error
              & jotShowDataLog @AwsLogEntry

            migrateUp "db/migration.yaml"
              & trapFail @AWS.Error
              & trapFail @IOException
              & trapFail @JsonDecodeError
              & trapFail @RdsDataError
              & trapFail @YamlDecodeError
              & jotShowDataLog

            upResult <-
              ( executeStatement $ mconcat
                  [ "SELECT table_name"
                  , "  FROM information_schema.tables"
                  , "  WHERE table_schema = 'public'"
                  , "    AND table_type = 'BASE TABLE';"
                  ]
              )
              & trapFail @AWS.Error
              & trapFail @RdsDataError
              & jotShowDataLog

            let upTables = upResult ^.. the @"records" . each . each . each . the @"stringValue" . _Just

            L.sort upTables === ["examples", "migration", "projects", "users"]

            migrateDown "db/migration.yaml"
              & trapFail @AWS.Error
              & trapFail @IOException
              & trapFail @JsonDecodeError
              & trapFail @RdsDataError
              & trapFail @YamlDecodeError
              & jotShowDataLog

            downResult <-
              ( executeStatement $ mconcat
                  [ "SELECT table_name"
                  , "  FROM information_schema.tables"
                  , "  WHERE table_schema = 'public'"
                  , "    AND table_type = 'BASE TABLE'"
                  ]
              )
              & trapFail @AWS.Error
              & trapFail @RdsDataError
              & jotShowDataLog

            let downTables = downResult ^.. the @"records" . each . each . each . the @"stringValue" . _Just

            L.sort downTables === ["migration"]