1+ import { expect } from 'chai'
2+ import { Event } from '../../../src/@types/event'
3+ import { EventKinds } from '../../../src/constants/base'
4+ import {
5+ isDislikeReaction ,
6+ isExternalContentReactionEvent ,
7+ isLikeReaction ,
8+ isReactionEvent ,
9+ parseReaction ,
10+ } from '../../../src/utils/nip25'
11+
12+ const baseEvent = ( ) : Partial < Event > => ( { tags : [ ] , content : '+' } )
13+
14+ describe ( 'NIP-25' , ( ) => {
15+ describe ( 'isReactionEvent' , ( ) => {
16+ it ( 'returns true for kind 7' , ( ) =>
17+ expect ( isReactionEvent ( { ...baseEvent ( ) , kind : EventKinds . REACTION } as Event ) ) . to . equal ( true ) )
18+
19+ it ( 'returns false for other kinds' , ( ) =>
20+ expect ( isReactionEvent ( { ...baseEvent ( ) , kind : EventKinds . TEXT_NOTE } as Event ) ) . to . equal ( false ) )
21+ } )
22+
23+ describe ( 'isExternalContentReactionEvent' , ( ) => {
24+ it ( 'returns true for kind 17' , ( ) =>
25+ expect (
26+ isExternalContentReactionEvent ( { ...baseEvent ( ) , kind : EventKinds . EXTERNAL_CONTENT_REACTION } as Event ) ,
27+ ) . to . equal ( true ) )
28+
29+ it ( 'returns false for kind 7' , ( ) =>
30+ expect (
31+ isExternalContentReactionEvent ( { ...baseEvent ( ) , kind : EventKinds . REACTION } as Event ) ,
32+ ) . to . equal ( false ) )
33+ } )
34+
35+ describe ( 'isLikeReaction' , ( ) => {
36+ it ( 'returns true for "+"' , ( ) =>
37+ expect ( isLikeReaction ( { ...baseEvent ( ) , kind : EventKinds . REACTION , content : '+' } as Event ) ) . to . equal ( true ) )
38+
39+ it ( 'returns true for empty content' , ( ) =>
40+ expect ( isLikeReaction ( { ...baseEvent ( ) , kind : EventKinds . REACTION , content : '' } as Event ) ) . to . equal ( true ) )
41+
42+ it ( 'returns false for "-"' , ( ) =>
43+ expect ( isLikeReaction ( { ...baseEvent ( ) , kind : EventKinds . REACTION , content : '-' } as Event ) ) . to . equal ( false ) )
44+ } )
45+
46+ describe ( 'isDislikeReaction' , ( ) => {
47+ it ( 'returns true for "-"' , ( ) =>
48+ expect ( isDislikeReaction ( { ...baseEvent ( ) , kind : EventKinds . REACTION , content : '-' } as Event ) ) . to . equal ( true ) )
49+
50+ it ( 'returns false for "+"' , ( ) =>
51+ expect ( isDislikeReaction ( { ...baseEvent ( ) , kind : EventKinds . REACTION , content : '+' } as Event ) ) . to . equal ( false ) )
52+ } )
53+
54+ describe ( 'parseReaction' , ( ) => {
55+ it ( 'picks the last e tag as targetEventId' , ( ) => {
56+ const event = {
57+ ...baseEvent ( ) ,
58+ kind : EventKinds . REACTION ,
59+ tags : [ [ 'e' , 'aaa' ] , [ 'e' , 'bbb' ] ] ,
60+ } as unknown as Event
61+ expect ( parseReaction ( event ) . targetEventId ) . to . equal ( 'bbb' )
62+ } )
63+
64+ it ( 'picks the last p tag as targetPubkey' , ( ) => {
65+ const event = {
66+ ...baseEvent ( ) ,
67+ kind : EventKinds . REACTION ,
68+ tags : [ [ 'p' , 'pk1' ] , [ 'p' , 'pk2' ] ] ,
69+ } as unknown as Event
70+ expect ( parseReaction ( event ) . targetPubkey ) . to . equal ( 'pk2' )
71+ } )
72+
73+ it ( 'parses k tag as targetKind number' , ( ) => {
74+ const event = {
75+ ...baseEvent ( ) ,
76+ kind : EventKinds . REACTION ,
77+ tags : [ [ 'k' , '1' ] ] ,
78+ } as unknown as Event
79+ expect ( parseReaction ( event ) . targetKind ) . to . equal ( 1 )
80+ } )
81+
82+ it ( 'returns undefined fields when tags are absent' , ( ) => {
83+ const event = { ...baseEvent ( ) , kind : EventKinds . REACTION , tags : [ ] } as unknown as Event
84+ const result = parseReaction ( event )
85+ expect ( result . targetEventId ) . to . be . undefined
86+ expect ( result . targetPubkey ) . to . be . undefined
87+ expect ( result . targetKind ) . to . be . undefined
88+ } )
89+ } )
90+ } )
0 commit comments