packages feed

bloodhound-1.0.0.0: tests/Test/MLModelGroupsSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.MLModelGroupsSpec (spec) where

import Data.ByteString.Lazy.Char8 qualified as LBS
import Database.Bloodhound.OpenSearch3.Types
import TestsUtils.Import
import Prelude

-- | Register response: @{model_group_id, status}@.
sampleRegisterResponse :: LBS.ByteString
sampleRegisterResponse = "{\"model_group_id\":\"GDNmQ4gBYW0Qyy5ZcBcg\",\"status\":\"CREATED\"}"

-- | Get response. Note the response key is @access@ (not @access_mode@).
sampleGetResponse :: LBS.ByteString
sampleGetResponse =
  "{\
  \  \"name\": \"test_model_group\",\
  \  \"latest_version\": 0,\
  \  \"description\": \"This is a public model group\",\
  \  \"access\": \"public\",\
  \  \"created_time\": 1715112992748,\
  \  \"last_updated_time\": 1715112992748\
  \}"

spec :: Spec
spec = describe "ML Commons model group APIs" $ do
  describe "ModelGroupAccessMode" $ do
    it "encodes the documented access modes" $ do
      encode ModelGroupAccessModePublic `shouldBe` "\"public\""
      encode ModelGroupAccessModePrivate `shouldBe` "\"private\""
      encode ModelGroupAccessModeRestricted `shouldBe` "\"restricted\""
    it "decodes the documented access modes" $ do
      decode "\"public\"" `shouldBe` Just ModelGroupAccessModePublic
      decode "\"private\"" `shouldBe` Just ModelGroupAccessModePrivate
      decode "\"restricted\"" `shouldBe` Just ModelGroupAccessModeRestricted
    it "round-trips an unknown mode through the Other escape hatch" $ do
      let other = ModelGroupAccessModeOther "future"
      decode (encode other) `shouldBe` Just other

  describe "RegisterModelGroupResponse" $
    it "decodes the doc sample" $
      decode sampleRegisterResponse
        `shouldBe` Just
          RegisterModelGroupResponse
            { registerModelGroupResponseId = Just "GDNmQ4gBYW0Qyy5ZcBcg",
              registerModelGroupResponseStatus = Just "CREATED"
            }

  describe "RegisterModelGroupRequest" $
    it "encodes a public group, omitting the absent access-control fields" $ do
      let req =
            RegisterModelGroupRequest
              { registerModelGroupName = "test_model_group",
                registerModelGroupDescription = Just "This is a public model group",
                registerModelGroupAccessMode = Just ModelGroupAccessModePublic,
                registerModelGroupBackendRoles = Nothing,
                registerModelGroupAddAllBackendRoles = Nothing
              }
      encode req
        `shouldBe` "{\"access_mode\":\"public\",\"description\":\"This is a public model group\",\"name\":\"test_model_group\"}"

  describe "ModelGroupInfo" $ do
    it "decodes the doc get sample (response key is 'access')" $
      decode sampleGetResponse
        `shouldBe` Just
          ModelGroupInfo
            { modelGroupName = Just "test_model_group",
              modelGroupLatestVersion = Just 0,
              modelGroupDescription = Just "This is a public model group",
              modelGroupAccess = Just ModelGroupAccessModePublic,
              modelGroupBackendRoles = Nothing,
              modelGroupCreatedTime = Just 1715112992748,
              modelGroupLastUpdatedTime = Just 1715112992748
            }
    it "round-trips a sparse info" $ do
      let info =
            ModelGroupInfo
              { modelGroupName = Just "g",
                modelGroupLatestVersion = Nothing,
                modelGroupDescription = Nothing,
                modelGroupAccess = Just ModelGroupAccessModeRestricted,
                modelGroupBackendRoles = Just ["ops"],
                modelGroupCreatedTime = Nothing,
                modelGroupLastUpdatedTime = Nothing
              }
      decode (encode info) `shouldBe` Just info