{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StandaloneDeriving #-}

module Tests where

import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Aeson.Encode.Pretty
import qualified Data.ByteString.Lazy.Char8 as BS
import qualified Data.HashMap.Internal.Strict as HM
import qualified Data.HashMap.Strict as HS
import Data.Text (Text)
import Database.Firestore.Direct
import GHC.Generics (Generic)
import Generic.Random
import qualified Network.Google.FireStore.Types as FireStore
import Test.QuickCheck
import Test.QuickCheck.Arbitrary (Arbitrary)
import Test.QuickCheck.Instances.ByteString
import Test.QuickCheck.Instances.Text
import Test.QuickCheck.Instances.Time
import Test.QuickCheck.Instances.UnorderedContainers

realTest :: IO ()
realTest :: IO ()
realTest = do
  Env FireStoreScope
env <- IO (Env FireStoreScope)
defaultEnvironment
  Env FireStoreScope -> Text -> FireStore () -> IO ()
forall (m :: * -> *) (s :: [Symbol]) env a.
(MonadUnliftIO m, HasEnv s env, AllowScopes s,
 HasScope' s FireStoreScope ~ 'True) =>
env -> Text -> FireStore a -> m a
runFireStore Env FireStoreScope
env Text
"carboncopy" (FireStore () -> IO ()) -> FireStore () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
    -- docs <- listAllDocuments "rss_subscriptions"
    ([Document]
docs, Maybe PageToken
_) <- Text -> Maybe PageToken -> FireStore ([Document], Maybe PageToken)
listDocumentsOnePage Text
"rss_subscriptions" Maybe PageToken
forall a. Maybe a
Nothing -- :: IO (Result ([BotUser], Maybe NextPage))
    IO () -> FireStore ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> FireStore ()) -> IO () -> FireStore ()
forall a b. (a -> b) -> a -> b
$ ByteString -> IO ()
BS.putStrLn (ByteString -> IO ()) -> ByteString -> IO ()
forall a b. (a -> b) -> a -> b
$ Document -> ByteString
forall a. ToJSON a => a -> ByteString
encodePretty (Document -> ByteString) -> Document -> ByteString
forall a b. (a -> b) -> a -> b
$ [Document] -> Document
forall a. [a] -> a
head [Document]
docs
    IO () -> FireStore ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> FireStore ()) -> IO () -> FireStore ()
forall a b. (a -> b) -> a -> b
$ Int -> IO ()
forall a. Show a => a -> IO ()
print (Int -> IO ()) -> Int -> IO ()
forall a b. (a -> b) -> a -> b
$ [Document] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Document]
docs

-- instance Arbitrary (HS.HashMap Text Value) where
--   arbitrary = HS.fromList <$> arbitrary
--   shrink m = HS.fromList <$> shrink (HS.toList m)

instance Arbitrary FireStore.Value where
  arbitrary :: Gen Value
arbitrary = Value -> Gen Value
forall (m :: * -> *) a. Monad m => a -> m a
return Value
FireStore.value
  shrink :: Value -> [Value]
shrink Value
v = []

instance Arbitrary Value where
  arbitrary :: Gen Value
arbitrary = Weights Value -> Gen Value
forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary Weights Value
forall a. UniformWeight_ (Rep a) => Weights a
uniform -- Give a distribution of constructors.
  shrink :: Value -> [Value]
shrink = Value -> [Value]
forall a.
(Generic a, RecursivelyShrink (Rep a), GSubterms (Rep a) a) =>
a -> [a]
genericShrink -- Generic shrinking is provided by the QuickCheck library.

prop_roundtrip_value :: Value -> Bool
prop_roundtrip_value Value
v = Value -> Value
parseValue (Value -> Value
buildValue Value
v) Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
== Value
v

prop_roundtrip_value' :: Value -> Bool
prop_roundtrip_value' Value
v = Value -> Value
buildValue (Value -> Value
parseValue Value
v) Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
== Value
v

propTests :: IO ()
propTests :: IO ()
propTests =
  do
    Value -> IO ()
forall a. Show a => a -> IO ()
print (Value -> IO ()) -> Value -> IO ()
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Value
GeoPoint Double
0.0 Double
0.0
    Value -> IO ()
forall a. Show a => a -> IO ()
print (Value -> IO ()) -> Value -> IO ()
forall a b. (a -> b) -> a -> b
$ Value -> Value
buildValue (Value -> Value) -> Value -> Value
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Value
GeoPoint Double
0.0 Double
0.0
    Value -> IO ()
forall a. Show a => a -> IO ()
print (Value -> IO ()) -> Value -> IO ()
forall a b. (a -> b) -> a -> b
$ Value -> Value
parseValue (Value -> Value) -> (Value -> Value) -> Value -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Value
buildValue (Value -> Value) -> Value -> Value
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Value
GeoPoint Double
0.0 Double
0.0

    Value -> IO ()
forall a. Show a => a -> IO ()
print (Value -> IO ()) -> Value -> IO ()
forall a b. (a -> b) -> a -> b
$ [Value] -> Value
Array [HashMap Text Value -> Value
Map ([(Text, Value)] -> HashMap Text Value
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList [(Text
"", Double -> Double -> Value
GeoPoint Double
0.0 Double
0.0)])]
    Value -> IO ()
forall a. Show a => a -> IO ()
print (Value -> IO ()) -> Value -> IO ()
forall a b. (a -> b) -> a -> b
$ Value -> Value
parseValue (Value -> Value) -> (Value -> Value) -> Value -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Value
buildValue (Value -> Value) -> Value -> Value
forall a b. (a -> b) -> a -> b
$ [Value] -> Value
Array [HashMap Text Value -> Value
Map ([(Text, Value)] -> HashMap Text Value
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList [(Text
"", Double -> Double -> Value
GeoPoint Double
0.0 Double
0.0)])]
    (Value -> Bool) -> IO ()
forall prop. Testable prop => prop -> IO ()
quickCheck ((Value -> Bool) -> IO ()) -> (Value -> Bool) -> IO ()
forall a b. (a -> b) -> a -> b
$ Value -> Bool
prop_roundtrip_value