packages feed

hocker-1.0.6: test/Tests/Data/Docker/Nix/FetchDocker.hs

{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}

-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Docker.Nix.FetchDocker
-- Copyright   :  (C) 2017 Awake Networks
-- License     :  Apache-2.0
-- Maintainer  :  Awake Networks <opensource@awakenetworks.com>
-- Stability   :  stable
----------------------------------------------------------------------------

module Tests.Data.Docker.Nix.FetchDocker where

import           Control.Exception            as CE
import           Control.Monad.Except         as Except
import           Data.ByteString              as BS
import           Data.ByteString.Lazy.Char8   as C8L
import           Data.Either                  (either)
import qualified Data.Text                    as Text
import qualified Data.Text.Prettyprint.Doc.Render.String
import           Data.Word8                   as W8
import           Network.URI

import           Test.Tasty
import           Test.Tasty.Golden
import           Test.Tasty.Golden.Advanced   (goldenTest)
import           Test.Tasty.HUnit
import           Text.Printf                  (printf)

import           Data.Docker.Image.Types
import           Data.Docker.Nix.FetchDocker  as Nix.FetchDocker
import           Data.Docker.Nix.Lib          as Nix.Lib
import           Hocker.Lib
import           Network.Wreq.Docker.Registry as Docker.Registry
import           Hocker.Types
import           Hocker.Types.ImageTag

-- | Compare a given string against the golden file contents,
-- ignoring differences in contiguous nonempty spans of whitespace,
-- and the presence or absence of whitespace before or after a comma.
goldenVsStringCanonicalize
  :: TestName -- ^ test name
  -> FilePath -- ^ path to golden file
  -> IO C8L.ByteString -- ^ action that returns string to compare
  -> TestTree -- ^ the test verifies that the returned string equals the
              -- golden file contents when ignoring differences in whitespace
goldenVsStringCanonicalize name ref act =
  goldenTest
    name
    (BS.readFile ref)
    (C8L.toStrict <$> act)
    cmp
    upd
  where
  cmp x y = cmpCanonicalize msg x y
    where
    msg = printf "Test output was different from '%s'. It was: %s" ref (show y)
  upd = BS.writeFile ref

cmpCanonicalize ::
  String -> BS.ByteString -> BS.ByteString -> IO (Maybe String)
cmpCanonicalize e x y =
    return $ if canonicalize x == canonicalize y then Nothing else Just e
  where
    canonicalize = BS.pack . BS.foldr op []
    op x acc
      | W8.isSpace x, y : _ <- acc, y == W8._space = acc
      | W8.isSpace x, y : _ <- acc, y == W8._comma = acc
      | W8.isSpace x = W8._space : acc
      | x == W8._comma, y : ys <- acc, y == W8._space = W8._comma : ys
      | otherwise = x : acc

tests = testGroup "FetchDocker Nix Generation Tests"
  [ goldenVsStringCanonicalize
      "Golden vs. Generated `fetchDocker' Nix Expression"
      "test/data/golden-debian_jessie.nix"
      generateFetchDockerNix
  , testCase "Base16 Digest to Base32 Digest" testBase16toBase32
  ]

testBase16toBase32 :: Assertion
testBase16toBase32 = do
  let b16     = Base16Digest "5c90d4a2d1a8dfffd05ff2dd659923f0ca2d843b5e45d030e17abbcd06a11b5b"
      b32     = Base32Digest "0nqvl43cvfvsw4qd0iay7f22vjph4fcnbpgjbz8gzpx8s6id942w"

  res <- Except.runExceptT (Nix.Lib.toBase32Nix b16)

  either
    (assertFailure . show)
    (assertEqual "" b32)
    res

generateFetchDockerNix :: IO C8L.ByteString
generateFetchDockerNix = do
  manifest      <- C8L.readFile "test/data/manifest-debian_jessie.json"
  nixExpression <- Nix.FetchDocker.generate
    HockerImageMeta
      { imageRepo      = "library"
      , imageName      = "debian"
      , imageTag       = ImageTag "jessie"
      , manifestJSON   = manifest
      , dockerRegistry = defaultRegistry
      , altImageName   = Nothing
      }

  let display = Data.Text.Prettyprint.Doc.Render.String.renderString

  either
    (Hocker.Lib.die . Text.pack . show)
    (return . C8L.pack . display . Hocker.Lib.renderNixExpr)
    nixExpression