add documentation
This commit is contained in:
parent
494b2be299
commit
17cecdad80
75
yesod-test/README.md
Normal file
75
yesod-test/README.md
Normal file
@ -0,0 +1,75 @@
|
||||
# TestWaiPersistent - Pragmatic integration tests for haskell web applications using WAI and Persistent
|
||||
|
||||
yesod-test is designed for testing web applications built using wai and persistent.
|
||||
It's main goal is to encourage integration and system testing of web applications by making everything /easy to test/.
|
||||
|
||||
Your tests are like browser sessions that keep track of cookies and the last
|
||||
visited page. You can perform assertions on the content of HTML responses,
|
||||
using css selectors to explore the document more easily.
|
||||
|
||||
You can also easily build requests using forms present in the current page.
|
||||
This is very useful for testing web applications built in yesod for example,
|
||||
were your forms may have field names generated by the framework or a randomly
|
||||
generated "\_token" field.
|
||||
|
||||
Your database is also directly available so you can use runDB to set up
|
||||
backend pre-conditions, or to assert that your session is having the desired effect.
|
||||
|
||||
The testing facilities behind the scenes are HUnit and HSpec.
|
||||
|
||||
This is the helloworld and kitchen sink. In this case for testing a yesod app.
|
||||
|
||||
```haskell
|
||||
|
||||
import Yesod
|
||||
import Yesod.Static
|
||||
import qualified MySite.Settings as Settings
|
||||
import MySite.Models
|
||||
|
||||
main :: IO a
|
||||
main = do
|
||||
cfg <- (loadConfig Test) >>= either fail return
|
||||
st <- static Settings.staticDir
|
||||
Settings.withConnectionPool (connStr cfg) $ \cnPool -> do
|
||||
-- ... Perhaps some code here to truncate your test database?
|
||||
app <- toWaiApp $ MyApp st cfg
|
||||
runTests app cnPool $ mySuite
|
||||
|
||||
mySuite = do
|
||||
describe "Basic navigation and assertions" $ do
|
||||
it "Gets a page that has a form, with auto generated fields and token" $ do
|
||||
doGet_ "url/of/page/with/form" -- Load a page
|
||||
statusIs 200 -- Assert the status was success
|
||||
|
||||
bodyContains "Hello Person" -- Assert any part of the document contains some text.
|
||||
|
||||
-- Perform a css queries and assertions.
|
||||
htmlCount "form .main" 1 -- It matches 1 element
|
||||
htmlAllContain "h1#mainTitle" "Sign Up Now!" -- All matches have some text
|
||||
|
||||
-- Performs the post using the current page to extract field values:
|
||||
doPost "url/to/post/to" $ do
|
||||
addNonce -- Add the _nonce field with the currently shown value
|
||||
|
||||
-- Lookup field by the text on the labels pointing to them.
|
||||
byLabel "Email:" "gustavo@cerati.com"
|
||||
byLabel "Password:" "secret"
|
||||
byLabel "Confirm:" "secret"
|
||||
|
||||
it "Sends another form, this one has a file" $ do
|
||||
doPost "url/to/post/file/to" $ do
|
||||
-- You can add files this easy, you still have to provide the mime type manually though.
|
||||
addFile "file_field_name" "path/to/local/file" "image/jpeg"
|
||||
|
||||
-- And of course you can add any field if you know it's name
|
||||
byName "answer" "42"
|
||||
|
||||
statusIs 302
|
||||
|
||||
describe "Db access, still very raw" $ do
|
||||
it "selects the list" $ do
|
||||
msgs <- testDB $ do (selectList [] [] :: SqlPersist IO [(Key SqlPersist Message, Message)])
|
||||
assertEqual "One Message in the DB" 1 (DL.length msgs)
|
||||
|
||||
```
|
||||
|
||||
Loading…
Reference in New Issue
Block a user