module Spec.Integrations.TestData (allTests) where import Test.HUnit import Data.Aeson (ToJSON, toJSON) import Data.Function ((&)) import Data.Functor ((<&>)) import Data.Text (Text) import GHC.Generics (Generic) import Control.Monad.Logger import LaunchDarkly.Server import LaunchDarkly.Server.DataSource.Internal import qualified LaunchDarkly.Server.Integrations.TestData as TestData import qualified LaunchDarkly.Server.Integrations.TestData.FlagBuilder as FlagBuilder allTests :: Test allTests = TestList [ testVariationForAllUsers , testMultipleFlags , testModifyFlags , testMultipleClients , testTargeting , testRules , testValueForAllUsers ] testConfig :: DataSourceFactory -> Config testConfig factory = configSetSendEvents False $ configSetDataSourceFactory (Just factory) $ configSetLogger (runStdoutLoggingT . filterLogger (\_ lvl -> lvl /= LevelDebug)) $ makeConfig "sdk-key" testVariationForAllUsers :: Test testVariationForAllUsers = TestCase $ do td <- TestData.newTestData TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.variationForAllUsers True) let config = testConfig (TestData.dataSourceFactory td) client <- makeClient config let user1 = makeUser "user1" user2 = makeUser "user2" assertEqual "user1 set" True =<< boolVariation client "flag-key-1" user1 False assertEqual "user2 set" True =<< boolVariation client "flag-key-1" user2 False assertEqual "user not set for another flag" False =<< boolVariation client "another-key" user1 False close client testModifyFlags :: Test testModifyFlags = TestCase $ do td <- TestData.newTestData TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.variations [ toJSON ("blue" :: Text) , toJSON ("red" :: Text) , toJSON ("green" :: Text) ] <&> TestData.variationForAllUsers (0 :: TestData.VariationIndex)) let config = testConfig (TestData.dataSourceFactory td) client <- makeClient config let user = makeUser "user" assertEqual "user set" "blue" =<< stringVariation client "flag-key-1" user "none" TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.variationForAllUsers (2 :: TestData.VariationIndex)) assertEqual "user set to green after update" "green" =<< stringVariation client "flag-key-1" user "none" close client testMultipleFlags :: Test testMultipleFlags = TestCase $ do td <- TestData.newTestData TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.variations [ toJSON ("blue" :: Text) , toJSON ("red" :: Text) , toJSON ("green" :: Text) ] <&> TestData.variationForAllUsers (0 :: TestData.VariationIndex)) TestData.update td =<< (TestData.flag td "flag-key-2" <&> TestData.variationForAllUsers True) let config = testConfig (TestData.dataSourceFactory td) client <- makeClient config let user = makeUser "user" assertEqual "flag 1" "blue" =<< stringVariation client "flag-key-1" user "none" assertEqual "flag 2" True =<< boolVariation client "flag-key-2" user False close client testMultipleClients :: Test testMultipleClients = TestCase $ do td <- TestData.newTestData let config = testConfig (TestData.dataSourceFactory td) client1 <- makeClient config client2 <- makeClient config let user = makeUser "user" TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.variations [ toJSON ("blue" :: Text) , toJSON ("red" :: Text) , toJSON ("green" :: Text) ] <&> TestData.variationForAllUsers (0 :: TestData.VariationIndex)) assertEqual "client1 recieved update" "blue" =<< stringVariation client1 "flag-key-1" user "none" assertEqual "client2 recieved update" "blue" =<< stringVariation client2 "flag-key-1" user "none" close client2 TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.variationForAllUsers (2 :: TestData.VariationIndex)) assertEqual "client1 recieved update to green" "green" =<< stringVariation client1 "flag-key-1" user "none" assertEqual "client2 no update after close" "none" =<< stringVariation client2 "flag-key-1" user "none" close client1 testTargeting :: Test testTargeting = TestCase $ do td <- TestData.newTestData TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.variations [ toJSON ("blue" :: Text) , toJSON ("red" :: Text) , toJSON ("green" :: Text) ] <&> TestData.variationForUser "ben" (0 :: TestData.VariationIndex) <&> TestData.variationForUser "todd" (0 :: TestData.VariationIndex) <&> TestData.offVariation (1 :: TestData.VariationIndex) <&> TestData.fallthroughVariation (2 :: TestData.VariationIndex)) let config = testConfig (TestData.dataSourceFactory td) ben = makeUser "ben" todd = makeUser "todd" evelyn = makeUser "evelyn" client <- makeClient config assertEqual "ben recieves blue" "blue" =<< stringVariation client "flag-key-1" ben "none" assertEqual "todd recieves blue" "blue" =<< stringVariation client "flag-key-1" todd "none" assertEqual "evelyn recieves green" "green" =<< stringVariation client "flag-key-1" evelyn "none" TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.on False) assertEqual "targeting off ben recieves red" "red" =<< stringVariation client "flag-key-1" ben "none" assertEqual "targeting off todd recieves red" "red" =<< stringVariation client "flag-key-1" todd "none" assertEqual "targeting off evelyn recieves red" "red" =<< stringVariation client "flag-key-1" evelyn "none" close client testRules :: Test testRules = TestCase $ do td <- TestData.newTestData TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.variations [ toJSON ("blue" :: Text) , toJSON ("red" :: Text) , toJSON ("green" :: Text) ] <&> TestData.ifMatch "country" [toJSON ("gb" :: Text), toJSON ("usa" :: Text)] <&> TestData.andMatch "name" [toJSON ("Todd" :: Text)] <&> TestData.thenReturn (1 :: TestData.VariationIndex) <&> TestData.ifNotMatch "name" [toJSON ("Todd" :: Text)] <&> TestData.andMatch "country" [toJSON ("gb" :: Text), toJSON ("usa" :: Text)] <&> TestData.thenReturn (2 :: TestData.VariationIndex) <&> TestData.fallthroughVariation (0 :: TestData.VariationIndex)) let config = testConfig (TestData.dataSourceFactory td) ben = makeUser "ben" & userSetCountry (Just "usa") & userSetName (Just "Ben") todd = makeUser "todd" & userSetCountry (Just "gb") & userSetName (Just "Todd") evelyn = makeUser "evelyn" client <- makeClient config assertEqual "ben recieves green" "green" =<< stringVariation client "flag-key-1" ben "none" assertEqual "todd recieves red" "red" =<< stringVariation client "flag-key-1" todd "none" assertEqual "evelyn recieves blue" "blue" =<< stringVariation client "flag-key-1" evelyn "none" close client data CustomType = CustomType1 | CustomType2 deriving (Generic, Eq, Show, ToJSON) testValueForAllUsers :: Test testValueForAllUsers = TestCase $ do td <- TestData.newTestData TestData.update td =<< (TestData.flag td "flag-key-1" <&> TestData.valueForAllUsers CustomType1) let config = testConfig (TestData.dataSourceFactory td) ben = makeUser "ben" todd = makeUser "todd" client <- makeClient config assertEqual "ben recieves CustomType1" "CustomType1" =<< stringVariation client "flag-key-1" ben "CustomType2" assertEqual "todd recieves CustomType1" "CustomType1" =<< stringVariation client "flag-key-1" todd "CustomType2" close client