96 lines
2.3 KiB
TypeScript
96 lines
2.3 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
import type { VaultEntry, ViewDefinition } from '../types'
|
|
import { evaluateView } from './viewFilters'
|
|
|
|
const BASE_ENTRY: VaultEntry = {
|
|
path: '/vault/test.md',
|
|
filename: 'test.md',
|
|
title: 'Test',
|
|
isA: null,
|
|
aliases: [],
|
|
belongsTo: [],
|
|
relatedTo: [],
|
|
status: null,
|
|
archived: false,
|
|
modifiedAt: 1,
|
|
createdAt: 1,
|
|
fileSize: 100,
|
|
snippet: '',
|
|
wordCount: 0,
|
|
relationships: {},
|
|
icon: null,
|
|
color: null,
|
|
order: null,
|
|
sidebarLabel: null,
|
|
template: null,
|
|
sort: null,
|
|
view: null,
|
|
visible: null,
|
|
favorite: false,
|
|
favoriteIndex: null,
|
|
outgoingLinks: [],
|
|
properties: {},
|
|
listPropertiesDisplay: [],
|
|
}
|
|
|
|
function makeEntry(title: string, date: string): VaultEntry {
|
|
return {
|
|
...BASE_ENTRY,
|
|
path: `/vault/${title.toLowerCase()}.md`,
|
|
filename: `${title.toLowerCase()}.md`,
|
|
title,
|
|
properties: { date },
|
|
}
|
|
}
|
|
|
|
function dateEqualsView(value: string): ViewDefinition {
|
|
return {
|
|
name: 'Relative date',
|
|
icon: null,
|
|
color: null,
|
|
sort: null,
|
|
filters: { all: [{ field: 'date', op: 'equals', value }] },
|
|
}
|
|
}
|
|
|
|
describe('relative date view filters', () => {
|
|
afterEach(() => {
|
|
vi.useRealTimers()
|
|
})
|
|
|
|
it('matches today against date frontmatter at query time', () => {
|
|
vi.useFakeTimers()
|
|
vi.setSystemTime(new Date('2026-04-07T12:00:00Z'))
|
|
|
|
const result = evaluateView(dateEqualsView('today'), [
|
|
makeEntry('Yesterday', '2026-04-06'),
|
|
makeEntry('Today', '2026-04-07'),
|
|
makeEntry('Tomorrow', '2026-04-08'),
|
|
])
|
|
|
|
expect(result.map((entry) => entry.title)).toEqual(['Today'])
|
|
})
|
|
|
|
it('matches future relative expressions against date frontmatter', () => {
|
|
vi.useFakeTimers()
|
|
vi.setSystemTime(new Date('2026-04-07T12:00:00Z'))
|
|
|
|
const result = evaluateView(dateEqualsView('in 1 week'), [
|
|
makeEntry('Today', '2026-04-07'),
|
|
makeEntry('Next Week', '2026-04-14'),
|
|
makeEntry('Later', '2026-04-15'),
|
|
])
|
|
|
|
expect(result.map((entry) => entry.title)).toEqual(['Next Week'])
|
|
})
|
|
|
|
it('keeps unsupported calendar tokens from matching arbitrary dates', () => {
|
|
vi.useFakeTimers()
|
|
vi.setSystemTime(new Date('2026-04-07T12:00:00Z'))
|
|
|
|
expect(evaluateView(dateEqualsView('this month'), [
|
|
makeEntry('April Entry', '2026-04-15'),
|
|
])).toEqual([])
|
|
})
|
|
})
|