; Follow-up — viewer mute/block filtering. (feed-test name got expected)

(define
  S
  (feed/stream
    (list
      (feed/normalize {:actor "alice" :object "P1" :at 1 :tags (list "news")})
      (feed/normalize {:actor "bob" :object "P2" :at 2 :tags (list "spam")})
      (feed/normalize {:actor "alice" :object "P3" :at 3 :tags (list "cats")})
      (feed/normalize {:actor "carol" :object "P4" :at 4 :tags (list "news" "spam")}))))

; ---------- mute actors ----------

(feed-test
  "mute bob drops his post"
  (map
    (fn (a) (get a :object))
    (feed/items (feed/mute-actors S (list "bob"))))
  (list "P1" "P3" "P4"))
(feed-test
  "mute alice drops two"
  (feed/count (feed/mute-actors S (list "alice")))
  2)
(feed-test
  "mute nobody keeps all"
  (feed/count (feed/mute-actors S (list)))
  4)

; ---------- mute tags ----------

(feed-test
  "mute spam tag drops two"
  (map
    (fn (a) (get a :object))
    (feed/items (feed/mute-tags S (list "spam"))))
  (list "P1" "P3"))
(feed-test
  "mute news+cats leaves spam-only"
  (map
    (fn (a) (get a :object))
    (feed/items (feed/mute-tags S (list "news" "cats"))))
  (list "P2"))

; ---------- mute objects ----------

(feed-test
  "mute object P3 (thread mute)"
  (feed/count (feed/mute-objects S (list "P3")))
  3)

; ---------- combined prefs ----------

(feed-test
  "apply-prefs actors + tags"
  (map
    (fn (a) (get a :object))
    (feed/items (feed/apply-prefs S {:mute-actors (list "bob") :mute-tags (list "cats")})))
  (list "P1" "P4"))
(feed-test
  "apply-prefs empty keeps all"
  (feed/count (feed/apply-prefs S {}))
  4)
(feed-test
  "apply-prefs all three filters"
  (map
    (fn (a) (get a :object))
    (feed/items (feed/apply-prefs S {:mute-objects (list "P3") :mute-actors (list "carol") :mute-tags (list "spam")})))
  (list "P1"))
