module UpdateSpec where
import Composite.Opaleye.Update (recordToUpdate)
import Composite.Record ((:->), Rec(RNil), Record, pattern (:*:))
import Composite.TH (withLensesAndProxies)
import Test.Hspec (Spec, describe, it, shouldBe)
withLensesAndProxies [d|
type FFoo = "foo" :-> Int
type FFooMay = "foo" :-> Maybe Int
type FBar = "bar" :-> String
type FBaz = "baz" :-> Maybe Double
type FBazMay = "baz" :-> Maybe (Maybe Double)
type FQux = "qux" :-> Maybe Bool
|]
type ForSelect1 = '[]
type ForUpdate1 = '[]
type ForSelect2 = '[FBar]
type ForUpdate2 = '[FBar]
type ForSelect3 = '[FFoo]
type ForUpdate3 = '[FFooMay]
type ForSelect4 = '[FFoo , FBar, FBaz , FQux]
type ForUpdate4 = '[FFooMay, FBar, FBazMay, FQux]
type ForSelect5 = '[FBar, FFoo , FQux, FBaz ]
type ForUpdate5 = '[FBar, FFooMay, FQux, FBazMay]
updateSuite :: Spec
updateSuite = do
describe "Composite.Opaleye.Update" $ do
it "should compute the update version of an empty record" $ do
recordToUpdate ( RNil :: Record ForSelect1)
`shouldBe` ( RNil :: Record ForUpdate1)
it "should compute the update version of a record with no defaulted fields" $ do
recordToUpdate ("hi" :*: RNil :: Record ForSelect2)
`shouldBe` ("hi" :*: RNil :: Record ForUpdate2)
it "should compute the update version of a record with a defaulted field" $ do
recordToUpdate ( 123 :*: RNil :: Record ForSelect3)
`shouldBe` (Just 123 :*: RNil :: Record ForUpdate3)
it "should compute the update version of a record with mixed fields" $ do
recordToUpdate ( 123 :*: "hi" :*: Nothing :*: Just True :*: RNil :: Record ForSelect4)
`shouldBe` (Just 123 :*: "hi" :*: Just Nothing :*: Just True :*: RNil :: Record ForUpdate4)
it "should compute the update version of a record with mixed fields and different ordering" $ do
recordToUpdate ("hi" :*: 123 :*: Just True :*: Nothing :*: RNil :: Record ForSelect5)
`shouldBe` ("hi" :*: Just 123 :*: Just True :*: Just Nothing :*: RNil :: Record ForUpdate5)