module Spec.Reference (allTests) where import LaunchDarkly.Server.Reference (getComponents, getError, getRawPath, makeLiteral, makeReference) import Test.HUnit invalidReferences :: Test invalidReferences = TestCase $ ( do confirm "empty reference" "" confirm "empty reference" "/" confirm "trailing slash" "//" confirm "trailing slash" "/a/b/" confirm "double slash" "/a//b" confirm "invalid escape sequence" "/a~x" confirm "invalid escape sequence" "/a~" confirm "invalid escape sequence" "/a/b~x" confirm "invalid escape sequence" "/a/b~" ) where confirm err reference = assertEqual "" err $ getError $ makeReference reference validReferencesWithoutLeadingSlash :: Test validReferencesWithoutLeadingSlash = TestCase $ ( do confirm "key" confirm "kind" confirm "name" confirm "name/with/slashes" confirm "name~0~1with-what-looks-like-escape-sequences" ) where confirm ref = let reference = makeReference ref in ( do assertEqual "" "" $ getError reference assertEqual "" ref $ getRawPath reference assertEqual "" [ref] $ getComponents reference ) validReferencesWithLeadingSlash :: Test validReferencesWithLeadingSlash = TestCase $ ( do confirm "/key" "key" confirm "/0" "0" confirm "/name~1with~1slashes~0and~0tildes" "name/with/slashes~and~tildes" ) where confirm ref component = let reference = makeReference ref in ( do assertEqual "" "" $ getError reference assertEqual "" [component] $ getComponents reference assertEqual "" ref $ getRawPath reference ) canAccessSubcomponents :: Test canAccessSubcomponents = TestCase $ ( do confirm "/key" ["key"] confirm "/a/b" ["a", "b"] confirm "/a~1b/c" ["a/b", "c"] confirm "/a~0b/c" ["a~b", "c"] confirm "/a/10/20/30x" ["a", "10", "20", "30x"] confirm "" [] confirm "key" ["key"] confirm "/key" ["key"] confirm "/a/b" ["a", "b"] ) where confirm ref components = let reference = makeReference ref in assertEqual "" components $ getComponents reference validLiteralReferences :: Test validLiteralReferences = TestCase $ ( do confirm "name" "name" confirm "a/b" "a/b" confirm "/a/b~c" "/~1a~1b~0c" confirm "/" "/~1" ) where confirm ref path = let literal = makeLiteral ref reference = makeReference path in assertEqual "" (getRawPath literal) (getRawPath reference) invalidLiteralReferences :: Test invalidLiteralReferences = TestCase $ assertEqual "" "empty reference" $ getError $ makeLiteral "" allTests :: Test allTests = TestList [ invalidReferences , validReferencesWithoutLeadingSlash , validReferencesWithLeadingSlash , canAccessSubcomponents , validLiteralReferences , invalidLiteralReferences ]