packages feed

nakadi-client-0.5.0.0: tests/Tests.hs

{-# LANGUAGE ScopedTypeVariables #-}
import           ClassyPrelude

import           Network.HTTP.Client
import           Network.Nakadi
import           Network.Nakadi.Config.Test
import           Network.Nakadi.Connection.Test
import           Network.Nakadi.EventTypes.Test
import           Network.Nakadi.Examples.Test
import           Network.Nakadi.Internal.Test
import           Network.Nakadi.MonadicAPI.Test
import           Network.Nakadi.Registry.Test
import           Network.Nakadi.Subscriptions.Test
import           Network.Nakadi.Tests.Common
import           System.Environment
import           System.Exit
import           System.IO                         (hFlush)
import           Test.Tasty

main :: IO ()
main = do
  putStrLn ""
  maybeNakadiEndpoint <- lookupEnv "TEST_NAKADI_ENDPOINT"
  (label, runTests) <- case maybeNakadiEndpoint of
    Nothing -> do
      hPut stderr . encodeUtf8 $
        "***************************************************************\n\
        \** The environment variable TEST_NAKADI_ENDPOINT is not set. **\n\
        \**                                                           **\n\
        \**              SKIPPING INTEGRATION TESTS                   **\n\
        \**                                                           **\n\
        \** If you want to run the integration tests contained in     **\n\
        \** this test suite, you need to run a Nakadi server which    **\n\
        \** allows access without authentication. Then, set the       **\n\
        \** environment variable TEST_NAKADI_ENDPOINT to the base     **\n\
        \** endpoint of this Nakadi server.                           **\n\
        \**                                                           **\n\
        \** To run a local Nakadi server clone the repository         **\n\
        \**                                                           **\n\
        \**     https://github.com/zalando/nakadi                     **\n\
        \**                                                           **\n\
        \** and follow the contained instructions; the command        **\n\
        \**                                                           **\n\
        \**     ./gradlew startNakadi                                 **\n\
        \**                                                           **\n\
        \** starts a local Nakadi server at http://localhost:8080.    **\n\
        \**                                                           **\n\
        \** Thus, set TEST_NAKADI_ENDPOINT to http://localhost:8080.  **\n\
        \***************************************************************\n"
      return ("nakadi-client Test Suite (w/o integration tests)", unitTests)
    Just nakadiEndpoint -> do
      let nakadiEndpointT = pack nakadiEndpoint
      case parseRequest nakadiEndpoint of
        Just request -> do
          let conf   = newConfig httpBackendIO request
              confIO = newConfigIO request
          return ("nakadi-client Test Suite",
                  integrationTests conf confIO ++ unitTests)
        Nothing -> do
          hPut stderr . encodeUtf8 $
            "Failed to parse Nakadi URL in TEST_NAKADI_ENDPOINT (" <> nakadiEndpointT <> ")"
          hFlush stderr
          exitFailure
  defaultMain (testGroup label runTests)

unitTests :: [TestTree]
unitTests =
  [ testInternal
  , testConfig
  , testConnection
  ]

integrationTests :: Config App -> ConfigIO -> [TestTree]
integrationTests conf confIO =
  [ testSubscriptions conf
  , testExamples confIO
  , testEventTypes conf
  , testRegistry conf
  , testMonadicAPI conf
  ]