packages feed

neuron-0.4.0.0: test/Neuron/Zettelkasten/ZettelSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Neuron.Zettelkasten.ZettelSpec
  ( spec,
  )
where

import Data.Aeson
import Data.TagTree
import Data.Time.Calendar
import Neuron.Zettelkasten.ID
import Neuron.Zettelkasten.Zettel
import Relude
import Rib.Parser.MMark (parsePure)
import Test.Hspec

spec :: Spec
spec = do
  describe "sortZettelsReverseChronological" $ do
    let mkDay = fromGregorian 2020 3
        dummyContent = either error id $ parsePure "<spec>" "Dummy"
        mkZettel day idx =
          Zettel (ZettelDateID (mkDay day) idx) "Some title" [Tag "science", Tag "journal/class"] (Just $ mkDay day) dummyContent
    it "sorts correctly" $ do
      let zs = [mkZettel 3 2, mkZettel 5 1]
      sortZettelsReverseChronological zs
        `shouldBe` [mkZettel 5 1, mkZettel 3 2]
  describe "Zettel JSON" $ do
    let day = fromGregorian 2020 3 19
        zid = ZettelCustomID "Foo-Bar"
        dummyContent = either error id $ parsePure "<spec>" "Dummy"
        zettel = Zettel zid "Some title" [Tag "science", Tag "journal/class"] (Just day) dummyContent
    it "Produces expected json" $ do
      -- "{\"id\":\"2011401\",\"title\":\"Some title\",\"tags\":[\"science\"]}"
      object (zettelJson zettel)
        `shouldBe` object
          [ "id" .= ("Foo-Bar" :: Text),
            "title" .= ("Some title" :: Text),
            "tags" .= (["science", "journal/class"] :: [Text]),
            "day" .= day
          ]