• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Courseography / courseography / e3067493-4a98-4820-be1f-7f2867b02a0c

20 Oct 2025 03:49PM UTC coverage: 55.118%. Remained the same
e3067493-4a98-4820-be1f-7f2867b02a0c

Pull #1607

circleci

akarki2005
fixed some lingering naming issues in ProgramControllerTests.hs
Pull Request #1607: Rename post table to program

486 of 956 branches covered (50.84%)

Branch coverage included in aggregate %.

8 of 22 new or added lines in 5 files covered. (36.36%)

16 existing lines in 1 file now uncovered.

2217 of 3948 relevant lines covered (56.16%)

159.79 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

48.65
/app/Controllers/Generate.hs
1
module Controllers.Generate
2
    (generateResponse, findAndSavePrereqsResponse) where
3

4
import Control.Monad ()
5
import Control.Monad.IO.Class (liftIO)
6
import Data.Aeson (decode, object, (.=))
7
import Data.List (nub)
8
import Data.Maybe (fromJust, isNothing, mapMaybe)
9
import qualified Data.Text.Lazy as TL
10
import DynamicGraphs.GraphOptions (CourseGraphOptions (..), GraphOptions (..))
11
import DynamicGraphs.WriteRunDot (generateAndSavePrereqResponse, getBody)
12
import Happstack.Server
13
import MasterTemplate
14
import Models.Program (reqsForProgram, returnProgram)
15
import Scripts
16
import Text.Blaze ((!))
17
import qualified Text.Blaze.Html5 as H
18
import qualified Text.Blaze.Html5.Attributes as A
19
import Util.Happstack (createJSONResponse)
20

21
generateResponse :: ServerPart Response
22
generateResponse =
23
    ok $ toResponse $
×
24
        masterTemplate "Courseography - Generate"
×
25
                    []
×
26
                    (do
×
27
                        H.div ! A.id "navbar" $ ""
×
28
                        generatePrerequisites
×
29
                    )
30
                    generateScripts
×
31

32
generatePrerequisites :: H.Html
33
generatePrerequisites =
34
    H.html $ do
×
35
        H.head $
×
36
            H.title "Generate Prerequisites!"
×
37
        H.div ! A.id "generateRoot" $ ""
×
38

39
findAndSavePrereqsResponse :: ServerPart Response
40
findAndSavePrereqsResponse = do
1✔
41
    method PUT
1✔
42
    requestBody <- getBody
1✔
43
    let coursesOptions :: CourseGraphOptions = fromJust $ decode requestBody
2✔
44

45
    programResults <- liftIO $ mapM (\code -> do
2✔
NEW
46
                        program <- returnProgram (TL.toStrict code)
×
NEW
47
                        return (TL.toStrict code, program))
×
48
                   (programs coursesOptions)
2✔
49

NEW
50
    let invalidPrograms = map fst $ filter (isNothing . snd) programResults
×
NEW
51
        validPrograms = mapMaybe snd programResults
×
52

53
    allCourses <- liftIO $ nub <$>
2✔
54
        if all (== TL.empty) (courses coursesOptions)
2!
55
            then return $ map TL.pack (concatMap reqsForProgram validPrograms)
×
56
            else return $ courses coursesOptions
2✔
57

58
    let updatedCoursesOptions = coursesOptions
2✔
59
            { courses = map TL.toUpper allCourses
2✔
60
            , graphOptions = (graphOptions coursesOptions)
2✔
61
                { taken = map TL.toUpper (taken (graphOptions coursesOptions))
2✔
62
                , departments = map TL.toUpper (departments (graphOptions coursesOptions))
2✔
63
                }
64
            }
65

66
    if all (== TL.empty) (courses coursesOptions) && not (null invalidPrograms)
2!
67
        then return $ createJSONResponse $ object ["error" .= object ["invalidPrograms" .= invalidPrograms]]
×
68
        else liftIO $ generateAndSavePrereqResponse updatedCoursesOptions
2✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc