fb 0.15.2 → 1.0
raw patch · 16 files changed
+97/−80 lines, 16 filesdep +conduit-extradep ~conduitdep ~hspecdep ~http-conduit
Dependencies added: conduit-extra
Dependency ranges changed: conduit, hspec, http-conduit
Files
- fb.cabal +14/−6
- src/Facebook/Auth.hs +6/−5
- src/Facebook/Base.hs +6/−5
- src/Facebook/FQL.hs +2/−2
- src/Facebook/Graph.hs +6/−6
- src/Facebook/Monad.hs +15/−8
- src/Facebook/Object/Action.hs +3/−3
- src/Facebook/Object/Checkin.hs +3/−3
- src/Facebook/Object/FriendList.hs +3/−5
- src/Facebook/Object/Order.hs +2/−2
- src/Facebook/Object/Page.hs +3/−3
- src/Facebook/Object/User.hs +5/−6
- src/Facebook/Pager.hs +5/−4
- src/Facebook/RealTime.hs +3/−2
- src/Facebook/TestUsers.hs +6/−6
- tests/Main.hs +15/−14
fb.cabal view
@@ -1,5 +1,5 @@ name: fb-version: 0.15.2+version: 1.0 license: BSD3 license-file: LICENSE author: Felipe Lessa@@ -40,6 +40,8 @@ default: False description: Print debugging info. +flag conduit11+ description: Use conduit >= 1.1. library hs-source-dirs: src@@ -71,12 +73,10 @@ , transformers-base , monad-control , resourcet- , conduit == 1.0.* , data-default , http-types- , http-conduit == 2.0.*+ , http-conduit >= 2.0 && < 2.2 , attoparsec >= 0.10.4 && < 0.12- , attoparsec-conduit == 1.0.* , unordered-containers , aeson >= 0.5 && < 0.8 , base16-bytestring >= 0.1@@ -88,6 +88,14 @@ , cryptohash >= 0.7 , cryptohash-cryptoapi == 0.1.* , monad-logger >= 0.3+ if flag(conduit11)+ build-depends:+ conduit == 1.1.*+ , conduit-extra == 1.1.*+ else+ build-depends:+ conduit == 1.0.*+ , attoparsec-conduit == 1.0.* extensions: DeriveDataTypeable EmptyDataDecls@@ -111,7 +119,7 @@ build-depends: -- Library dependencies used on the tests. No need to -- specify versions since they'll use the same as above.- base, lifted-base, transformers, bytestring,+ base, lifted-base, transformers, bytestring, resourcet, conduit, http-conduit, text, time, aeson, monad-control -- Test-only dependencies@@ -119,7 +127,7 @@ , data-default , HUnit , QuickCheck- , hspec == 1.8.*+ , hspec == 1.9.* , fb extensions: TypeFamilies
src/Facebook/Auth.hs view
@@ -32,6 +32,7 @@ import Data.String (IsString(..)) import qualified Control.Exception.Lifted as E+import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as AE import qualified Data.Aeson.Types as AE import qualified Data.Attoparsec.Char8 as AB@@ -58,7 +59,7 @@ -- | Get an app access token from Facebook using your -- credentials.-getAppAccessToken :: (C.MonadResource m, MonadBaseControl IO m) =>+getAppAccessToken :: (R.MonadResource m, MonadBaseControl IO m) => FacebookT Auth m AppAccessToken getAppAccessToken = runResourceInFb $ do@@ -104,7 +105,7 @@ -- request query parameters passed to your 'RedirectUrl' and give -- to this function that will complete the user authentication -- flow and give you an @'UserAccessToken'@.-getUserAccessTokenStep2 :: (MonadBaseControl IO m, C.MonadResource m) =>+getUserAccessTokenStep2 :: (MonadBaseControl IO m, R.MonadResource m) => RedirectUrl -- ^ Should be exactly the same -- as in 'getUserAccessTokenStep1'. -> [Argument] -- ^ Query parameters.@@ -236,7 +237,7 @@ -- access token may not be valid as well. For example, in the -- case of an user access token, they may have changed their -- password, logged out from Facebook or blocked your app.-isValid :: (MonadBaseControl IO m, C.MonadResource m) =>+isValid :: (MonadBaseControl IO m, R.MonadResource m) => AccessToken anyKind -> FacebookT anyAuth m Bool isValid token = do@@ -270,7 +271,7 @@ -- have the same data and expiration time as before, but you -- can't assume this). Note that expired access tokens can't be -- extended, only valid tokens.-extendUserAccessToken :: (MonadBaseControl IO m, C.MonadResource m) =>+extendUserAccessToken :: (MonadBaseControl IO m, R.MonadResource m) => UserAccessToken -> FacebookT Auth m (Either FacebookException UserAccessToken) extendUserAccessToken token@(UserAccessToken uid data_ _)@@ -354,7 +355,7 @@ -- | Get detailed information about an access token.-debugToken :: (MonadBaseControl IO m, C.MonadResource m) =>+debugToken :: (MonadBaseControl IO m, R.MonadResource m) => AppAccessToken -- ^ Your app access token. -> AccessTokenData -- ^ The access token you want to debug. -> FacebookT Auth m DebugToken
src/Facebook/Base.hs view
@@ -22,6 +22,7 @@ import qualified Control.Exception.Lifted as E import Control.Monad.Trans.Class (MonadTrans) import Control.Monad.Trans.Control (MonadBaseControl)+import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A import qualified Data.Attoparsec.Char8 as AT import qualified Data.ByteString as B@@ -86,12 +87,12 @@ -- | Converts a plain 'H.Response' coming from 'H.http' into a -- JSON value.-asJson :: (MonadIO m, MonadTrans t, C.MonadThrow m, A.FromJSON a) =>+asJson :: (MonadIO m, MonadTrans t, R.MonadThrow m, A.FromJSON a) => H.Response (C.ResumableSource m ByteString) -> t m a asJson = lift . asJsonHelper -asJsonHelper :: (MonadIO m, C.MonadThrow m, A.FromJSON a) =>+asJsonHelper :: (MonadIO m, R.MonadThrow m, A.FromJSON a) => H.Response (C.ResumableSource m ByteString) -> m a asJsonHelper response = do@@ -140,14 +141,14 @@ -- | Same as 'H.http', but tries to parse errors and throw -- meaningful 'FacebookException'@s@.-fbhttp :: (MonadBaseControl IO m, C.MonadResource m) =>+fbhttp :: (MonadBaseControl IO m, R.MonadResource m) => H.Request -> FacebookT anyAuth m (H.Response (C.ResumableSource m ByteString)) fbhttp req = do manager <- getManager lift (fbhttpHelper manager req) -fbhttpHelper :: (MonadBaseControl IO m, C.MonadResource m) =>+fbhttpHelper :: (MonadBaseControl IO m, R.MonadResource m) => H.Manager -> H.Request -> m (H.Response (C.ResumableSource m ByteString))@@ -192,7 +193,7 @@ -- | Send a @HEAD@ request just to see if the resposne status -- code is 2XX (returns @True@) or not (returns @False@).-httpCheck :: (MonadBaseControl IO m, C.MonadResource m) =>+httpCheck :: (MonadBaseControl IO m, R.MonadResource m) => H.Request -> FacebookT anyAuth m Bool
src/Facebook/FQL.hs view
@@ -13,8 +13,8 @@ import Data.Time (UTCTime) import Data.Time.Clock.POSIX (posixSecondsToUTCTime) +import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A-import qualified Data.Conduit as C import qualified Data.HashMap.Strict as HMS import Facebook.Types@@ -25,7 +25,7 @@ -- | Query the Facebook Graph using FQL.-fqlQuery :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>+fqlQuery :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => Text -- ^ FQL Query -> Maybe (AccessToken anyKind) -- ^ Optional access token -> FacebookT anyAuth m (Pager a)
src/Facebook/Graph.hs view
@@ -24,10 +24,10 @@ import Data.Word (Word, Word8, Word16, Word32, Word64) import System.Locale (defaultTimeLocale) +import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A import qualified Data.Aeson.Encode as AE (fromValue) import qualified Data.ByteString.Char8 as B-import qualified Data.Conduit as C import qualified Data.Text.Encoding as TE import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Builder as TLB@@ -44,7 +44,7 @@ -- | Make a raw @GET@ request to Facebook's Graph API.-getObject :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>+getObject :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => Text -- ^ Path (should begin with a slash @\/@) -> [Argument] -- ^ Arguments to be passed to Facebook -> Maybe (AccessToken anyKind) -- ^ Optional access token@@ -55,7 +55,7 @@ -- | Make a raw @POST@ request to Facebook's Graph API.-postObject :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>+postObject :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => Text -- ^ Path (should begin with a slash @\/@) -> [Argument] -- ^ Arguments to be passed to Facebook -> AccessToken anyKind -- ^ Access token@@ -64,7 +64,7 @@ -- | Make a raw @DELETE@ request to Facebook's Graph API.-deleteObject :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>+deleteObject :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => Text -- ^ Path (should begin with a slash @\/@) -> [Argument] -- ^ Arguments to be passed to Facebook -> AccessToken anyKind -- ^ Access token@@ -73,7 +73,7 @@ -- | Helper function used by 'postObject' and 'deleteObject'.-methodObject :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>+methodObject :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => HT.Method -> Text -- ^ Path (should begin with a slash @\/@) -> [Argument] -- ^ Arguments to be passed to Facebook@@ -87,7 +87,7 @@ -- | Make a raw @GET@ request to the /search endpoint of Facebook’s -- Graph API. Returns a raw JSON 'A.Value'.-searchObjects :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a)+searchObjects :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => Text -- ^ A Facebook object type to search for -> Text -- ^ The keyword to search for -> [Argument] -- ^ Additional arguments to pass
src/Facebook/Monad.hs view
@@ -1,4 +1,11 @@-{-# LANGUAGE DeriveDataTypeable, FlexibleContexts, FlexibleInstances, GeneralizedNewtypeDeriving, MultiParamTypeClasses, TypeFamilies, UndecidableInstances #-}+{-# LANGUAGE DeriveDataTypeable,+ FlexibleContexts,+ FlexibleInstances,+ GeneralizedNewtypeDeriving,+ MultiParamTypeClasses,+ StandaloneDeriving,+ TypeFamilies,+ UndecidableInstances #-} module Facebook.Monad ( FacebookT , Auth@@ -33,7 +40,6 @@ import Data.Typeable (Typeable) import qualified Control.Monad.Trans.Resource as R -import qualified Data.Conduit as C import qualified Network.HTTP.Conduit as H import Facebook.Types@@ -45,10 +51,11 @@ -- have supplied your 'Credentials') or 'NoAuth' (you have not -- supplied any 'Credentials'). newtype FacebookT auth m a = F { unF :: ReaderT FbData m a }- deriving ( Functor, Applicative, Alternative, Monad- , MonadFix, MonadPlus, MonadIO, MonadTrans- , R.MonadThrow, R.MonadActive, R.MonadResource )+ deriving ( Functor, Applicative, Alternative, Monad, MonadFix+ , MonadPlus, MonadIO, MonadTrans, R.MonadThrow ) +deriving instance (R.MonadResource m, MonadBase IO m) => R.MonadResource (FacebookT auth m)+ instance MonadBase b m => MonadBase b (FacebookT auth m) where liftBase = lift . liftBase @@ -136,10 +143,10 @@ -- | Run a 'ResourceT' inside a 'FacebookT'.-runResourceInFb :: (C.MonadResource m, MonadBaseControl IO m) =>- FacebookT anyAuth (C.ResourceT m) a+runResourceInFb :: (R.MonadResource m, MonadBaseControl IO m) =>+ FacebookT anyAuth (R.ResourceT m) a -> FacebookT anyAuth m a-runResourceInFb (F inner) = F $ ask >>= lift . C.runResourceT . runReaderT inner+runResourceInFb (F inner) = F $ ask >>= lift . R.runResourceT . runReaderT inner -- | Transform the computation inside a 'FacebookT'.
src/Facebook/Object/Action.hs view
@@ -10,7 +10,7 @@ import Data.String (IsString(..)) import Data.Text (Text) -import qualified Data.Conduit as C+import qualified Control.Monad.Trans.Resource as R import Facebook.Types import Facebook.Monad@@ -25,7 +25,7 @@ -- > [ "recipe" #= "http://example.com/cookie.html" -- > , "when" #= now ] -- > token-createAction :: (C.MonadResource m, MonadBaseControl IO m) =>+createAction :: (R.MonadResource m, MonadBaseControl IO m) => Action -- ^ Action kind to be created. -> [Argument] -- ^ Arguments of the action. -> Maybe AppAccessToken@@ -37,7 +37,7 @@ -> FacebookT Auth m Id createAction (Action action) query mapptoken usertoken = do creds <- getCreds- let post :: (C.MonadResource m, MonadBaseControl IO m) => Text -> AccessToken anyKind -> FacebookT Auth m Id+ let post :: (R.MonadResource m, MonadBaseControl IO m) => Text -> AccessToken anyKind -> FacebookT Auth m Id post prepath = postObject (prepath <> appName creds <> ":" <> action) query case mapptoken of Nothing -> post "/me/" usertoken
src/Facebook/Object/Checkin.hs view
@@ -14,8 +14,8 @@ import Data.Time (UTCTime) import Data.Typeable (Typeable) +import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A-import qualified Data.Conduit as C import Facebook.Types@@ -68,7 +68,7 @@ -- | Get a checkin from its ID. The user access token is -- optional, but when provided more information can be returned -- back by Facebook.-getCheckin :: (C.MonadResource m, MonadBaseControl IO m) =>+getCheckin :: (R.MonadResource m, MonadBaseControl IO m) => Id -- ^ Checkin ID. -> [Argument] -- ^ Arguments to be passed to Facebook. -> Maybe UserAccessToken -- ^ Optional user access token.@@ -78,7 +78,7 @@ -- | Creates a 'check-in' and returns its ID. Place and -- coordinates are both required by Facebook.-createCheckin :: (C.MonadResource m, MonadBaseControl IO m) =>+createCheckin :: (R.MonadResource m, MonadBaseControl IO m) => Id -- ^ Place ID. -> GeoCoordinates -- ^ Coordinates. -> [Argument] -- ^ Other arguments of the action.
src/Facebook/Object/FriendList.hs view
@@ -13,9 +13,8 @@ import Data.Text (Text) import Data.Typeable (Typeable) --- import qualified Control.Exception.Lifted as E+import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A-import qualified Data.Conduit as C import Facebook.Types@@ -71,7 +70,7 @@ -- | Get the friend lists of the given user. getUserFriendLists ::- (C.MonadResource m, MonadBaseControl IO m) =>+ (R.MonadResource m, MonadBaseControl IO m) => UserId -- ^ User ID or @\"me\"@. -> [Argument] -- ^ Arguments to be passed to Facebook. -> UserAccessToken -- ^ User access token.@@ -81,11 +80,10 @@ -- | Get the members of a friend list. getFriendListMembers ::- (C.MonadResource m, MonadBaseControl IO m) =>+ (R.MonadResource m, MonadBaseControl IO m) => Id -- ^ List ID. -> [Argument] -- ^ Arguments to be passed to Facebook. -> UserAccessToken -- ^ User access token. -> FacebookT anyAuth m (Pager Friend) getFriendListMembers id_ query token = getObject ("/" <> idCode id_ <> "/members") query (Just token)-
src/Facebook/Object/Order.hs view
@@ -15,8 +15,8 @@ import Data.Typeable (Typeable) import Data.Time.LocalTime (ZonedTime) +import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A-import qualified Data.Conduit as C import Facebook.Types import Facebook.Monad@@ -84,7 +84,7 @@ -- | Get an 'Order' using its 'OrderId'. The user access token -- is mandatory.-getOrder :: (C.MonadResource m, MonadBaseControl IO m) =>+getOrder :: (R.MonadResource m, MonadBaseControl IO m) => OrderId -- ^ Order ID. -> UserAccessToken -- ^ User access token. -> FacebookT anyAuth m Order
src/Facebook/Object/Page.hs view
@@ -12,8 +12,8 @@ import Control.Monad (mzero) import Control.Monad.Trans.Control (MonadBaseControl) import Data.Aeson ((.:), (.:?))+import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A-import qualified Data.Conduit as C import Data.Text (Text) import Data.Typeable (Typeable) @@ -61,7 +61,7 @@ -- | Get a page using its ID. The user access token is optional.-getPage :: (C.MonadResource m, MonadBaseControl IO m)+getPage :: (R.MonadResource m, MonadBaseControl IO m) => Id -- ^ Page ID -> [Argument] -- ^ Arguments to be passed to Facebook -> Maybe UserAccessToken -- ^ Optional user access token@@ -70,7 +70,7 @@ -- | Search pages by keyword. The user access token is optional.-searchPages :: (C.MonadResource m, MonadBaseControl IO m)+searchPages :: (R.MonadResource m, MonadBaseControl IO m) => Text -- ^ Keyword to search for -> [Argument] -- ^ Arguments to pass to Facebook -> Maybe UserAccessToken -- ^ Optional user access token
src/Facebook/Object/User.hs view
@@ -16,9 +16,8 @@ import Data.Text (Text) import Data.Typeable (Typeable) --- import qualified Control.Exception.Lifted as E+import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A-import qualified Data.Conduit as C import Facebook.Types@@ -86,7 +85,7 @@ -- back by Facebook. The user ID may be @\"me\"@, in which -- case you must provide an user access token and information -- about the token's owner is given.-getUser :: (C.MonadResource m, MonadBaseControl IO m) =>+getUser :: (R.MonadResource m, MonadBaseControl IO m) => UserId -- ^ User ID or @\"me\"@. -> [Argument] -- ^ Arguments to be passed to Facebook. -> Maybe UserAccessToken -- ^ Optional user access token.@@ -95,7 +94,7 @@ -- | Search users by keyword.-searchUsers :: (C.MonadResource m, MonadBaseControl IO m)+searchUsers :: (R.MonadResource m, MonadBaseControl IO m) => Text -> [Argument] -> Maybe UserAccessToken@@ -105,7 +104,7 @@ -- | Get a list of check-ins made by a given user. getUserCheckins ::- (C.MonadResource m, MonadBaseControl IO m) =>+ (R.MonadResource m, MonadBaseControl IO m) => UserId -- ^ User ID or @\"me\"@. -> [Argument] -- ^ Arguments to be passed to Facebook. -> UserAccessToken -- ^ User access token.@@ -130,7 +129,7 @@ -- | Get the list of friends of the given user. getUserFriends ::- (C.MonadResource m, MonadBaseControl IO m) =>+ (R.MonadResource m, MonadBaseControl IO m) => UserId -- ^ User ID or @\"me\"@. -> [Argument] -- ^ Arguments to be passed to Facebook. -> UserAccessToken -- ^ User access token.
src/Facebook/Pager.hs view
@@ -15,6 +15,7 @@ import Control.Monad.Trans.Resource (MonadResourceBase) import Data.Typeable (Typeable) +import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A import qualified Data.Conduit as C import qualified Network.HTTP.Conduit as H@@ -66,7 +67,7 @@ -- | Tries to fetch the next page of a 'Pager'. Returns -- 'Nothing' whenever the current @Pager@ does not have a -- 'pagerNext'.-fetchNextPage :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>+fetchNextPage :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => Pager a -> FacebookT anyAuth m (Maybe (Pager a)) fetchNextPage = fetchHelper pagerNext @@ -74,13 +75,13 @@ -- | Tries to fetch the previous page of a 'Pager'. Returns -- 'Nothing' whenever the current @Pager@ does not have a -- 'pagerPrevious'.-fetchPreviousPage :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>+fetchPreviousPage :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => Pager a -> FacebookT anyAuth m (Maybe (Pager a)) fetchPreviousPage = fetchHelper pagerPrevious -- | (Internal) See 'fetchNextPage' and 'fetchPreviousPage'.-fetchHelper :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>+fetchHelper :: (R.MonadResource m, MonadBaseControl IO m, A.FromJSON a) => (Pager a -> Maybe String) -> Pager a -> FacebookT anyAuth m (Maybe (Pager a)) fetchHelper pagerRef pager = case pagerRef pager of@@ -121,6 +122,6 @@ go [] (Just next) = do req <- liftIO (H.parseUrl next) let get = fbhttpHelper manager req { H.redirectCount = 3 }- start =<< lift (C.runResourceT $ asJsonHelper =<< get)+ start =<< lift (R.runResourceT $ asJsonHelper =<< get) start p = go (pagerData p) $! pagerRef p return (start pager)
src/Facebook/RealTime.hs view
@@ -22,6 +22,7 @@ import Data.Text.Encoding (encodeUtf8) import Data.Typeable (Typeable) +import qualified Control.Monad.Trans.Resource as R import qualified Crypto.Classes as Crypto import qualified Crypto.HMAC as Crypto import qualified Data.Aeson as A@@ -92,7 +93,7 @@ -- If there was any previous subscription for the given -- 'RealTimeUpdateObject', it's overriden by this one (even if -- the other subscription had a different callback URL).-modifySubscription :: (C.MonadResource m, MonadBaseControl IO m) =>+modifySubscription :: (R.MonadResource m, MonadBaseControl IO m) => RealTimeUpdateObject -- ^ Type of objects whose subscription you -- and to add or modify.@@ -148,7 +149,7 @@ -- | List current real-time update subscriptions. listSubscriptions ::- (C.MonadResource m, MonadBaseControl IO m) =>+ (R.MonadResource m, MonadBaseControl IO m) => AppAccessToken -> FacebookT Auth m [RealTimeUpdateSubscription] listSubscriptions apptoken = do path <- getSubscriptionsPath
src/Facebook/TestUsers.hs view
@@ -21,9 +21,9 @@ import qualified Control.Exception.Lifted as E+import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A import qualified Data.ByteString.Char8 as B-import qualified Data.Conduit as C import Facebook.Auth@@ -98,7 +98,7 @@ -- | Create a new test user.-createTestUser :: (C.MonadResource m, MonadBaseControl IO m)+createTestUser :: (R.MonadResource m, MonadBaseControl IO m) => CreateTestUser -- ^ How the test user should be -- created. -> AppAccessToken -- ^ Access token for your app.@@ -110,7 +110,7 @@ -- | Get a list of test users.-getTestUsers :: (C.MonadResource m, MonadBaseControl IO m)+getTestUsers :: (R.MonadResource m, MonadBaseControl IO m) => AppAccessToken -- ^ Access token for your app. -> FacebookT Auth m (Pager TestUser) getTestUsers token = do@@ -119,7 +119,7 @@ -- | Remove an existing test user.-removeTestUser :: (C.MonadResource m, MonadBaseControl IO m)+removeTestUser :: (R.MonadResource m, MonadBaseControl IO m) => TestUser -- ^ The TestUser to be removed. -> AppAccessToken -- ^ Access token for your app (ignored since fb 0.14.7). -> FacebookT Auth m Bool@@ -136,7 +136,7 @@ -- format: \"\/userB_id\/friends\/userA_id\" with the access token of -- user B as query parameter. The first call creates a friend request -- and the second call accepts the friend request.-makeFriendConn :: (C.MonadResource m, MonadBaseControl IO m)+makeFriendConn :: (R.MonadResource m, MonadBaseControl IO m) => TestUser -> TestUser -> FacebookT Auth m ()@@ -171,7 +171,7 @@ -- | Same as 'getObject', but instead of parsing the result -- as a JSON, it tries to parse either as "true" or "false". -- Used only by the Test User API bindings.-getObjectBool :: (C.MonadResource m, MonadBaseControl IO m)+getObjectBool :: (R.MonadResource m, MonadBaseControl IO m) => Text -- ^ Path (should begin with a slash @\/@). -> [Argument]
tests/Main.hs view
@@ -22,6 +22,7 @@ import qualified Control.Exception.Lifted as E+import qualified Control.Monad.Trans.Resource as R import qualified Data.Aeson as A import qualified Data.Aeson.Types as A import qualified Data.ByteString.Char8 as B@@ -100,14 +101,14 @@ facebookTests "Production tier: " creds manager- (C.runResourceT . FB.runFacebookT creds manager)- (C.runResourceT . FB.runNoAuthFacebookT manager)+ (R.runResourceT . FB.runFacebookT creds manager)+ (R.runResourceT . FB.runNoAuthFacebookT manager) -- ...and the other in Facebook's beta tier. facebookTests "Beta tier: " creds manager- (C.runResourceT . FB.beta_runFacebookT creds manager)- (C.runResourceT . FB.beta_runNoAuthFacebookT manager)+ (R.runResourceT . FB.beta_runFacebookT creds manager)+ (R.runResourceT . FB.beta_runNoAuthFacebookT manager) -- Tests that don't depend on which tier is chosen. libraryTests manager@@ -115,8 +116,8 @@ facebookTests :: String -> FB.Credentials -> H.Manager- -> (forall a. FB.FacebookT FB.Auth (C.ResourceT IO) a -> IO a)- -> (forall a. FB.FacebookT FB.NoAuth (C.ResourceT IO) a -> IO a)+ -> (forall a. FB.FacebookT FB.Auth (R.ResourceT IO) a -> IO a)+ -> (forall a. FB.FacebookT FB.NoAuth (R.ResourceT IO) a -> IO a) -> Spec facebookTests pretitle creds manager runAuth runNoAuth = do let describe' = describe . (pretitle ++)@@ -127,7 +128,7 @@ token <- FB.getAppAccessToken FB.isValid token #?= True it "throws a FacebookException on invalid credentials" $- C.runResourceT $+ R.runResourceT $ FB.runFacebookT invalidCredentials manager $ do ret <- E.try $ FB.getAppAccessToken case ret of@@ -162,7 +163,7 @@ case FB.dtAccessToken ret of Nothing -> fail "dtAccessToken is Nothing" Just t -> do- let f :: FB.UserAccessToken -> FB.FacebookT FB.Auth (C.ResourceT IO) ()+ let f :: FB.UserAccessToken -> FB.FacebookT FB.Auth (R.ResourceT IO) () f (FB.UserAccessToken uid dt exps) = do uid &?= FB.tuId testUser dt &?= testUserAccessTokenData@@ -220,7 +221,7 @@ length val `seq` return () describe' "fetchNextPage" $ do- let fetchNextPageWorks :: FB.Pager A.Value -> FB.FacebookT anyAuth (C.ResourceT IO) ()+ let fetchNextPageWorks :: FB.Pager A.Value -> FB.FacebookT anyAuth (R.ResourceT IO) () fetchNextPageWorks pager | isNothing (FB.pagerNext pager) = return () | otherwise = FB.fetchNextPage pager >>= maybe not_ (\_ -> return ())@@ -234,7 +235,7 @@ fetchNextPageWorks =<< FB.getObject "/app/insights" [] (Just token) describe' "fetchNextPage/fetchPreviousPage" $ do- let backAndForthWorks :: FB.Pager A.Value -> FB.FacebookT anyAuth (C.ResourceT IO) ()+ let backAndForthWorks :: FB.Pager A.Value -> FB.FacebookT anyAuth (R.ResourceT IO) () backAndForthWorks pager = do Just pager2 <- FB.fetchNextPage pager Just pager3 <- FB.fetchPreviousPage pager2@@ -323,7 +324,7 @@ token <- FB.getAppAccessToken pager <- FB.getTestUsers token src <- FB.fetchAllNextPages pager- oldList <- liftIO $ C.runResourceT $ src C.$$ CL.consume+ oldList <- liftIO $ R.runResourceT $ src C.$$ CL.consume withTestUser D.def $ \testUser -> do let (%?=) = (&?=) `on` fmap FB.tuId (//) = S.difference `on` S.fromList@@ -395,8 +396,8 @@ exampleSig = "vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso" exampleData = "eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0" exampleCreds = FB.Credentials "name" "id" "secret"- runExampleAuth :: FB.FacebookT FB.Auth (C.ResourceT IO) a -> IO a- runExampleAuth = C.runResourceT . FB.runFacebookT exampleCreds manager+ runExampleAuth :: FB.FacebookT FB.Auth (R.ResourceT IO) a -> IO a+ runExampleAuth = R.runResourceT . FB.runFacebookT exampleCreds manager it "works for Facebook example" $ do runExampleAuth $ do ret <- FB.parseSignedRequest (B.concat [exampleSig, ".", exampleData])@@ -481,7 +482,7 @@ -- | Perform an action with a new test user. Remove the new test user -- after the action is performed.-withTestUser :: (C.MonadResource m, MonadBaseControl IO m)+withTestUser :: (R.MonadResource m, MonadBaseControl IO m) => FB.CreateTestUser -> (FB.TestUser -> FB.FacebookT FB.Auth m a) -> FB.FacebookT FB.Auth m a