packages feed

aws-arn-0.3.2.0: test/Network/AWS/ARN/Test.hs

{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}

module Network.AWS.ARN.Test where

import Data.List.NonEmpty (NonEmpty (..))
import Data.Text (Text)
import Lens.Micro.Pro (Lens', over, preview, review)
import Network.AWS.ARN
import Test.Tasty
import Test.Tasty.HUnit

test_all :: TestTree
test_all =
  testGroup
    "Network.AWS.ARN"
    [ testGroup
        "basic tests"
        [ testCase "inspect function name and alias of Lambda ARN" $
            (resource <$> parseARN aliasedLambdaSampleARN)
              @?= Just "function:the-coolest-function-ever:Alias",
          testCase "parses empty region OK" $
            (region <$> parseARN s3FileSampleARN) @?= Just "",
          testCase "parses empty account OK" $
            (account <$> parseARN s3FileSampleARN) @?= Just "",
          testCase "rejects non-ARNs" $
            parseARN sampleNotAnARN @?= Nothing
        ],
      testGroup
        "optic tests"
        [ testCase "prism roundtrip" $
            (review _ARN <$> preview _ARN authorizerSampleARN)
              @?= Just authorizerSampleARN,
          testCase "edit path of Lambda Authorizer ARN" $
            over (_ARN . arnResource . slashes) (\parts -> take 2 parts ++ ["*"]) authorizerSampleARN
              @?= "arn:aws:execute-api:us-east-1:123456789012:my-spiffy-api/stage/*"
        ]
    ]

authorizerSampleARN :: Text
authorizerSampleARN = "arn:aws:execute-api:us-east-1:123456789012:my-spiffy-api/stage/GET/some/deep/path"

aliasedLambdaSampleARN :: Text
aliasedLambdaSampleARN = "arn:aws:lambda:us-east-1:123456789012:function:the-coolest-function-ever:Alias"

s3FileSampleARN :: Text
s3FileSampleARN = "arn:aws:s3:::an-okay-bucket/sample.txt"

sampleNotAnARN :: Text
sampleNotAnARN = "//library.googleapis.com/shelves/shelf1/books/book2"

arnResource :: Lens' (ARN a) a
arnResource l a@(ARN {resource}) = (\r -> a {resource = r}) <$> l resource

-- In Data.List.NonEmpty as of base >=4.16, but not worth breaking
-- compatibility just for this. Remove once the three latest GHC major
-- releases are all base >=4.16.
prependList :: [a] -> NonEmpty a -> NonEmpty a
prependList [] ys = ys
prependList (x : xs) (y :| ys) = x :| xs ++ y : ys