packages feed

google-cloud-compute-0.1.0.0: test/Spec.hs

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

import Test.Hspec
import Google.Cloud.Compute.Disk as Disk
import Google.Cloud.Compute.Instance as Instance
import qualified Google.Cloud.Compute.Firewall as Firewall
import Data.Aeson (decode, encode)
import Data.Maybe (isJust)
import qualified Data.ByteString.Lazy.Char8 as BSL

main :: IO ()
main = hspec spec

spec :: Spec
spec = do
  describe "Google.Cloud.Compute.Disk" $ do
    context "DiskResponse JSON serialization" $ do
      it "successfully parses valid JSON to DiskResponse" $ do
        let json = "{\"kind\":\"compute#diskList\",\"items\":[],\"nextPageToken\":\"token\",\"selfLink\":\"link\"}"
        let result = decode (BSL.pack json) :: Maybe DiskResponse
        result `shouldSatisfy` isJust

      it "successfully converts DiskResponse to JSON" $ do
        let diskResponse = DiskResponse (Just "compute#diskList") Nothing (Just []) (Just "token") (Just "link") Nothing
        let json = encode diskResponse
        decode json `shouldBe` Just diskResponse

    context "InsertDiskOps default" $ do
      it "creates a default InsertDiskOps" $ do
        let diskOps = defaultInsertOps "my-disk" "100"
        (\InsertDiskOps{..} -> name) diskOps `shouldBe` "my-disk"
        (\InsertDiskOps{..} -> sizeGb) diskOps `shouldBe` "100"
        (\InsertDiskOps{..} -> description) diskOps `shouldBe` Nothing

    context "CreateSnapshotOps default" $ do
      it "creates a default CreateSnapshotOps" $ do
        let snapshotOps = defaultCreateSnapshotOps "my-snapshot"
        (\CreateSnapshotOps{..} -> name) snapshotOps `shouldBe` "my-snapshot"
        (\CreateSnapshotOps{..} -> description) snapshotOps `shouldBe` Nothing

    context "Warning JSON serialization" $ do
      it "serializes and deserializes Warning correctly" $ do
        let warning = Disk.Warning "NO_RESULTS" "No results found" (Just [WarningData "scope" "global"])
        let json = encode warning
        decode json `shouldBe` Just warning

    context "Operation JSON serialization" $ do
      it "successfully parses valid JSON to Operation" $ do
        let json = "{\"id\":\"123\",\"name\":\"operation-1\",\"status\":\"DONE\"}"
        let result = decode (BSL.pack json) :: Maybe Operation
        result `shouldSatisfy` isJust

      it "successfully converts Operation to JSON" $ do
        let operation = Operation (Just "123") (Just "operation-1") Nothing Nothing Nothing (Just "DONE") Nothing Nothing Nothing Nothing Nothing Nothing Nothing
        let json = encode operation
        decode json `shouldBe` Just operation

      describe "JSON Serialization" $ do
        it "correctly serializes and deserializes RunDuration" $ do
          let runDuration = TerminationTime "2023-10-15T10:00:00Z"
          decode (encode runDuration) `shouldBe` Just runDuration

        it "correctly serializes and deserializes OnInstanceTerminationAction" $ do
          let action = DiscardLocalSsd True
          decode (encode action) `shouldBe` Just action

        it "correctly serializes and deserializes Scheduling" $ do
          let scheduling = Scheduling {
                onHostMaintenance = "MIGRATE",
                automaticRestart = True,
                preemptible = False,
                nodeAffinities = [],
                minNodeCpus = 1,
                locationHint = "us-central1",
                availabilityDomain = 0,
                provisioningModel = "STANDARD",
                instanceTerminationAction = RunDurationRunDuration (TerminationTime "2023-10-15T12:00:00Z")
              }
          decode (encode scheduling) `shouldBe` Just scheduling

      describe "Default Query Constructors" $ do
        it "creates a default ListInstancesQuery with all fields set to Nothing" $ do
          let query = defaultListInstancesQuery
          filter_ query `shouldBe` Nothing
          maxResults query `shouldBe` Nothing
          orderBy query `shouldBe` Nothing
          pageToken query `shouldBe` Nothing
          returnPartialSuccess query `shouldBe` Nothing

        it "creates a default InsertInstanceOps with correct settings" $ do
          let ops = defaultInsertInstanceOps "my-project" "us-central1-a" "test-instance" "f1-micro"
          (\InsertInstanceOps{..} -> name) ops `shouldBe` "test-instance"
          machineType ops `shouldBe` "zones/us-central1-a/machineTypes/f1-micro"
          isJust (disks ops) `shouldBe` True
          isJust (networkInterfaces ops) `shouldBe` True

        it "creates a default RequestIdQuery with given requestId" $ do
          let rid = "request-123"
          let query = defaultRequestIdQuery rid
          requestId query `shouldBe` Just rid
      
    describe "Google.Cloud.Compute.Firewall" $ do

        describe "JSON serialization/deserialization" $ do
          it "should serialize and deserialize WarningData" $ do
            let warningData = Firewall.WarningData "some_key" "some_value"
            let json = encode warningData
            decode json `shouldBe` Just warningData

          it "should serialize and deserialize Warning" $ do
            let warning = Firewall.Warning "some_code" "some_message" Nothing
            let json = encode warning
            decode json `shouldBe` Just warning

          it "should serialize and deserialize LogConfig" $ do
            let logConfig = Firewall.LogConfig True (Just "INCLUDE_ALL_METADATA")
            let json = encode logConfig
            decode json `shouldBe` Just logConfig

          it "should serialize and deserialize AllowedFirewall" $ do
            let allowedFirewall = Firewall.AllowedFirewall "tcp" (Just ["80", "443"])
            let json = encode allowedFirewall
            decode json `shouldBe` Just allowedFirewall

          it "should serialize and deserialize DeniedFirewall" $ do
            let deniedFirewall = Firewall.DeniedFirewall "tcp" (Just ["22"])
            let json = encode deniedFirewall
            decode json `shouldBe` Just deniedFirewall

          it "should serialize and deserialize FirewallMeta" $ do
            let firewallMeta = Firewall.FirewallMeta (Just "compute#firewall") (Just "123456") (Just "2021-01-01T00:00:00Z") 
                                          (Just "test-firewall") (Just "A test firewall") 
                                          (Just "global/networks/default") (Just 1000) 
                                          (Just ["0.0.0.0/0"]) (Just ["tag1"]) (Just ["tag2"]) 
                                          (Just [Firewall.AllowedFirewall "tcp" (Just ["80"])]) 
                                          (Just [Firewall.DeniedFirewall "tcp" (Just ["22"])]) 
                                          (Just "INGRESS") (Just (Firewall.LogConfig True (Just "INCLUDE_ALL_METADATA"))) 
                                          (Just False) (Just "selfLink")
            let json = encode firewallMeta
            decode json `shouldBe` Just firewallMeta

          it "should serialize and deserialize FirewallList" $ do
            let firewallList = Firewall.FirewallList (Just "compute#firewallList") (Just "12345") 
                                            (Just [Firewall.FirewallMeta (Just "compute#firewall") (Just "123456") 
                                            (Just "2021-01-01T00:00:00Z") (Just "test-firewall") 
                                            (Just "A test firewall") (Just "global/networks/default") 
                                            (Just 1000) (Just ["0.0.0.0/0"]) (Just ["tag1"]) 
                                            (Just ["tag2"]) (Just [Firewall.AllowedFirewall "tcp" (Just ["80"])] ) 
                                            (Just [Firewall.DeniedFirewall "tcp" (Just ["22"])] ) 
                                            (Just "INGRESS") (Just (Firewall.LogConfig True (Just "INCLUDE_ALL_METADATA"))) 
                                            (Just False) (Just "selfLink")]) 
                                            (Just "nextPageToken") (Just "selfLink") 
                                            (Just (Firewall.Warning "some_code" "some_message" Nothing))
            let json = encode firewallList
            decode json `shouldBe` Just firewallList

          it "should create default CreateFirewallOps" $ do
            let defaultOps = Firewall.defaultCreateFirewallOps "test-firewall"
            (\Firewall.CreateFirewallOps{..} -> name) defaultOps `shouldBe` "test-firewall"
            (\Firewall.CreateFirewallOps{..} -> description) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> network) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> priority) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> sourceRanges) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> sourceTags) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> targetTags) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> allowed) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> denied) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> direction) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> logConfig) defaultOps `shouldBe` Nothing
            (\Firewall.CreateFirewallOps{..} -> disabled) defaultOps `shouldBe` Nothing