Lets add support to Circle CI to make sure the code is tested regularly. The idea is to have Circle CI to build and run the tests so we can have confidence that the project is in a health state.

The first thing you will need is to create an account on the Circle CI website and add the project so Circle CI can start to monitor your repository and start the building process as soon as new commits arrive.

Having the account created and the project added, we need to create the configuration file - circle.yml - in the project’s root folder. This file will tell Circle CI about the project dependencies and what commands to run.

machine:
  # exports environment variables
  environment:
    PGUSER: postgres
    PGDATABASE: circle_test
    PGPORT: 5432
    PGHOST: localhost

dependencies:
  cache_directories:
    # Frontend app javascript modules
    - "js/node_modules"
    # Backend app haskell modules
    - "~/.stack"

  pre:
    # Install stack
    - wget -q -O- https://s3.amazonaws.com/download.fpcomplete.com/ubuntu/fpco.key | sudo apt-key add -
    - echo 'deb http://download.fpcomplete.com/ubuntu/precise stable main' | sudo tee /etc/apt/sources.list.d/fpco.list
    - sudo apt-get update && sudo apt-get install stack -y

  override:
    # Build javascript dependencies
    - cd js && npm install --save-dev
    # Build haskell dependencies
    - stack setup && stack build --test --only-dependencies

test:
  override:
    # run js tests
    - cd js && npm test
    # run haskell tests
    - stack test

Configuring Yesod

We will need to change the test-settings.yml and the TestImport.hs files so Yesod will handle settings with environment variables when running the tests.

First we tell Yesod that flora_test is the default test database and that it can be overwritten by the PGDATABASE environment variable.

--- a/config/test-settings.yml
+++ b/config/test-settings.yml
@@ -1,2 +1,2 @@
 database:
-  database: flora_test
+  database: "_env:PGDATABASE:flora_test"

Secondly, we need to change the TestImport.hs file because it ignores environment variables by default.

diff --git a/test/TestImport.hs b/test/TestImport.hs
index 625acce..ad76ec4 100644
--- a/test/TestImport.hs
+++ b/test/TestImport.hs
@@ -11,7 +11,7 @@ import Foundation            as X
 import Model                 as X
 import Test.Hspec            as X
 import Text.Shakespeare.Text (st)
-import Yesod.Default.Config2 (ignoreEnv, loadAppSettings)
+import Yesod.Default.Config2 (useEnv, loadAppSettings)
 import Yesod.Test            as X

 runDB :: SqlPersistM a -> YesodExample App a
@@ -28,7 +28,7 @@ withApp = before $ do
     settings <- loadAppSettings
         ["config/test-settings.yml", "config/settings.yml"]
         []
-        ignoreEnv
+        useEnv
     foundation <- makeFoundation settings
     wipeDB foundation
     logWare <- liftIO $ makeLogWare foundation

Now, every time you push a commit to github, Circle CI will build the project and run the tests.

Bonus

You can access the Project settings -> Status badges menu in the Circle CI platform and generate a badge for you to put in your project README file. The badge will change as the last build build successfully or not.

This is how it looks like: