feature-flipper-0.1.0.0: test/Control/FlipperSpec.hs
module Control.FlipperSpec (main, spec) where
import Control.Monad.State (evalState, execState)
import qualified Data.Map.Strict as M
import Test.Hspec
import Control.Flipper
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
describe "whenEnabled" $ do
context "the feature is enabled" $
it "evaluates the given monad" $
let
featureState = mkFeatures $ M.insert "ADD_ANOTHER_FEATURE" True mempty
store = execState
(whenEnabled "ADD_ANOTHER_FEATURE" (enable "ANOTHER_FEATURE"))
featureState
in
M.lookup "ANOTHER_FEATURE" (unFeatures store) `shouldBe` Just True
context "the feature is disabled" $
it "does not evaluate the given monad" $
let
featureState = mkFeatures $ M.insert "ADD_ANOTHER_FEATURE" False mempty
store = execState
(whenEnabled "ADD_ANOTHER_FEATURE" (enable "ANOTHER_FEATURE"))
featureState
in
M.lookup "ANOTHER_FEATURE" (unFeatures store) `shouldBe` Nothing
describe "enable" $ do
it "enables a new feature key" $
let
featureState = mempty :: Features
result = evalState (enable "NEW_FEATURE" >> enabled "NEW_FEATURE") featureState
in
result `shouldBe` True
it "enables a existing feature key" $
let
featureState = mkFeatures $ M.insert "FEATURE" False mempty
result = evalState (enable "FEATURE" >> enabled "FEATURE") featureState
in
result `shouldBe` True
describe "disable" $ do
it "disables a new feature key" $
let
featureState = mempty :: Features
result = evalState (disable "NEW_FEATURE" >> enabled "NEW_FEATURE") featureState
in
result `shouldBe` False
it "disables a existing feature key" $
let
featureState = mkFeatures $ M.insert "FEATURE" True mempty
result = evalState (disable "FEATURE" >> enabled "FEATURE") featureState
in
result `shouldBe` False
describe "toggle" $ do
it "enables a new feature key" $
let
featureState = mempty :: Features
result = evalState (toggle "NEW_FEATURE" >> enabled "NEW_FEATURE") featureState
in
result `shouldBe` True
it "enables a disabled feature key" $
let
featureState = mkFeatures $ M.insert "FEATURE" False mempty
result = evalState (toggle "FEATURE" >> enabled "FEATURE") featureState
in
result `shouldBe` True
it "disables a enabled feature key" $
let
featureState = mkFeatures $ M.insert "FEATURE" True mempty
result = evalState (toggle "FEATURE" >> enabled "FEATURE") featureState
in
result `shouldBe` False
describe "enabled" $ do
it "returns True when the feature is enabled" $
let
featureState = mkFeatures $ M.insert "ENABLED_FEATURE" True mempty
result = evalState (enabled "ENABLED_FEATURE") featureState
in
result `shouldBe` True
it "returns False when the feature is not enabled" $
let
featureState = mkFeatures $ M.insert "DISABLED_FEATURE" False mempty
result = evalState (enabled "DISABLED_FEATURE") featureState
in
result `shouldBe` False
it "returns False when the feature key is not found" $
let
featureState = mempty :: Features
result = evalState (enabled "NON_EXISTANT_FEATURE") featureState
in
result `shouldBe` False