packages feed

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

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

module Neuron.Zettelkasten.IDSpec
  ( spec,
  )
where

import qualified Data.Aeson as Aeson
import Data.Time.Calendar
import qualified Neuron.Zettelkasten.ID as Z
import Relude
import Test.Hspec

spec :: Spec
spec = do
  describe "ID parsing" $ do
    let day = fromGregorian 2020 3 19
    context "date id parsing" $ do
      let zid = Z.ZettelDateID day 1
      it "parses a zettel ID" $ do
        Z.parseZettelID "2011401" `shouldBe` zid
      it "parses a zettel ID from zettel filename" $ do
        Z.mkZettelID "2011401.md" `shouldBe` zid
        Z.zettelIDSourceFileName zid `shouldBe` "2011401.md"
    context "custom id parsing" $ do
      let zid = Z.ZettelCustomID "20abcde"
      it "parses a custom zettel ID" $ do
        Z.parseZettelID' "20abcde" `shouldBe` Right zid
      it "parses a custom zettel ID from zettel filename" $ do
        Z.mkZettelID "20abcde.md" `shouldBe` zid
        Z.zettelIDSourceFileName zid `shouldBe` "20abcde.md"
      let deceptiveZid = Z.ZettelCustomID "2136537e"
      it "parses a custom zettel ID that looks like date ID" $ do
        Z.parseZettelID' "2136537e" `shouldBe` Right deceptiveZid
  describe "ID converstion" $ do
    context "JSON encoding" $ do
      let day = fromGregorian 2020 3 19
          zid = Z.ZettelDateID day 1
      it "Converts ID to text when encoding to JSON" $ do
        Aeson.toJSON (Z.ZettelCustomID "20abcde") `shouldBe` Aeson.String "20abcde"
        Aeson.toJSON zid `shouldBe` Aeson.String "2011401"
    it "Date ID to Text" $ do
      let day = fromGregorian 2020 4 21
      Z.zettelIDText (Z.ZettelDateID day 1) `shouldBe` "2016201"