From 60e01a900662e89ef7a93e056d9b315351f7d699 Mon Sep 17 00:00:00 2001 From: Sepehr Safari Date: Sun, 26 Mar 2023 13:43:02 +0330 Subject: [PATCH] edit filter.test.js and add more test cases (#165) * add more test cases for event file * add another test case for event file * edit filter.test.js and add more test cases --- filter.test.js | 204 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 169 insertions(+), 35 deletions(-) diff --git a/filter.test.js b/filter.test.js index 61aa9f7..6552e6a 100644 --- a/filter.test.js +++ b/filter.test.js @@ -1,42 +1,176 @@ /* eslint-env jest */ -const {matchFilters} = require('./lib/nostr.cjs') +const {matchFilter, matchFilters} = require('./lib/nostr.cjs.js') -test('test if filters match', () => { - ;[ - { - filters: [{ids: ['i']}], - good: [{id: 'i'}], - bad: [{id: 'j'}] - }, - { - filters: [{authors: ['abc']}, {kinds: [1, 3]}], - good: [ - {pubkey: 'xyz', kind: 3}, - {pubkey: 'abc', kind: 12}, - {pubkey: 'abc', kind: 1} - ], - bad: [{pubkey: 'hhh', kind: 12}] - }, - { - filters: [{'#e': ['yyy'], since: 444}], - good: [ - { - tags: [ - ['e', 'uuu'], - ['e', 'yyy'] - ], - created_at: 555 - } - ], - bad: [{tags: [['e', 'uuu']], created_at: 111}] - } - ].forEach(({filters, good, bad}) => { - good.forEach(ev => { - expect(matchFilters(filters, ev)).toBeTruthy() +describe('Filter', () => { + describe('matchFilter', () => { + it('should return true when all filter conditions are met', () => { + const filter = { + ids: ['123', '456'], + kinds: [1, 2, 3], + authors: ['abc'], + since: 100, + until: 200, + '#tag': ['value'] + } + + const event = { + id: '123', + kind: 1, + pubkey: 'abc', + created_at: 150, + tags: [['tag', 'value']] + } + + const result = matchFilter(filter, event) + + expect(result).toEqual(true) }) - bad.forEach(ev => { - expect(matchFilters(filters, ev)).toBeFalsy() + + it('should return false when the event id is not in the filter', () => { + const filter = {ids: ['123', '456']} + + const event = {id: '789'} + + const result = matchFilter(filter, event) + + expect(result).toEqual(false) + }) + + it('should return false when the event kind is not in the filter', () => { + const filter = {kinds: [1, 2, 3]} + + const event = {kind: 4} + + const result = matchFilter(filter, event) + + expect(result).toEqual(false) + }) + + it('should return false when the event author is not in the filter', () => { + const filter = {authors: ['abc', 'def']} + + const event = {pubkey: 'ghi'} + + const result = matchFilter(filter, event) + + expect(result).toEqual(false) + }) + + it('should return false when a tag is not present in the event', () => { + const filter = {'#tag': ['value1', 'value2']} + + const event = {tags: [['not_tag', 'value1']]} + + const result = matchFilter(filter, event) + + expect(result).toEqual(false) + }) + + it('should return false when a tag value is not present in the event', () => { + const filter = {'#tag': ['value1', 'value2']} + + const event = {tags: [['tag', 'value3']]} + + const result = matchFilter(filter, event) + + expect(result).toEqual(false) + }) + + it('should return true when filter has tags that is present in the event', () => { + const filter = {'#tag1': ['foo']} + + const event = { + id: '123', + kind: 1, + pubkey: 'abc', + created_at: 150, + tags: [ + ['tag1', 'foo'], + ['tag2', 'bar'] + ] + } + + const result = matchFilter(filter, event) + + expect(result).toEqual(true) + }) + + it('should return false when the event is before the filter since value', () => { + const filter = {since: 100} + + const event = {created_at: 50} + + const result = matchFilter(filter, event) + + expect(result).toEqual(false) + }) + + it('should return false when the event is after the filter until value', () => { + const filter = {until: 100} + + const event = {created_at: 150} + + const result = matchFilter(filter, event) + + expect(result).toEqual(false) + }) + }) + + describe('matchFilters', () => { + it('should return true when at least one filter matches the event', () => { + const filters = [ + {ids: ['123'], kinds: [1], authors: ['abc']}, + {ids: ['456'], kinds: [2], authors: ['def']}, + {ids: ['789'], kinds: [3], authors: ['ghi']} + ] + + const event = {id: '789', kind: 3, pubkey: 'ghi'} + + const result = matchFilters(filters, event) + + expect(result).toEqual(true) + }) + + it('should return true when event matches one or more filters and some have limit set', () => { + const filters = [ + {ids: ['123'], limit: 1}, + {kinds: [1], limit: 2}, + {authors: ['abc'], limit: 3} + ] + + const event = {id: '123', kind: 1, pubkey: 'abc', created_at: 150} + + const result = matchFilters(filters, event) + + expect(result).toEqual(true) + }) + + it('should return false when no filters match the event', () => { + const filters = [ + {ids: ['123'], kinds: [1], authors: ['abc']}, + {ids: ['456'], kinds: [2], authors: ['def']}, + {ids: ['789'], kinds: [3], authors: ['ghi']} + ] + + const event = {id: '100', kind: 4, pubkey: 'jkl'} + + const result = matchFilters(filters, event) + + expect(result).toEqual(false) + }) + + it('should return false when event matches none of the filters and some have limit set', () => { + const filters = [ + {ids: ['123'], limit: 1}, + {kinds: [1], limit: 2}, + {authors: ['abc'], limit: 3} + ] + const event = {id: '456', kind: 2, pubkey: 'def', created_at: 200} + + const result = matchFilters(filters, event) + + expect(result).toEqual(false) }) }) })